mod commands;
mod config;
mod launch;
mod output;
use clap::{Parser, Subcommand};
use commands::{
AccountShowArgs, BuyArgs, HireArgs, InitArgs, LaunchArgs, PaySuiArgs, QuoteArgs, SellArgs,
WorkAcceptArgs, WorkDisputeArgs, WorkRefundArgs, WorkReleaseArgs, WorkShowArgs,
WorkSubmitReceiptArgs,
};
use output::OutputMode;
#[derive(Parser, Debug)]
#[command(
name = "tai",
version,
about = "Tai — Sui-native tokenized agentic infrastructure",
long_about = None,
)]
struct Cli {
#[arg(long, value_enum, global = true, default_value_t = OutputMode::Auto)]
output: OutputMode,
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand, Debug)]
enum Command {
Init(InitArgs),
Status,
#[command(subcommand)]
Account(AccountCommand),
Quote(QuoteArgs),
#[command(subcommand)]
Pay(PayCommand),
Launch(LaunchArgs),
Buy(BuyArgs),
Sell(SellArgs),
Hire(HireArgs),
#[command(subcommand)]
Work(WorkCommand),
}
#[derive(Subcommand, Debug)]
enum AccountCommand {
Show(AccountShowArgs),
}
#[derive(Subcommand, Debug)]
enum PayCommand {
Sui(PaySuiArgs),
}
#[derive(Subcommand, Debug)]
enum WorkCommand {
Show(WorkShowArgs),
Accept(WorkAcceptArgs),
SubmitReceipt(WorkSubmitReceiptArgs),
Release(WorkReleaseArgs),
Refund(WorkRefundArgs),
Dispute(WorkDisputeArgs),
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("warn")),
)
.init();
let cli = Cli::parse();
match cli.command {
Command::Init(args) => commands::cmd_init(args, cli.output).await,
Command::Status => commands::cmd_status(cli.output).await,
Command::Account(AccountCommand::Show(args)) => {
commands::cmd_account_show(args, cli.output).await
}
Command::Quote(args) => commands::cmd_quote(args, cli.output).await,
Command::Pay(PayCommand::Sui(args)) => commands::cmd_pay_sui(args, cli.output).await,
Command::Launch(args) => commands::cmd_launch(args, cli.output).await,
Command::Buy(args) => commands::cmd_buy(args, cli.output).await,
Command::Sell(args) => commands::cmd_sell(args, cli.output).await,
Command::Hire(args) => commands::cmd_hire(args, cli.output).await,
Command::Work(WorkCommand::Show(args)) => commands::cmd_work_show(args, cli.output).await,
Command::Work(WorkCommand::Accept(args)) => {
commands::cmd_work_accept(args, cli.output).await
}
Command::Work(WorkCommand::SubmitReceipt(args)) => {
commands::cmd_work_submit_receipt(args, cli.output).await
}
Command::Work(WorkCommand::Release(args)) => {
commands::cmd_work_release(args, cli.output).await
}
Command::Work(WorkCommand::Refund(args)) => {
commands::cmd_work_refund(args, cli.output).await
}
Command::Work(WorkCommand::Dispute(args)) => {
commands::cmd_work_dispute(args, cli.output).await
}
}
}