use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use systemprompt_identifiers::{
AgentName, ArtifactId, ContextId, ExecutionStepId, McpExecutionId, MessageId, SessionId,
SkillId, TaskId, TraceId, UserId,
};
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub(crate) struct TaskRow {
pub task_id: TaskId,
pub context_id: ContextId,
pub status: String,
pub status_timestamp: Option<DateTime<Utc>>,
pub user_id: Option<UserId>,
pub session_id: Option<SessionId>,
pub trace_id: Option<TraceId>,
pub agent_name: Option<AgentName>,
pub started_at: Option<DateTime<Utc>>,
pub completed_at: Option<DateTime<Utc>>,
pub execution_time_ms: Option<i32>,
pub error_message: Option<String>,
pub metadata: Option<serde_json::Value>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct TaskMessage {
pub id: i32,
pub task_id: TaskId,
pub message_id: MessageId,
pub client_message_id: Option<String>,
pub role: String,
pub context_id: ContextId,
pub user_id: Option<UserId>,
pub session_id: Option<SessionId>,
pub trace_id: Option<TraceId>,
pub sequence_number: i32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub metadata: Option<serde_json::Value>,
pub reference_task_ids: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct MessagePart {
pub id: i32,
pub message_id: MessageId,
pub task_id: TaskId,
pub part_kind: String,
pub sequence_number: i32,
pub text_content: Option<String>,
pub file_name: Option<String>,
pub file_mime_type: Option<String>,
pub file_uri: Option<String>,
pub file_bytes: Option<String>,
pub data_content: Option<serde_json::Value>,
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ArtifactRow {
pub artifact_id: ArtifactId,
pub task_id: TaskId,
pub context_id: ContextId,
pub name: Option<String>,
pub description: Option<String>,
pub artifact_type: String,
pub source: Option<String>,
pub tool_name: Option<String>,
pub mcp_execution_id: Option<McpExecutionId>,
pub fingerprint: Option<String>,
pub skill_id: Option<SkillId>,
pub skill_name: Option<String>,
pub metadata: Option<serde_json::Value>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ArtifactPartRow {
pub id: i32,
pub artifact_id: ArtifactId,
pub context_id: ContextId,
pub part_kind: String,
pub sequence_number: i32,
pub text_content: Option<String>,
pub file_name: Option<String>,
pub file_mime_type: Option<String>,
pub file_uri: Option<String>,
pub file_bytes: Option<String>,
pub data_content: Option<serde_json::Value>,
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ExecutionStepBatchRow {
pub step_id: ExecutionStepId,
pub task_id: TaskId,
pub status: String,
pub content: serde_json::Value,
pub started_at: DateTime<Utc>,
pub completed_at: Option<DateTime<Utc>>,
pub duration_ms: Option<i32>,
pub error_message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub(crate) struct PushNotificationConfigRow {
pub id: String,
pub task_id: TaskId,
pub url: String,
pub endpoint: String,
pub token: Option<String>,
pub headers: Option<serde_json::Value>,
pub authentication: Option<serde_json::Value>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}