Skip to main content

xz_skill/types/
skill.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4/// A registered skill with all its configuration.
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct Skill {
7    pub id: String,
8    pub name: String,
9    pub version: String,
10    pub description: String,
11    pub author: String,
12    pub prompt: String,
13    pub tools: Vec<ToolDefinition>,
14    pub config_schema: Option<serde_json::Value>,
15    pub default_config: Option<serde_json::Value>,
16    pub permissions: Vec<SkillPermission>,
17    pub enabled: bool,
18    pub created_at: u64,
19    pub updated_at: u64,
20    pub min_agent_version: Option<String>,
21}
22
23/// A tool available to a skill — may be built-in, WASM, or HTTP-based.
24#[derive(Debug, Clone, Serialize, Deserialize)]
25pub struct ToolDefinition {
26    pub name: String,
27    pub description: String,
28    pub input_schema: serde_json::Value,
29    pub tool_type: ToolType,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33#[serde(tag = "type")]
34pub enum ToolType {
35    #[serde(rename = "builtin")]
36    Builtin { handler: String },
37    #[serde(rename = "wasm")]
38    Wasm {
39        #[serde(skip)]
40        module: Vec<u8>,
41        #[serde(default)]
42        module_path: Option<String>,
43        memory_limit_mb: u64,
44        timeout_ms: u64,
45    },
46    #[serde(rename = "http")]
47    Http {
48        url: String,
49        method: String,
50        #[serde(default)]
51        headers: HashMap<String, String>,
52        timeout_ms: u64,
53    },
54}
55
56/// Permissions a skill may request.
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
58pub enum SkillPermission {
59    Network,
60    FileRead,
61    FileWrite,
62    Execute,
63    Custom(String),
64}
65
66/// Result of an upsert (register) operation.
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub enum UpsertResult {
69    Created,
70    Updated { changed_fields: Vec<String> },
71    Unchanged,
72}