1pub mod models;
2mod util;
3
4use serde::{Deserialize, Serialize};
5
6pub use models::*;
7pub use util::*;
8
9#[derive(Debug, Clone, Serialize, Deserialize, Default)]
11pub struct GitContext {
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub branch: Option<String>,
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub commit: Option<String>,
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub is_dirty: Option<bool>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize, Default)]
22pub struct RunContext {
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub cwd: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub git: Option<GitContext>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub runtime: Option<String>,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize, Default)]
33pub struct AgentPolicy {
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub sandbox_mode: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub network_access: Option<String>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub approval_policy: Option<String>,
40}
41
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
44#[serde(transparent)]
45pub struct Source(String);
46
47impl Source {
48 pub fn new(name: impl Into<String>) -> Self {
49 Self(name.into())
50 }
51}
52
53#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(rename_all = "snake_case")]
56pub enum ToolStatus {
57 Success,
58 Error,
59 InProgress,
60 Unknown,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct SessionSummary {
66 pub session_id: String,
67 pub source: Source,
68 pub project_hash: String,
69 pub start_ts: String,
70 pub end_ts: String,
71 pub event_count: usize,
72 pub user_message_count: usize,
73 pub tokens_input_total: u64,
74 pub tokens_output_total: u64,
75}