1use clap::{Parser, Subcommand};
2use std::path::PathBuf;
3use steer_core::api::Model;
4use strum::IntoEnumIterator;
5
6#[derive(Debug, Clone, Copy)]
8pub struct ModelArg(pub Model);
9
10impl From<ModelArg> for Model {
11 fn from(arg: ModelArg) -> Self {
12 arg.0
13 }
14}
15
16impl clap::ValueEnum for ModelArg {
17 fn value_variants<'a>() -> &'a [Self] {
18 use once_cell::sync::Lazy;
19 static VARIANTS: Lazy<Vec<ModelArg>> = Lazy::new(|| Model::iter().map(ModelArg).collect());
20 &VARIANTS
21 }
22
23 fn to_possible_value(&self) -> Option<clap::builder::PossibleValue> {
24 let s: &'static str = self.0.into();
25 let mut pv = clap::builder::PossibleValue::new(s);
26
27 for alias in self.0.aliases() {
29 pv = pv.alias(alias);
30 }
31
32 Some(pv)
33 }
34}
35
36#[derive(Parser)]
38#[command(version, about, long_about = None, author)]
39pub struct Cli {
40 #[arg(long)]
42 pub session: Option<String>,
43 #[arg(short, long)]
45 pub directory: Option<std::path::PathBuf>,
46
47 #[arg(short, long, value_enum, default_value_t = ModelArg(Model::default()))]
49 pub model: ModelArg,
50
51 #[arg(long)]
53 pub remote: Option<String>,
54
55 #[arg(long)]
57 pub system_prompt: Option<String>,
58
59 #[arg(long, env = "STEER_SESSION_DB", hide = true)]
61 pub session_db: Option<PathBuf>,
62
63 #[arg(long)]
65 pub session_config: Option<PathBuf>,
66
67 #[arg(long)]
69 pub theme: Option<String>,
70
71 #[arg(long, hide = true)]
73 pub force_setup: bool,
74
75 #[command(subcommand)]
77 pub command: Option<Commands>,
78}
79
80#[derive(Subcommand, Clone)]
81pub enum Commands {
82 Tui {
84 #[arg(long)]
86 remote: Option<String>,
87 #[arg(long)]
89 session_config: Option<PathBuf>,
90 #[arg(long)]
92 theme: Option<String>,
93 #[arg(long, hide = true)]
95 force_setup: bool,
96 },
97 Preferences {
99 #[command(subcommand)]
100 action: PreferencesCommands,
101 },
102 Headless {
104 #[arg(long)]
106 model: Option<ModelArg>,
107
108 #[arg(long)]
110 messages_json: Option<PathBuf>,
111
112 #[arg(long)]
114 session: Option<String>,
115
116 #[arg(long)]
118 session_config: Option<PathBuf>,
119
120 #[arg(long)]
122 system_prompt: Option<String>,
123
124 #[arg(long)]
126 remote: Option<String>,
127 },
128 Server {
130 #[arg(long, default_value = "50051")]
132 port: u16,
133
134 #[arg(long, default_value = "127.0.0.1")]
136 bind: String,
137 },
138 Session {
140 #[command(subcommand)]
141 session_command: SessionCommands,
142 },
143 #[clap(hide = true)]
145 Notify {
146 #[clap(long)]
147 title: String,
148 #[clap(long)]
149 message: String,
150 #[clap(long)]
151 sound: Option<String>,
152 },
153}
154
155#[derive(Subcommand, Clone)]
156pub enum PreferencesCommands {
157 Show,
159 Edit,
161 Reset,
163}
164
165#[derive(Subcommand, Clone)]
166pub enum SessionCommands {
167 List {
169 #[arg(long)]
171 active: bool,
172 #[arg(long, default_value = "20")]
174 limit: u32,
175 },
176 Create {
178 #[arg(long)]
180 session_config: Option<PathBuf>,
181 #[arg(long)]
183 metadata: Option<String>,
184 #[arg(long)]
186 system_prompt: Option<String>,
187 },
188 Delete {
190 session_id: String,
192 #[arg(long)]
194 force: bool,
195 },
196 Show {
198 session_id: String,
200 },
201}