use std::path::PathBuf;
use clap::{Args, Parser, Subcommand};
use crate::channel::SurfaceKind;
pub const DAG_GRAPH_OFF: &str = "off";
pub const DEFAULT_HEARTBEAT_INTERVAL_SECONDS: u64 = 1_800;
#[derive(Debug, Clone, PartialEq, Eq, Parser)]
#[command(name = "onepipeline", version, about, long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Clone, PartialEq, Eq, Subcommand)]
#[command(rename_all = "kebab-case")]
pub enum Command {
Start(StartArgs),
#[command(subcommand)]
Plan(PlanCommand),
Adopt(AdoptArgs),
#[command(subcommand)]
Channel(ChannelCommand),
Next(ReadArgs),
Reply(ReplyArgs),
Surface(SurfaceArgs),
Attest(AttestArgs),
Stop(StopArgs),
Runs(RunsArgs),
Status(OptionalRunArgs),
Host,
Monitor(ReadArgs),
Watch(WatchArgs),
Results(RunArgs),
Goals(OptionalRunArgs),
Transcript(TranscriptArgs),
Telemetry(TelemetryArgs),
#[command(hide = true, name = crate::engine::DRIVE_VERB)]
DriveRun(DriveRunArgs),
#[command(hide = true, name = crate::agentgraph::DRIVE_VERB)]
Drive(DriveArgs),
}
#[derive(Debug, Clone, PartialEq, Eq, Subcommand)]
#[command(rename_all = "kebab-case")]
pub enum PlanCommand {
Check(PlanCheckArgs),
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct PlanCheckArgs {
pub project: String,
#[arg(long = "check", value_name = "PATH")]
pub checks: Vec<PathBuf>,
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct StartArgs {
pub project: String,
#[arg(long, conflicts_with = "detach")]
pub attach: bool,
#[arg(long)]
pub detach: bool,
#[arg(long, value_name = "REF", default_value = DAG_GRAPH_OFF)]
pub dag_graph: String,
#[arg(long, value_name = "REF")]
pub pr_author_graph: Option<String>,
#[arg(long, value_name = "COMMAND")]
pub node_validator: Option<String>,
#[arg(long, value_name = "COMMAND")]
pub envelope_reviewer: Option<String>,
#[arg(long, value_name = "SECONDS", default_value_t = DEFAULT_HEARTBEAT_INTERVAL_SECONDS)]
pub heartbeat_interval: u64,
#[arg(long = "set", value_name = "PATH=VALUE")]
pub dag_sets: Vec<String>,
#[arg(long = "node-set", value_name = "PATH=VALUE")]
pub node_sets: Vec<String>,
#[arg(long)]
pub acknowledge_concurrent: bool,
#[arg(long, value_name = "FILE")]
pub launch_config: Option<PathBuf>,
#[arg(long, value_name = "SPEC")]
pub filter_agentgraph: Option<String>,
#[arg(long, value_name = "SPEC")]
pub filter_vcs: Option<String>,
#[arg(long = "filter-profile", value_name = "NAME=SPEC")]
pub filter_profiles: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct AdoptArgs {
pub run: String,
#[arg(long, conflicts_with = "detach")]
pub attach: bool,
#[arg(long)]
pub detach: bool,
}
pub(crate) const ADOPT_FLAG: &str = "adopt";
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct DriveRunArgs {
pub run: String,
#[arg(long = ADOPT_FLAG)]
pub adopt: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct ReadArgs {
pub run: String,
#[arg(long, value_name = "NAME|SPEC", conflicts_with = "all")]
pub filter: Option<String>,
#[arg(long)]
pub all: bool,
}
pub const DEFAULT_WATCH_TIMEOUT_SECONDS: u64 = 300;
pub const DEFAULT_WATCH_TICK_SECONDS: u64 = 30;
pub const WATCH_CURSOR_VERSION: &str = "1";
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, clap::ValueEnum)]
#[value(rename_all = "kebab-case")]
pub enum WatchUntil {
#[default]
Surface,
Settled,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct WatchArgs {
#[command(flatten)]
pub read: ReadArgs,
#[arg(long, value_name = "SECONDS", default_value_t = DEFAULT_WATCH_TIMEOUT_SECONDS)]
pub timeout: u64,
#[arg(long, value_name = "SECONDS", default_value_t = DEFAULT_WATCH_TICK_SECONDS)]
pub tick_interval: u64,
#[arg(long, value_name = "CURSOR")]
pub cursor: Option<String>,
#[arg(long, value_name = "CONDITION", value_enum, default_value_t = WatchUntil::Surface)]
pub until: WatchUntil,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct DriveArgs {
pub graph: String,
#[arg(long, value_name = "TEXT")]
pub task: String,
#[arg(long, value_name = "DIR")]
pub dir: PathBuf,
#[arg(long = "label", value_name = "KEY=VALUE")]
pub labels: Vec<String>,
#[arg(long = "set", value_name = "PATH=VALUE")]
pub sets: Vec<String>,
#[arg(long, value_name = "SPEC")]
pub event_filter: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Subcommand)]
#[command(rename_all = "kebab-case")]
pub enum ChannelCommand {
Serve(RunArgs),
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct RunArgs {
pub run: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct OptionalRunArgs {
pub run: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct ReplyArgs {
pub run: String,
pub file: Option<PathBuf>,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct SurfaceArgs {
pub run: String,
#[arg(conflicts_with = "message")]
pub file: Option<PathBuf>,
#[arg(long, value_enum)]
pub kind: SurfaceKind,
#[arg(long, value_name = "TEXT")]
pub message: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct AttestArgs {
pub run: String,
pub reference: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct StopArgs {
pub run: String,
#[arg(long)]
pub force: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct RunsArgs {
#[arg(long)]
pub mine: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct TranscriptArgs {
pub run: String,
pub node: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Args)]
pub struct TelemetryArgs {
pub run: Option<String>,
#[arg(long)]
pub breakdown: bool,
}