use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum MarkdownDialect {
CommonMark,
ZaloMd,
GChatText,
DiscordMd,
SlackMrkdwn,
TelegramHtml,
Plain,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum LengthUnit {
Chars,
Utf16,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ChannelCaps {
pub max_message_len: usize,
pub length_unit: LengthUnit,
pub dialect: MarkdownDialect,
pub threads: bool,
pub edit: bool,
pub typing: bool,
}
impl ChannelCaps {
pub fn basic() -> Self {
Self {
max_message_len: 2000,
length_unit: LengthUnit::Chars,
dialect: MarkdownDialect::CommonMark,
threads: false,
edit: false,
typing: false,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[non_exhaustive]
pub enum ToolPolicy {
#[default]
Web,
McpOnly,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct AgentCaps {
pub system_prompt: bool,
pub mcp: bool,
pub tool_policies: Vec<ToolPolicy>,
pub resume: bool,
pub stream: bool,
}
impl AgentCaps {
pub fn enforces(&self, policy: ToolPolicy) -> bool {
self.tool_policies.contains(&policy)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tool_policy_names() {
assert_eq!(
serde_json::to_string(&ToolPolicy::McpOnly).unwrap(),
"\"mcp-only\""
);
assert_eq!(ToolPolicy::default(), ToolPolicy::Web);
}
}