1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use tandem_types::HostRuntimeContext;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
6#[serde(rename_all = "camelCase")]
7pub struct WireModelSpec {
8 #[serde(rename = "providerID")]
9 pub provider_id: String,
10 #[serde(rename = "modelID")]
11 pub model_id: String,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
15#[serde(rename_all = "camelCase")]
16pub struct WireSession {
17 pub id: String,
18 #[serde(skip_serializing_if = "Option::is_none")]
19 pub slug: Option<String>,
20 #[serde(skip_serializing_if = "Option::is_none")]
21 pub version: Option<String>,
22 #[serde(rename = "projectID", skip_serializing_if = "Option::is_none")]
23 pub project_id: Option<String>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub directory: Option<String>,
26 #[serde(rename = "workspaceRoot", skip_serializing_if = "Option::is_none")]
27 pub workspace_root: Option<String>,
28 #[serde(
29 rename = "originWorkspaceRoot",
30 skip_serializing_if = "Option::is_none"
31 )]
32 pub origin_workspace_root: Option<String>,
33 #[serde(
34 rename = "attachedFromWorkspace",
35 skip_serializing_if = "Option::is_none"
36 )]
37 pub attached_from_workspace: Option<String>,
38 #[serde(
39 rename = "attachedToWorkspace",
40 skip_serializing_if = "Option::is_none"
41 )]
42 pub attached_to_workspace: Option<String>,
43 #[serde(rename = "attachTimestampMs", skip_serializing_if = "Option::is_none")]
44 pub attach_timestamp_ms: Option<u64>,
45 #[serde(rename = "attachReason", skip_serializing_if = "Option::is_none")]
46 pub attach_reason: Option<String>,
47 pub title: String,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub time: Option<WireSessionTime>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub model: Option<WireModelSpec>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub provider: Option<String>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub environment: Option<HostRuntimeContext>,
56 #[serde(default)]
57 pub messages: Vec<WireSessionMessage>,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
61pub struct WireSessionTime {
62 pub created: u64,
63 pub updated: u64,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
67pub struct WireSessionMessage {
68 pub info: WireMessageInfo,
69 pub parts: Vec<Value>,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
73#[serde(rename_all = "camelCase")]
74pub struct WireMessageInfo {
75 pub id: String,
76 #[serde(rename = "sessionID")]
77 pub session_id: String,
78 pub role: String,
79 pub time: WireMessageTime,
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub summary: Option<Value>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub agent: Option<String>,
84 #[serde(skip_serializing_if = "Option::is_none")]
85 pub model: Option<Value>,
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub deleted: Option<bool>,
88 #[serde(skip_serializing_if = "Option::is_none")]
89 pub reverted: Option<bool>,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
93pub struct WireMessageTime {
94 pub created: u64,
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub completed: Option<u64>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
100#[serde(rename_all = "camelCase")]
101pub struct WireMessagePart {
102 #[serde(skip_serializing_if = "Option::is_none")]
103 pub id: Option<String>,
104 #[serde(rename = "sessionID", skip_serializing_if = "Option::is_none")]
105 pub session_id: Option<String>,
106 #[serde(rename = "messageID", skip_serializing_if = "Option::is_none")]
107 pub message_id: Option<String>,
108 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
109 pub part_type: Option<String>,
110 #[serde(skip_serializing_if = "Option::is_none")]
111 pub text: Option<String>,
112 #[serde(skip_serializing_if = "Option::is_none")]
113 pub tool: Option<String>,
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub args: Option<Value>,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub state: Option<String>,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub result: Option<Value>,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub error: Option<String>,
122}