use std::path::PathBuf;
use std::time::Duration as StdDuration;
use clap::{Args, Subcommand, ValueEnum};
use super::util::parse_duration_arg;
#[derive(Debug, Args)]
pub(crate) struct SignalsArgs {
#[arg(long, global = true, value_name = "DIR")]
pub dir: Option<PathBuf>,
#[command(subcommand)]
pub command: SignalsCommand,
}
#[derive(Debug, Subcommand)]
pub(crate) enum SignalsCommand {
List(SignalsOutputArgs),
Pending(SignalsPendingArgs),
Sessions(SignalsOutputArgs),
Fire(Box<SignalsFireArgs>),
Resolve(SignalsResolveArgs),
Ack(SignalsAckArgs),
Hook(SignalsHookArgs),
}
#[derive(Debug, Args)]
pub(crate) struct SignalsOutputArgs {
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Args)]
pub(crate) struct SignalsPendingArgs {
#[arg(long, value_name = "ID")]
pub session: Option<String>,
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Args)]
pub(crate) struct SignalsFireArgs {
#[arg(long, value_name = "FILE", conflicts_with_all = ["summary", "source_url"])]
pub event: Option<PathBuf>,
#[arg(long)]
pub key: Option<String>,
#[arg(long, required_unless_present = "event")]
pub summary: Option<String>,
#[arg(long, required_unless_present = "event")]
pub source_url: Option<String>,
#[arg(long, default_value = "")]
pub why: String,
#[arg(
long,
default_value = "Check the source and decide whether it affects this work."
)]
pub action: String,
#[arg(long, default_value = "manual")]
pub provider: String,
#[arg(long, default_value = "manual")]
pub kind: String,
#[arg(long, value_enum, default_value_t = SignalSeverityArg::Warning)]
pub severity: SignalSeverityArg,
#[arg(long, default_value = "harn signals fire")]
pub producer: String,
#[arg(long, value_enum, default_value_t = SignalSignatureArg::Local)]
pub signature: SignalSignatureArg,
#[arg(long, value_name = "OWNER/NAME")]
pub repo: Option<String>,
#[arg(long, value_name = "DIR")]
pub cwd: Option<PathBuf>,
#[arg(long)]
pub topic: Option<String>,
#[arg(long, value_name = "DURATION", value_parser = parse_duration_arg)]
pub expires_in: Option<StdDuration>,
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Args)]
pub(crate) struct SignalsResolveArgs {
pub key: String,
#[arg(long)]
pub summary: Option<String>,
#[arg(long, value_enum, default_value_t = SignalSignatureArg::Local)]
pub signature: SignalSignatureArg,
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Args)]
pub(crate) struct SignalsAckArgs {
pub key: String,
#[arg(long)]
pub generation: Option<u64>,
#[arg(long, value_name = "ID")]
pub session: Option<String>,
}
#[derive(Debug, Args)]
pub(crate) struct SignalsHookArgs {
#[arg(long, value_enum)]
pub format: SignalsHookFormat,
#[arg(long, value_enum)]
pub event: SignalsHookEvent,
#[arg(long)]
pub role: Option<String>,
#[arg(long)]
pub rewake: bool,
#[arg(long, value_name = "DURATION", value_parser = parse_duration_arg, default_value = "9m")]
pub max_wait: StdDuration,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
pub(crate) enum SignalSeverityArg {
Info,
Warning,
Urgent,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
pub(crate) enum SignalSignatureArg {
Local,
Verified,
Unverified,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)]
pub(crate) enum SignalsHookFormat {
ClaudeCode,
Codex,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)]
pub(crate) enum SignalsHookEvent {
#[value(name = "SessionStart", alias = "session-start")]
SessionStart,
#[value(name = "UserPromptSubmit", alias = "user-prompt-submit")]
UserPromptSubmit,
#[value(name = "PostToolUse", alias = "post-tool-use")]
PostToolUse,
#[value(name = "Stop", alias = "stop")]
Stop,
#[value(name = "SessionEnd", alias = "session-end")]
SessionEnd,
}