mod accounting;
mod definitions;
mod handlers;
use std::sync::atomic::{AtomicBool, Ordering};
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub use accounting::{
baseline_policy, cap_baseline, request_overhead_tokens, schema_overhead_tokens,
settle_session_debt, BaselinePolicy,
};
pub(crate) use definitions::is_always_load;
pub use definitions::{
ast_grep_available, core_toolset_instructions, get_always_load_tool_definitions,
get_installable_tool_definitions, get_listed_tool_definitions, get_tool_definitions,
is_graph_scoped_tool, is_hidden_tool, is_read_only_tool, is_selectorless_local_graph_tool,
is_tool_area, reachable_tool_name, tool_area, CONTEXT_DESCRIPTION, CORE_TOOLS,
GRAPH_SELECTOR_INSTRUCTIONS, MORE_TOOL, RENAME_DESCRIPTION, TOOL_AREAS,
};
pub use handlers::{handle_tool_call, handle_tool_call_with_session, SessionState};
const MAX_RESPONSE_CHARS: usize = 15_000;
static RESPONSE_LIMIT_DISABLED: AtomicBool = AtomicBool::new(false);
pub fn disable_response_limit() {
RESPONSE_LIMIT_DISABLED.store(true, Ordering::Relaxed);
}
fn response_limit() -> usize {
if RESPONSE_LIMIT_DISABLED.load(Ordering::Relaxed) {
usize::MAX
} else {
MAX_RESPONSE_CHARS
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolDefinition {
pub name: String,
pub description: String,
#[serde(rename = "inputSchema")]
pub input_schema: Value,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Value>,
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<Value>,
}
pub struct ToolResult {
pub value: Value,
pub touched_files: Vec<String>,
}