aico/commands/
init.rs

1use crate::consts::SESSION_FILE_NAME;
2use crate::exceptions::AicoError;
3use crate::fs::atomic_write_json;
4use crate::models::{SessionPointer, SessionView};
5use chrono::Utc;
6use std::env;
7use std::fs;
8#[cfg(unix)]
9use std::os::unix::fs::PermissionsExt;
10
11pub fn run(model: String) -> Result<(), AicoError> {
12    let current_dir = env::current_dir()?;
13    let session_file = current_dir.join(SESSION_FILE_NAME);
14
15    if session_file.exists() {
16        return Err(AicoError::Configuration(format!(
17            "Session file '{}' already exists in this directory.",
18            session_file.display()
19        )));
20    }
21
22    // 1. Prepare directories
23    let aico_dir = current_dir.join(".aico");
24    let history_root = aico_dir.join("history");
25    let sessions_dir = aico_dir.join("sessions");
26
27    // Create dirs with 0700 permissions
28    for dir in &[&aico_dir, &history_root, &sessions_dir] {
29        fs::create_dir_all(dir)?;
30        #[cfg(unix)]
31        {
32            let mut perms = fs::metadata(dir)?.permissions();
33            perms.set_mode(0o700);
34            fs::set_permissions(dir, perms)?;
35        }
36    }
37
38    // 2. Create .gitignore
39    let gitignore_path = aico_dir.join(".gitignore");
40    if !gitignore_path.exists() {
41        fs::write(&gitignore_path, "*\n!addons/\n!.gitignore\n")?;
42    }
43
44    // 3. Create SessionView
45    let view = SessionView {
46        model,
47        context_files: vec![],
48        message_indices: vec![],
49        history_start_pair: 0,
50        excluded_pairs: vec![],
51        created_at: Utc::now(),
52    };
53
54    let view_path = sessions_dir.join("main.json");
55    atomic_write_json(&view_path, &view)?;
56
57    // 4. Create Pointer (relative path)
58    let pointer = SessionPointer {
59        pointer_type: "aico_session_pointer_v1".to_string(),
60        path: ".aico/sessions/main.json".to_string(),
61    };
62    atomic_write_json(&session_file, &pointer)?;
63
64    println!("Initialized session file: {}", SESSION_FILE_NAME);
65
66    Ok(())
67}