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