Skip to main content

Config

Struct Config 

Source
pub struct Config {
Show 13 fields pub agents: Vec<AgentSpec>, pub roles: Roles, pub graph: Graph, pub blind: Blind, pub verify: Verify, pub disk: Disk, pub merge: Merge, pub update: Update, pub prompts: Prompts, pub notify: Notify, pub repos: Repos, pub talk: Talk, pub daemon: Daemon,
}
Expand description

Top-level configuration.

Fields§

§agents: Vec<AgentSpec>

Agent roster.

§roles: Roles

Role assignment.

§graph: Graph

Graph shape.

§blind: Blind

Blindness policy.

§verify: Verify

Verification commands.

§disk: Disk

Disk hygiene.

§merge: Merge

Merge policy.

§update: Update

Self-update policy.

§prompts: Prompts

Project-specific text appended to the node prompts.

§notify: Notify

How the operator is told a run is waiting on them.

§repos: Repos

Local repositories the plan surface can start or derive a conversation against.

§talk: Talk

Policy for the standing conversation (crate::talk).

§daemon: Daemon

How many runs magi serve’s own loop drives at once.

Implementations§

Source§

impl Config

Source

pub const CONFIG_DIR_ENV: &str = "MAGI_CONFIG_DIR"

Environment variable that relocates the machine-wide config layer.

Set it to a directory and magi reads <dir>/magi/config.toml instead of the one under dirs::config_dir; set it to the empty string and magi reads no machine layer at all.

This exists because the machine layer is otherwise unavoidable, and a test that builds a config fixture is not asking for the operator’s preferences to be merged into it. Adding [repos] roots to the real machine config on a development box turned two passing tests red - repos_list_returns_name_and_path_for_every_configured_root and repos_list_only_rescans_within_the_ttl_when_asked_to, whose fixtures declare [repos] roots of their own, which Config::layers then found in two layers and Config::refuse_split_arrays correctly refused. CI never saw it: a runner has no machine config, so the suite was green there and red only where somebody actually uses magi.

An operator gets the same escape hatch for free: a second machine config, or none, without moving files about.

Source

pub fn load(path: &Path) -> Result<Self>

Load one file through teravars: Tera rendering, [vars] resolution, and the include = [...] directive.

Source

pub fn load_layers(paths: &[PathBuf]) -> Result<Self>

Load and deep-merge a stack of config files, later files winning.

This is why the config is TOML-through-teravars rather than plain serde: the roster is a machine fact (which CLIs and plans you pay for) while the gate is a repository fact (cargo make check here, pnpm test there). Picking one file and ignoring the other would force every repo to restate the roster.

Source

pub fn array_provenance( paths: &[PathBuf], key: &str, ) -> Vec<(PathBuf, Vec<String>)>

Which layers contributed to a composed, appendable array key (e.g. "verify.gate"), in the same low-to-high-priority order Config::load_layers concatenates them in. Layers that do not declare key at all are omitted.

This is a display aid for magi doctor only. The command list that actually runs always comes from the one joint teravars::load_merged call in load_layers, never from this function - the exact hazard Config::refuse_split_arrays warns about is two merge paths that might disagree, so this function must never become a second source of the composed value, only of which file wrote which line in it.

Re-rendering each layer alone can, in principle, resolve a {{ vars.x }} differently than the joint render would, if x is defined in one layer and referenced in another - the same caveat refuse_split_arrays’s structural, key-only check already lives with. None of magi’s own gate commands cross that line, and a doctor listing is read by a human who can compare it against the joint one printed alongside it, so this is judged worth the simplicity of not threading provenance through the real load path.

Source

pub fn describe_composed( paths: &[PathBuf], commands: &[String], key: &str, empty: &str, ) -> String

Render a composed command list for magi doctor: the joined command line the run actually uses, plus - only when more than one layer contributed - which layer wrote which line.

A single contributing layer (the common case today) stays the plain one-line summary magi has always printed, empty included: that honest “(none — …)” is what caught a real gate-composition gap before this array could compose at all, and composition should not make the common case noisier.

Source

pub fn discover( repo: &Path, explicit: Option<&Path>, ) -> Result<(Self, Vec<PathBuf>)>

Resolve the config for repo, honouring an explicit --config path.

Returns the config and the layers it came from, empty for built-in defaults.

Source

pub fn layers(repo: &Path) -> Vec<PathBuf>

Every config layer that applies to repo, in increasing precedence.

The machine layer is whatever Config::machine_layer resolves to, which is nothing at all in a test build.

Source

pub fn autodetected() -> Self

Built-in config whose roster is the agent CLIs found on PATH.

Source

pub fn cache_dir(&self) -> Option<PathBuf>

The shared build cache the verify commands and the agents both build into, when the config declares one. See Verify::cache_dir.

Source

pub fn agent(&self, id: &str) -> Result<&AgentSpec>

Look an agent up by id.

Source

pub fn resolve_roles(&self) -> Result<ResolvedRoles>

Fill the roles out to the configured widths.

An empty role list rotates through the whole roster, so a three-agent roster with candidates = 3 gives one implementation per agent, and judges = 3 rotates the judge seats by one so that judge i is not the author of candidate i whenever the roster has more than one agent.

Source

pub fn shell(&self) -> Vec<String>

Shell prefix for Verify commands.

Source

pub fn starter_toml() -> String

Starter config, as written by magi init.

Trait Implementations§

Source§

impl Clone for Config

Source§

fn clone(&self) -> Config

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Config

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Config

Source§

fn default() -> Config

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for Config
where Config: Default,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for Config

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more