pub struct Engine { /* private fields */ }Expand description
The Converge execution engine.
Owns suggestor registration, dependency indexing, and the convergence loop.
Implementations§
Source§impl Engine
impl Engine
Sourcepub fn with_budget(budget: Budget) -> Self
pub fn with_budget(budget: Budget) -> Self
Creates a new engine with custom budget.
Sourcepub fn set_budget(&mut self, budget: Budget)
pub fn set_budget(&mut self, budget: Budget)
Sets the execution budget.
Sourcepub fn set_streaming(&mut self, callback: Arc<dyn StreamingCallback>)
pub fn set_streaming(&mut self, callback: Arc<dyn StreamingCallback>)
Sets a streaming callback for real-time fact emission.
When set, the callback will be invoked:
- At the start of each convergence cycle
- When each fact is added to the context
- At the end of each convergence cycle
§Example
use std::sync::Arc;
use converge_core::{Engine, StreamingCallback, Fact};
struct MyCallback;
impl StreamingCallback for MyCallback {
fn on_cycle_start(&self, cycle: u32) {
println!("[cycle:{}] started", cycle);
}
fn on_fact(&self, cycle: u32, fact: &Fact) {
println!("[cycle:{}] fact:{} | {:?}", cycle, fact.id(), fact.text());
}
fn on_cycle_end(&self, cycle: u32, facts_added: usize) {
println!("[cycle:{}] ended with {} facts", cycle, facts_added);
}
}
let mut engine = Engine::new();
engine.set_streaming(Arc::new(MyCallback));Sourcepub fn set_event_observer(&mut self, observer: Arc<dyn ExperienceEventObserver>)
pub fn set_event_observer(&mut self, observer: Arc<dyn ExperienceEventObserver>)
Sets the event observer for audit trail capture.
When set, the engine emits ExperienceEvents during convergence:
FactPromoted, OutcomeRecorded, BudgetExceeded, and HITL gate decisions.
Sourcepub fn clear_streaming(&mut self)
pub fn clear_streaming(&mut self)
Clears the streaming callback.
Sourcepub fn set_hitl_policy(&mut self, policy: EngineHitlPolicy)
pub fn set_hitl_policy(&mut self, policy: EngineHitlPolicy)
Sets the HITL policy for gating proposals.
When set, proposals matching the policy will pause convergence
instead of auto-promoting. Use run_with_hitl() to get a
RunResult that can represent the paused state.
Sourcepub fn clear_hitl_policy(&mut self)
pub fn clear_hitl_policy(&mut self)
Clears the HITL policy.
Sourcepub async fn run_with_hitl(&mut self, context: ContextState) -> RunResult
pub async fn run_with_hitl(&mut self, context: ContextState) -> RunResult
Runs the convergence loop with HITL gate support.
Like run(), but returns RunResult which can represent
either completion or a HITL pause. When paused, call resume()
with the human’s decision to continue.
Sourcepub async fn resume(
&mut self,
pause: HitlPause,
decision: GateDecision,
) -> RunResult
pub async fn resume( &mut self, pause: HitlPause, decision: GateDecision, ) -> RunResult
Resumes convergence after a HITL gate decision.
Takes the HitlPause state returned from run_with_hitl() and
the human’s GateDecision, then continues the convergence loop.
On approval: the paused proposal is promoted and convergence continues. On rejection: the proposal is discarded and convergence continues without it (may still converge on remaining facts).
Sourcepub fn register_invariant(
&mut self,
invariant: impl Invariant + 'static,
) -> InvariantId
pub fn register_invariant( &mut self, invariant: impl Invariant + 'static, ) -> InvariantId
Registers an invariant (compiled Gherkin predicate).
Invariants are checked at different points depending on their class:
- Structural: after every merge
- Semantic: at end of each cycle
- Acceptance: when convergence is claimed
Sourcepub fn register_suggestor(
&mut self,
suggestor: impl Suggestor + 'static,
) -> SuggestorId
pub fn register_suggestor( &mut self, suggestor: impl Suggestor + 'static, ) -> SuggestorId
Registers a suggestor and returns its ID.
Suggestors are assigned monotonically increasing IDs. The dependency index is updated incrementally.
Sourcepub fn register_suggestor_in_pack(
&mut self,
pack_id: impl Into<PackId>,
suggestor: impl Suggestor + 'static,
) -> SuggestorId
pub fn register_suggestor_in_pack( &mut self, pack_id: impl Into<PackId>, suggestor: impl Suggestor + 'static, ) -> SuggestorId
Registers a suggestor as part of a named pack.
Pack ownership is used by run_with_types_intent
and set_active_packs to constrain which
suggestors may participate in a run.
Sourcepub fn suggestor_count(&self) -> usize
pub fn suggestor_count(&self) -> usize
Returns the number of registered suggestors.
Sourcepub fn set_active_packs<I, S>(&mut self, pack_ids: I)
pub fn set_active_packs<I, S>(&mut self, pack_ids: I)
Restrict future runs to the provided pack IDs.
Sourcepub fn clear_active_packs(&mut self)
pub fn clear_active_packs(&mut self)
Remove any active pack restriction.
Sourcepub async fn run_with_types_intent(
&mut self,
context: ContextState,
intent: &TypesRootIntent,
) -> Result<ConvergeResult, ConvergeError>
pub async fn run_with_types_intent( &mut self, context: ContextState, intent: &TypesRootIntent, ) -> Result<ConvergeResult, ConvergeError>
Run the engine with budgets and active packs derived from a typed intent.
Sourcepub async fn run_with_types_intent_and_hooks(
&mut self,
context: ContextState,
intent: &TypesRootIntent,
hooks: TypesRunHooks,
) -> Result<ConvergeResult, ConvergeError>
pub async fn run_with_types_intent_and_hooks( &mut self, context: ContextState, intent: &TypesRootIntent, hooks: TypesRunHooks, ) -> Result<ConvergeResult, ConvergeError>
Run the engine with a typed intent plus run-scoped observers/evaluators.
Sourcepub async fn run(
&mut self,
context: ContextState,
) -> Result<ConvergeResult, ConvergeError>
pub async fn run( &mut self, context: ContextState, ) -> Result<ConvergeResult, ConvergeError>
Runs the convergence loop until fixed point or budget exhaustion.
§Algorithm
initialize context
mark all keys as dirty (first cycle)
repeat:
clear dirty flags
find eligible suggestors (dirty deps + accepts)
execute eligible suggestors (parallel read)
merge effects (serial, deterministic order)
track which keys changed
until no keys changed OR budget exhausted§Errors
Returns ConvergeError::BudgetExhausted if:
max_cyclesis exceededmax_factsis exceeded