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