mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-05-17 18:38:57 +08:00
67 lines
2.1 KiB
Rust
67 lines
2.1 KiB
Rust
pub mod providers;
|
|
pub mod terminal;
|
|
|
|
use serde::Serialize;
|
|
use std::path::Path;
|
|
|
|
use providers::{claude, codex, gemini, openclaw, opencode};
|
|
|
|
#[derive(Debug, Clone, Serialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct SessionMeta {
|
|
pub provider_id: String,
|
|
pub session_id: String,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub title: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub summary: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub project_dir: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub created_at: Option<i64>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub last_active_at: Option<i64>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub source_path: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub resume_command: Option<String>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct SessionMessage {
|
|
pub role: String,
|
|
pub content: String,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub ts: Option<i64>,
|
|
}
|
|
|
|
pub fn scan_sessions() -> Vec<SessionMeta> {
|
|
let mut sessions = Vec::new();
|
|
sessions.extend(codex::scan_sessions());
|
|
sessions.extend(claude::scan_sessions());
|
|
sessions.extend(opencode::scan_sessions());
|
|
sessions.extend(openclaw::scan_sessions());
|
|
sessions.extend(gemini::scan_sessions());
|
|
|
|
sessions.sort_by(|a, b| {
|
|
let a_ts = a.last_active_at.or(a.created_at).unwrap_or(0);
|
|
let b_ts = b.last_active_at.or(b.created_at).unwrap_or(0);
|
|
b_ts.cmp(&a_ts)
|
|
});
|
|
|
|
sessions
|
|
}
|
|
|
|
pub fn load_messages(provider_id: &str, source_path: &str) -> Result<Vec<SessionMessage>, String> {
|
|
let path = Path::new(source_path);
|
|
match provider_id {
|
|
"codex" => codex::load_messages(path),
|
|
"claude" => claude::load_messages(path),
|
|
"opencode" => opencode::load_messages(path),
|
|
"openclaw" => openclaw::load_messages(path),
|
|
"gemini" => gemini::load_messages(path),
|
|
_ => Err(format!("Unsupported provider: {provider_id}")),
|
|
}
|
|
}
|