Skip to main content

systemprompt_cli/commands/admin/
mod.rs

1pub mod access_control;
2pub mod agents;
3pub mod bootstrap;
4pub mod bridge;
5pub mod config;
6pub mod keys;
7pub mod session;
8pub mod setup;
9pub mod users;
10
11use anyhow::Result;
12use clap::Subcommand;
13use systemprompt_runtime::DatabaseContext;
14
15use crate::CliConfig;
16use crate::shared::render_result;
17
18#[derive(Debug, Subcommand)]
19pub enum AdminCommands {
20    #[command(subcommand, about = "User management and IP banning")]
21    Users(users::UsersCommands),
22
23    #[command(subcommand, about = "Agent management")]
24    Agents(agents::AgentsCommands),
25
26    #[command(subcommand, about = "Configuration management and rate limits")]
27    Config(config::ConfigCommands),
28
29    #[command(about = "Interactive setup wizard for local development environment")]
30    Setup(setup::SetupArgs),
31
32    #[command(
33        about = "Idempotently ensure the platform admin user exists with the admin role. Required \
34                 by every install recipe before services start."
35    )]
36    Bootstrap(bootstrap::BootstrapArgs),
37
38    #[command(subcommand, about = "Manage CLI session and profile switching")]
39    Session(session::SessionCommands),
40
41    #[command(
42        subcommand,
43        about = "Bridge helper enrollment (device certs, exchange codes)"
44    )]
45    Bridge(bridge::BridgeCommands),
46
47    #[command(
48        subcommand,
49        name = "access-control",
50        about = "Access-control baseline operations (DB → YAML export)"
51    )]
52    AccessControl(access_control::AccessControlCommands),
53
54    #[command(
55        subcommand,
56        about = "RSA signing-key generation for the federated JWT plane"
57    )]
58    Keys(keys::KeysCommands),
59}
60
61pub async fn execute(cmd: AdminCommands, config: &CliConfig) -> Result<()> {
62    match cmd {
63        AdminCommands::Users(cmd) => users::execute(cmd, config).await,
64        AdminCommands::Agents(cmd) => agents::execute(cmd).await,
65        AdminCommands::Config(cmd) => config::execute(cmd, config),
66        AdminCommands::Setup(args) => {
67            let result = setup::execute(args, config).await?;
68            render_result(&result);
69            Ok(())
70        },
71        AdminCommands::Bootstrap(args) => {
72            let result = bootstrap::execute(args, config).await?;
73            render_result(&result);
74            Ok(())
75        },
76        AdminCommands::Session(cmd) => session::execute(cmd, config).await,
77        AdminCommands::Bridge(cmd) => bridge::execute(cmd, config).await,
78        AdminCommands::AccessControl(cmd) => access_control::execute(cmd, config).await,
79        AdminCommands::Keys(cmd) => keys::execute(cmd).await,
80    }
81}
82
83pub async fn execute_with_db(
84    cmd: AdminCommands,
85    db_ctx: &DatabaseContext,
86    config: &CliConfig,
87) -> Result<()> {
88    match cmd {
89        AdminCommands::Users(cmd) => users::execute_with_db(cmd, db_ctx, config).await,
90        _ => anyhow::bail!("This command requires full profile context"),
91    }
92}