use std::path::PathBuf;
use std::sync::Arc;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::agent::ToolUse;
use crate::provenance::ExecutionProvenance;
use crate::provider::{Message, Usage};
pub const DEFAULT_MAX_STEPS: usize = 250;
#[derive(Debug, Clone)]
pub struct ImageAttachment {
pub data_url: String,
pub mime_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Session {
pub id: String,
pub title: Option<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub metadata: SessionMetadata,
pub agent: String,
#[serde(deserialize_with = "crate::session::tail_seed::deserialize_tail_vec")]
pub messages: Vec<Message>,
#[serde(deserialize_with = "crate::session::tail_seed::deserialize_tail_vec")]
pub tool_uses: Vec<ToolUse>,
pub usage: Usage,
#[serde(skip)]
pub max_steps: Option<usize>,
#[serde(skip)]
pub bus: Option<Arc<crate::bus::AgentBus>>,
}
#[derive(Clone, Default, Serialize, Deserialize)]
pub struct SessionMetadata {
pub directory: Option<PathBuf>,
pub model: Option<String>,
pub knowledge_snapshot: Option<PathBuf>,
pub provenance: Option<ExecutionProvenance>,
#[serde(default)]
pub auto_apply_edits: bool,
#[serde(default)]
pub allow_network: bool,
#[serde(default = "default_slash_autocomplete")]
pub slash_autocomplete: bool,
#[serde(default = "default_use_worktree")]
pub use_worktree: bool,
pub shared: bool,
pub share_url: Option<String>,
#[serde(default)]
pub rlm: crate::rlm::RlmConfig,
#[serde(skip)]
pub subcall_provider: Option<std::sync::Arc<dyn crate::provider::Provider>>,
#[serde(skip)]
pub subcall_model_name: Option<String>,
}
impl std::fmt::Debug for SessionMetadata {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SessionMetadata")
.field("directory", &self.directory)
.field("model", &self.model)
.field("knowledge_snapshot", &self.knowledge_snapshot)
.field("provenance", &self.provenance)
.field("auto_apply_edits", &self.auto_apply_edits)
.field("allow_network", &self.allow_network)
.field("slash_autocomplete", &self.slash_autocomplete)
.field("use_worktree", &self.use_worktree)
.field("shared", &self.shared)
.field("share_url", &self.share_url)
.field("rlm", &self.rlm)
.field(
"subcall_provider",
&self.subcall_provider.as_ref().map(|_| "<provider>"),
)
.field("subcall_model_name", &self.subcall_model_name)
.finish()
}
}
fn default_slash_autocomplete() -> bool {
true
}
fn default_use_worktree() -> bool {
true
}