Expand description
enact-runner — The Robust Agent Loop for Enact
This crate fills the gap between enact-core’s deterministic kernel and the
applications (CLI, API) that assume the Rust layer handles retries, context
compaction, and multi-format tool call parsing.
§Architecture
┌─────────────────────────────────────────────────────┐
│ CLI / API / Web (thin clients) │
└──────────────────────┬──────────────────────────────┘
│ Execution Intent
▼
┌─────────────────────────────────────────────────────┐
│ enact-runner (THIS CRATE) │
│ ┌─────────────────────────────────────────────┐ │
│ │ AgentRunner::run() │ │
│ │ • Multi-iteration tool call loop │ │
│ │ • Retry with exponential backoff │ │
│ │ • Auto context compaction │ │
│ │ • Multi-format parsing (JSON/XML/MD) │ │
│ │ • Checkpoint at intervals │ │
│ │ • Stream event emission │ │
│ └─────────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ Callable::run()
▼
┌─────────────────────────────────────────────────────┐
│ enact-core kernel (deterministic DAG engine) │
└─────────────────────────────────────────────────────┘§Quick Start
use enact_runner::{AgentRunner, RunnerConfig, DefaultAgentRunner};
// Create runner with default config
let mut runner = DefaultAgentRunner::default_new();
// Or configure for long-running tasks
let mut runner = DefaultAgentRunner::with_config(RunnerConfig::long_running());
// Run an agent through the robust loop
// let outcome = runner.run(&my_callable, "user input").await?;Re-exports§
pub use approval::checker_from_approval_config;pub use approval::checker_from_config;pub use approval::AlwaysApprove;pub use approval::AlwaysDeny;pub use approval::ApprovalChecker;pub use approval::ApprovalPrompter;pub use approval::AskApprovalChecker;pub use approval::AskOnceApprovalChecker;pub use approval::CliPrompter;pub use approval::PatternApprovalChecker;pub use approval::PolicyWithOverrides;pub use commands::dispatch as dispatch_command;pub use commands::load_commands;pub use commands::load_commands_for_run;pub use commands::CommandDef;pub use compaction::HistoryMessage;pub use config::ObservabilityConfig;pub use config::RetryConfig;pub use config::RunnerConfig;pub use hooks::load_global_hooks;pub use hooks::HookRegistry;pub use loop_driver::AgentRunner;pub use loop_driver::DefaultAgentRunner;pub use loop_driver::LoopOutcome;pub use parser::ParseResult;pub use parser::ParsedToolCall;pub use parser::ToolCallFormat;pub use registry::LiveSessionInfo;pub use registry::LiveSessionRegistry;pub use retry::classify_error;pub use retry::ErrorKind;pub use retry::RetryHandler;pub use session::SessionDetails;pub use session::SessionEvent;pub use session::SessionQuery;pub use session::SessionReader;pub use session::SessionRecorder;pub use session::SessionStatus;pub use session::SessionSummary;pub use session::SortOrder;
Modules§
- approval
- Human-in-the-loop approval — check before tool execution.
- commands
- Slash commands — user-invokable commands from ~/.enact/commands/, .enact/commands/, and plugins.
- compaction
- Context compaction for long-running agent loops
- config
- Runner configuration
- hooks
- Hook configuration and registry — load hooks from ~/.enact/hooks.yaml, plugins, and agent YAML.
- loop_
driver - Core agent loop driver
- parser
- Multi-format tool call parser
- registry
- Live Session Registry — tracks currently running sessions for message routing
- retry
- Retry handler with exponential backoff and error classification
- session
- Session recorder and reader — one JSONL file per run under agents/
/sessions/ and optionally projects/ /sessions/.