soma_codemode/execute/
call_tool.rs1use 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(¶ms, 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}