Skip to main content

soma_codemode/
execute.rs

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}