1pub mod budget;
2pub mod call_tool;
3pub mod discovery;
4pub mod internal;
5pub mod proxy;
6pub mod result;
7pub mod runner;
8pub mod tool_dispatch;
9
10#[cfg(test)]
11mod budget_tests;
12#[cfg(test)]
13mod call_tool_tests;
14#[cfg(test)]
15mod discovery_tests;
16#[cfg(test)]
17mod internal_tests;
18#[cfg(test)]
19mod proxy_tests;
20#[cfg(test)]
21mod result_tests;
22#[cfg(test)]
23mod runner_tests;
24#[cfg(test)]
25mod tool_dispatch_tests;
26
27use std::sync::Arc;
28
29use crate::shape::shape_final_result;
30use crate::truncate::truncate_execution_response;
31use crate::types::{CodeModeExecutionResponse, UiLink};
32use crate::{normalize_user_code, CodeModeConfig, ToolError};
33
34#[derive(Debug, Clone, PartialEq)]
35pub struct CodeModeExecutionOutcome {
36 pub raw_response: CodeModeExecutionResponse,
37 pub display_response: CodeModeExecutionResponse,
38}
39
40pub async fn execute_inline(
41 code: &str,
42 config: CodeModeConfig,
43 ui_capture: Arc<std::sync::Mutex<Option<UiLink>>>,
44) -> Result<CodeModeExecutionOutcome, ToolError> {
45 let normalized = normalize_user_code(code);
46 let output =
47 crate::runner::run_code_mode_runner_once(crate::protocol::CodeModeRunnerInput::Start {
48 code: normalized,
49 proxy: String::new(),
50 })
51 .map_err(ToolError::internal_message)?;
52 match output {
53 crate::protocol::CodeModeRunnerOutput::Done { result, .. } => {
54 finish_response(result::response_from_runner(result, ui_capture), &config)
55 }
56 crate::protocol::CodeModeRunnerOutput::Error { kind, message } => Err(ToolError::Sdk {
57 sdk_kind: kind,
58 message,
59 }),
60 _ => Err(ToolError::internal_message(
61 "runner returned an unexpected non-terminal message",
62 )),
63 }
64}
65
66pub(crate) fn finish_response(
67 raw_response: CodeModeExecutionResponse,
68 config: &CodeModeConfig,
69) -> Result<CodeModeExecutionOutcome, ToolError> {
70 let shaped = shape_final_result(
71 raw_response.result.clone(),
72 config.result_shape_policy,
73 config.max_response_bytes,
74 config.max_response_tokens,
75 config.token_estimate_divisor,
76 );
77 let mut display_response = raw_response.clone();
78 display_response.result = shaped.result;
79 display_response = truncate_execution_response(
80 display_response,
81 config.max_response_bytes,
82 config.max_response_tokens,
83 config.token_estimate_divisor,
84 );
85 Ok(CodeModeExecutionOutcome {
86 raw_response,
87 display_response,
88 })
89}