Skip to main content

tandem_wire/
session.rs

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}