Skip to main content

soma_codemode/execute/
call_tool.rs

1use serde_json::Value;
2
3use crate::host::{CodeModeHost, ExecCtx, ToolCallOutcome};
4use crate::schema::validate_code_mode_params_against_schema;
5use crate::types::{CodeModeCaller, CodeModeSurface, ToolDescriptor, ToolScope};
6use crate::ToolError;
7
8pub async fn call_host_tool<H: CodeModeHost>(
9    host: &H,
10    descriptor: &ToolDescriptor,
11    params: Value,
12    caller: &CodeModeCaller,
13    surface: CodeModeSurface,
14    scope: &ToolScope,
15) -> Result<ToolCallOutcome, ToolError> {
16    if !scope.allows(&descriptor.id) {
17        return Err(ToolError::Forbidden {
18            message: format!("Code Mode scope does not allow `{}`", descriptor.id),
19            required_scopes: vec![descriptor.namespace.clone()],
20        });
21    }
22    validate_code_mode_params_against_schema(&params, descriptor.schema.as_ref())?;
23    host.call_tool(
24        &descriptor.id,
25        params,
26        caller,
27        surface,
28        scope,
29        ExecCtx::none(),
30    )
31    .await
32}