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