diff --git a/codex-rs/core/src/client_tool_metadata.rs b/codex-rs/core/src/client_tool_metadata.rs index 5fecb42a1b..f5193109de 100644 --- a/codex-rs/core/src/client_tool_metadata.rs +++ b/codex-rs/core/src/client_tool_metadata.rs @@ -2,9 +2,9 @@ //! Only the wire copy changes; model-visible input and WebSocket continuation history stay intact. use crate::tools::metadata_metrics; -use crate::utils::json::serialized_json_bytes; use codex_protocol::models::ResponseItem; use codex_protocol::models::bound_executed_tool_calls_for_message; +use codex_utils_string::serialized_json_bytes; use serde::Serialize; const MAX_RESPONSE_MESSAGE_BYTES: usize = 15 * 1024 * 1024; diff --git a/codex-rs/core/src/context_manager/history.rs b/codex-rs/core/src/context_manager/history.rs index 42c894f294..9e2624bf03 100644 --- a/codex-rs/core/src/context_manager/history.rs +++ b/codex-rs/core/src/context_manager/history.rs @@ -33,7 +33,6 @@ use crate::guardian::GUARDIAN_MAX_ROOT_MESSAGE_TOKENS; use crate::guardian::guardian_truncate_text; use crate::session::FileAudioDurations; use crate::session::turn_context::TurnContext; -use crate::utils::json::serialized_json_bytes; use base64::Engine; use base64::engine::general_purpose::STANDARD as BASE64_STANDARD; use codex_attachment_store::AttachmentStore; @@ -79,6 +78,7 @@ use codex_utils_output_truncation::approx_token_count; use codex_utils_output_truncation::approx_tokens_from_byte_count_i64; use codex_utils_output_truncation::truncate_function_output_payload; use codex_utils_output_truncation::with_serialization_allowance; +use codex_utils_string::serialized_json_bytes; use image::ImageReader; use std::collections::BTreeSet; use std::io::Cursor; diff --git a/codex-rs/core/src/tools/executed_tool_calls.rs b/codex-rs/core/src/tools/executed_tool_calls.rs index 52df442d30..563acf59d8 100644 --- a/codex-rs/core/src/tools/executed_tool_calls.rs +++ b/codex-rs/core/src/tools/executed_tool_calls.rs @@ -39,7 +39,7 @@ use crate::tools::context::ToolOutput; use crate::tools::context::ToolPayload; use crate::tools::metadata_metrics; use crate::tools::router::ToolCall; -use crate::utils::json::serialized_json_bytes; +use codex_utils_string::serialized_json_bytes; mod seen_ids; diff --git a/codex-rs/core/src/utils/json.rs b/codex-rs/core/src/utils/json.rs deleted file mode 100644 index 54b2303f1f..0000000000 --- a/codex-rs/core/src/utils/json.rs +++ /dev/null @@ -1,22 +0,0 @@ -#[derive(Default)] -struct JsonByteCounter(usize); - -impl std::io::Write for JsonByteCounter { - fn write(&mut self, bytes: &[u8]) -> std::io::Result { - self.0 = self.0.saturating_add(bytes.len()); - Ok(bytes.len()) - } - - fn flush(&mut self) -> std::io::Result<()> { - Ok(()) - } -} - -/// Counts serialized JSON bytes without retaining the serialized output. -pub(crate) fn serialized_json_bytes( - value: &T, -) -> serde_json::Result { - let mut counter = JsonByteCounter::default(); - serde_json::to_writer(&mut counter, value)?; - Ok(counter.0) -} diff --git a/codex-rs/core/src/utils/mod.rs b/codex-rs/core/src/utils/mod.rs index b4bc359f3a..adbdcef12b 100644 --- a/codex-rs/core/src/utils/mod.rs +++ b/codex-rs/core/src/utils/mod.rs @@ -1,2 +1 @@ -pub(crate) mod json; pub mod path_utils; diff --git a/codex-rs/utils/string/src/json.rs b/codex-rs/utils/string/src/json.rs index da69ed6318..84a209e912 100644 --- a/codex-rs/utils/string/src/json.rs +++ b/codex-rs/utils/string/src/json.rs @@ -1,9 +1,30 @@ -//! JSON serialization helpers for ASCII-only transports and bounded output. +//! JSON serialization helpers for counting bytes, bounding output, and ASCII-only transports. use std::io; use serde::Serialize; +#[derive(Default)] +struct JsonByteCounter(usize); + +impl io::Write for JsonByteCounter { + fn write(&mut self, bytes: &[u8]) -> io::Result { + self.0 = self.0.saturating_add(bytes.len()); + Ok(bytes.len()) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } +} + +/// Counts serialized JSON bytes without retaining the serialized output. +pub fn serialized_json_bytes(value: &T) -> serde_json::Result { + let mut counter = JsonByteCounter::default(); + serde_json::to_writer(&mut counter, value)?; + Ok(counter.0) +} + struct AsciiJsonFormatter; impl serde_json::ser::Formatter for AsciiJsonFormatter { diff --git a/codex-rs/utils/string/src/lib.rs b/codex-rs/utils/string/src/lib.rs index cbc755829c..6c3b70d4df 100644 --- a/codex-rs/utils/string/src/lib.rs +++ b/codex-rs/utils/string/src/lib.rs @@ -1,6 +1,7 @@ mod json; mod truncate; +pub use json::serialized_json_bytes; pub use json::to_ascii_json_string; pub use json::to_json_string_bounded; pub use truncate::TextTruncation;