enact_core/runner/mod.rs
1//! Runner module - thin execution shell
2//!
3//! The runner is a thin orchestration layer that:
4//! - Accepts invocations
5//! - Passes to Kernel
6//! - Wires callbacks
7//! - Returns streams
8//!
9//! Core execution logic lives in the kernel module.
10//! Context types are in the context module.
11//!
12//! ## CRITICAL INVARIANT: Runner Never Mutates State
13//!
14//! Runner is a thin orchestration shell. All execution semantics live in kernel/.
15//!
16//! Runner MUST NOT:
17//! - Mutate execution state directly
18//! - Retry steps (kernel handles retries)
19//! - Handle backoff (kernel handles backoff)
20//! - Skip nodes (kernel handles node execution)
21//!
22//! If Runner starts doing these things → duplicated kernel logic (architectural leak).
23//!
24//! **What Runner Does:**
25//! - Wires services (session, memory, artifacts)
26//! - Handles callbacks (before/after hooks)
27//! - Delegates execution to ExecutionKernel
28//! - Streams events to clients
29//!
30//! **What Runner Does NOT Do:**
31//! - Mutate execution state directly
32//! - Implement execution semantics
33//! - Make policy decisions
34//!
35//! @see docs/TECHNICAL/01-EXECUTION-TELEMETRY.md
36//! @see docs/TECHNICAL/25-STREAM-PROCESSORS.md
37
38pub mod approval_policy;
39pub mod callbacks;
40mod execution_runner;
41mod r#loop;
42mod protected_runner;
43
44// Runner types
45pub use execution_runner::{DefaultRunner, Runner};
46
47// Agentic loop types (discovery loop for long-running executions)
48pub use r#loop::{AgenticLoop, AgenticLoopResult, DiscoveredStep, DiscoveryOutput};
49
50// Protected runner (feat-09: Guardrails)
51pub use protected_runner::{DefaultProtectedRunner, InputBlockedError, ProtectedRunner};
52
53// Approval policy (HITL)
54pub use approval_policy::{
55 AlwaysApprovePolicy, AlwaysRequireApprovalPolicy, ApprovalPolicy, ApprovalPolicyConfig,
56 CompositeApprovalPolicy, PatternApprovalPolicy, ThresholdApprovalPolicy,
57};
58
59// Re-export from kernel (kernel owns parallel/interrupt logic)
60pub use crate::kernel::{
61 run_parallel, InterruptDecision, InterruptReason, InterruptableRunner, ParallelResult,
62};
63
64// Re-export from context
65pub use crate::context::{
66 InvocationContext, InvocationServices, ResourceLimits, RuntimeContext, RuntimeContextBuilder,
67 SessionContext, TraceContext,
68};
69
70// Callback traits and types for observability
71pub use callbacks::{
72 // Callback traits
73 AfterAgentCallback,
74 AfterModelCallback,
75 AfterToolCallback,
76 // Callback context types
77 AgentCallbackContext,
78 AgentCallbackResult,
79 BeforeAgentCallback,
80 BeforeModelCallback,
81 BeforeToolCallback,
82 // Registry
83 CallbackRegistry,
84 // Combined trait
85 ExecutionCallbacks,
86 ModelCallbackContext,
87 ModelCallbackResult,
88 // No-op implementation
89 NoOpCallbacks,
90 ToolCallbackContext,
91 ToolCallbackResult,
92};