agents-kit 0.0.1

Rust agent control Kit for Codex, OpenCode, and provider-backed Custom runtimes
Documentation
use serde::Serialize;

use super::CodexDynamicToolSpec;
use crate::KitError;

pub(super) struct CodexDynamicToolDeclarations {
    entries: Vec<CodexDynamicToolDeclaration>,
}

#[derive(Serialize)]
#[serde(tag = "type", rename_all = "camelCase")]
enum CodexDynamicToolDeclaration {
    Function(CodexDynamicFunction),
}

#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct CodexDynamicFunction {
    name: String,
    description: String,
    input_schema: serde_json::Value,
}

impl CodexDynamicToolDeclarations {
    pub(super) fn from_specs(specs: &[CodexDynamicToolSpec]) -> Result<Self, KitError> {
        let entries = specs
            .iter()
            .map(|spec| {
                CodexDynamicToolDeclaration::Function(CodexDynamicFunction {
                    name: spec.name.clone(),
                    description: spec.description.clone(),
                    input_schema: spec.input_schema.clone(),
                })
            })
            .collect();
        Ok(Self { entries })
    }

    pub(super) fn into_values(self) -> Result<Vec<serde_json::Value>, KitError> {
        self.entries
            .into_iter()
            .map(|entry| {
                serde_json::to_value(entry).map_err(|_| {
                    KitError::protocol("dynamic tool declaration could not be encoded")
                })
            })
            .collect()
    }
}