Skip to main content

meerkat_tools/
lib.rs

1#![cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used))]
2//! meerkat-tools - Tool validation and dispatch for Meerkat
3//!
4//! This crate provides tool registry and dispatch functionality.
5//!
6//! ## Built-in Tools
7//!
8//! The [`builtin`] module provides built-in tools for task management and utilities.
9//! Use [`CompositeDispatcher`] to combine built-in tools with external MCP tools.
10//!
11//! ```text
12//! use meerkat_tools::{
13//!     CompositeDispatcher, BuiltinToolConfig, FileTaskStore,
14//!     find_project_root, ensure_rkat_dir,
15//! };
16//!
17//! let project_root = find_project_root(&std::env::current_dir().unwrap())
18//!     .expect("no .rkat directory found");
19//! ensure_rkat_dir(&project_root).unwrap();
20//! let store = Arc::new(FileTaskStore::in_project(&project_root));
21//! let dispatcher = CompositeDispatcher::new(
22//!     store,
23//!     &BuiltinToolConfig::default(),
24//!     Some(project_root),
25//!     None,
26//!     None,
27//!     None,
28//! )?;
29//! ```
30
31// On wasm32, use tokio_with_wasm as a drop-in replacement for tokio.
32#[cfg(target_arch = "wasm32")]
33pub mod tokio {
34    pub use tokio_with_wasm::alias::*;
35}
36
37#[cfg(not(target_arch = "wasm32"))]
38pub mod builder;
39pub mod builtin;
40pub mod control_plane;
41pub mod dispatcher;
42pub mod error;
43pub mod registry;
44pub mod schema;
45pub mod timeout;
46
47#[cfg(all(feature = "comms", not(target_arch = "wasm32")))]
48pub use builder::CommsDispatcherConfig;
49#[cfg(all(feature = "mcp", not(target_arch = "wasm32")))]
50pub use builder::McpDispatcherConfig;
51#[cfg(not(target_arch = "wasm32"))]
52pub use builder::{BuiltinDispatcherConfig, ToolDispatcherBuilder, build_builtin_dispatcher};
53#[cfg(feature = "comms")]
54pub use builtin::CommsToolSurface;
55pub use builtin::{
56    BuiltinTool, BuiltinToolConfig, BuiltinToolEntry, BuiltinToolError, CompositeDispatcher,
57    CompositeDispatcherError, EnforcedToolPolicy, MemoryTaskStore, ResolvedToolPolicy, TaskStore,
58    ToolMode, ToolPolicyLayer,
59};
60#[cfg(not(target_arch = "wasm32"))]
61pub use builtin::{FileTaskStore, ensure_rkat_dir, ensure_rkat_dir_async, find_project_root};
62pub use control_plane::{CatalogControlDispatcher, CatalogControlVisibilityProvider};
63#[cfg(not(target_arch = "wasm32"))]
64pub use dispatcher::ToolDispatcher;
65pub use dispatcher::{EmptyToolDispatcher, FilteredDispatcher};
66pub use error::{DispatchError, ToolError, ToolValidationError};
67#[cfg(feature = "comms")]
68pub use meerkat_comms::agent::{CommsToolDispatcher, DynCommsToolDispatcher, NoOpDispatcher};
69pub use registry::validate_tool_def;
70pub use schema::{empty_object_schema, schema_for};
71pub use timeout::ToolTimeoutPolicy;
72
73// Capability registrations
74inventory::submit! {
75    meerkat_capabilities::CapabilityRegistration {
76        id: meerkat_capabilities::CapabilityId::Builtins,
77        description: "Built-in tools: task_list, task_create, task_get, task_update, datetime, apply_patch, view_image, generate_image, blob_save_file, blob_load_file, blob_inspect",
78        scope: meerkat_capabilities::CapabilityScope::Universal,
79        requires_feature: None,
80        prerequisites: &[],
81        status_resolver: Some(|config| {
82            if config.tools.builtins_enabled {
83                meerkat_capabilities::CapabilityStatus::Available
84            } else {
85                meerkat_capabilities::CapabilityStatus::DisabledByPolicy {
86                    description: std::borrow::Cow::Borrowed("tools.builtins_enabled = false"),
87                }
88            }
89        }),
90    }
91}
92
93#[cfg(not(target_arch = "wasm32"))]
94inventory::submit! {
95    meerkat_capabilities::CapabilityRegistration {
96        id: meerkat_capabilities::CapabilityId::Shell,
97        description: "Shell tool with job management: shell, shell_jobs, shell_job_status, shell_job_cancel",
98        scope: meerkat_capabilities::CapabilityScope::Universal,
99        requires_feature: None,
100        prerequisites: &[],
101        status_resolver: Some(|config| {
102            if config.tools.shell_enabled {
103                meerkat_capabilities::CapabilityStatus::Available
104            } else {
105                meerkat_capabilities::CapabilityStatus::DisabledByPolicy {
106                    description: std::borrow::Cow::Borrowed("tools.shell_enabled = false"),
107                }
108            }
109        }),
110    }
111}
112
113// Skill registrations
114inventory::submit! {
115    meerkat_skills::SkillRegistration {
116        id: "task-workflow",
117        name: "Task Workflow",
118        description: "How to use task_create/task_update/task_list for structured work tracking",
119        scope: meerkat_core::skills::SkillScope::Builtin,
120        requires_capabilities: &["builtins"],
121        body: include_str!("../skills/task-workflow/SKILL.md"),
122        extensions: &[],
123    }
124}
125
126inventory::submit! {
127    meerkat_skills::SkillRegistration {
128        id: "skill-discovery-workflow",
129        name: "Skill Discovery Workflow",
130        description: "How to browse, load, and use Meerkat skills during a session",
131        scope: meerkat_core::skills::SkillScope::Builtin,
132        requires_capabilities: &["skills"],
133        body: include_str!("../skills/skill-discovery-workflow/SKILL.md"),
134        extensions: &[],
135    }
136}
137
138inventory::submit! {
139    meerkat_skills::SkillRegistration {
140        id: "builtin-utilities-workflow",
141        name: "Builtin Utilities Workflow",
142        description: "How to use Meerkat built-in utility tools safely and productively",
143        scope: meerkat_core::skills::SkillScope::Builtin,
144        requires_capabilities: &["builtins"],
145        body: include_str!("../skills/builtin-utilities-workflow/SKILL.md"),
146        extensions: &[],
147    }
148}
149
150#[cfg(not(target_arch = "wasm32"))]
151inventory::submit! {
152    meerkat_skills::SkillRegistration {
153        id: "shell-patterns",
154        name: "Shell Patterns",
155        description: "Background job patterns with shell and job management tools",
156        scope: meerkat_core::skills::SkillScope::Builtin,
157        requires_capabilities: &["builtins", "shell"],
158        body: include_str!("../skills/shell-patterns/SKILL.md"),
159        extensions: &[],
160    }
161}