refactor(agent): extract claude driver into hive-claude crate
This commit is contained in:
parent
e35acca814
commit
a3b66241d1
13 changed files with 907 additions and 442 deletions
58
hive-claude/src/config.rs
Normal file
58
hive-claude/src/config.rs
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
//! Invocation config: how to build one `claude --print` command line.
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
/// Which claude session a run should attach to. Kept separate from [`Config`]
|
||||
/// so a single config can drive resume + create + `/compact` of the same
|
||||
/// logical session across turns.
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Session {
|
||||
/// `--resume <id-or-title>` — resume an existing session by UUID or by the
|
||||
/// display title set via [`Session::Create`]. Yields
|
||||
/// [`crate::Outcome::SessionNotFound`] if nothing matches.
|
||||
Resume(String),
|
||||
/// `--name <title>` — 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 [`Session`] attachment (passed separately to [`crate::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>,
|
||||
}
|
||||
Loading…
Reference in a new issue