Skip to main content

lash/
lib.rs

1//! App-facing embedding facade for Lash.
2//!
3//! `lash` is intentionally a small layer above the lower-level
4//! `lash-core` runtime crate. Host applications own providers, persistence,
5//! app state, HTTP protocols, auth, and frontend streaming; this crate
6//! owns only the ergonomic core/session/turn API.
7//!
8//! Every public name has exactly one home. The crate root carries the daily
9//! core/session/turn path; each domain module ([`tools`], [`persistence`],
10//! [`plugins`], [`observe`], [`triggers`], ...) carries its own
11//! vocabulary. [`prelude`] mirrors the crate root exactly.
12
13pub mod admin;
14mod core;
15mod error;
16mod plugin_binding;
17pub(crate) mod process_admin;
18mod prompt_layer;
19#[cfg(feature = "rlm")]
20pub mod rlm;
21pub mod scenario_contracts;
22mod session;
23mod support;
24#[cfg(all(test, feature = "rlm"))]
25mod tests;
26pub mod turn;
27pub mod usage;
28
29pub use crate::admin::{
30    AdvancedToolAdmin, Completions, CoreTriggerAdmin, PluginOperations, SessionCommandAdmin,
31    SessionTriggerAdmin, ToolAdmin,
32};
33pub use crate::core::{LashCore, LashCoreBuilder, SessionDeleteReport};
34pub use crate::error::{EmbedError, Result};
35pub use crate::plugin_binding::PluginBinding;
36pub use crate::prompt_layer::PromptLayerSink;
37pub use crate::session::{
38    EnqueueTurnBuilder, LashSession, ObservableSession, ParkedSession, SessionBuilder,
39    SessionConfigPatch,
40};
41pub use crate::turn::{
42    QueuedTurnBuilder, TurnActivityFanout, TurnBuilder, TurnOutput, TurnResult, TurnStream,
43    message_role, message_text,
44};
45pub use lash_core::{
46    AwaitEventKey, AwaitEventWaitIdentity, ExecutionSummary, ExternalCompletionError, InputItem,
47    ModelLimits, ModelSpec, PendingTurnInput, PendingTurnInputCancelOutcome,
48    PendingTurnInputCancelResult, PendingTurnInputCancelTarget,
49    PendingTurnInputSuffixCancelOutcome, PluginStack, Resolution, ResolveOutcome, SessionCommand,
50    SessionCommandReceipt, SessionCreateRequest, SessionSpec, SessionStartPoint, TurnActivity,
51    TurnActivityId, TurnActivitySink, TurnCause, TurnEvent, TurnFinish, TurnInput, TurnOutcome,
52    TurnStop,
53};
54/// Cooperative cancellation handle accepted by
55/// [`TurnBuilder::cancel`](crate::TurnBuilder::cancel); re-exported so
56/// embedders cancel turns without depending on `tokio-util` themselves.
57pub use tokio_util::sync::CancellationToken;
58
59/// The prelude is exactly the crate root: `use lash::prelude::*;` brings in
60/// the daily core/session/turn vocabulary and nothing from the domain
61/// modules.
62pub mod prelude {
63    pub use crate::{
64        AdvancedToolAdmin, CoreTriggerAdmin, EmbedError, EnqueueTurnBuilder, ExecutionSummary,
65        InputItem, LashCore, LashCoreBuilder, LashSession, ModelLimits, ModelSpec,
66        ObservableSession, ParkedSession, PendingTurnInputCancelOutcome, PluginBinding,
67        PluginOperations, PluginStack, PromptLayerSink, QueuedTurnBuilder, Result, SessionBuilder,
68        SessionCommand, SessionCommandAdmin, SessionCommandReceipt, SessionConfigPatch,
69        SessionCreateRequest, SessionDeleteReport, SessionSpec, SessionStartPoint,
70        SessionTriggerAdmin, ToolAdmin, TurnActivity, TurnActivityFanout, TurnActivityId,
71        TurnActivitySink, TurnBuilder, TurnCause, TurnEvent, TurnFinish, TurnInput, TurnOutcome,
72        TurnOutput, TurnResult, TurnStop, TurnStream, message_role, message_text,
73    };
74}
75
76/// Session observation: cursors, resumable event streams, and live replay
77/// recovery for host frontends. Entry point: [`LashSession::observe`] /
78/// [`ObservableSession`].
79pub mod observe {
80    pub use crate::session::{
81        RemoteSessionObservationEventStream, RemoteSessionObservationStream,
82        RemoteSessionObservationStreamItem, RemoteSessionObservationSubscription,
83        SessionObservationStream, SessionObservationStreamItem,
84    };
85    pub use lash_core::{
86        InMemoryLiveReplayStore, InMemoryLiveReplayStoreConfig, LiveReplayGap, LiveReplayGapReason,
87        LiveReplayStore, SessionCursor, SessionObservation, SessionObservationEvent,
88        SessionObservationEventPayload, SessionObservationSubscription, SessionProcessEventKind,
89        SessionQueueEventKind, SessionResume, SessionRevision,
90    };
91}
92
93/// Triggers and subscriptions: declaring event sources, emitting occurrences,
94/// and inspecting trigger subscriptions. Entry points:
95/// [`LashCore::triggers`] and [`LashSession::triggers`].
96pub mod triggers {
97    pub use lash_core::{
98        LashSchema, TriggerEmitReport, TriggerEvent, TriggerEventType, TriggerOccurrenceRequest,
99        TriggerRegistration, TriggerStore, TriggerSubscriptionDraft, TriggerSubscriptionFilter,
100        TriggerSubscriptionRecord, TriggerTargetSummary, empty_trigger_source_key,
101    };
102}
103
104pub mod tools {
105    pub use lash_core::{
106        CancelHint, PendingCompletion, PreparedToolCall, TimeoutBehavior, ToolActivation,
107        ToolArgumentProjectionPolicy, ToolCall, ToolCallOutput, ToolCallRecord, ToolContext,
108        ToolContract, ToolDefinition, ToolDurableEffects, ToolExecutionGrant, ToolManifest,
109        ToolOutputContract, ToolPrepareCall, ToolPrepareContext, ToolProvider, ToolResult,
110        ToolScheduling, ToolSourceHandle, ToolTriggerClient,
111    };
112    pub use lash_core::{
113        PLUGIN_TOOL_SOURCE_ID, ToolId, ToolRestoreReport, ToolState, ToolStateEntry,
114    };
115    #[cfg(feature = "rlm")]
116    pub use lash_lashlang_runtime::{
117        CataloguePreviewEntry, CataloguePreviewOptions, DEFAULT_CATALOGUE_PREVIEW_CALL_NAME_LIMIT,
118        DEFAULT_CATALOGUE_PREVIEW_MODULE_LIMIT, LASHLANG_TOOL_BINDING_KEY, LashlangToolBinding,
119        RemoteToolGrantLashlangExt, ToolDefinitionLashlangExt, ToolManifestLashlangExt,
120        catalogue_preview_contribution, catalogue_preview_contribution_for_entries,
121        catalogue_preview_contribution_for_entries_with_options,
122        catalogue_preview_contribution_for_manifests, catalogue_preview_contribution_with_options,
123        catalogue_preview_entries_from_catalog_records, catalogue_preview_entries_from_manifests,
124        catalogue_preview_entry_from_catalog_record, catalogue_preview_entry_from_manifest,
125    };
126    #[cfg(feature = "rlm")]
127    pub use lash_lashlang_runtime::{
128        DeferredResolutionRecord, DeferredToolResolver, Resolution as DeferredToolResolution,
129        SharedDeferredToolResolver, ToolGrant as DeferredToolGrant,
130    };
131    /// Author a fixed-tool provider without hand-rolling `tool_manifests` /
132    /// `resolve_contract`: supply the [`ToolDefinition`]s once and an
133    /// [`StaticToolExecute`] for behavior.
134    pub use lash_tool_support::{StaticToolExecute, StaticToolProvider};
135}
136
137pub mod direct {
138    pub use lash_core::llm::types::{
139        LlmAttachment, LlmEventSender, LlmOutputPart, LlmTerminalReason, LlmUsage,
140    };
141    pub use lash_core::{
142        DirectCompletion, DirectJsonSchema, DirectLlmClient, DirectLlmCompletion, DirectLlmError,
143        DirectMessage, DirectOutputSpec, DirectPart, DirectRequest, DirectRole,
144    };
145}
146
147pub mod persistence {
148    pub use lash_core::CheckpointKind;
149    pub use lash_core::FileAttachmentStore;
150    pub use lash_core::runtime::{
151        DeliveryPolicy, InMemorySessionStore, InMemorySessionStoreFactory, MergeKey,
152        PendingTurnInputClaimDiagnostics, PendingTurnInputDraft, QueuedWorkBatch,
153        QueuedWorkBatchDraft, QueuedWorkClaim, QueuedWorkClaimBoundary, QueuedWorkClass,
154        QueuedWorkCompletion, QueuedWorkItem, QueuedWorkPayload, RuntimeSessionState,
155        SessionStoreCreateRequest, SessionStoreFactory, SlotPolicy, TurnInputClaim,
156        TurnInputCompletion,
157    };
158    pub use lash_core::store::queued_work;
159    pub use lash_core::store::{
160        GraphCommitDelta, HydratedSessionCheckpoint, PersistedSessionRead, RuntimeCommit,
161        RuntimeCommitResult, RuntimeTurnCommitStamp, SessionCheckpoint, SessionHead,
162        SessionHeadMeta, load_persisted_session_state, load_persisted_session_state_active_path,
163    };
164    pub use lash_core::{
165        AttachmentReclamationReport, AttachmentStore, InMemoryAttachmentStore,
166        InMemoryProcessExecutionEnvStore, ProcessExecutionEnvStore, reclaim_orphaned_attachments,
167    };
168    pub use lash_core::{
169        BlobRef, GcReport, LeaseOwnerIdentity, LeaseOwnerLiveness, PersistedSessionConfig,
170        PersistedTurnState, ProtocolEvent, QueuedWorkStore, RuntimePersistence, SessionCommitStore,
171        SessionEventRecord, SessionExecutionLease, SessionExecutionLeaseClaimOutcome,
172        SessionExecutionLeaseCompletion, SessionExecutionLeaseFence, SessionExecutionLeaseStore,
173        SessionGraph, SessionMeta, SessionNodeRecord, SessionReadScope, SessionReadView,
174        SessionRelation, StoreError, StoreMaintenance, TurnInputStore, VacuumReport,
175    };
176    #[cfg(feature = "rlm")]
177    pub use lash_lashlang_runtime::{InMemoryLashlangArtifactStore, LashlangArtifactStore};
178}
179
180pub mod plugins {
181    pub use lash_core::PluginDirective;
182    pub use lash_core::PluginOptions;
183    pub use lash_core::plugin::{
184        AfterToolCallHook, AfterTurnHook, AssistantResponseHook, AssistantResponseHookContext,
185        AssistantResponseTransform, AssistantStreamHook, AssistantStreamHookContext,
186        AssistantStreamTransform, BeforeToolCallHook, BeforeTurnHook, CheckpointHook,
187        CheckpointHookContext, CompactionContext, ContextCompaction, ContextCompactor,
188        ContextError, PluginExtensionContribution, PluginSpecBuilder, StaticPluginFactory,
189        ToolCallHookContext, ToolResultHookContext,
190    };
191    pub use lash_core::{
192        PluginError, PluginFactory, PluginHost, PluginMessage, PluginRegistrar, PluginRuntimeEvent,
193        PluginSession, PluginSessionContext, PluginSpec, PluginSpecFactory, PromptHookContext,
194        SessionPlugin, ToolCatalogContribution, TurnHookContext, TurnResultHookContext,
195    };
196    pub use lash_plugin_tool_output_budget::{
197        ToolOutputBudgetConfig, ToolOutputBudgetMode, ToolOutputBudgetPluginFactory,
198        tool_output_budget_stack as runtime_plugin_stack,
199    };
200}
201
202pub mod messages {
203    pub use lash_core::{Message, MessageRole};
204}
205
206/// Wire-format DTOs for driving lash across a process boundary, sub-namespaced
207/// by protocol domain. Only the cross-cutting handshake
208/// ([`REMOTE_PROTOCOL_VERSION`](remote::REMOTE_PROTOCOL_VERSION),
209/// [`ensure_protocol_version`](remote::ensure_protocol_version)) and the
210/// protocol error type live at this root; everything else has exactly one
211/// home in a domain sub-namespace.
212pub mod remote {
213    pub use lash_remote_protocol::{
214        REMOTE_PROTOCOL_VERSION, RemoteProtocolError, ensure_protocol_version,
215    };
216
217    /// LLM request/response envelopes: messages, attachments, tool specs,
218    /// output specs, and provider metadata.
219    pub mod llm {
220        pub use lash_remote_protocol::llm::{
221            RemoteAttachmentRef, RemoteDiagnostic, RemoteGenerationOptions, RemoteLlmAttachment,
222            RemoteLlmContentBlock, RemoteLlmMessage, RemoteLlmOutputPart, RemoteLlmOutputSpec,
223            RemoteLlmRequest, RemoteLlmRequestScope, RemoteLlmResponse, RemoteLlmRole,
224            RemoteLlmTerminalReason, RemoteLlmToolChoice, RemoteLlmToolSpec, RemoteModelIntent,
225            RemoteProviderFailureKind, RemoteProviderMetadata, RemoteProviderReasoningReplay,
226            RemoteProviderReplayMeta, RemoteResponseTextMeta, RemoteSchemaProjectionOverride,
227        };
228    }
229
230    /// Session observation: cursors, resumable observation events, and live
231    /// replay gaps.
232    pub mod observations {
233        pub use lash_remote_protocol::observations::{
234            RemoteLiveReplayGap, RemoteLiveReplayGapReason, RemoteSessionCursor,
235            RemoteSessionObservation, RemoteSessionObservationEvent,
236            RemoteSessionObservationEventPayload, RemoteSessionProcessEventKind,
237            RemoteSessionQueueEventKind,
238        };
239    }
240
241    /// Process lifecycle envelopes: start/cancel/signal/await/list requests
242    /// and results, process records, event semantics, and execution
243    /// environments.
244    pub mod processes {
245        pub use lash_remote_protocol::processes::{
246            RemoteAbandonEvidence, RemoteAbandonRequest, RemoteAbandonWriter,
247            RemoteObservedProcess, RemoteObservedProcessEvent, RemotePersistProcessEnvRequest,
248            RemotePersistProcessEnvResult, RemoteProcessAwaitOutput, RemoteProcessAwaitRequest,
249            RemoteProcessAwaitResult, RemoteProcessCancelRequest, RemoteProcessCancelResult,
250            RemoteProcessDefinitionIdentity, RemoteProcessEvent, RemoteProcessEventSemantics,
251            RemoteProcessEventSemanticsSpec, RemoteProcessEventType, RemoteProcessEventsRequest,
252            RemoteProcessEventsResponse, RemoteProcessExecutionEnvRef,
253            RemoteProcessExecutionEnvSpec, RemoteProcessExecutionPolicy, RemoteProcessExternalRef,
254            RemoteProcessHandleDescriptor, RemoteProcessInput, RemoteProcessLifecycleStatus,
255            RemoteProcessListFilter, RemoteProcessListResponse, RemoteProcessModelLimits,
256            RemoteProcessModelSpec, RemoteProcessOriginator, RemoteProcessPluginOptions,
257            RemoteProcessProvenance, RemoteProcessSignalRequest, RemoteProcessSignalResult,
258            RemoteProcessStartGrant, RemoteProcessStartRequest, RemoteProcessStartResult,
259            RemoteProcessStarted, RemoteProcessStatus, RemoteProcessStatusFilter,
260            RemoteProcessSummary, RemoteProcessTerminalSemantics, RemoteProcessTerminalSpec,
261            RemoteProcessTerminalState, RemoteProcessValueSelector, RemoteProcessWaitKind,
262            RemoteProcessWaitState, RemoteProcessWake, RemoteProcessWakeDedupeKey,
263            RemoteProcessWakeSpec, RemoteProcessWorkItem, RemoteProcessWorkSnapshot,
264            RemoteRecoveryDisposition, RemoteRuntimeEffectKind, RemoteRuntimeInvocation,
265            RemoteRuntimeReplay, RemoteRuntimeScope, RemoteRuntimeSubject, RemoteSessionScope,
266            RemoteToolFailureClass,
267        };
268    }
269
270    /// Prompt-layer envelopes: templates, slots, and contributions.
271    pub mod prompt {
272        pub use lash_remote_protocol::prompt::{
273            RemotePromptBuiltin, RemotePromptContribution, RemotePromptContributionGate,
274            RemotePromptLayer, RemotePromptSlot, RemotePromptSlotLayer, RemotePromptTemplate,
275            RemotePromptTemplateEntry, RemotePromptTemplateSection,
276        };
277    }
278
279    /// Tool grants and the remote tool-registry contract.
280    pub mod tools {
281        pub use lash_remote_protocol::registry_errors::{
282            RemoteToolRegistry, assert_remote_tool_registry_reopenable,
283        };
284        pub use lash_remote_protocol::tools::{
285            RemoteToolActivation, RemoteToolArgumentProjectionPolicy, RemoteToolGrant,
286            RemoteToolOutputContract, RemoteToolRetryPolicy, RemoteToolScheduling,
287        };
288    }
289
290    /// Trigger envelopes: occurrence emission, subscriptions, and
291    /// registrations.
292    pub mod triggers {
293        pub use lash_remote_protocol::triggers::{
294            RemoteTriggerCancelSubscriptionRequest, RemoteTriggerCancelSubscriptionResult,
295            RemoteTriggerEmitReport, RemoteTriggerInputBinding, RemoteTriggerInputTemplate,
296            RemoteTriggerListSubscriptionsResponse, RemoteTriggerOccurrenceRecord,
297            RemoteTriggerOccurrenceRequest, RemoteTriggerRegisterSubscriptionRequest,
298            RemoteTriggerRegisterSubscriptionResult, RemoteTriggerRegistration,
299            RemoteTriggerSubscriptionDraft, RemoteTriggerSubscriptionFilter,
300            RemoteTriggerSubscriptionRecord, RemoteTriggerTargetSummary,
301        };
302    }
303
304    /// Turn input envelopes: items, per-turn protocol options, and the turn
305    /// request.
306    pub mod turn_input {
307        pub use lash_remote_protocol::turn_input::{
308            RemoteInputItem, RemoteProtocolTurnOptions, RemoteTurnInput, RemoteTurnRequest,
309        };
310    }
311
312    /// Turn result envelopes: outcomes, stops, assistant output, summaries,
313    /// issues, and causal references.
314    pub mod turn_result {
315        pub use lash_remote_protocol::turn_result::{
316            RemoteAssistantOutput, RemoteAssistantOutputState, RemoteCausalRef,
317            RemoteExecutionSummary, RemoteToolCallOutcome, RemoteToolCallSummary, RemoteTurnFinish,
318            RemoteTurnIssue, RemoteTurnOutcome, RemoteTurnResult, RemoteTurnStatus, RemoteTurnStop,
319            RemoteTurnUsageSummary,
320        };
321    }
322
323    /// Token usage accounting and the streaming turn-activity vocabulary.
324    pub mod usage {
325        pub use lash_remote_protocol::usage_activity::{
326            RemoteTokenLedgerEntry, RemoteTurnActivity, RemoteTurnEvent, RemoteUsage,
327        };
328    }
329}
330
331pub mod process {
332    pub use crate::admin::SessionProcessAdmin;
333    pub use crate::process_admin::Processes;
334    pub use lash_core::{
335        AbandonEvidence, AbandonRequest, AbandonWriter, ObservedProcess, ObservedProcessEvent,
336        ObservedWorkItem, ProcessAttach, ProcessAwaitOutput, ProcessAwaiter, ProcessCancelAbility,
337        ProcessCancelAllRequest, ProcessCancelRequest, ProcessCancelSource, ProcessCancelSummary,
338        ProcessChangeHub, ProcessEvent, ProcessEventAppendRequest, ProcessEventAppendResult,
339        ProcessEventSink, ProcessEventType, ProcessExecutionContext, ProcessExecutionEnvRef,
340        ProcessExecutionEnvSpec, ProcessExternalRef, ProcessHandleDescriptor, ProcessHandleGrant,
341        ProcessHandleSummary, ProcessIdentity, ProcessInput, ProcessLease,
342        ProcessLeaseClaimOutcome, ProcessLeaseCompletion, ProcessLifecycleStatus,
343        ProcessListFilter, ProcessListMode, ProcessOpScope, ProcessProvenance, ProcessPruneReport,
344        ProcessRecord, ProcessRegistration, ProcessRegistry, ProcessRunHandle, ProcessRuntimeHost,
345        ProcessService, ProcessSessionDeleteReport, ProcessStartOptions, ProcessStartRequest,
346        ProcessStarted, ProcessStatus, ProcessStatusFilter, ProcessTerminalState, ProcessWake,
347        ProcessWakeDedupeKey, ProcessWakeDelivery, ProcessWakeSpec, ProcessWorkDriver,
348        ProcessWorkObserver, ProcessWorkSnapshot, RecoveryDisposition, SessionScope,
349        SessionScopeId, ToolSessionProcessAdmin, watch_process_registry,
350        watch_process_registry_with_sink,
351    };
352    #[cfg(feature = "rlm")]
353    pub use lash_lashlang_runtime::{
354        LASHLANG_ENGINE_KIND, LashlangProcessInput, lashlang_process_event_types,
355        lashlang_process_signal_event_types,
356    };
357}
358
359pub mod durability {
360    pub use lash_core::{
361        DurableProcessWorker, DurableProcessWorkerConfig, EffectHost, InlineEffectHost,
362        LeaseTimings, LeaseTimingsError, ProcessDrainReport, Residency, RuntimeEnvironment,
363        RuntimeHostConfig, TerminationPolicy,
364    };
365}
366
367pub mod runtime {
368    pub use crate::core::AdvancedLashCoreBuilder;
369    pub use lash_core::runtime::{
370        AssembledTurn, AwaitEventResolver, DirectCompletionClient, EmbeddedRuntimeHost, EventSink,
371        ExecutionScope, InlineRuntimeEffectController, LashRuntime, LlmAttachmentSpec,
372        LlmRequestSpec, NoopEventSink, NoopTurnActivitySink, ProcessCommand, ProcessEffectOutcome,
373        QueuedWorkDriver, QueuedWorkRunHandle, QueuedWorkRunRequest, RuntimeEffectCommand,
374        RuntimeEffectController, RuntimeEffectControllerError, RuntimeEffectEnvelope,
375        RuntimeEffectKind, RuntimeEffectLocalExecutor, RuntimeEffectOutcome,
376        RuntimeEnvironmentBuilder, RuntimeError, RuntimeErrorCode, RuntimeHandle,
377        RuntimeInvocation, RuntimeObservation, RuntimeScope, RuntimeTurnPhase,
378        RuntimeTurnPhaseProbe, ScopedEffectController, TurnContext,
379    };
380    pub use lash_core::{
381        PersistentRuntimeServices, ProtocolSessionExtensionHandle, ProtocolTurnOptions,
382        SessionHandle, SessionPolicy, SessionSnapshot, render_turn_causes_prompt,
383    };
384}
385
386pub mod prompt {
387    pub use lash_core::{
388        PromptBuiltin, PromptContribution, PromptContributionGate, PromptLayer, PromptSlot,
389        PromptTemplate, PromptTemplateEntry, PromptTemplateSection, default_prompt_template,
390    };
391}
392
393pub mod tracing {
394    pub use lash_core::{
395        JsonlTraceSink, TraceAttachment, TraceBranchSelection, TraceContentBlock, TraceError,
396        TraceEvent, TraceLabelMetadata, TraceLlmMessage, TraceLlmRequest, TraceLlmResponse,
397        TracePromptComponent, TraceProviderStreamEvent, TraceRecord, TraceRuntimeScope,
398        TraceRuntimeStreamEvent, TraceRuntimeSubject, TraceSinkError, TraceTokenUsage,
399        TraceToolSpec,
400    };
401    #[cfg(feature = "otel-trace")]
402    pub use lash_core::{OtelTraceOptions, OtelTraceSink};
403    #[cfg(feature = "rlm")]
404    pub use lash_lashlang_runtime::{
405        TraceLashlangChildExecution, TraceLashlangEdgeSelection, TraceLashlangExecutionEvent,
406        TraceLashlangExecutionIdentity, TraceLashlangGraph, TraceLashlangGraphChildLink,
407        TraceLashlangGraphEdge, TraceLashlangGraphNode, TraceLashlangGraphStore, TraceLashlangMap,
408        TraceLashlangMapEdge, TraceLashlangMapNode, TraceLashlangNodeStatus, TraceLashlangStatus,
409    };
410    pub use lash_trace::{StderrTraceSink, TeeTraceSink, TraceContext, TraceLevel, TraceSink};
411}
412
413/// Test helpers for embedders. Enable with `lash = { ..., features = ["testing"] }`
414/// to script model responses in integration tests without a live provider.
415#[cfg(all(any(test, feature = "testing"), feature = "rlm"))]
416pub mod testing;
417
418pub mod provider {
419    /// Typed provider-failure classification surfaced on
420    /// [`TurnIssue`](crate::turn::TurnIssue) and session error envelopes.
421    pub use lash_core::ProviderFailureKind;
422    pub use lash_core::provider::{
423        ProviderRateLimitPolicy, ProviderReliability, ProviderRetryPolicy,
424    };
425    /// Request/response/error vocabulary of [`Provider::complete`],
426    /// re-exported so hosts can implement provider decorators (admission
427    /// gates, metrics taps) against the facade alone.
428    pub use lash_core::{LlmRequest, LlmRequestScope, LlmResponse, LlmTransportError};
429    pub use lash_core::{
430        LlmTimeouts, Provider, ProviderComponents, ProviderFactory, ProviderHandle,
431        ProviderModelPolicy, ProviderOptions, ProviderSpec, RequestTimeout, StaticModelPolicy,
432    };
433}