//! Invocation config: how to build one `claude --print` command line. use std::path::PathBuf; use std::time::Duration; /// How a run attaches to a claude session — the low-level session flag. Kept /// separate from [`Config`] so one config can drive resume + create + /// `/compact` of the same logical session. For a self-managing durable /// session, prefer [`crate::InfiniteSession`] over hand-picking an `Attach`. #[derive(Debug, Clone)] pub enum Attach { /// `--resume ` — resume an existing session by UUID or by the /// display title set via [`Attach::Create`]. Yields /// [`crate::Error::SessionNotFound`] if nothing matches. Resume(String), /// `--name ` — start a new session carrying the given display title /// (persisted as a `custom-title` event, which `--resume <title>` later /// resolves against). Create(String), /// `--continue` — resume the most recent session in the cwd. Ambiguous /// when other claude processes share the cwd; prefer titled sessions. Continue, /// No session flag — a one-off, unnamed session. OneOff, } /// Everything needed to build one headless `claude --print` invocation, minus /// the [`Attach`] target (passed separately to [`crate::Claude::run`]). /// /// Fields map one-to-one to CLI flags; `None`/empty means "don't pass the /// flag". `--print --verbose --output-format stream-json` are always set by /// the driver and are not configurable here (the driver depends on the /// stream-json shape). #[derive(Debug, Clone, Default)] pub struct Config { /// `--model`. Empty omits the flag (claude falls back to its own default). pub model: String, /// `--effort <level>`. `None` omits the flag. pub effort: Option<String>, /// Working directory for the child. Claude derives its per-project session /// dir from this path. `None` inherits the parent process cwd. pub cwd: Option<PathBuf>, /// `--system-prompt-file <path>`. pub system_prompt_file: Option<PathBuf>, /// `--mcp-config <path>`. pub mcp_config: Option<PathBuf>, /// Pass `--strict-mcp-config` (only the configured MCP servers, no /// discovery). pub strict_mcp_config: bool, /// `--tools <expr>` — the built-in tool allow-list expression. pub tools: Option<String>, /// `--allowedTools <expr>`. pub allowed_tools: Option<String>, /// `--add-dir <path>` (repeatable) — extra readable directories. pub add_dirs: Vec<PathBuf>, /// Any additional raw args appended verbatim after the ones above. pub extra_args: Vec<String>, /// Program to spawn. `None` defaults to `claude` (resolved on `PATH`). pub program: Option<String>, /// Idle watchdog: kill the child and return [`crate::Error::IdleTimeout`] /// if no stdout line arrives for this long. The timer resets on every /// stdout line, so a large/slow but still-streaming turn is never cut; /// only complete output silence trips it. `None` waits indefinitely. /// The driver stays policy-free — the caller decides the window (and /// whether to read it from the environment). pub idle_timeout: Option<Duration>, }