use crate::sessions::ExternalAgentSessionMigration; use std::path::PathBuf; use std::time::Duration; const DEFAULT_SESSION_IMPORT_MAX_AGE: Duration = Duration::from_secs(30 * 24 * 60 * 60); const DEFAULT_SESSION_IMPORT_MAX_COUNT: usize = 50; /// Bounds session discovery for an external-agent import. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ExternalAgentSessionImportLimits { /// Oldest source-session modification age that remains eligible. pub max_age: Duration, /// Maximum number of eligible sessions returned by detection. pub max_sessions: usize, } impl Default for ExternalAgentSessionImportLimits { fn default() -> Self { Self { max_age: DEFAULT_SESSION_IMPORT_MAX_AGE, max_sessions: DEFAULT_SESSION_IMPORT_MAX_COUNT, } } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ExternalAgentConfigDetectOptions { pub include_home: bool, pub include_memory: bool, pub cwds: Option>, } #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct ExternalAgentConfigDetection { pub items: Vec, pub connectors: Vec, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct DetectedConnectorCandidate { pub name: String, pub session_count: u32, pub source: DetectedConnectorSource, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum DetectedConnectorSource { RemoteMcpServersConfig, SessionToolUse, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum ExternalAgentConfigMigrationItemType { Config, Skills, AgentsMd, Plugins, McpServerConfig, Subagents, Hooks, Commands, Memory, Sessions, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct PluginsMigration { pub marketplace_name: String, pub plugin_names: Vec, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct NamedMigration { pub name: String, } #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct MigrationDetails { pub plugins: Vec, pub skills: Vec, pub sessions: Vec, pub mcp_servers: Vec, pub hooks: Vec, pub subagents: Vec, pub commands: Vec, pub memory: Vec, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct PendingPluginImport { pub cwd: Option, pub description: String, pub details: MigrationDetails, } #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct PluginImportOutcome { pub succeeded_marketplaces: Vec, pub succeeded_plugin_ids: Vec, pub failed_marketplaces: Vec, pub failed_plugin_ids: Vec, pub raw_errors: Vec, } #[derive(Debug, Clone, Default, PartialEq, Eq)] pub struct ExternalAgentConfigImportOutcome { pub pending_plugin_imports: Vec, pub item_results: Vec, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ExternalAgentConfigImportItemResult { pub item_type: ExternalAgentConfigMigrationItemType, pub description: String, pub cwd: Option, pub success_count: u32, pub error_count: u32, pub successes: Vec, pub raw_errors: Vec, } impl ExternalAgentConfigImportItemResult { pub fn new( item_type: ExternalAgentConfigMigrationItemType, description: String, cwd: Option, ) -> Self { Self { item_type, description, cwd, success_count: 0, error_count: 0, successes: Vec::new(), raw_errors: Vec::new(), } } pub fn record_error(&mut self, raw_error: ExternalAgentConfigImportRawError) { self.error_count = self.error_count.saturating_add(1); self.raw_errors.push(raw_error); } pub fn record_success( &mut self, source: Option, target: Option, title: Option, ) { self.record_success_with_cwd(self.cwd.clone(), source, target, title); } pub fn record_success_with_cwd( &mut self, cwd: Option, source: Option, target: Option, title: Option, ) { self.success_count = self.success_count.saturating_add(1); self.successes.push(ExternalAgentConfigImportSuccess { item_type: self.item_type, cwd, source, target, title, }); } } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ExternalAgentConfigImportSuccess { pub item_type: ExternalAgentConfigMigrationItemType, pub cwd: Option, pub source: Option, pub target: Option, pub title: Option, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ExternalAgentConfigImportRawError { pub item_type: ExternalAgentConfigMigrationItemType, pub error_type: Option, pub sub_error_type: Option, pub failure_stage: String, pub message: String, pub cwd: Option, pub source: Option, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ExternalAgentConfigMigrationItem { pub item_type: ExternalAgentConfigMigrationItemType, pub description: String, pub cwd: Option, pub details: Option, }