use super::*;
#[derive(Debug, Parser)]
#[command(name = "clipmem")]
#[command(version)]
#[command(about = "macOS clipboard memory backed by SQLite")]
#[command(after_help = ROOT_AFTER_HELP)]
#[command(next_line_help = true)]
pub(super) struct Cli {
#[arg(long, global = true)]
pub(super) db: Option<PathBuf>,
#[command(subcommand)]
pub(super) command: Command,
}
#[derive(Debug, Subcommand)]
pub(super) enum Command {
Agents(AgentsArgs),
Setup(SetupArgs),
Service(ServiceArgs),
Watch(WatchArgs),
CaptureOnce(CaptureOnceArgs),
Search(SearchArgs),
Recent(RecentArgs),
Timeline(TimelineArgs),
Stats(StatsArgs),
Recall(RecallArgs),
Get(GetArgs),
Export(ExportArgs),
Restore(RestoreArgs),
Forget(ForgetArgs),
Purge(PurgeArgs),
Storage(StorageArgs),
Ocr(OcrArgs),
Settings(SettingsArgs),
Doctor(DoctorArgs),
}
#[derive(Debug, Args)]
#[command(after_help = WATCH_AFTER_HELP)]
pub(super) struct WatchArgs {
#[arg(long, default_value_t = 400)]
pub(super) interval_ms: u64,
#[arg(long, default_value_t = false)]
pub(super) quiet: bool,
#[arg(long, default_value_t = false)]
pub(super) skip_initial: bool,
}
#[derive(Debug, Args)]
#[command(after_help = SETUP_AFTER_HELP)]
pub(super) struct SetupArgs {}
#[derive(Debug, Args)]
#[command(after_help = SERVICE_AFTER_HELP)]
pub(super) struct ServiceArgs {
#[command(subcommand)]
pub(super) command: ServiceCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum ServiceCommand {
Start,
Stop,
Status(ServiceStatusArgs),
Uninstall,
}
#[derive(Debug, Args)]
#[command(after_help = SERVICE_STATUS_AFTER_HELP)]
pub(super) struct ServiceStatusArgs {
#[arg(long, default_value_t = false)]
pub(super) json: bool,
#[arg(long, default_value_t = false)]
pub(super) human: bool,
}
#[derive(Debug, Args)]
#[command(after_help = CAPTURE_ONCE_AFTER_HELP)]
pub(super) struct CaptureOnceArgs {
#[arg(long, default_value_t = false)]
pub(super) json: bool,
#[arg(long, default_value_t = false)]
pub(super) human: bool,
}
#[derive(Debug, Args)]
#[command(after_help = SEARCH_AFTER_HELP)]
pub(super) struct SearchArgs {
pub(super) query: String,
#[arg(long, value_enum, default_value_t = SearchMode::Auto)]
pub(super) mode: SearchMode,
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) cursor: Option<String>,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Clone, Args)]
pub(super) struct RetrievalFilterArgs {
#[arg(long, value_parser = parse_rfc3339_timestamp)]
pub(super) since: Option<String>,
#[arg(long, value_parser = parse_rfc3339_timestamp)]
pub(super) until: Option<String>,
#[arg(long)]
pub(super) hours: Option<u32>,
#[arg(long)]
pub(super) app: Option<String>,
#[arg(long)]
pub(super) bundle_id: Option<String>,
#[arg(long, value_enum)]
pub(super) kind: Option<RetrievalKind>,
#[arg(long, default_value_t = false)]
pub(super) has_text: bool,
#[arg(long, default_value_t = false)]
pub(super) has_url: bool,
#[arg(long, default_value_t = false)]
pub(super) has_file_url: bool,
#[arg(long, default_value_t = false)]
pub(super) has_image: bool,
#[arg(long, default_value_t = false)]
pub(super) has_pdf: bool,
#[arg(long, value_parser = parse_nonnegative_bytes)]
pub(super) min_bytes: Option<usize>,
#[arg(long, value_parser = parse_nonnegative_bytes)]
pub(super) max_bytes: Option<usize>,
}
impl RetrievalFilterArgs {
pub(super) fn normalized(&self) -> std::result::Result<RetrievalFilters, clap::Error> {
validate_time_window(self.since.as_deref(), self.until.as_deref())?;
validate_byte_window(self.min_bytes, self.max_bytes)?;
let app = normalize_nonempty_filter_value(self.app.as_deref(), "--app")?;
let bundle_id = normalize_nonempty_filter_value(self.bundle_id.as_deref(), "--bundle-id")?;
let since = self.since.clone();
let hours = if self.since.is_some() {
None
} else {
self.hours
};
Ok(RetrievalFilters::new(
since,
self.until.clone(),
hours,
app,
bundle_id,
self.kind,
self.has_text,
self.has_url,
self.has_file_url,
self.has_image,
self.has_pdf,
self.min_bytes,
self.max_bytes,
))
}
}
#[derive(Debug, Args)]
#[command(after_help = RECENT_AFTER_HELP)]
pub(super) struct RecentArgs {
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) cursor: Option<String>,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = TIMELINE_AFTER_HELP)]
pub(super) struct TimelineArgs {
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) cursor: Option<String>,
#[arg(long, value_enum, default_value_t = TimelineSort::Desc)]
pub(super) sort: TimelineSort,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = STATS_AFTER_HELP)]
pub(super) struct StatsArgs {
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: StatsOutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = RECALL_AFTER_HELP)]
pub(super) struct RecallArgs {
pub(super) query: Option<String>,
#[arg(long, value_enum, default_value_t = SearchMode::Auto)]
pub(super) mode: SearchMode,
#[arg(long, default_value_t = 5, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long, default_value_t = false)]
pub(super) full: bool,
#[arg(long, default_value_t = false)]
pub(super) quote: bool,
#[arg(long, value_parser = parse_normalized_score)]
pub(super) min_score: Option<f64>,
#[arg(long, default_value_t = false)]
pub(super) prefer_recent: bool,
#[arg(long)]
pub(super) prefer_app: Option<String>,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: RecallOutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = GET_AFTER_HELP)]
pub(super) struct GetArgs {
pub(super) snapshot_id: i64,
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) events: usize,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = EXPORT_AFTER_HELP)]
pub(super) struct ExportArgs {
pub(super) snapshot_id: i64,
#[arg(long)]
pub(super) item: usize,
#[arg(long)]
pub(super) uti: String,
#[arg(long)]
pub(super) out: PathBuf,
#[arg(long, default_value_t = false)]
pub(super) force: bool,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = RESTORE_AFTER_HELP)]
pub(super) struct RestoreArgs {
pub(super) snapshot_id: i64,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = FORGET_AFTER_HELP)]
pub(super) struct ForgetArgs {
pub(super) snapshot_id: i64,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = PURGE_AFTER_HELP)]
pub(super) struct PurgeArgs {
#[arg(long, value_parser = parse_duration_value)]
pub(super) older_than: DurationValue,
#[arg(long, default_value_t = false)]
pub(super) dry_run: bool,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = STORAGE_AFTER_HELP)]
pub(super) struct StorageArgs {
#[command(subcommand)]
pub(super) command: StorageCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum StorageCommand {
Compact(StorageCompactArgs),
OptimizeImages(StorageOptimizeImagesArgs),
}
#[derive(Debug, Args)]
pub(super) struct StorageCompactArgs {
#[arg(long, default_value_t = false)]
pub(super) dry_run: bool,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct StorageOptimizeImagesArgs {
#[arg(long, default_value_t = false)]
pub(super) dry_run: bool,
#[arg(long, default_value_t = false)]
pub(super) no_compact: bool,
#[arg(long, default_value_t = 25, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long, value_enum)]
pub(super) progress: Option<ProgressFormat>,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = OCR_AFTER_HELP)]
pub(super) struct OcrArgs {
#[command(subcommand)]
pub(super) command: OcrCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum OcrCommand {
Status(OcrStatusArgs),
Run(OcrRunArgs),
}
#[derive(Debug, Args)]
pub(super) struct OcrStatusArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct OcrRunArgs {
#[arg(long, default_value_t = 25, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) snapshot: Option<i64>,
#[arg(long, default_value_t = false)]
pub(super) retry_failed: bool,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = SETTINGS_AFTER_HELP)]
pub(super) struct SettingsArgs {
#[command(subcommand)]
pub(super) command: SettingsCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum SettingsCommand {
Show(SettingsShowArgs),
Pause(SettingsPauseArgs),
ApiKeyFilter(SettingsApiKeyFilterArgs),
Ocr(SettingsOcrArgs),
Retention(SettingsRetentionArgs),
Ignore(SettingsIgnoreArgs),
}
#[derive(Debug, Args)]
pub(super) struct SettingsShowArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsPauseArgs {
pub(super) state: PauseState,
}
#[derive(Debug, Args)]
pub(super) struct SettingsApiKeyFilterArgs {
pub(super) state: PauseState,
}
#[derive(Debug, Args)]
pub(super) struct SettingsOcrArgs {
pub(super) state: PauseState,
}
#[derive(Debug, Args)]
pub(super) struct SettingsRetentionArgs {
#[arg(value_parser = parse_retention_value)]
pub(super) value: RetentionValue,
}
#[derive(Debug, Args)]
pub(super) struct SettingsIgnoreArgs {
#[command(subcommand)]
pub(super) command: SettingsIgnoreCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum SettingsIgnoreCommand {
Add(SettingsIgnoreBundleArgs),
Remove(SettingsIgnoreBundleArgs),
List(SettingsIgnoreListArgs),
}
#[derive(Debug, Args)]
pub(super) struct SettingsIgnoreBundleArgs {
pub(super) bundle_id: String,
}
#[derive(Debug, Args)]
pub(super) struct SettingsIgnoreListArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = DOCTOR_AFTER_HELP)]
pub(super) struct DoctorArgs {
#[arg(long, default_value_t = false)]
pub(super) json: bool,
#[arg(long, default_value_t = false)]
pub(super) human: bool,
}
#[derive(Debug, Args)]
pub(super) struct AgentsArgs {
#[command(subcommand)]
pub(super) command: AgentsCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum AgentsCommand {
Openclaw(OpenClawArgs),
Hermes(HermesArgs),
}
#[derive(Debug, Args)]
pub(super) struct OpenClawArgs {
#[command(subcommand)]
pub(super) command: OpenClawCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum OpenClawCommand {
InstallSkill(OpenClawInstallSkillArgs),
UninstallSkill(OpenClawUninstallSkillArgs),
#[command(after_help = OPENCLAW_PRINT_AFTER_HELP)]
PrintSkill,
Doctor(OpenClawDoctorArgs),
}
#[derive(Debug, Args)]
#[command(after_help = OPENCLAW_INSTALL_AFTER_HELP)]
pub(super) struct OpenClawInstallSkillArgs {
#[arg(long, default_value_t = false)]
pub(super) shared: bool,
#[arg(long)]
pub(super) dest: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub(super) force: bool,
}
#[derive(Debug, Args)]
#[command(after_help = OPENCLAW_UNINSTALL_AFTER_HELP)]
pub(super) struct OpenClawUninstallSkillArgs {
#[arg(long, default_value_t = false)]
pub(super) shared: bool,
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}
#[derive(Debug, Args)]
#[command(after_help = OPENCLAW_DOCTOR_AFTER_HELP)]
pub(super) struct OpenClawDoctorArgs {
#[arg(long, default_value_t = false)]
pub(super) shared: bool,
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}
#[derive(Debug, Args)]
pub(super) struct HermesArgs {
#[command(subcommand)]
pub(super) command: HermesCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum HermesCommand {
InstallSkill(HermesInstallSkillArgs),
UninstallSkill(HermesUninstallSkillArgs),
#[command(after_help = HERMES_PRINT_AFTER_HELP)]
PrintSkill,
Doctor(HermesDoctorArgs),
}
#[derive(Debug, Args)]
#[command(after_help = HERMES_INSTALL_AFTER_HELP)]
pub(super) struct HermesInstallSkillArgs {
#[arg(long)]
pub(super) dest: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub(super) force: bool,
}
#[derive(Debug, Args)]
#[command(after_help = HERMES_UNINSTALL_AFTER_HELP)]
pub(super) struct HermesUninstallSkillArgs {
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}
#[derive(Debug, Args)]
#[command(after_help = HERMES_DOCTOR_AFTER_HELP)]
pub(super) struct HermesDoctorArgs {
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}