ai-agent 0.13.4

Idiomatic agent sdk inspired by the claude code source leak
Documentation
// Source: /data/home/swei/claudecode/openclaudecode/src/query.ts
//! Query utilities - translates query logic from TypeScript
//!
//! This module provides basic query functionality, handling the main query
//! lifecycle and session state for conversations.

#![allow(dead_code)]

use serde::{Deserialize, Serialize};
use serde_json::Value;

/// Query configuration
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QueryConfig {
    /// Messages to send to the model
    pub messages: Vec<Value>,
    /// System prompt
    pub system_prompt: Option<String>,
    /// User context
    pub user_context: std::collections::HashMap<String, String>,
    /// System context
    pub system_context: std::collections::HashMap<String, String>,
    /// Query source
    pub query_source: Option<String>,
    /// Maximum output tokens override
    pub max_output_tokens_override: Option<u32>,
    /// Maximum turns
    pub max_turns: Option<u32>,
    /// Skip cache write
    pub skip_cache_write: Option<bool>,
    /// Task budget
    pub task_budget: Option<TaskBudget>,
}

impl Default for QueryConfig {
    fn default() -> Self {
        Self {
            messages: vec![],
            system_prompt: None,
            user_context: std::collections::HashMap::new(),
            system_context: std::collections::HashMap::new(),
            query_source: None,
            max_output_tokens_override: None,
            max_turns: None,
            skip_cache_write: None,
            task_budget: None,
        }
    }
}

/// Task budget configuration
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TaskBudget {
    /// Total budget for the task
    pub total: u32,
}

/// Query result
#[derive(Debug, Clone)]
pub struct QueryResult {
    /// Messages returned from the query
    pub messages: Vec<Value>,
    /// Whether the query was successful
    pub success: bool,
    /// Error message if query failed
    pub error: Option<String>,
}

impl Default for QueryResult {
    fn default() -> Self {
        Self {
            messages: vec![],
            success: true,
            error: None,
        }
    }
}

/// Execute a query with the given configuration
///
/// # Arguments
/// * `config` - Query configuration
///
/// # Returns
/// A future that resolves to QueryResult
pub async fn execute_query(config: QueryConfig) -> QueryResult {
    // Basic stub - returns the input messages
    // Full implementation would call the model API
    QueryResult {
        messages: config.messages,
        success: true,
        error: None,
    }
}

/// Query checkpoint for profiling
pub fn query_checkpoint(name: &str) {
    // Profiling hook - no-op in basic stub
    let _ = name;
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_query_config_default() {
        let config = QueryConfig::default();
        assert!(config.messages.is_empty());
        assert!(config.system_prompt.is_none());
    }

    #[test]
    fn test_query_result_default() {
        let result = QueryResult::default();
        assert!(result.success);
        assert!(result.error.is_none());
    }
}