Skip to main content

FullEngineError

Enum FullEngineError 

Source
pub enum FullEngineError {
    Lean(EngineError),
    MemPathNotAllowed {
        attempted: PathBuf,
        candidate: String,
        patterns: Vec<String>,
        reason: &'static str,
        policy_table: &'static str,
    },
    InvalidMemName {
        name: String,
        reason: &'static str,
    },
    MemReferencedByPolicy {
        name: String,
        referring_mems: Vec<String>,
    },
    MemSchemaNotAllowed {
        candidate: String,
        matched_pattern: String,
        requested_schema: String,
        allowed_schemas: Vec<String>,
    },
    ConfigAlreadyExists {
        path: PathBuf,
    },
    MemStorageResidueDetected {
        branch_ref: String,
        config_blob: Option<String>,
        entity_count: usize,
    },
}
Expand description

Errors surfaced by the full engine extension.

Lean(EngineError) wraps any failure that originates in the underlying lean engine — full orchestrators that delegate to memstead_base::Engine propagate lean errors verbatim through this variant (#[from]), so the wire-rendering layer at the full MCP surface can recover the lean code() for any wrapped variant.

The remaining variants are lifecycle-only: they fire from the full mem management orchestrator (create_mem / delete_mem) and have no lean-side fire conditions. They live in this crate alongside their orchestrator.

Variants§

§

Lean(EngineError)

Wrapped lean-engine error. Use this variant whenever a full code path delegates to memstead_base::Engine and a lean-side failure should surface unchanged.

§

MemPathNotAllowed

create_mem / delete_mem rejected because the mem path is not covered by an allowlist rule. reason is one of no_allowlist_configured / no_match / outside_workspace. policy_table names the refusing allowlist — "mem_management.create" or "mem_management.delete" — so an agent recovering from the envelope knows which TOML table to edit without threading subcommand context through error handling. The two discriminators are orthogonal: reason names why the gate refused; policy_table names which gate refused.

Fields

§attempted: PathBuf
§candidate: String
§patterns: Vec<String>
§reason: &'static str
§policy_table: &'static str
§

InvalidMemName

create_mem rejected before the allowlist check because the supplied name is structurally malformed — empty, whitespace, invalid characters, or carries the reserved __ prefix. reason discriminates the four shapes so an agent who typed the wrong thing gets a recoverable signal instead of an allowlist refusal. Split out of the MemPathNotAllowed (no_match) catch-all so the structural failure modes are visible.

Fields

§name: String
§reason: &'static str
§

MemReferencedByPolicy

delete_mem rejected because the workspace [cross_mem_links] policy grants one or more other mems permission to write into this one. referring_mems lists the granting mems sorted alphabetically so the agent can walk the policy table. The condition is a policy grant, not a materialised graph edge — revoking the grant in .memstead/workspace.toml is the recovery path.

Fields

§name: String
§referring_mems: Vec<String>
§

MemSchemaNotAllowed

create_mem rejected because the matched create-rule does not allow the requested schema. allowed_schemas is the canonicalised allow-list (each entry name@version).

Fields

§candidate: String
§matched_pattern: String
§requested_schema: String
§allowed_schemas: Vec<String>
§

ConfigAlreadyExists

create_mem rejected because the target .memstead/config.json already exists at the requested location — the engine never silently overwrites a prior attempt.

Fields

§path: PathBuf
§

MemStorageResidueDetected

create_mem detected on-disk storage residue for the requested branch path that is not reflected in the in-memory mem router — typically left over by a crash or a partially-failed delete. The caller must select an explicit recovery action via [MemCreateParams::recovery] (Reattach, ForceOverwrite, or HardCleanupFirst) and retry; the special case of unregistered_at-tombstoned residue (deliberate operator state from memstead mem unregister) defaults to Reattach without this refusal. The payload carries the composed branch ref, the config-blob path, and the entity count of the residual data so the caller can decide between adopting and discarding.

Fields

§branch_ref: String

Composed branch reference (refs/heads/<branch_leaf>) that carries the residue.

§config_blob: Option<String>

Tree path of the __MEMSTEAD:mems/<branch_leaf>/config.json blob (or None when the branch exists but the config blob has already been pruned).

§entity_count: usize

Best-effort entity count on the residual branch. Reads the branch’s tip tree and counts .md entries; 0 when the count is unavailable.

Implementations§

Source§

impl FullEngineError

Source

pub fn prose_render(&self) -> String

Render rich, fully-inlined recovery prose for the agent-visible text channel. Closes the asymmetry where structured details.X fields stayed off the agent’s text channel. Each lifecycle variant with a structured list (patterns, referring_mems, allowed_schemas) inlines the full payload; lean wraps delegate to EngineError::prose_render; trivial variants fall back to Display.

Source

pub fn details(&self) -> Value

Variant-specific recovery payload, rendered as a structured JSON object that surfaces under error.details in MCP / CLI envelopes. The CLI’s mem commands used to discard the engine’s structured details because the lift code didn’t have a single source of truth — this mirrors EngineError::details() so the lift can call err.details() directly without hand-maintaining each per- variant payload at the CLI surface.

Lean(inner) delegates to EngineError::details(). Lifecycle variants return the same JSON object shape full_engine_err_unified builds on the MCP wire — both surfaces share the payload here so they cannot drift.

Source

pub fn code(&self) -> &'static str

Stable, surface-independent error code token.

Matches memstead_base::EngineError::code() for every variant — wrapped lean errors delegate to the lean mapping, lifecycle variants return the exact strings the lean enum returned for them today. This is load-bearing: the wire-shape pins in memstead-mcp/tests/wire_shape.rs assert these exact code strings.

Trait Implementations§

Source§

impl Debug for FullEngineError

Source§

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

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

impl Display for FullEngineError

Source§

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

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

impl Error for FullEngineError

Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0:

use the Display impl or to_string()

1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<EngineError> for FullEngineError

Source§

fn from(source: EngineError) -> Self

Converts to this type from the input type.

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> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Fruit for T
where T: Send + Downcast,

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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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