use codex_code_mode_protocol::grpc; use codex_code_mode_protocol::host::MAX_FRAME_BYTES; use prost::Message; pub(super) fn request( session_id: &str, invocation_id: &str, result: Result, ) -> grpc::CompleteToolCallRequest { request_with_maximum(session_id, invocation_id, result, MAX_FRAME_BYTES) } fn request_with_maximum( session_id: &str, invocation_id: &str, result: Result, maximum_message_bytes: usize, ) -> grpc::CompleteToolCallRequest { let outcome = match result { Ok(value) => match serde_json::to_vec(&value) { Ok(output_json) => { grpc::complete_tool_call_request::Outcome::Succeeded(grpc::ToolCallSucceeded { output_json, }) } Err(error) => grpc::complete_tool_call_request::Outcome::Failed(grpc::ToolCallFailed { message: format!("failed to encode code-mode tool result: {error}"), }), }, Err(message) => { grpc::complete_tool_call_request::Outcome::Failed(grpc::ToolCallFailed { message }) } }; let mut request = grpc::CompleteToolCallRequest { session_id: session_id.to_string(), invocation_id: invocation_id.to_string(), outcome: Some(outcome), }; let encoded_bytes = request.encoded_len(); if encoded_bytes > maximum_message_bytes { request.outcome = Some(grpc::complete_tool_call_request::Outcome::Failed( grpc::ToolCallFailed { message: format!( "code-mode tool result of {encoded_bytes} encoded bytes exceeds the gRPC message limit of {maximum_message_bytes} bytes" ), }, )); } request } #[cfg(test)] #[path = "completion_tests.rs"] mod tests;