Skip to main content

meerkat_contracts/capability/
mod.rs

1//! Typed capability model for Meerkat.
2//!
3//! Every capability known to Meerkat is a variant of [`CapabilityId`].
4//! Feature-gated crates self-register via [`inventory::submit!`] with
5//! [`CapabilityRegistration`].
6
7pub mod query;
8mod registry;
9
10pub use query::{CapabilitiesResponse, CapabilityEntry};
11pub use registry::{CapabilityRegistration, build_capabilities};
12
13use std::borrow::Cow;
14
15use serde::{Deserialize, Serialize};
16
17use crate::Protocol;
18
19/// Every capability known to Meerkat. Adding a variant forces updates to
20/// the registry, error mappings, and codegen templates.
21#[derive(
22    Debug,
23    Clone,
24    Copy,
25    PartialEq,
26    Eq,
27    PartialOrd,
28    Ord,
29    Hash,
30    Serialize,
31    Deserialize,
32    strum::EnumIter,
33    strum::EnumString,
34    strum::Display,
35)]
36#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
37#[serde(rename_all = "snake_case")]
38#[strum(serialize_all = "snake_case")]
39pub enum CapabilityId {
40    Sessions,
41    Streaming,
42    StructuredOutput,
43    Hooks,
44    Builtins,
45    Shell,
46    Comms,
47    MemoryStore,
48    SessionStore,
49    SessionCompaction,
50    Skills,
51    McpLive,
52}
53
54/// Where a capability applies.
55#[derive(Debug, Clone, Serialize, Deserialize)]
56#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
57pub enum CapabilityScope {
58    /// Available on all protocol surfaces.
59    Universal,
60    /// Available only on specific protocols.
61    Extension { protocols: Cow<'static, [Protocol]> },
62}
63
64/// Runtime status of a capability.
65#[derive(Debug, Clone, Serialize, Deserialize)]
66#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
67pub enum CapabilityStatus {
68    /// Compiled in, config-enabled, protocol supports it.
69    Available,
70    /// Compiled in but disabled by policy.
71    ///
72    /// `description` summarizes why — this is intentionally a human-readable
73    /// string, not a config path, because the reality is multi-layered:
74    /// always-compiled features like `Builtins` and `Shell` are controlled by
75    /// `AgentFactory` flags, per-build `AgentBuildConfig` overrides, and
76    /// `BuiltinToolConfig` policy layers (soft + enforced). A single
77    /// "config_path" can't represent that resolution chain.
78    DisabledByPolicy { description: Cow<'static, str> },
79    /// Not compiled into this build (feature flag absent).
80    NotCompiled { feature: Cow<'static, str> },
81    /// This protocol surface doesn't support it.
82    NotSupportedByProtocol { reason: Cow<'static, str> },
83}