2025-07-31 00:43:21 -07:00
|
|
|
use std::collections::HashMap;
|
2025-05-04 11:12:40 -07:00
|
|
|
use std::path::PathBuf;
|
2025-05-07 08:37:48 -07:00
|
|
|
use std::sync::Arc;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
|
2025-07-27 20:01:35 -07:00
|
|
|
use codex_core::codex_wrapper::CodexConversation;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use codex_core::codex_wrapper::init_codex;
|
2025-04-27 21:47:50 -07:00
|
|
|
use codex_core::config::Config;
|
2025-07-16 15:11:18 -07:00
|
|
|
use codex_core::protocol::AgentMessageDeltaEvent;
|
2025-05-13 20:44:42 -07:00
|
|
|
use codex_core::protocol::AgentMessageEvent;
|
2025-07-16 15:11:18 -07:00
|
|
|
use codex_core::protocol::AgentReasoningDeltaEvent;
|
2025-05-13 20:44:42 -07:00
|
|
|
use codex_core::protocol::AgentReasoningEvent;
|
2025-08-05 01:56:13 -07:00
|
|
|
use codex_core::protocol::AgentReasoningRawContentDeltaEvent;
|
|
|
|
|
use codex_core::protocol::AgentReasoningRawContentEvent;
|
2025-05-13 20:44:42 -07:00
|
|
|
use codex_core::protocol::ApplyPatchApprovalRequestEvent;
|
2025-08-05 22:44:27 -07:00
|
|
|
use codex_core::protocol::BackgroundEventEvent;
|
2025-05-13 20:44:42 -07:00
|
|
|
use codex_core::protocol::ErrorEvent;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use codex_core::protocol::Event;
|
|
|
|
|
use codex_core::protocol::EventMsg;
|
2025-05-13 20:44:42 -07:00
|
|
|
use codex_core::protocol::ExecApprovalRequestEvent;
|
|
|
|
|
use codex_core::protocol::ExecCommandBeginEvent;
|
|
|
|
|
use codex_core::protocol::ExecCommandEndEvent;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use codex_core::protocol::InputItem;
|
2025-05-13 20:44:42 -07:00
|
|
|
use codex_core::protocol::McpToolCallBeginEvent;
|
|
|
|
|
use codex_core::protocol::McpToolCallEndEvent;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use codex_core::protocol::Op;
|
2025-05-13 20:44:42 -07:00
|
|
|
use codex_core::protocol::PatchApplyBeginEvent;
|
2025-05-19 16:08:18 -07:00
|
|
|
use codex_core::protocol::TaskCompleteEvent;
|
feat: show number of tokens remaining in UI (#1388)
When using the OpenAI Responses API, we now record the `usage` field for
a `"response.completed"` event, which includes metrics about the number
of tokens consumed. We also introduce `openai_model_info.rs`, which
includes current data about the most common OpenAI models available via
the API (specifically `context_window` and `max_output_tokens`). If
Codex does not recognize the model, you can set `model_context_window`
and `model_max_output_tokens` explicitly in `config.toml`.
When then introduce a new event type to `protocol.rs`, `TokenCount`,
which includes the `TokenUsage` for the most recent turn.
Finally, we update the TUI to record the running sum of tokens used so
the percentage of available context window remaining can be reported via
the placeholder text for the composer:

We could certainly get much fancier with this (such as reporting the
estimated cost of the conversation), but for now, we are just trying to
achieve feature parity with the TypeScript CLI.
Though arguably this improves upon the TypeScript CLI, as the TypeScript
CLI uses heuristics to estimate the number of tokens used rather than
using the `usage` information directly:
https://github.com/openai/codex/blob/296996d74e345b1b05d8c3451a06ace21c5ada96/codex-cli/src/utils/approximate-tokens-used.ts#L3-L16
Fixes https://github.com/openai/codex/issues/1242
2025-06-25 23:31:11 -07:00
|
|
|
use codex_core::protocol::TokenUsage;
|
2025-08-05 22:44:27 -07:00
|
|
|
use codex_core::protocol::TurnDiffEvent;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use crossterm::event::KeyEvent;
|
2025-07-31 17:10:52 -07:00
|
|
|
use crossterm::event::KeyEventKind;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use ratatui::buffer::Buffer;
|
2025-08-06 12:03:45 -07:00
|
|
|
use ratatui::layout::Constraint;
|
|
|
|
|
use ratatui::layout::Layout;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use ratatui::layout::Rect;
|
|
|
|
|
use ratatui::widgets::Widget;
|
|
|
|
|
use ratatui::widgets::WidgetRef;
|
|
|
|
|
use tokio::sync::mpsc::UnboundedSender;
|
2025-05-07 08:37:48 -07:00
|
|
|
use tokio::sync::mpsc::unbounded_channel;
|
2025-08-05 22:44:27 -07:00
|
|
|
use tracing::info;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
|
|
|
|
|
use crate::app_event::AppEvent;
|
2025-05-15 14:50:30 -07:00
|
|
|
use crate::app_event_sender::AppEventSender;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use crate::bottom_pane::BottomPane;
|
|
|
|
|
use crate::bottom_pane::BottomPaneParams;
|
2025-07-28 12:00:06 -07:00
|
|
|
use crate::bottom_pane::CancellationEvent;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use crate::bottom_pane::InputResult;
|
2025-07-30 10:05:40 -07:00
|
|
|
use crate::history_cell::CommandOutput;
|
|
|
|
|
use crate::history_cell::HistoryCell;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use crate::history_cell::PatchEventType;
|
2025-08-04 21:23:22 -07:00
|
|
|
use crate::live_wrap::RowBuilder;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
use crate::user_approval_widget::ApprovalRequest;
|
2025-06-28 15:04:23 -07:00
|
|
|
use codex_file_search::FileMatch;
|
2025-08-04 21:23:22 -07:00
|
|
|
use ratatui::style::Stylize;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
|
2025-07-31 00:43:21 -07:00
|
|
|
struct RunningCommand {
|
|
|
|
|
command: Vec<String>,
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
|
cwd: PathBuf,
|
|
|
|
|
}
|
|
|
|
|
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
pub(crate) struct ChatWidget<'a> {
|
2025-05-15 14:50:30 -07:00
|
|
|
app_event_tx: AppEventSender,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
codex_op_tx: UnboundedSender<Op>,
|
|
|
|
|
bottom_pane: BottomPane<'a>,
|
2025-08-06 12:03:45 -07:00
|
|
|
active_history_cell: Option<HistoryCell>,
|
2025-04-27 21:47:50 -07:00
|
|
|
config: Config,
|
2025-05-17 09:00:23 -07:00
|
|
|
initial_user_message: Option<UserMessage>,
|
2025-08-07 05:17:18 -07:00
|
|
|
total_token_usage: TokenUsage,
|
|
|
|
|
last_token_usage: TokenUsage,
|
2025-07-16 22:26:31 -07:00
|
|
|
reasoning_buffer: String,
|
2025-08-05 01:56:13 -07:00
|
|
|
content_buffer: String,
|
2025-07-25 01:56:40 -07:00
|
|
|
// Buffer for streaming assistant answer text; we do not surface partial
|
|
|
|
|
// We wait for the final AgentMessage event and then emit the full text
|
|
|
|
|
// at once into scrollback so the history contains a single message.
|
2025-07-16 22:26:31 -07:00
|
|
|
answer_buffer: String,
|
2025-07-31 00:43:21 -07:00
|
|
|
running_commands: HashMap<String, RunningCommand>,
|
2025-08-04 21:23:22 -07:00
|
|
|
live_builder: RowBuilder,
|
|
|
|
|
current_stream: Option<StreamKind>,
|
|
|
|
|
stream_header_emitted: bool,
|
|
|
|
|
live_max_rows: u16,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
|
2025-05-17 09:00:23 -07:00
|
|
|
struct UserMessage {
|
|
|
|
|
text: String,
|
|
|
|
|
image_paths: Vec<PathBuf>,
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-04 21:23:22 -07:00
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
|
|
|
enum StreamKind {
|
|
|
|
|
Answer,
|
|
|
|
|
Reasoning,
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-17 09:00:23 -07:00
|
|
|
impl From<String> for UserMessage {
|
|
|
|
|
fn from(text: String) -> Self {
|
|
|
|
|
Self {
|
|
|
|
|
text,
|
|
|
|
|
image_paths: Vec::new(),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn create_initial_user_message(text: String, image_paths: Vec<PathBuf>) -> Option<UserMessage> {
|
|
|
|
|
if text.is_empty() && image_paths.is_empty() {
|
|
|
|
|
None
|
|
|
|
|
} else {
|
|
|
|
|
Some(UserMessage { text, image_paths })
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
impl ChatWidget<'_> {
|
2025-08-06 14:56:34 -07:00
|
|
|
fn interrupt_running_task(&mut self) {
|
|
|
|
|
if self.bottom_pane.is_task_running() {
|
|
|
|
|
self.active_history_cell = None;
|
|
|
|
|
self.bottom_pane.clear_ctrl_c_quit_hint();
|
|
|
|
|
self.submit_op(Op::Interrupt);
|
|
|
|
|
self.bottom_pane.set_task_running(false);
|
|
|
|
|
self.bottom_pane.clear_live_ring();
|
|
|
|
|
self.live_builder = RowBuilder::new(self.live_builder.width());
|
|
|
|
|
self.current_stream = None;
|
|
|
|
|
self.stream_header_emitted = false;
|
|
|
|
|
self.answer_buffer.clear();
|
|
|
|
|
self.reasoning_buffer.clear();
|
|
|
|
|
self.content_buffer.clear();
|
|
|
|
|
self.request_redraw();
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-08-06 12:03:45 -07:00
|
|
|
fn layout_areas(&self, area: Rect) -> [Rect; 2] {
|
|
|
|
|
Layout::vertical([
|
|
|
|
|
Constraint::Max(
|
|
|
|
|
self.active_history_cell
|
|
|
|
|
.as_ref()
|
|
|
|
|
.map_or(0, |c| c.desired_height(area.width)),
|
|
|
|
|
),
|
|
|
|
|
Constraint::Min(self.bottom_pane.desired_height(area.width)),
|
|
|
|
|
])
|
|
|
|
|
.areas(area)
|
|
|
|
|
}
|
2025-08-05 01:56:13 -07:00
|
|
|
fn emit_stream_header(&mut self, kind: StreamKind) {
|
|
|
|
|
use ratatui::text::Line as RLine;
|
|
|
|
|
if self.stream_header_emitted {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
let header = match kind {
|
|
|
|
|
StreamKind::Reasoning => RLine::from("thinking".magenta().italic()),
|
|
|
|
|
StreamKind::Answer => RLine::from("codex".magenta().bold()),
|
|
|
|
|
};
|
|
|
|
|
self.app_event_tx
|
|
|
|
|
.send(AppEvent::InsertHistory(vec![header]));
|
|
|
|
|
self.stream_header_emitted = true;
|
|
|
|
|
}
|
|
|
|
|
fn finalize_active_stream(&mut self) {
|
|
|
|
|
if let Some(kind) = self.current_stream {
|
|
|
|
|
self.finalize_stream(kind);
|
|
|
|
|
}
|
|
|
|
|
}
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
pub(crate) fn new(
|
2025-04-27 21:47:50 -07:00
|
|
|
config: Config,
|
2025-05-15 14:50:30 -07:00
|
|
|
app_event_tx: AppEventSender,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
initial_prompt: Option<String>,
|
2025-05-04 11:12:40 -07:00
|
|
|
initial_images: Vec<PathBuf>,
|
2025-07-31 17:30:44 -07:00
|
|
|
enhanced_keys_supported: bool,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
) -> Self {
|
|
|
|
|
let (codex_op_tx, mut codex_op_rx) = unbounded_channel::<Op>();
|
|
|
|
|
|
|
|
|
|
let app_event_tx_clone = app_event_tx.clone();
|
|
|
|
|
// Create the Codex asynchronously so the UI loads as quickly as possible.
|
2025-04-27 21:47:50 -07:00
|
|
|
let config_for_agent_loop = config.clone();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
tokio::spawn(async move {
|
2025-07-27 20:01:35 -07:00
|
|
|
let CodexConversation {
|
|
|
|
|
codex,
|
|
|
|
|
session_configured,
|
|
|
|
|
..
|
|
|
|
|
} = match init_codex(config_for_agent_loop).await {
|
|
|
|
|
Ok(vals) => vals,
|
|
|
|
|
Err(e) => {
|
|
|
|
|
// TODO: surface this error to the user.
|
|
|
|
|
tracing::error!("failed to initialize codex: {e}");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
};
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
|
|
|
|
|
// Forward the captured `SessionInitialized` event that was consumed
|
|
|
|
|
// inside `init_codex()` so it can be rendered in the UI.
|
2025-07-27 20:01:35 -07:00
|
|
|
app_event_tx_clone.send(AppEvent::CodexEvent(session_configured.clone()));
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
let codex = Arc::new(codex);
|
|
|
|
|
let codex_clone = codex.clone();
|
|
|
|
|
tokio::spawn(async move {
|
|
|
|
|
while let Some(op) = codex_op_rx.recv().await {
|
|
|
|
|
let id = codex_clone.submit(op).await;
|
|
|
|
|
if let Err(e) = id {
|
|
|
|
|
tracing::error!("failed to submit op: {e}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
while let Ok(event) = codex.next_event().await {
|
2025-05-15 14:50:30 -07:00
|
|
|
app_event_tx_clone.send(AppEvent::CodexEvent(event));
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2025-05-17 09:00:23 -07:00
|
|
|
Self {
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
app_event_tx: app_event_tx.clone(),
|
|
|
|
|
codex_op_tx,
|
|
|
|
|
bottom_pane: BottomPane::new(BottomPaneParams {
|
|
|
|
|
app_event_tx,
|
|
|
|
|
has_input_focus: true,
|
2025-07-31 17:30:44 -07:00
|
|
|
enhanced_keys_supported,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}),
|
2025-08-06 12:03:45 -07:00
|
|
|
active_history_cell: None,
|
2025-04-27 21:47:50 -07:00
|
|
|
config,
|
2025-05-17 09:00:23 -07:00
|
|
|
initial_user_message: create_initial_user_message(
|
|
|
|
|
initial_prompt.unwrap_or_default(),
|
|
|
|
|
initial_images,
|
|
|
|
|
),
|
2025-08-07 05:17:18 -07:00
|
|
|
total_token_usage: TokenUsage::default(),
|
|
|
|
|
last_token_usage: TokenUsage::default(),
|
2025-07-16 22:26:31 -07:00
|
|
|
reasoning_buffer: String::new(),
|
2025-08-05 01:56:13 -07:00
|
|
|
content_buffer: String::new(),
|
2025-07-16 22:26:31 -07:00
|
|
|
answer_buffer: String::new(),
|
2025-07-31 00:43:21 -07:00
|
|
|
running_commands: HashMap::new(),
|
2025-08-04 21:23:22 -07:00
|
|
|
live_builder: RowBuilder::new(80),
|
|
|
|
|
current_stream: None,
|
|
|
|
|
stream_header_emitted: false,
|
|
|
|
|
live_max_rows: 3,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-31 00:43:21 -07:00
|
|
|
pub fn desired_height(&self, width: u16) -> u16 {
|
|
|
|
|
self.bottom_pane.desired_height(width)
|
2025-08-06 12:03:45 -07:00
|
|
|
+ self
|
|
|
|
|
.active_history_cell
|
|
|
|
|
.as_ref()
|
|
|
|
|
.map_or(0, |c| c.desired_height(width))
|
2025-07-30 17:06:55 -07:00
|
|
|
}
|
|
|
|
|
|
2025-05-15 14:50:30 -07:00
|
|
|
pub(crate) fn handle_key_event(&mut self, key_event: KeyEvent) {
|
2025-07-31 17:10:52 -07:00
|
|
|
if key_event.kind == KeyEventKind::Press {
|
|
|
|
|
self.bottom_pane.clear_ctrl_c_quit_hint();
|
|
|
|
|
}
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
|
2025-07-27 11:04:09 -07:00
|
|
|
match self.bottom_pane.handle_key_event(key_event) {
|
|
|
|
|
InputResult::Submitted(text) => {
|
|
|
|
|
self.submit_user_message(text.into());
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-07-27 11:04:09 -07:00
|
|
|
InputResult::None => {}
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-12 15:32:00 -07:00
|
|
|
pub(crate) fn handle_paste(&mut self, text: String) {
|
2025-07-27 11:04:09 -07:00
|
|
|
self.bottom_pane.handle_paste(text);
|
2025-07-12 15:32:00 -07:00
|
|
|
}
|
|
|
|
|
|
2025-07-30 10:05:40 -07:00
|
|
|
fn add_to_history(&mut self, cell: HistoryCell) {
|
|
|
|
|
self.app_event_tx
|
|
|
|
|
.send(AppEvent::InsertHistory(cell.plain_lines()));
|
2025-07-25 01:56:40 -07:00
|
|
|
}
|
|
|
|
|
|
2025-05-17 09:00:23 -07:00
|
|
|
fn submit_user_message(&mut self, user_message: UserMessage) {
|
|
|
|
|
let UserMessage { text, image_paths } = user_message;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
let mut items: Vec<InputItem> = Vec::new();
|
|
|
|
|
|
|
|
|
|
if !text.is_empty() {
|
|
|
|
|
items.push(InputItem::Text { text: text.clone() });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for path in image_paths {
|
|
|
|
|
items.push(InputItem::LocalImage { path });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if items.is_empty() {
|
2025-05-15 14:50:30 -07:00
|
|
|
return;
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.codex_op_tx
|
|
|
|
|
.send(Op::UserInput { items })
|
|
|
|
|
.unwrap_or_else(|e| {
|
|
|
|
|
tracing::error!("failed to send message: {e}");
|
|
|
|
|
});
|
|
|
|
|
|
feat: record messages from user in ~/.codex/history.jsonl (#939)
This is a large change to support a "history" feature like you would
expect in a shell like Bash.
History events are recorded in `$CODEX_HOME/history.jsonl`. Because it
is a JSONL file, it is straightforward to append new entries (as opposed
to the TypeScript file that uses `$CODEX_HOME/history.json`, so to be
valid JSON, each new entry entails rewriting the entire file). Because
it is possible for there to be multiple instances of Codex CLI writing
to `history.jsonl` at once, we use advisory file locking when working
with `history.jsonl` in `codex-rs/core/src/message_history.rs`.
Because we believe history is a sufficiently useful feature, we enable
it by default. Though to provide some safety, we set the file
permissions of `history.jsonl` to be `o600` so that other users on the
system cannot read the user's history. We do not yet support a default
list of `SENSITIVE_PATTERNS` as the TypeScript CLI does:
https://github.com/openai/codex/blob/3fdf9df1335ac9501e3fb0e61715359145711e8b/codex-cli/src/utils/storage/command-history.ts#L10-L17
We are going to take a more conservative approach to this list in the
Rust CLI. For example, while `/\b[A-Za-z0-9-_]{20,}\b/` might exclude
sensitive information like API tokens, it would also exclude valuable
information such as references to Git commits.
As noted in the updated documentation, users can opt-out of history by
adding the following to `config.toml`:
```toml
[history]
persistence = "none"
```
Because `history.jsonl` could, in theory, be quite large, we take a[n
arguably overly pedantic] approach in reading history entries into
memory. Specifically, we start by telling the client the current number
of entries in the history file (`history_entry_count`) as well as the
inode (`history_log_id`) of `history.jsonl` (see the new fields on
`SessionConfiguredEvent`).
The client is responsible for keeping new entries in memory to create a
"local history," but if the user hits up enough times to go "past" the
end of local history, then the client should use the new
`GetHistoryEntryRequest` in the protocol to fetch older entries.
Specifically, it should pass the `history_log_id` it was given
originally and work backwards from `history_entry_count`. (It should
really fetch history in batches rather than one-at-a-time, but that is
something we can improve upon in subsequent PRs.)
The motivation behind this crazy scheme is that it is designed to defend
against:
* The `history.jsonl` being truncated during the session such that the
index into the history is no longer consistent with what had been read
up to that point. We do not yet have logic to enforce a `max_bytes` for
`history.jsonl`, but once we do, we will aspire to implement it in a way
that should result in a new inode for the file on most systems.
* New items from concurrent Codex CLI sessions amending to the history.
Because, in absence of truncation, `history.jsonl` is an append-only
log, so long as the client reads backwards from `history_entry_count`,
it should always get a consistent view of history. (That said, it will
not be able to read _new_ commands from concurrent sessions, but perhaps
we will introduce a `/` command to reload latest history or something
down the road.)
Admittedly, my testing of this feature thus far has been fairly light. I
expect we will find bugs and introduce enhancements/fixes going forward.
2025-05-15 16:26:23 -07:00
|
|
|
// Persist the text to cross-session message history.
|
|
|
|
|
if !text.is_empty() {
|
|
|
|
|
self.codex_op_tx
|
|
|
|
|
.send(Op::AddToHistory { text: text.clone() })
|
|
|
|
|
.unwrap_or_else(|e| {
|
|
|
|
|
tracing::error!("failed to send AddHistory op: {e}");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
// Only show text portion in conversation history for now.
|
|
|
|
|
if !text.is_empty() {
|
2025-07-30 10:05:40 -07:00
|
|
|
self.add_to_history(HistoryCell::new_user_prompt(text.clone()));
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-15 14:50:30 -07:00
|
|
|
pub(crate) fn handle_codex_event(&mut self, event: Event) {
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
let Event { id, msg } = event;
|
|
|
|
|
match msg {
|
2025-05-13 19:22:16 -07:00
|
|
|
EventMsg::SessionConfigured(event) => {
|
feat: record messages from user in ~/.codex/history.jsonl (#939)
This is a large change to support a "history" feature like you would
expect in a shell like Bash.
History events are recorded in `$CODEX_HOME/history.jsonl`. Because it
is a JSONL file, it is straightforward to append new entries (as opposed
to the TypeScript file that uses `$CODEX_HOME/history.json`, so to be
valid JSON, each new entry entails rewriting the entire file). Because
it is possible for there to be multiple instances of Codex CLI writing
to `history.jsonl` at once, we use advisory file locking when working
with `history.jsonl` in `codex-rs/core/src/message_history.rs`.
Because we believe history is a sufficiently useful feature, we enable
it by default. Though to provide some safety, we set the file
permissions of `history.jsonl` to be `o600` so that other users on the
system cannot read the user's history. We do not yet support a default
list of `SENSITIVE_PATTERNS` as the TypeScript CLI does:
https://github.com/openai/codex/blob/3fdf9df1335ac9501e3fb0e61715359145711e8b/codex-cli/src/utils/storage/command-history.ts#L10-L17
We are going to take a more conservative approach to this list in the
Rust CLI. For example, while `/\b[A-Za-z0-9-_]{20,}\b/` might exclude
sensitive information like API tokens, it would also exclude valuable
information such as references to Git commits.
As noted in the updated documentation, users can opt-out of history by
adding the following to `config.toml`:
```toml
[history]
persistence = "none"
```
Because `history.jsonl` could, in theory, be quite large, we take a[n
arguably overly pedantic] approach in reading history entries into
memory. Specifically, we start by telling the client the current number
of entries in the history file (`history_entry_count`) as well as the
inode (`history_log_id`) of `history.jsonl` (see the new fields on
`SessionConfiguredEvent`).
The client is responsible for keeping new entries in memory to create a
"local history," but if the user hits up enough times to go "past" the
end of local history, then the client should use the new
`GetHistoryEntryRequest` in the protocol to fetch older entries.
Specifically, it should pass the `history_log_id` it was given
originally and work backwards from `history_entry_count`. (It should
really fetch history in batches rather than one-at-a-time, but that is
something we can improve upon in subsequent PRs.)
The motivation behind this crazy scheme is that it is designed to defend
against:
* The `history.jsonl` being truncated during the session such that the
index into the history is no longer consistent with what had been read
up to that point. We do not yet have logic to enforce a `max_bytes` for
`history.jsonl`, but once we do, we will aspire to implement it in a way
that should result in a new inode for the file on most systems.
* New items from concurrent Codex CLI sessions amending to the history.
Because, in absence of truncation, `history.jsonl` is an append-only
log, so long as the client reads backwards from `history_entry_count`,
it should always get a consistent view of history. (That said, it will
not be able to read _new_ commands from concurrent sessions, but perhaps
we will introduce a `/` command to reload latest history or something
down the road.)
Admittedly, my testing of this feature thus far has been fairly light. I
expect we will find bugs and introduce enhancements/fixes going forward.
2025-05-15 16:26:23 -07:00
|
|
|
self.bottom_pane
|
|
|
|
|
.set_history_metadata(event.history_log_id, event.history_entry_count);
|
2025-07-30 10:05:40 -07:00
|
|
|
// Record session information at the top of the conversation.
|
|
|
|
|
self.add_to_history(HistoryCell::new_session_info(&self.config, event, true));
|
2025-05-17 09:00:23 -07:00
|
|
|
|
|
|
|
|
if let Some(user_message) = self.initial_user_message.take() {
|
|
|
|
|
// If the user provided an initial message, add it to the
|
|
|
|
|
// conversation history.
|
|
|
|
|
self.submit_user_message(user_message);
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-15 14:50:30 -07:00
|
|
|
self.request_redraw();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-08-04 21:23:22 -07:00
|
|
|
EventMsg::AgentMessage(AgentMessageEvent { message: _ }) => {
|
|
|
|
|
// Final assistant answer: commit all remaining rows and close with
|
|
|
|
|
// a blank line. Use the final text if provided, otherwise rely on
|
|
|
|
|
// streamed deltas already in the builder.
|
|
|
|
|
self.finalize_stream(StreamKind::Answer);
|
2025-07-16 22:26:31 -07:00
|
|
|
self.request_redraw();
|
|
|
|
|
}
|
|
|
|
|
EventMsg::AgentMessageDelta(AgentMessageDeltaEvent { delta }) => {
|
2025-08-04 21:23:22 -07:00
|
|
|
self.begin_stream(StreamKind::Answer);
|
2025-07-25 01:56:40 -07:00
|
|
|
self.answer_buffer.push_str(&delta);
|
2025-08-04 21:23:22 -07:00
|
|
|
self.stream_push_and_maybe_commit(&delta);
|
|
|
|
|
self.request_redraw();
|
2025-07-16 22:26:31 -07:00
|
|
|
}
|
|
|
|
|
EventMsg::AgentReasoningDelta(AgentReasoningDeltaEvent { delta }) => {
|
2025-08-04 21:23:22 -07:00
|
|
|
// Stream CoT into the live pane; keep input visible and commit
|
|
|
|
|
// overflow rows incrementally to scrollback.
|
|
|
|
|
self.begin_stream(StreamKind::Reasoning);
|
2025-07-25 01:56:40 -07:00
|
|
|
self.reasoning_buffer.push_str(&delta);
|
2025-08-04 21:23:22 -07:00
|
|
|
self.stream_push_and_maybe_commit(&delta);
|
|
|
|
|
self.request_redraw();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-08-04 21:23:22 -07:00
|
|
|
EventMsg::AgentReasoning(AgentReasoningEvent { text: _ }) => {
|
|
|
|
|
// Final reasoning: commit remaining rows and close with a blank.
|
|
|
|
|
self.finalize_stream(StreamKind::Reasoning);
|
2025-07-16 22:26:31 -07:00
|
|
|
self.request_redraw();
|
2025-05-10 21:43:27 -07:00
|
|
|
}
|
2025-08-05 01:56:13 -07:00
|
|
|
EventMsg::AgentReasoningRawContentDelta(AgentReasoningRawContentDeltaEvent {
|
|
|
|
|
delta,
|
|
|
|
|
}) => {
|
|
|
|
|
// Treat raw reasoning content the same as summarized reasoning for UI flow.
|
|
|
|
|
self.begin_stream(StreamKind::Reasoning);
|
|
|
|
|
self.reasoning_buffer.push_str(&delta);
|
|
|
|
|
self.stream_push_and_maybe_commit(&delta);
|
|
|
|
|
self.request_redraw();
|
|
|
|
|
}
|
|
|
|
|
EventMsg::AgentReasoningRawContent(AgentReasoningRawContentEvent { text: _ }) => {
|
|
|
|
|
// Finalize the raw reasoning stream just like the summarized reasoning event.
|
|
|
|
|
self.finalize_stream(StreamKind::Reasoning);
|
|
|
|
|
self.request_redraw();
|
|
|
|
|
}
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
EventMsg::TaskStarted => {
|
2025-06-27 13:37:11 -04:00
|
|
|
self.bottom_pane.clear_ctrl_c_quit_hint();
|
2025-05-15 14:50:30 -07:00
|
|
|
self.bottom_pane.set_task_running(true);
|
2025-08-04 21:23:22 -07:00
|
|
|
// Replace composer with single-line spinner while waiting.
|
|
|
|
|
self.bottom_pane
|
|
|
|
|
.update_status_text("waiting for model".to_string());
|
2025-05-15 14:50:30 -07:00
|
|
|
self.request_redraw();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-05-19 16:08:18 -07:00
|
|
|
EventMsg::TaskComplete(TaskCompleteEvent {
|
|
|
|
|
last_agent_message: _,
|
|
|
|
|
}) => {
|
2025-05-15 14:50:30 -07:00
|
|
|
self.bottom_pane.set_task_running(false);
|
2025-08-04 21:23:22 -07:00
|
|
|
self.bottom_pane.clear_live_ring();
|
2025-05-15 14:50:30 -07:00
|
|
|
self.request_redraw();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
feat: show number of tokens remaining in UI (#1388)
When using the OpenAI Responses API, we now record the `usage` field for
a `"response.completed"` event, which includes metrics about the number
of tokens consumed. We also introduce `openai_model_info.rs`, which
includes current data about the most common OpenAI models available via
the API (specifically `context_window` and `max_output_tokens`). If
Codex does not recognize the model, you can set `model_context_window`
and `model_max_output_tokens` explicitly in `config.toml`.
When then introduce a new event type to `protocol.rs`, `TokenCount`,
which includes the `TokenUsage` for the most recent turn.
Finally, we update the TUI to record the running sum of tokens used so
the percentage of available context window remaining can be reported via
the placeholder text for the composer:

We could certainly get much fancier with this (such as reporting the
estimated cost of the conversation), but for now, we are just trying to
achieve feature parity with the TypeScript CLI.
Though arguably this improves upon the TypeScript CLI, as the TypeScript
CLI uses heuristics to estimate the number of tokens used rather than
using the `usage` information directly:
https://github.com/openai/codex/blob/296996d74e345b1b05d8c3451a06ace21c5ada96/codex-cli/src/utils/approximate-tokens-used.ts#L3-L16
Fixes https://github.com/openai/codex/issues/1242
2025-06-25 23:31:11 -07:00
|
|
|
EventMsg::TokenCount(token_usage) => {
|
2025-08-07 05:17:18 -07:00
|
|
|
self.total_token_usage = add_token_usage(&self.total_token_usage, &token_usage);
|
|
|
|
|
self.last_token_usage = token_usage;
|
|
|
|
|
self.bottom_pane.set_token_usage(
|
|
|
|
|
self.total_token_usage.clone(),
|
|
|
|
|
self.last_token_usage.clone(),
|
|
|
|
|
self.config.model_context_window,
|
|
|
|
|
);
|
feat: show number of tokens remaining in UI (#1388)
When using the OpenAI Responses API, we now record the `usage` field for
a `"response.completed"` event, which includes metrics about the number
of tokens consumed. We also introduce `openai_model_info.rs`, which
includes current data about the most common OpenAI models available via
the API (specifically `context_window` and `max_output_tokens`). If
Codex does not recognize the model, you can set `model_context_window`
and `model_max_output_tokens` explicitly in `config.toml`.
When then introduce a new event type to `protocol.rs`, `TokenCount`,
which includes the `TokenUsage` for the most recent turn.
Finally, we update the TUI to record the running sum of tokens used so
the percentage of available context window remaining can be reported via
the placeholder text for the composer:

We could certainly get much fancier with this (such as reporting the
estimated cost of the conversation), but for now, we are just trying to
achieve feature parity with the TypeScript CLI.
Though arguably this improves upon the TypeScript CLI, as the TypeScript
CLI uses heuristics to estimate the number of tokens used rather than
using the `usage` information directly:
https://github.com/openai/codex/blob/296996d74e345b1b05d8c3451a06ace21c5ada96/codex-cli/src/utils/approximate-tokens-used.ts#L3-L16
Fixes https://github.com/openai/codex/issues/1242
2025-06-25 23:31:11 -07:00
|
|
|
}
|
2025-05-13 20:44:42 -07:00
|
|
|
EventMsg::Error(ErrorEvent { message }) => {
|
2025-07-30 10:05:40 -07:00
|
|
|
self.add_to_history(HistoryCell::new_error_event(message.clone()));
|
2025-05-15 14:50:30 -07:00
|
|
|
self.bottom_pane.set_task_running(false);
|
2025-08-05 01:56:13 -07:00
|
|
|
self.bottom_pane.clear_live_ring();
|
|
|
|
|
self.live_builder = RowBuilder::new(self.live_builder.width());
|
|
|
|
|
self.current_stream = None;
|
|
|
|
|
self.stream_header_emitted = false;
|
|
|
|
|
self.answer_buffer.clear();
|
|
|
|
|
self.reasoning_buffer.clear();
|
|
|
|
|
self.content_buffer.clear();
|
|
|
|
|
self.request_redraw();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-07-31 13:45:52 -07:00
|
|
|
EventMsg::PlanUpdate(update) => {
|
2025-08-04 21:23:22 -07:00
|
|
|
// Commit plan updates directly to history (no status-line preview).
|
2025-07-31 13:45:52 -07:00
|
|
|
self.add_to_history(HistoryCell::new_plan_update(update));
|
|
|
|
|
}
|
2025-05-13 20:44:42 -07:00
|
|
|
EventMsg::ExecApprovalRequest(ExecApprovalRequestEvent {
|
2025-07-23 11:43:53 -07:00
|
|
|
call_id: _,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
command,
|
|
|
|
|
cwd,
|
|
|
|
|
reason,
|
2025-05-13 20:44:42 -07:00
|
|
|
}) => {
|
2025-08-05 01:56:13 -07:00
|
|
|
self.finalize_active_stream();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
let request = ApprovalRequest::Exec {
|
|
|
|
|
id,
|
|
|
|
|
command,
|
|
|
|
|
cwd,
|
|
|
|
|
reason,
|
|
|
|
|
};
|
2025-05-15 14:50:30 -07:00
|
|
|
self.bottom_pane.push_approval_request(request);
|
2025-07-28 12:00:06 -07:00
|
|
|
self.request_redraw();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-05-13 20:44:42 -07:00
|
|
|
EventMsg::ApplyPatchApprovalRequest(ApplyPatchApprovalRequestEvent {
|
2025-07-23 12:55:35 -07:00
|
|
|
call_id: _,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
changes,
|
|
|
|
|
reason,
|
|
|
|
|
grant_root,
|
2025-05-13 20:44:42 -07:00
|
|
|
}) => {
|
2025-08-05 01:56:13 -07:00
|
|
|
self.finalize_active_stream();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
// ------------------------------------------------------------------
|
|
|
|
|
// Before we even prompt the user for approval we surface the patch
|
|
|
|
|
// summary in the main conversation so that the dialog appears in a
|
|
|
|
|
// sensible chronological order:
|
|
|
|
|
// (1) codex → proposes patch (HistoryCell::PendingPatch)
|
|
|
|
|
// (2) UI → asks for approval (BottomPane)
|
|
|
|
|
// This mirrors how command execution is shown (command begins →
|
|
|
|
|
// approval dialog) and avoids surprising the user with a modal
|
|
|
|
|
// prompt before they have seen *what* is being requested.
|
|
|
|
|
// ------------------------------------------------------------------
|
2025-07-30 10:05:40 -07:00
|
|
|
self.add_to_history(HistoryCell::new_patch_event(
|
|
|
|
|
PatchEventType::ApprovalRequest,
|
|
|
|
|
changes,
|
|
|
|
|
));
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
|
|
|
|
|
// Now surface the approval request in the BottomPane as before.
|
|
|
|
|
let request = ApprovalRequest::ApplyPatch {
|
|
|
|
|
id,
|
|
|
|
|
reason,
|
|
|
|
|
grant_root,
|
|
|
|
|
};
|
2025-05-15 14:50:30 -07:00
|
|
|
self.bottom_pane.push_approval_request(request);
|
|
|
|
|
self.request_redraw();
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-05-13 20:44:42 -07:00
|
|
|
EventMsg::ExecCommandBegin(ExecCommandBeginEvent {
|
2025-07-31 00:43:21 -07:00
|
|
|
call_id,
|
2025-05-13 20:44:42 -07:00
|
|
|
command,
|
2025-07-31 00:43:21 -07:00
|
|
|
cwd,
|
2025-05-13 20:44:42 -07:00
|
|
|
}) => {
|
2025-08-05 01:56:13 -07:00
|
|
|
self.finalize_active_stream();
|
|
|
|
|
// Ensure the status indicator is visible while the command runs.
|
|
|
|
|
self.bottom_pane
|
|
|
|
|
.update_status_text("running command".to_string());
|
2025-07-31 00:43:21 -07:00
|
|
|
self.running_commands.insert(
|
|
|
|
|
call_id,
|
|
|
|
|
RunningCommand {
|
|
|
|
|
command: command.clone(),
|
|
|
|
|
cwd: cwd.clone(),
|
|
|
|
|
},
|
|
|
|
|
);
|
2025-08-06 12:03:45 -07:00
|
|
|
self.active_history_cell = Some(HistoryCell::new_active_exec_command(command));
|
|
|
|
|
}
|
|
|
|
|
EventMsg::ExecCommandOutputDelta(_) => {
|
|
|
|
|
// TODO
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-05-13 20:44:42 -07:00
|
|
|
EventMsg::PatchApplyBegin(PatchApplyBeginEvent {
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
call_id: _,
|
|
|
|
|
auto_approved,
|
|
|
|
|
changes,
|
2025-05-13 20:44:42 -07:00
|
|
|
}) => {
|
2025-07-30 10:05:40 -07:00
|
|
|
self.add_to_history(HistoryCell::new_patch_event(
|
|
|
|
|
PatchEventType::ApplyBegin { auto_approved },
|
|
|
|
|
changes,
|
|
|
|
|
));
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-08-06 12:03:45 -07:00
|
|
|
EventMsg::PatchApplyEnd(event) => {
|
2025-08-06 22:25:41 -07:00
|
|
|
if !event.success {
|
|
|
|
|
self.add_to_history(HistoryCell::new_patch_apply_failure(event.stderr));
|
|
|
|
|
}
|
2025-08-05 22:44:27 -07:00
|
|
|
}
|
2025-05-13 20:44:42 -07:00
|
|
|
EventMsg::ExecCommandEnd(ExecCommandEndEvent {
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
call_id,
|
|
|
|
|
exit_code,
|
2025-08-06 17:10:59 -07:00
|
|
|
duration: _,
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
stdout,
|
|
|
|
|
stderr,
|
2025-05-13 20:44:42 -07:00
|
|
|
}) => {
|
2025-08-04 21:23:22 -07:00
|
|
|
// Compute summary before moving stdout into the history cell.
|
2025-07-31 00:43:21 -07:00
|
|
|
let cmd = self.running_commands.remove(&call_id);
|
2025-08-06 12:03:45 -07:00
|
|
|
self.active_history_cell = None;
|
2025-07-30 10:05:40 -07:00
|
|
|
self.add_to_history(HistoryCell::new_completed_exec_command(
|
2025-07-31 00:43:21 -07:00
|
|
|
cmd.map(|cmd| cmd.command).unwrap_or_else(|| vec![call_id]),
|
2025-07-30 10:05:40 -07:00
|
|
|
CommandOutput {
|
|
|
|
|
exit_code,
|
|
|
|
|
stdout,
|
|
|
|
|
stderr,
|
|
|
|
|
},
|
|
|
|
|
));
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
2025-05-13 20:44:42 -07:00
|
|
|
EventMsg::McpToolCallBegin(McpToolCallBeginEvent {
|
2025-07-30 10:05:40 -07:00
|
|
|
call_id: _,
|
|
|
|
|
invocation,
|
2025-05-13 20:44:42 -07:00
|
|
|
}) => {
|
2025-08-05 01:56:13 -07:00
|
|
|
self.finalize_active_stream();
|
2025-07-30 10:05:40 -07:00
|
|
|
self.add_to_history(HistoryCell::new_active_mcp_tool_call(invocation));
|
2025-05-06 16:12:15 -07:00
|
|
|
}
|
2025-07-30 10:05:40 -07:00
|
|
|
EventMsg::McpToolCallEnd(McpToolCallEndEvent {
|
|
|
|
|
call_id: _,
|
|
|
|
|
duration,
|
|
|
|
|
invocation,
|
|
|
|
|
result,
|
|
|
|
|
}) => {
|
|
|
|
|
self.add_to_history(HistoryCell::new_completed_mcp_tool_call(
|
|
|
|
|
80,
|
|
|
|
|
invocation,
|
|
|
|
|
duration,
|
|
|
|
|
result
|
|
|
|
|
.as_ref()
|
|
|
|
|
.map(|r| r.is_error.unwrap_or(false))
|
|
|
|
|
.unwrap_or(false),
|
|
|
|
|
result,
|
|
|
|
|
));
|
2025-05-06 16:12:15 -07:00
|
|
|
}
|
feat: record messages from user in ~/.codex/history.jsonl (#939)
This is a large change to support a "history" feature like you would
expect in a shell like Bash.
History events are recorded in `$CODEX_HOME/history.jsonl`. Because it
is a JSONL file, it is straightforward to append new entries (as opposed
to the TypeScript file that uses `$CODEX_HOME/history.json`, so to be
valid JSON, each new entry entails rewriting the entire file). Because
it is possible for there to be multiple instances of Codex CLI writing
to `history.jsonl` at once, we use advisory file locking when working
with `history.jsonl` in `codex-rs/core/src/message_history.rs`.
Because we believe history is a sufficiently useful feature, we enable
it by default. Though to provide some safety, we set the file
permissions of `history.jsonl` to be `o600` so that other users on the
system cannot read the user's history. We do not yet support a default
list of `SENSITIVE_PATTERNS` as the TypeScript CLI does:
https://github.com/openai/codex/blob/3fdf9df1335ac9501e3fb0e61715359145711e8b/codex-cli/src/utils/storage/command-history.ts#L10-L17
We are going to take a more conservative approach to this list in the
Rust CLI. For example, while `/\b[A-Za-z0-9-_]{20,}\b/` might exclude
sensitive information like API tokens, it would also exclude valuable
information such as references to Git commits.
As noted in the updated documentation, users can opt-out of history by
adding the following to `config.toml`:
```toml
[history]
persistence = "none"
```
Because `history.jsonl` could, in theory, be quite large, we take a[n
arguably overly pedantic] approach in reading history entries into
memory. Specifically, we start by telling the client the current number
of entries in the history file (`history_entry_count`) as well as the
inode (`history_log_id`) of `history.jsonl` (see the new fields on
`SessionConfiguredEvent`).
The client is responsible for keeping new entries in memory to create a
"local history," but if the user hits up enough times to go "past" the
end of local history, then the client should use the new
`GetHistoryEntryRequest` in the protocol to fetch older entries.
Specifically, it should pass the `history_log_id` it was given
originally and work backwards from `history_entry_count`. (It should
really fetch history in batches rather than one-at-a-time, but that is
something we can improve upon in subsequent PRs.)
The motivation behind this crazy scheme is that it is designed to defend
against:
* The `history.jsonl` being truncated during the session such that the
index into the history is no longer consistent with what had been read
up to that point. We do not yet have logic to enforce a `max_bytes` for
`history.jsonl`, but once we do, we will aspire to implement it in a way
that should result in a new inode for the file on most systems.
* New items from concurrent Codex CLI sessions amending to the history.
Because, in absence of truncation, `history.jsonl` is an append-only
log, so long as the client reads backwards from `history_entry_count`,
it should always get a consistent view of history. (That said, it will
not be able to read _new_ commands from concurrent sessions, but perhaps
we will introduce a `/` command to reload latest history or something
down the road.)
Admittedly, my testing of this feature thus far has been fairly light. I
expect we will find bugs and introduce enhancements/fixes going forward.
2025-05-15 16:26:23 -07:00
|
|
|
EventMsg::GetHistoryEntryResponse(event) => {
|
|
|
|
|
let codex_core::protocol::GetHistoryEntryResponseEvent {
|
|
|
|
|
offset,
|
|
|
|
|
log_id,
|
|
|
|
|
entry,
|
|
|
|
|
} = event;
|
|
|
|
|
|
|
|
|
|
// Inform bottom pane / composer.
|
|
|
|
|
self.bottom_pane
|
|
|
|
|
.on_history_entry_response(log_id, offset, entry.map(|e| e.text));
|
|
|
|
|
}
|
2025-07-23 15:03:26 -07:00
|
|
|
EventMsg::ShutdownComplete => {
|
|
|
|
|
self.app_event_tx.send(AppEvent::ExitRequest);
|
|
|
|
|
}
|
2025-08-05 22:44:27 -07:00
|
|
|
EventMsg::TurnDiff(TurnDiffEvent { unified_diff }) => {
|
|
|
|
|
info!("TurnDiffEvent: {unified_diff}");
|
|
|
|
|
}
|
|
|
|
|
EventMsg::BackgroundEvent(BackgroundEventEvent { message }) => {
|
|
|
|
|
info!("BackgroundEvent: {message}");
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Update the live log preview while a task is running.
|
2025-05-15 14:50:30 -07:00
|
|
|
pub(crate) fn update_latest_log(&mut self, line: String) {
|
2025-08-05 01:56:13 -07:00
|
|
|
if self.bottom_pane.is_task_running() {
|
|
|
|
|
self.bottom_pane.update_status_text(line);
|
|
|
|
|
}
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
|
2025-05-15 14:50:30 -07:00
|
|
|
fn request_redraw(&mut self) {
|
2025-07-17 12:54:55 -07:00
|
|
|
self.app_event_tx.send(AppEvent::RequestRedraw);
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
|
2025-06-26 13:03:31 -07:00
|
|
|
pub(crate) fn add_diff_output(&mut self, diff_output: String) {
|
2025-07-30 10:05:40 -07:00
|
|
|
self.add_to_history(HistoryCell::new_diff_output(diff_output.clone()));
|
2025-04-25 12:01:52 -07:00
|
|
|
}
|
|
|
|
|
|
2025-08-05 23:57:52 -07:00
|
|
|
pub(crate) fn add_status_output(&mut self) {
|
|
|
|
|
self.add_to_history(HistoryCell::new_status_output(
|
|
|
|
|
&self.config,
|
2025-08-07 05:17:18 -07:00
|
|
|
&self.total_token_usage,
|
2025-08-05 23:57:52 -07:00
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-07 03:55:59 -07:00
|
|
|
pub(crate) fn add_prompts_output(&mut self) {
|
|
|
|
|
self.add_to_history(HistoryCell::new_prompts_output());
|
|
|
|
|
}
|
|
|
|
|
|
feat: add support for @ to do file search (#1401)
Introduces support for `@` to trigger a fuzzy-filename search in the
composer. Under the hood, this leverages
https://crates.io/crates/nucleo-matcher to do the fuzzy matching and
https://crates.io/crates/ignore to build up the list of file candidates
(so that it respects `.gitignore`).
For simplicity (at least for now), we do not do any caching between
searches like VS Code does for its file search:
https://github.com/microsoft/vscode/blob/1d89ed699b2e924d418c856318a3e12bca67ff3a/src/vs/workbench/services/search/node/rawSearchService.ts#L212-L218
Because we do not do any caching, I saw queries take up to three seconds
on large repositories with hundreds of thousands of files. To that end,
we do not perform searches synchronously on each keystroke, but instead
dispatch an event to do the search on a background thread that
asynchronously reports back to the UI when the results are available.
This is largely handled by the `FileSearchManager` introduced in this
PR, which also has logic for debouncing requests so there is at most one
search in flight at a time.
While we could potentially polish and tune this feature further, it may
already be overengineered for how it will be used, in practice, so we
can improve things going forward if it turns out that this is not "good
enough" in the wild.
Note this feature does not work like `@` in the TypeScript CLI, which
was more like directory-based tab completion. In the Rust CLI, `@`
triggers a full-repo fuzzy-filename search.
Fixes https://github.com/openai/codex/issues/1261.
2025-06-28 13:47:42 -07:00
|
|
|
/// Forward file-search results to the bottom pane.
|
2025-06-28 15:04:23 -07:00
|
|
|
pub(crate) fn apply_file_search_result(&mut self, query: String, matches: Vec<FileMatch>) {
|
feat: add support for @ to do file search (#1401)
Introduces support for `@` to trigger a fuzzy-filename search in the
composer. Under the hood, this leverages
https://crates.io/crates/nucleo-matcher to do the fuzzy matching and
https://crates.io/crates/ignore to build up the list of file candidates
(so that it respects `.gitignore`).
For simplicity (at least for now), we do not do any caching between
searches like VS Code does for its file search:
https://github.com/microsoft/vscode/blob/1d89ed699b2e924d418c856318a3e12bca67ff3a/src/vs/workbench/services/search/node/rawSearchService.ts#L212-L218
Because we do not do any caching, I saw queries take up to three seconds
on large repositories with hundreds of thousands of files. To that end,
we do not perform searches synchronously on each keystroke, but instead
dispatch an event to do the search on a background thread that
asynchronously reports back to the UI when the results are available.
This is largely handled by the `FileSearchManager` introduced in this
PR, which also has logic for debouncing requests so there is at most one
search in flight at a time.
While we could potentially polish and tune this feature further, it may
already be overengineered for how it will be used, in practice, so we
can improve things going forward if it turns out that this is not "good
enough" in the wild.
Note this feature does not work like `@` in the TypeScript CLI, which
was more like directory-based tab completion. In the Rust CLI, `@`
triggers a full-repo fuzzy-filename search.
Fixes https://github.com/openai/codex/issues/1261.
2025-06-28 13:47:42 -07:00
|
|
|
self.bottom_pane.on_file_search_result(query, matches);
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-27 13:37:11 -04:00
|
|
|
/// Handle Ctrl-C key press.
|
2025-07-28 12:00:06 -07:00
|
|
|
/// Returns CancellationEvent::Handled if the event was consumed by the UI, or
|
|
|
|
|
/// CancellationEvent::Ignored if the caller should handle it (e.g. exit).
|
|
|
|
|
pub(crate) fn on_ctrl_c(&mut self) -> CancellationEvent {
|
|
|
|
|
match self.bottom_pane.on_ctrl_c() {
|
|
|
|
|
CancellationEvent::Handled => return CancellationEvent::Handled,
|
|
|
|
|
CancellationEvent::Ignored => {}
|
|
|
|
|
}
|
2025-06-27 13:37:11 -04:00
|
|
|
if self.bottom_pane.is_task_running() {
|
2025-08-06 14:56:34 -07:00
|
|
|
self.interrupt_running_task();
|
2025-07-28 12:00:06 -07:00
|
|
|
CancellationEvent::Ignored
|
2025-06-27 13:37:11 -04:00
|
|
|
} else if self.bottom_pane.ctrl_c_quit_hint_visible() {
|
2025-07-23 15:03:26 -07:00
|
|
|
self.submit_op(Op::Shutdown);
|
2025-07-28 12:00:06 -07:00
|
|
|
CancellationEvent::Handled
|
2025-06-27 13:37:11 -04:00
|
|
|
} else {
|
|
|
|
|
self.bottom_pane.show_ctrl_c_quit_hint();
|
2025-07-28 12:00:06 -07:00
|
|
|
CancellationEvent::Ignored
|
2025-06-27 13:37:11 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-06 14:56:34 -07:00
|
|
|
pub(crate) fn on_ctrl_z(&mut self) {
|
|
|
|
|
self.interrupt_running_task();
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-16 08:59:26 -07:00
|
|
|
pub(crate) fn composer_is_empty(&self) -> bool {
|
|
|
|
|
self.bottom_pane.composer_is_empty()
|
|
|
|
|
}
|
|
|
|
|
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
/// Forward an `Op` directly to codex.
|
|
|
|
|
pub(crate) fn submit_op(&self, op: Op) {
|
|
|
|
|
if let Err(e) = self.codex_op_tx.send(op) {
|
|
|
|
|
tracing::error!("failed to submit op: {e}");
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-07-25 01:56:40 -07:00
|
|
|
|
2025-08-06 09:10:23 -07:00
|
|
|
/// Programmatically submit a user text message as if typed in the
|
|
|
|
|
/// composer. The text will be added to conversation history and sent to
|
|
|
|
|
/// the agent.
|
|
|
|
|
pub(crate) fn submit_text_message(&mut self, text: String) {
|
|
|
|
|
if text.is_empty() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
self.submit_user_message(text.into());
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-25 01:56:40 -07:00
|
|
|
pub(crate) fn token_usage(&self) -> &TokenUsage {
|
2025-08-07 05:17:18 -07:00
|
|
|
&self.total_token_usage
|
2025-07-25 01:56:40 -07:00
|
|
|
}
|
2025-07-31 21:34:32 -07:00
|
|
|
|
|
|
|
|
pub(crate) fn clear_token_usage(&mut self) {
|
2025-08-07 05:17:18 -07:00
|
|
|
self.total_token_usage = TokenUsage::default();
|
|
|
|
|
self.bottom_pane.set_token_usage(
|
|
|
|
|
self.total_token_usage.clone(),
|
|
|
|
|
self.last_token_usage.clone(),
|
|
|
|
|
self.config.model_context_window,
|
|
|
|
|
);
|
2025-07-31 21:34:32 -07:00
|
|
|
}
|
2025-08-03 11:31:35 -07:00
|
|
|
|
|
|
|
|
pub fn cursor_pos(&self, area: Rect) -> Option<(u16, u16)> {
|
2025-08-06 12:03:45 -07:00
|
|
|
let [_, bottom_pane_area] = self.layout_areas(area);
|
|
|
|
|
self.bottom_pane.cursor_pos(bottom_pane_area)
|
2025-08-03 11:31:35 -07:00
|
|
|
}
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
|
2025-08-04 21:23:22 -07:00
|
|
|
impl ChatWidget<'_> {
|
|
|
|
|
fn begin_stream(&mut self, kind: StreamKind) {
|
2025-08-05 01:56:13 -07:00
|
|
|
if let Some(current) = self.current_stream {
|
|
|
|
|
if current != kind {
|
|
|
|
|
self.finalize_stream(current);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-04 21:23:22 -07:00
|
|
|
if self.current_stream != Some(kind) {
|
|
|
|
|
self.current_stream = Some(kind);
|
|
|
|
|
self.stream_header_emitted = false;
|
|
|
|
|
// Clear any previous live content; we're starting a new stream.
|
|
|
|
|
self.live_builder = RowBuilder::new(self.live_builder.width());
|
|
|
|
|
// Ensure the waiting status is visible (composer replaced).
|
|
|
|
|
self.bottom_pane
|
|
|
|
|
.update_status_text("waiting for model".to_string());
|
2025-08-05 01:56:13 -07:00
|
|
|
self.emit_stream_header(kind);
|
2025-08-04 21:23:22 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn stream_push_and_maybe_commit(&mut self, delta: &str) {
|
|
|
|
|
self.live_builder.push_fragment(delta);
|
|
|
|
|
|
|
|
|
|
// Commit overflow rows (small batches) while keeping the last N rows visible.
|
|
|
|
|
let drained = self
|
|
|
|
|
.live_builder
|
|
|
|
|
.drain_commit_ready(self.live_max_rows as usize);
|
|
|
|
|
if !drained.is_empty() {
|
|
|
|
|
let mut lines: Vec<ratatui::text::Line<'static>> = Vec::new();
|
|
|
|
|
if !self.stream_header_emitted {
|
|
|
|
|
match self.current_stream {
|
|
|
|
|
Some(StreamKind::Reasoning) => {
|
|
|
|
|
lines.push(ratatui::text::Line::from("thinking".magenta().italic()));
|
|
|
|
|
}
|
|
|
|
|
Some(StreamKind::Answer) => {
|
|
|
|
|
lines.push(ratatui::text::Line::from("codex".magenta().bold()));
|
|
|
|
|
}
|
|
|
|
|
None => {}
|
|
|
|
|
}
|
|
|
|
|
self.stream_header_emitted = true;
|
|
|
|
|
}
|
|
|
|
|
for r in drained {
|
|
|
|
|
lines.push(ratatui::text::Line::from(r.text));
|
|
|
|
|
}
|
|
|
|
|
self.app_event_tx.send(AppEvent::InsertHistory(lines));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update the live ring overlay lines (text-only, newest at bottom).
|
|
|
|
|
let rows = self
|
|
|
|
|
.live_builder
|
|
|
|
|
.display_rows()
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|r| ratatui::text::Line::from(r.text))
|
|
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
self.bottom_pane
|
|
|
|
|
.set_live_ring_rows(self.live_max_rows, rows);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn finalize_stream(&mut self, kind: StreamKind) {
|
|
|
|
|
if self.current_stream != Some(kind) {
|
|
|
|
|
// Nothing to do; either already finalized or not the active stream.
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// Flush any partial line as a full row, then drain all remaining rows.
|
|
|
|
|
self.live_builder.end_line();
|
|
|
|
|
let remaining = self.live_builder.drain_rows();
|
|
|
|
|
// TODO: Re-add markdown rendering for assistant answers and reasoning.
|
|
|
|
|
// When finalizing, pass the accumulated text through `markdown::append_markdown`
|
|
|
|
|
// to build styled `Line<'static>` entries instead of raw plain text lines.
|
|
|
|
|
if !remaining.is_empty() || !self.stream_header_emitted {
|
|
|
|
|
let mut lines: Vec<ratatui::text::Line<'static>> = Vec::new();
|
|
|
|
|
if !self.stream_header_emitted {
|
|
|
|
|
match kind {
|
|
|
|
|
StreamKind::Reasoning => {
|
|
|
|
|
lines.push(ratatui::text::Line::from("thinking".magenta().italic()));
|
|
|
|
|
}
|
|
|
|
|
StreamKind::Answer => {
|
|
|
|
|
lines.push(ratatui::text::Line::from("codex".magenta().bold()));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
self.stream_header_emitted = true;
|
|
|
|
|
}
|
|
|
|
|
for r in remaining {
|
|
|
|
|
lines.push(ratatui::text::Line::from(r.text));
|
|
|
|
|
}
|
|
|
|
|
// Close the block with a blank line for readability.
|
|
|
|
|
lines.push(ratatui::text::Line::from(""));
|
|
|
|
|
self.app_event_tx.send(AppEvent::InsertHistory(lines));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Clear the live overlay and reset state for the next stream.
|
|
|
|
|
self.live_builder = RowBuilder::new(self.live_builder.width());
|
|
|
|
|
self.bottom_pane.clear_live_ring();
|
|
|
|
|
self.current_stream = None;
|
|
|
|
|
self.stream_header_emitted = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
impl WidgetRef for &ChatWidget<'_> {
|
|
|
|
|
fn render_ref(&self, area: Rect, buf: &mut Buffer) {
|
2025-08-06 12:03:45 -07:00
|
|
|
let [active_cell_area, bottom_pane_area] = self.layout_areas(area);
|
|
|
|
|
(&self.bottom_pane).render(bottom_pane_area, buf);
|
|
|
|
|
if let Some(cell) = &self.active_history_cell {
|
|
|
|
|
cell.render_ref(active_cell_area, buf);
|
|
|
|
|
}
|
feat: initial import of Rust implementation of Codex CLI in codex-rs/ (#629)
As stated in `codex-rs/README.md`:
Today, Codex CLI is written in TypeScript and requires Node.js 22+ to
run it. For a number of users, this runtime requirement inhibits
adoption: they would be better served by a standalone executable. As
maintainers, we want Codex to run efficiently in a wide range of
environments with minimal overhead. We also want to take advantage of
operating system-specific APIs to provide better sandboxing, where
possible.
To that end, we are moving forward with a Rust implementation of Codex
CLI contained in this folder, which has the following benefits:
- The CLI compiles to small, standalone, platform-specific binaries.
- Can make direct, native calls to
[seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) and
[landlock](https://man7.org/linux/man-pages/man7/landlock.7.html) in
order to support sandboxing on Linux.
- No runtime garbage collection, resulting in lower memory consumption
and better, more predictable performance.
Currently, the Rust implementation is materially behind the TypeScript
implementation in functionality, so continue to use the TypeScript
implmentation for the time being. We will publish native executables via
GitHub Releases as soon as we feel the Rust version is usable.
2025-04-24 13:31:40 -07:00
|
|
|
}
|
|
|
|
|
}
|
feat: show number of tokens remaining in UI (#1388)
When using the OpenAI Responses API, we now record the `usage` field for
a `"response.completed"` event, which includes metrics about the number
of tokens consumed. We also introduce `openai_model_info.rs`, which
includes current data about the most common OpenAI models available via
the API (specifically `context_window` and `max_output_tokens`). If
Codex does not recognize the model, you can set `model_context_window`
and `model_max_output_tokens` explicitly in `config.toml`.
When then introduce a new event type to `protocol.rs`, `TokenCount`,
which includes the `TokenUsage` for the most recent turn.
Finally, we update the TUI to record the running sum of tokens used so
the percentage of available context window remaining can be reported via
the placeholder text for the composer:

We could certainly get much fancier with this (such as reporting the
estimated cost of the conversation), but for now, we are just trying to
achieve feature parity with the TypeScript CLI.
Though arguably this improves upon the TypeScript CLI, as the TypeScript
CLI uses heuristics to estimate the number of tokens used rather than
using the `usage` information directly:
https://github.com/openai/codex/blob/296996d74e345b1b05d8c3451a06ace21c5ada96/codex-cli/src/utils/approximate-tokens-used.ts#L3-L16
Fixes https://github.com/openai/codex/issues/1242
2025-06-25 23:31:11 -07:00
|
|
|
|
|
|
|
|
fn add_token_usage(current_usage: &TokenUsage, new_usage: &TokenUsage) -> TokenUsage {
|
|
|
|
|
let cached_input_tokens = match (
|
|
|
|
|
current_usage.cached_input_tokens,
|
|
|
|
|
new_usage.cached_input_tokens,
|
|
|
|
|
) {
|
|
|
|
|
(Some(current), Some(new)) => Some(current + new),
|
|
|
|
|
(Some(current), None) => Some(current),
|
|
|
|
|
(None, Some(new)) => Some(new),
|
|
|
|
|
(None, None) => None,
|
|
|
|
|
};
|
|
|
|
|
let reasoning_output_tokens = match (
|
|
|
|
|
current_usage.reasoning_output_tokens,
|
|
|
|
|
new_usage.reasoning_output_tokens,
|
|
|
|
|
) {
|
|
|
|
|
(Some(current), Some(new)) => Some(current + new),
|
|
|
|
|
(Some(current), None) => Some(current),
|
|
|
|
|
(None, Some(new)) => Some(new),
|
|
|
|
|
(None, None) => None,
|
|
|
|
|
};
|
|
|
|
|
TokenUsage {
|
|
|
|
|
input_tokens: current_usage.input_tokens + new_usage.input_tokens,
|
|
|
|
|
cached_input_tokens,
|
|
|
|
|
output_tokens: current_usage.output_tokens + new_usage.output_tokens,
|
|
|
|
|
reasoning_output_tokens,
|
|
|
|
|
total_tokens: current_usage.total_tokens + new_usage.total_tokens,
|
|
|
|
|
}
|
|
|
|
|
}
|