Skip to main content

ftui_runtime/
lib.rs

1#![forbid(unsafe_code)]
2
3//! FrankenTUI Runtime
4//!
5//! This crate provides the runtime components that tie together the core,
6//! render, and layout crates into a complete terminal application framework.
7//!
8//! # Key Components
9//!
10//! - [`TerminalWriter`] - Unified terminal output coordinator with inline mode support
11//! - [`LogSink`] - Line-buffered writer for sanitized log output
12//! - [`Program`] - Bubbletea/Elm-style runtime for terminal applications
13//! - [`Model`] - Trait for application state and behavior
14//! - [`Cmd`] - Commands for side effects
15//! - [`Subscription`] - Trait for continuous event sources
16//! - [`Every`] - Built-in tick subscription
17//!
18//! # Role in FrankenTUI
19//! `ftui-runtime` is the orchestrator. It consumes input events from
20//! `ftui-core`, drives your `Model::update`, calls `Model::view` to render
21//! frames, and delegates rendering to `ftui-render` via `TerminalWriter`.
22//!
23//! # How it fits in the system
24//! The runtime is the center of the architecture: it is the bridge between
25//! input (`ftui-core`) and output (`ftui-render`). Widgets and layout are
26//! optional layers used by your `view()` to construct UI output.
27
28pub mod allocation_budget;
29pub mod alpha_investing;
30pub mod asciicast;
31pub mod bocpd;
32pub mod cancellation;
33
34pub mod conformal_alert;
35pub mod conformal_frame_guard;
36pub mod conformal_predictor;
37pub mod conformal_stages;
38pub mod cost_model;
39pub mod debug_trace;
40pub mod decision_core;
41pub mod degradation_cascade;
42pub mod demo;
43pub mod diff_evidence;
44pub mod effect_system;
45pub mod eprocess_throttle;
46#[cfg(feature = "event-trace")]
47pub mod event_trace;
48pub mod evidence_bridges;
49pub mod evidence_sink;
50pub mod evidence_telemetry;
51pub mod flake_detector;
52pub mod flat_combine;
53pub mod input_fairness;
54pub mod input_macro;
55pub mod ivm;
56pub mod lens;
57pub mod locale;
58pub mod log_sink;
59pub mod metrics_registry;
60pub mod pane_keymap;
61pub mod policy_config;
62pub mod policy_registry;
63pub mod process_subscription;
64pub mod program;
65pub mod queueing_scheduler;
66#[cfg(feature = "render-thread")]
67pub mod render_thread;
68pub mod render_trace;
69pub mod resize_coalescer;
70pub mod resize_sla;
71pub mod retry;
72pub mod reversible;
73pub mod rough_path;
74pub mod schema_compat;
75pub mod simulator;
76pub mod slo;
77pub mod sos_barrier;
78pub mod state_persistence;
79#[cfg(feature = "stdio-capture")]
80pub mod stdio_capture;
81pub mod string_model;
82pub mod subscription;
83pub mod telemetry_schema;
84pub mod terminal_writer;
85pub mod tick_strategy;
86pub mod transparency;
87pub mod undo;
88pub mod unified_evidence;
89pub mod validation_pipeline;
90pub mod voi_sampling;
91pub mod wasm_runner;
92
93pub mod reactive;
94pub mod schedule_trace;
95#[cfg(feature = "telemetry")]
96pub mod telemetry;
97pub mod voi_telemetry;
98
99pub use asciicast::{AsciicastRecorder, AsciicastWriter};
100pub use cancellation::{CancellationSource, CancellationToken};
101pub use diff_evidence::{
102    DiffEvidenceLedger, DiffRegime, DiffStrategyRecord, Observation, RegimeTransition,
103};
104pub use evidence_sink::{EvidenceSink, EvidenceSinkConfig, EvidenceSinkDestination};
105pub use evidence_telemetry::{
106    BudgetDecisionSnapshot, ConformalSnapshot, DiffDecisionSnapshot, ResizeDecisionSnapshot,
107    budget_snapshot, clear_budget_snapshot, clear_diff_snapshot, clear_resize_snapshot,
108    diff_snapshot, resize_snapshot, set_budget_snapshot, set_diff_snapshot, set_resize_snapshot,
109};
110pub use ftui_backend::{BackendEventSource, BackendFeatures};
111#[cfg(feature = "native-backend")]
112pub use ftui_tty::TtyBackend;
113pub use input_macro::{
114    EventRecorder, FilteredEventRecorder, InputMacro, MacroPlayback, MacroPlayer, MacroRecorder,
115    RecordingFilter, RecordingState, TimedEvent,
116};
117pub use locale::{
118    Locale, LocaleContext, LocaleOverride, current_locale, detect_system_locale, set_locale,
119};
120pub use log_sink::LogSink;
121pub use process_subscription::{ProcessEvent, ProcessSubscription};
122#[cfg(feature = "crossterm-compat")]
123pub use program::CrosstermEventSource;
124pub use program::{
125    App, AppBuilder, BatchController, Cmd, EffectQueueConfig, FrameTiming, FrameTimingConfig,
126    FrameTimingSink, HeadlessEventSource, InlineAutoRemeasureConfig, LoadGovernorConfig, Model,
127    MouseCapturePolicy, PaneTerminalAdapter, PaneTerminalAdapterConfig, PaneTerminalDispatch,
128    PaneTerminalIgnoredReason, PaneTerminalLifecyclePhase, PaneTerminalLogEntry,
129    PaneTerminalLogOutcome, PaneTerminalSplitterHandle, PersistenceConfig, Program, ProgramConfig,
130    ResizeBehavior, RolloutPolicy, RuntimeLane, TaskExecutorBackend, TaskSpec, WidgetRefreshConfig,
131    pane_terminal_resolve_splitter_target, pane_terminal_splitter_handles,
132    pane_terminal_target_from_hit, register_pane_terminal_splitter_hits,
133};
134pub use render_trace::{
135    RenderTraceConfig, RenderTraceContext, RenderTraceFrame, RenderTraceRecorder,
136};
137pub use retry::{BackoffStrategy, RetryPolicy, task_with_retry, task_with_timeout};
138pub use simulator::ProgramSimulator;
139pub use string_model::{StringModel, StringModelAdapter};
140pub use subscription::{Every, StopSignal, SubId, Subscription};
141pub use terminal_writer::{ScreenMode, TerminalWriter, UiAnchor, inline_active_widgets};
142pub use tick_strategy::{
143    ActiveOnly, ActivePlusAdjacent, AllocationCurve, Custom, DecayConfig, MarkovPredictor,
144    Predictive, PredictiveConfig, PredictiveStrategyConfig, ScreenPrediction, ScreenTickDispatch,
145    TickAllocation, TickDecision, TickStrategy, TickStrategyKind, TransitionCounter,
146    TransitionEntry, TransitionHistory, Uniform,
147};
148#[cfg(feature = "state-persistence")]
149pub use tick_strategy::{load_transitions, save_transitions};
150pub use voi_telemetry::{
151    clear_inline_auto_voi_snapshot, inline_auto_voi_snapshot, set_inline_auto_voi_snapshot,
152};
153
154#[cfg(feature = "render-thread")]
155pub use render_thread::{OutMsg, RenderThread};
156
157#[cfg(feature = "stdio-capture")]
158pub use stdio_capture::{CapturedWriter, StdioCapture, StdioCaptureError};
159
160pub use allocation_budget::{
161    AllocationBudget, BudgetAlert, BudgetConfig, BudgetEvidence, BudgetSummary,
162};
163pub use conformal_alert::{
164    AlertConfig, AlertDecision, AlertEvidence, AlertReason, AlertStats, ConformalAlert,
165};
166pub use conformal_frame_guard::{
167    ConformalFrameGuard, ConformalFrameGuardConfig, ConformalFrameGuardTelemetry, GuardState,
168    NonconformitySummary, P99Prediction,
169};
170pub use conformal_predictor::{
171    BucketKey, ConformalConfig, ConformalPrediction, ConformalPredictor, ConformalUpdate,
172    DiffBucket, ModeBucket,
173};
174pub use cost_model::{
175    BatchCostParams, BatchCostResult, CacheCostParams, CacheCostResult, PipelineCostParams,
176    PipelineCostResult, StageStats,
177};
178pub use decision_core::{
179    Action as DecisionAction, Decision, DecisionCore, Outcome as DecisionOutcome, Posterior,
180    State as DecisionState, argmin_expected_loss, second_best_loss,
181};
182pub use degradation_cascade::{
183    CascadeConfig, CascadeDecision, CascadeEvidence, CascadeTelemetry, DegradationCascade,
184    PreRenderResult,
185};
186pub use demo::{DemoDefinition, DemoParseError, DemoStep, parse_demo_yaml, validate_demos};
187pub use effect_system::{
188    QueueTelemetry, effects_command_total, effects_executed_total, effects_queue_dropped,
189    effects_queue_enqueued, effects_queue_high_water, effects_queue_processed,
190    effects_subscription_total, queue_telemetry, record_command_effect, record_subscription_start,
191    record_subscription_stop, trace_command_effect,
192};
193pub use eprocess_throttle::{
194    EProcessThrottle, ThrottleConfig, ThrottleDecision, ThrottleLog, ThrottleStats,
195    eprocess_rejections_total,
196};
197#[cfg(feature = "event-trace")]
198pub use event_trace::{
199    EventReplayer, EventTraceReader, EventTraceWriter, EvidenceMismatch, EvidenceVerifier,
200    SerDecisionDomain, SerEvidenceEntry, SerEvidenceTerm, TraceFile, TraceRecord,
201};
202pub use flake_detector::{EvidenceLog, FlakeConfig, FlakeDecision, FlakeDetector, FlakeSummary};
203pub use flat_combine::{CombinerStats, FlatCombiner};
204pub use lens::{AtIndex, Composed, Fst, Identity, Lens, Prism, Snd, SomePrism, at_index, compose};
205pub use metrics_registry::{
206    BuiltinCounter, BuiltinGauge, BuiltinHistogram, Counter as MetricsCounter,
207    Gauge as MetricsGauge, Histogram as MetricsHistogram, METRICS, MetricsRegistry,
208};
209pub use policy_config::{
210    BocpdPolicyConfig, CascadePolicyConfig, ConformalPolicyConfig, EProcessBudgetPolicyConfig,
211    EProcessThrottlePolicyConfig, EvidencePolicyConfig, FrameGuardPolicyConfig, PidPolicyConfig,
212    PolicyConfig, PolicyConfigError, VoiPolicyConfig,
213};
214pub use policy_registry::{PolicyRegistry, PolicyRegistryError, PolicySwitchEvent};
215pub use reactive::{BatchScope, Binding, BindingScope, Computed, Observable, TwoWayBinding};
216pub use resize_coalescer::{
217    CoalesceAction, CoalescerConfig, CoalescerStats, CycleTimePercentiles, DecisionLog,
218    DecisionSummary, Regime, ResizeCoalescer,
219};
220pub use resize_sla::{
221    ResizeEvidence, ResizeSlaMonitor, SlaConfig, SlaLogEntry, SlaSummary, make_sla_hooks,
222};
223pub use reversible::{
224    AddOp, InsertOp, Journal, MulOp, PushOp, RemoveOp, Reversible, Sequence, SetOp, SwapOp, XorOp,
225};
226pub use schema_compat::{
227    CompatCheckResult, Compatibility, MatrixEntry, SchemaKind, check_event_trace_compat,
228    check_evidence_compat, check_golden_trace_compat, check_render_trace_compat,
229    check_schema_compat, default_compatibility_matrix, run_compatibility_matrix,
230};
231pub use slo::{
232    BreachResult, BreachSeverity, MetricSlo, MetricType, SafeModeDecision, SloSchema,
233    SloSchemaError, check_breach, check_safe_mode, emit_slo_check, parse_slo_yaml, run_slo_check,
234};
235pub use undo::{
236    CommandBatch, CommandError, CommandMetadata, CommandResult, CommandSource, HistoryConfig,
237    HistoryManager, MergeConfig, TextDeleteCmd, TextInsertCmd, TextReplaceCmd, Transaction,
238    TransactionScope, UndoableCmd, WidgetId,
239};
240pub use unified_evidence::{
241    DecisionDomain, DomainSummary, EmitsEvidence, EvidenceEntry, EvidenceEntryBuilder,
242    EvidenceTerm, LedgerSummary, UnifiedEvidenceLedger,
243};
244pub use validation_pipeline::{
245    LedgerEntry, PipelineConfig, PipelineResult, PipelineSummary, ValidationOutcome,
246    ValidationPipeline, ValidatorStats,
247};
248pub use voi_sampling::{
249    DeferredRefinementConfig, DeferredRefinementPlan, DeferredRefinementScheduler,
250    RefinementCandidate, RefinementSelection, VoiConfig, VoiDecision, VoiLogEntry, VoiObservation,
251    VoiSampler, VoiSamplerSnapshot, VoiSummary, voi_samples_skipped_total, voi_samples_taken_total,
252};
253
254// State persistence
255#[cfg(feature = "state-persistence")]
256pub use state_persistence::FileStorage;
257pub use state_persistence::{
258    MemoryStorage, RegistryStats, StateRegistry, StorageBackend, StorageError, StorageResult,
259    StoredEntry,
260};
261
262pub use schedule_trace::{
263    CancelReason, GoldenCompareResult, IsomorphismProof, ScheduleTrace, SchedulerPolicy, TaskEvent,
264    TraceConfig, TraceEntry, TraceSummary, WakeupReason, compare_golden,
265};
266
267// Diff strategy (re-exports from ftui-render)
268pub use ftui_render::diff_strategy::{
269    DiffStrategy, DiffStrategyConfig, DiffStrategySelector, StrategyEvidence,
270};
271pub use terminal_writer::RuntimeDiffConfig;
272pub use wasm_runner::{RenderedFrame, StepResult, WasmRunner};
273
274#[cfg(feature = "telemetry")]
275pub use telemetry::{
276    DecisionEvidence, EnabledReason, EndpointSource, EvidenceLedger, Protocol, SCHEMA_VERSION,
277    SpanId, TelemetryConfig, TelemetryError, TelemetryGuard, TraceContextSource, TraceId,
278    is_safe_env_var, redact,
279};