1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
68pub enum UpsertResult {
69 Created,
70 Updated { changed_fields: Vec<String> },
71 Unchanged,
72}