use chrono::Utc; use dirigent_protocol::types::meta::{Meta, ProviderMeta}; use dirigent_protocol::{Session, SessionMetadata}; use std::collections::HashMap; fn main() { println!("=== SessionMetadata JSON Examples ===\n"); // Example 1: Without new fields (backward compatible) println!("1. Basic SessionMetadata (without new fields):"); let basic = SessionMetadata { project_path: "/workspace/project".to_string(), model: Some("gpt-4".to_string()), total_messages: 10, system_message: None, current_mode_id: None, _meta: None, project_id: None, }; let json = serde_json::to_string_pretty(&basic).unwrap(); println!("{}\n", json); // Example 2: With current_mode_id println!("2. SessionMetadata with current_mode_id:"); let with_mode = SessionMetadata { project_path: "/workspace/project".to_string(), model: Some("claude-3-sonnet".to_string()), total_messages: 5, system_message: Some("You are a helpful coding assistant".to_string()), current_mode_id: Some("code_mode".to_string()), _meta: None, project_id: None, }; let json = serde_json::to_string_pretty(&with_mode).unwrap(); println!("{}\n", json); // Example 3: With provider metadata println!("3. SessionMetadata with provider metadata:"); let meta = Meta { provider: Some(ProviderMeta { name: "opencode".to_string(), original_ids: Some(HashMap::from([ ("session_id".to_string(), "ses_abc123xyz".to_string()), ("project_id".to_string(), "proj_456".to_string()), ])), raw_excerpt: Some(serde_json::json!({ "version": "0.15.31", "share": null })), }), extra: HashMap::new(), }; let with_meta = SessionMetadata { project_path: "/workspace/project".to_string(), model: Some("gpt-4-turbo".to_string()), total_messages: 15, system_message: Some("System prompt here".to_string()), current_mode_id: Some("architect".to_string()), _meta: Some(meta), project_id: None, }; let json = serde_json::to_string_pretty(&with_meta).unwrap(); println!("{}\n", json); // Example 4: Full Session object println!("4. Complete Session with all metadata fields:"); let now = Utc::now(); let session = Session { id: "ses_demo_123".to_string(), title: "My Coding Session".to_string(), created_at: now, updated_at: now, metadata: with_meta, models: None, modes: None, config_options: None, acp_client_id: None, cwd: None, }; let json = serde_json::to_string_pretty(&session).unwrap(); println!("{}\n", json); // Example 5: Verify backward compatibility println!("5. Backward compatibility test (deserializing old format):"); let old_json = r#"{ "project_path": "/old/project", "model": "gpt-3.5", "total_messages": 3 }"#; let parsed: SessionMetadata = serde_json::from_str(old_json).unwrap(); println!("Successfully parsed old JSON format:"); println!(" project_path: {}", parsed.project_path); println!(" model: {:?}", parsed.model); println!(" total_messages: {}", parsed.total_messages); println!(" system_message: {:?}", parsed.system_message); println!(" current_mode_id: {:?}", parsed.current_mode_id); println!(" _meta: {:?}", parsed._meta); }