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 asciicast;
30pub mod bocpd;
31pub mod conformal_alert;
32pub mod conformal_predictor;
33pub mod debug_trace;
34pub mod eprocess_throttle;
35pub mod evidence_sink;
36pub mod evidence_telemetry;
37pub mod flake_detector;
38pub mod input_fairness;
39pub mod input_macro;
40pub mod locale;
41pub mod log_sink;
42pub mod program;
43pub mod queueing_scheduler;
44#[cfg(feature = "render-thread")]
45pub mod render_thread;
46pub mod render_trace;
47pub mod resize_coalescer;
48pub mod resize_sla;
49pub mod simulator;
50pub mod state_persistence;
51#[cfg(feature = "stdio-capture")]
52pub mod stdio_capture;
53pub mod string_model;
54pub mod subscription;
55pub mod terminal_writer;
56pub mod undo;
57pub mod validation_pipeline;
58pub mod voi_sampling;
59
60pub mod reactive;
61pub mod schedule_trace;
62#[cfg(feature = "telemetry")]
63pub mod telemetry;
64pub mod voi_telemetry;
65
66pub use asciicast::{AsciicastRecorder, AsciicastWriter};
67pub use evidence_sink::{EvidenceSink, EvidenceSinkConfig, EvidenceSinkDestination};
68pub use evidence_telemetry::{
69    BudgetDecisionSnapshot, ConformalSnapshot, DiffDecisionSnapshot, ResizeDecisionSnapshot,
70    budget_snapshot, clear_budget_snapshot, clear_diff_snapshot, clear_resize_snapshot,
71    diff_snapshot, resize_snapshot, set_budget_snapshot, set_diff_snapshot, set_resize_snapshot,
72};
73pub use input_macro::{
74    EventRecorder, FilteredEventRecorder, InputMacro, MacroPlayback, MacroPlayer, MacroRecorder,
75    RecordingFilter, RecordingState, TimedEvent,
76};
77pub use locale::{
78    Locale, LocaleContext, LocaleOverride, current_locale, detect_system_locale, set_locale,
79};
80pub use log_sink::LogSink;
81pub use program::{
82    App, AppBuilder, BatchController, Cmd, EffectQueueConfig, FrameTiming, FrameTimingConfig,
83    FrameTimingSink, InlineAutoRemeasureConfig, Model, PersistenceConfig, Program, ProgramConfig,
84    ResizeBehavior, TaskSpec, WidgetRefreshConfig,
85};
86pub use render_trace::{
87    RenderTraceConfig, RenderTraceContext, RenderTraceFrame, RenderTraceRecorder,
88};
89pub use simulator::ProgramSimulator;
90pub use string_model::{StringModel, StringModelAdapter};
91pub use subscription::{Every, StopSignal, SubId, Subscription};
92pub use terminal_writer::{ScreenMode, TerminalWriter, UiAnchor};
93pub use voi_telemetry::{
94    clear_inline_auto_voi_snapshot, inline_auto_voi_snapshot, set_inline_auto_voi_snapshot,
95};
96
97#[cfg(feature = "render-thread")]
98pub use render_thread::{OutMsg, RenderThread};
99
100#[cfg(feature = "stdio-capture")]
101pub use stdio_capture::{CapturedWriter, StdioCapture, StdioCaptureError};
102
103pub use allocation_budget::{
104    AllocationBudget, BudgetAlert, BudgetConfig, BudgetEvidence, BudgetSummary,
105};
106pub use conformal_alert::{
107    AlertConfig, AlertDecision, AlertEvidence, AlertReason, AlertStats, ConformalAlert,
108};
109pub use conformal_predictor::{
110    BucketKey, ConformalConfig, ConformalPrediction, ConformalPredictor, ConformalUpdate,
111    DiffBucket, ModeBucket,
112};
113pub use eprocess_throttle::{
114    EProcessThrottle, ThrottleConfig, ThrottleDecision, ThrottleLog, ThrottleStats,
115};
116pub use flake_detector::{EvidenceLog, FlakeConfig, FlakeDecision, FlakeDetector, FlakeSummary};
117pub use reactive::{BatchScope, Binding, BindingScope, Computed, Observable, TwoWayBinding};
118pub use resize_coalescer::{
119    CoalesceAction, CoalescerConfig, CoalescerStats, CycleTimePercentiles, DecisionLog,
120    DecisionSummary, Regime, ResizeCoalescer,
121};
122pub use resize_sla::{
123    ResizeEvidence, ResizeSlaMonitor, SlaConfig, SlaLogEntry, SlaSummary, make_sla_hooks,
124};
125pub use undo::{
126    CommandBatch, CommandError, CommandMetadata, CommandResult, CommandSource, HistoryConfig,
127    HistoryManager, MergeConfig, TextDeleteCmd, TextInsertCmd, TextReplaceCmd, Transaction,
128    TransactionScope, UndoableCmd, WidgetId,
129};
130pub use validation_pipeline::{
131    LedgerEntry, PipelineConfig, PipelineResult, PipelineSummary, ValidationOutcome,
132    ValidationPipeline, ValidatorStats,
133};
134pub use voi_sampling::{
135    VoiConfig, VoiDecision, VoiLogEntry, VoiObservation, VoiSampler, VoiSamplerSnapshot, VoiSummary,
136};
137
138// State persistence
139#[cfg(feature = "state-persistence")]
140pub use state_persistence::FileStorage;
141pub use state_persistence::{
142    MemoryStorage, RegistryStats, StateRegistry, StorageBackend, StorageError, StorageResult,
143    StoredEntry,
144};
145
146pub use schedule_trace::{
147    CancelReason, GoldenCompareResult, IsomorphismProof, ScheduleTrace, SchedulerPolicy, TaskEvent,
148    TraceConfig, TraceEntry, TraceSummary, WakeupReason, compare_golden,
149};
150
151// Diff strategy (re-exports from ftui-render)
152pub use ftui_render::diff_strategy::{
153    DiffStrategy, DiffStrategyConfig, DiffStrategySelector, StrategyEvidence,
154};
155pub use terminal_writer::RuntimeDiffConfig;
156
157#[cfg(feature = "telemetry")]
158pub use telemetry::{
159    DecisionEvidence, EnabledReason, EndpointSource, EvidenceLedger, Protocol, SCHEMA_VERSION,
160    SpanId, TelemetryConfig, TelemetryError, TelemetryGuard, TraceContextSource, TraceId,
161    is_safe_env_var, redact,
162};