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