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