1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use sqlx::FromRow;
4use systemprompt_identifiers::{
5 AgentName, ArtifactId, CategoryId, ContextId, ExecutionStepId, McpExecutionId, MessageId,
6 PlaybookId, SessionId, SkillId, SourceId, TaskId, TraceId, UserId,
7};
8use systemprompt_models::{UserContext, UserContextWithStats};
9
10#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
11pub struct UserContextRow {
12 pub context_id: ContextId,
13 pub user_id: UserId,
14 pub name: String,
15 pub created_at: DateTime<Utc>,
16 pub updated_at: DateTime<Utc>,
17}
18
19impl From<UserContextRow> for UserContext {
20 fn from(row: UserContextRow) -> Self {
21 Self {
22 context_id: row.context_id,
23 user_id: row.user_id,
24 name: row.name,
25 created_at: row.created_at,
26 updated_at: row.updated_at,
27 }
28 }
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
32pub struct UserContextWithStatsRow {
33 pub context_id: ContextId,
34 pub user_id: UserId,
35 pub name: String,
36 pub created_at: DateTime<Utc>,
37 pub updated_at: DateTime<Utc>,
38 pub task_count: i64,
39 pub message_count: i64,
40 pub last_message_at: Option<DateTime<Utc>>,
41}
42
43impl From<UserContextWithStatsRow> for UserContextWithStats {
44 fn from(row: UserContextWithStatsRow) -> Self {
45 Self {
46 context_id: row.context_id,
47 user_id: row.user_id,
48 name: row.name,
49 created_at: row.created_at,
50 updated_at: row.updated_at,
51 task_count: row.task_count,
52 message_count: row.message_count,
53 last_message_at: row.last_message_at,
54 }
55 }
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
59pub struct TaskRow {
60 pub task_id: TaskId,
61 pub context_id: ContextId,
62 pub status: String,
63 pub status_timestamp: Option<DateTime<Utc>>,
64 pub user_id: Option<UserId>,
65 pub session_id: Option<SessionId>,
66 pub trace_id: Option<TraceId>,
67 pub agent_name: Option<AgentName>,
68 pub started_at: Option<DateTime<Utc>>,
69 pub completed_at: Option<DateTime<Utc>>,
70 pub execution_time_ms: Option<i32>,
71 pub error_message: Option<String>,
72 pub metadata: Option<serde_json::Value>,
73 pub created_at: DateTime<Utc>,
74 pub updated_at: DateTime<Utc>,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
78pub struct TaskMessage {
79 pub id: i32,
80 pub task_id: TaskId,
81 pub message_id: MessageId,
82 pub client_message_id: Option<String>,
83 pub role: String,
84 pub context_id: Option<ContextId>,
85 pub user_id: Option<UserId>,
86 pub session_id: Option<SessionId>,
87 pub trace_id: Option<TraceId>,
88 pub sequence_number: i32,
89 pub created_at: DateTime<Utc>,
90 pub updated_at: DateTime<Utc>,
91 pub metadata: Option<serde_json::Value>,
92 pub reference_task_ids: Option<Vec<String>>,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
96pub struct MessagePart {
97 pub id: i32,
98 pub message_id: MessageId,
99 pub task_id: TaskId,
100 pub part_kind: String,
101 pub sequence_number: i32,
102 pub text_content: Option<String>,
103 pub file_name: Option<String>,
104 pub file_mime_type: Option<String>,
105 pub file_uri: Option<String>,
106 pub file_bytes: Option<String>,
107 pub data_content: Option<serde_json::Value>,
108 pub metadata: Option<serde_json::Value>,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
112pub struct SkillRow {
113 pub skill_id: SkillId,
114 pub file_path: String,
115 pub name: String,
116 pub description: String,
117 pub instructions: String,
118 pub enabled: bool,
119 pub tags: Option<Vec<String>>,
120 pub category_id: Option<CategoryId>,
121 pub source_id: SourceId,
122 pub created_at: DateTime<Utc>,
123 pub updated_at: DateTime<Utc>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
127pub struct PlaybookRow {
128 pub playbook_id: PlaybookId,
129 pub file_path: String,
130 pub name: String,
131 pub description: String,
132 pub instructions: String,
133 pub enabled: bool,
134 pub tags: Option<Vec<String>>,
135 pub category: String,
136 pub domain: String,
137 pub source_id: SourceId,
138 pub created_at: DateTime<Utc>,
139 pub updated_at: DateTime<Utc>,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
143pub struct ArtifactRow {
144 pub artifact_id: ArtifactId,
145 pub task_id: TaskId,
146 pub context_id: Option<ContextId>,
147 pub name: Option<String>,
148 pub description: Option<String>,
149 pub artifact_type: String,
150 pub source: Option<String>,
151 pub tool_name: Option<String>,
152 pub mcp_execution_id: Option<McpExecutionId>,
153 pub fingerprint: Option<String>,
154 pub skill_id: Option<SkillId>,
155 pub skill_name: Option<String>,
156 pub metadata: Option<serde_json::Value>,
157 pub created_at: DateTime<Utc>,
158}
159
160#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
161pub struct ArtifactPartRow {
162 pub id: i32,
163 pub artifact_id: ArtifactId,
164 pub context_id: ContextId,
165 pub part_kind: String,
166 pub sequence_number: i32,
167 pub text_content: Option<String>,
168 pub file_name: Option<String>,
169 pub file_mime_type: Option<String>,
170 pub file_uri: Option<String>,
171 pub file_bytes: Option<String>,
172 pub data_content: Option<serde_json::Value>,
173 pub metadata: Option<serde_json::Value>,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
177pub struct ExecutionStepBatchRow {
178 pub step_id: ExecutionStepId,
179 pub task_id: TaskId,
180 pub status: String,
181 pub content: serde_json::Value,
182 pub started_at: DateTime<Utc>,
183 pub completed_at: Option<DateTime<Utc>>,
184 pub duration_ms: Option<i32>,
185 pub error_message: Option<String>,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
189pub struct PushNotificationConfigRow {
190 pub id: String,
191 pub task_id: TaskId,
192 pub url: String,
193 pub endpoint: String,
194 pub token: Option<String>,
195 pub headers: Option<serde_json::Value>,
196 pub authentication: Option<serde_json::Value>,
197 pub created_at: DateTime<Utc>,
198 pub updated_at: DateTime<Utc>,
199}