1use std::collections::BTreeMap;
13
14use kernel::event::record::{AuditVerdict, ShelvedFrom};
15use kernel::{Address, B3Hash, RunId, Seq, TimeMs};
16use serde::{Deserialize, Serialize};
17
18use super::SkillShelf;
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
23#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
24pub struct SkillUsageAnswer {
25 pub skills: Vec<SkillUsageLine>,
27}
28
29#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
32#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
33pub struct SkillUsageLine {
34 pub name: String,
35 pub held: Vec<HeldSkill>,
39 pub versions: Vec<SkillVersion>,
41 pub uses: Vec<SkillUse>,
43 pub per_day: Vec<DayCount>,
45}
46
47#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
49#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
50pub struct HeldSkill {
51 pub shelf: SkillShelf,
52 pub digest: B3Hash,
53 pub audit: SkillAudit,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
59#[serde(tag = "state", rename_all = "snake_case")]
60#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
61pub enum SkillAudit {
62 Unaudited,
64 Audited { verdict: AuditVerdict, at: Seq },
66 Stale { audited: B3Hash },
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
73#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
74pub struct SkillVersion {
75 pub digest: B3Hash,
76 pub seq: Seq,
79 pub at: TimeMs,
80 pub run: RunId,
81 #[serde(default)]
82 pub author: VersionAuthor,
83}
84
85#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
88#[serde(tag = "by", rename_all = "snake_case")]
89#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
90pub enum VersionAuthor {
91 Shelved { seq: Seq, from: ShelvedFrom },
94 OutsideShelf,
97 #[default]
100 Unrecorded,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
105#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
106pub struct SkillUse {
107 pub run: RunId,
108 pub resident: Option<Address>,
110 pub seq: Seq,
111 pub at: TimeMs,
112 pub part: String,
115 pub digest: B3Hash,
117 pub outcome: UseOutcome,
118}
119
120#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
122#[serde(rename_all = "snake_case")]
123#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
124pub enum UseOutcome {
125 Ok,
126 Failed,
127 Unknown,
129}
130
131#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
133#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
134pub struct DayCount {
135 pub day: String,
137 pub count: u32,
138}
139
140#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
143#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
144pub struct McpUsageAnswer {
145 pub servers: Vec<McpServerUsage>,
147}
148
149#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
151#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
152pub struct McpServerUsage {
153 pub server: Option<String>,
156 pub configured: bool,
158 pub tools: Vec<McpToolUsage>,
160}
161
162#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
164#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
165pub struct McpToolUsage {
166 pub tool: String,
169 pub uses: Vec<McpUse>,
170 pub per_day: Vec<DayCount>,
171}
172
173#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
175#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
176pub struct McpUse {
177 pub run: RunId,
178 pub resident: Option<Address>,
179 pub seq: Seq,
180 pub at: TimeMs,
181 pub outcome: UseOutcome,
182}
183
184#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
186#[serde(rename_all = "snake_case")]
187#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
188pub enum UsageKind {
189 Skills,
190 Mcp,
191}
192
193#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
195#[serde(rename_all = "snake_case")]
196#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
197pub enum ExportFormat {
198 Jsonl,
199 Csv,
200}
201
202#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
204#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
205pub struct UsageExportAnswer {
206 pub what: UsageKind,
207 pub format: ExportFormat,
208 pub body: String,
210}
211
212#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
216#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
217pub struct ShellsAnswer {
218 pub interpreters: Vec<ShellCalls>,
220}
221
222#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
224#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
225pub struct ShellCalls {
226 pub interpreter: String,
229 pub calls: u64,
230 pub failures: BTreeMap<String, u64>,
233}