use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use stakpak_shared::models::integrations::openai::ChatMessage;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "UPPERCASE")]
pub enum SessionVisibility {
#[default]
Private,
Public,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "UPPERCASE")]
pub enum SessionStatus {
#[default]
Active,
Deleted,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Session {
pub id: Uuid,
pub title: String,
pub visibility: SessionVisibility,
pub status: SessionStatus,
pub cwd: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
pub active_checkpoint: Option<Checkpoint>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SessionSummary {
pub id: Uuid,
pub title: String,
pub visibility: SessionVisibility,
pub status: SessionStatus,
pub cwd: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub message_count: u32,
pub active_checkpoint_id: Uuid,
pub last_message_at: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Checkpoint {
pub id: Uuid,
pub session_id: Uuid,
pub parent_id: Option<Uuid>,
pub state: CheckpointState,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CheckpointSummary {
pub id: Uuid,
pub session_id: Uuid,
pub parent_id: Option<Uuid>,
pub message_count: u32,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub state: Option<CheckpointState>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct CheckpointState {
#[serde(default)]
pub messages: Vec<ChatMessage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Serialize)]
pub struct CreateSessionRequest {
pub title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub visibility: Option<SessionVisibility>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cwd: Option<String>,
pub state: CheckpointState,
}
#[derive(Debug, Serialize)]
pub struct CreateCheckpointRequest {
pub state: CheckpointState,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent_id: Option<Uuid>,
}
#[derive(Debug, Default, Serialize)]
pub struct ListSessionsQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub visibility: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct UpdateSessionRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub visibility: Option<SessionVisibility>,
}
#[derive(Debug, Default, Serialize)]
pub struct ListCheckpointsQuery {
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_state: Option<bool>,
}
#[derive(Debug, Deserialize)]
pub struct CreateSessionResponse {
pub session_id: Uuid,
pub checkpoint: Checkpoint,
}
#[derive(Debug, Deserialize)]
pub struct CreateCheckpointResponse {
pub checkpoint: Checkpoint,
}
#[derive(Debug, Deserialize)]
pub struct ListSessionsResponse {
pub sessions: Vec<SessionSummary>,
}
#[derive(Debug, Deserialize)]
pub struct GetSessionResponse {
pub session: Session,
}
#[derive(Debug, Deserialize)]
pub struct UpdateSessionResponse {
pub session: Session,
}
#[derive(Debug, Deserialize)]
pub struct DeleteSessionResponse {
pub success: bool,
pub deleted_at: DateTime<Utc>,
}
#[derive(Debug, Deserialize)]
pub struct ListCheckpointsResponse {
pub checkpoints: Vec<CheckpointSummary>,
}
#[derive(Debug, Deserialize)]
pub struct GetCheckpointResponse {
pub checkpoint: Checkpoint,
}
#[derive(Debug, Serialize)]
pub struct SearchDocsRequest {
pub keywords: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub exclude_keywords: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
}
#[derive(Debug, Serialize)]
pub struct SearchMemoryRequest {
pub keywords: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<DateTime<Utc>>,
}
#[derive(Debug, Serialize)]
pub struct SlackReadMessagesRequest {
pub channel: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u32>,
}
#[derive(Debug, Serialize)]
pub struct SlackReadRepliesRequest {
pub channel: String,
pub ts: String,
}
#[derive(Debug, Serialize)]
pub struct SlackSendMessageRequest {
pub channel: String,
pub markdown_text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub thread_ts: Option<String>,
}
#[derive(Debug, Serialize)]
pub(crate) struct ToolsCallParams {
pub name: String,
pub arguments: serde_json::Value,
}