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