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 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 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 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 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 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}