Skip to main content

oxios_kernel/skill/clawhub/
types.rs

1#![allow(missing_docs)]
2//! ClawHub marketplace types.
3//!
4//! API types matching ClawHub API responses, plus origin/lockfile types.
5
6use std::collections::HashMap;
7
8use serde::Deserialize;
9
10/// ClawHub search result.
11#[derive(Debug, Clone, serde::Serialize, Deserialize)]
12pub struct ClawHubSearchResult {
13    pub score: f64,
14    pub slug: String,
15    #[serde(rename = "displayName", default)]
16    pub display_name: String,
17    pub summary: Option<String>,
18    pub version: Option<String>,
19    #[serde(rename = "updatedAt", default)]
20    pub updated_at: Option<i64>,
21}
22
23/// ClawHub skill detail.
24#[derive(Debug, Clone, serde::Serialize, Deserialize)]
25#[serde(deny_unknown_fields)]
26pub struct ClawHubSkillDetail {
27    #[serde(default)]
28    pub skill: Option<ClawHubSkillMeta>,
29    #[serde(rename = "latestVersion", default)]
30    pub latest_version: Option<ClawHubVersion>,
31    #[serde(default)]
32    pub metadata: Option<ClawHubMetadata>,
33    #[serde(default)]
34    pub owner: Option<ClawHubOwner>,
35}
36
37/// ClawHub skill meta.
38#[derive(Debug, Clone, serde::Serialize, Deserialize)]
39#[serde(deny_unknown_fields)]
40pub struct ClawHubSkillMeta {
41    pub slug: String,
42    #[serde(rename = "displayName", default)]
43    pub display_name: String,
44    pub summary: Option<String>,
45    #[serde(default)]
46    pub tags: Option<HashMap<String, String>>,
47    #[serde(rename = "createdAt", default)]
48    pub created_at: i64,
49    #[serde(rename = "updatedAt", default)]
50    pub updated_at: i64,
51}
52
53/// ClawHub version entry.
54#[derive(Debug, Clone, serde::Serialize, Deserialize)]
55#[serde(deny_unknown_fields)]
56pub struct ClawHubVersion {
57    pub version: String,
58    #[serde(rename = "createdAt", default)]
59    pub created_at: i64,
60    pub changelog: Option<String>,
61}
62
63/// ClawHub skill metadata.
64#[derive(Debug, Clone, serde::Serialize, Deserialize)]
65#[serde(deny_unknown_fields)]
66pub struct ClawHubMetadata {
67    #[serde(default)]
68    pub os: Option<Vec<String>>,
69    #[serde(default)]
70    pub systems: Option<Vec<String>>,
71}
72
73/// ClawHub owner info.
74#[derive(Debug, Clone, serde::Serialize, Deserialize)]
75#[serde(deny_unknown_fields)]
76pub struct ClawHubOwner {
77    #[serde(default)]
78    pub handle: Option<String>,
79    #[serde(rename = "displayName", default)]
80    pub display_name: Option<String>,
81    #[serde(default)]
82    pub image: Option<String>,
83}
84
85/// ClawHub origin file (inside skill dir as .clawhub/origin.json).
86#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
87pub struct ClawHubOrigin {
88    pub version: u32,
89    pub registry: String,
90    pub slug: String,
91    #[serde(rename = "installedVersion")]
92    pub installed_version: String,
93    #[serde(rename = "installedAt")]
94    pub installed_at: String,
95    /// SHA-256 hex digest of the downloaded archive.
96    #[serde(rename = "sha256", skip_serializing_if = "Option::is_none")]
97    pub sha256: Option<String>,
98}
99
100/// ClawHub lockfile (at workspace root as .clawhub/lock.json).
101#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
102pub struct ClawHubLockfile {
103    pub version: u32,
104    pub skills: HashMap<String, ClawHubLockEntry>,
105}
106
107/// A single entry in the lockfile.
108#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
109pub struct ClawHubLockEntry {
110    pub version: String,
111    #[serde(rename = "installedAt")]
112    pub installed_at: String,
113}
114
115/// Response wrapper for search results.
116#[derive(Debug, Clone, Deserialize)]
117pub struct SearchResponse {
118    pub results: Vec<ClawHubSearchResult>,
119}