Skip to main content

lash_sansio/
lib.rs

1pub mod attachment;
2pub mod causal;
3pub mod llm;
4pub mod plugin;
5pub mod prompt;
6pub mod sansio;
7pub mod session;
8pub mod session_model;
9pub mod tool_contract;
10pub mod tool_output;
11pub mod tool_surface;
12pub mod turn;
13pub mod turn_driver;
14
15pub const VERSION: &str = env!("CARGO_PKG_VERSION");
16
17pub use attachment::{
18    AttachmentCreateMeta, AttachmentId, AttachmentMeta, AttachmentRef, ImageMediaType, MediaType,
19};
20pub use causal::CausalRef;
21pub use llm::types::LlmTerminalReason;
22pub use plugin::{
23    CheckpointKind, PluginMessage, PluginRuntimeEvent, PromptContribution, PromptContributionGate,
24};
25pub use prompt::{
26    PreparedPrompt, PromptBuildInput, PromptCache, PromptContext, PromptContributionSet,
27    PromptFingerprint, build_prompt, build_prompt_cached, prompt_template_fingerprint,
28    prompt_text_fingerprint, prompt_tool_names_fingerprint,
29};
30pub use sansio::{
31    ChatContextProjector, CheckpointDelivery, CheckpointResumeAction, CompletedToolCall,
32    ContextProjector, DriverAction, DriverContextView, Effect, EffectId, LlmCallError,
33    PendingToolCall, ProjectorContext, ProtocolDriverHandle, Response, TurnCause, TurnCheckpoint,
34    TurnMachine, TurnMachineConfig, TurnProtocol, UnitTurnProtocol, WaitingExecState,
35    WaitingLlmState, render_turn_causes_prompt,
36};
37pub use session::{
38    CompletedTurn, ExecImage, ExecResponse, PromptUsage, SansIoSessionState,
39    TextProjectionMetadata, apply_completed_turn,
40};
41pub use session_model::message::MessageOrigin;
42pub use session_model::{
43    AcceptedInjectedTurnInput, BaseRenderCache, ConversationRecord, ErrorEnvelope,
44    MAIN_AGENT_INTRO, Message, MessageRole, MessageSequence, Part, PartAttachment, PartKind,
45    PromptBuiltin, PromptLayer, PromptSlot, PromptSlotLayer, PromptTemplate, PromptTemplateEntry,
46    PromptTemplateSection, PruneState, RenderedPrompt, ResolvedPromptLayer, SessionEvent,
47    SessionEventRecord, TokenUsage, TurnFinish, TurnOutcome, TurnStop, default_prompt_template,
48    messages_are_prompt_resume_safe, resolve_prompt_layers, shared_parts,
49};
50pub use tool_contract::{
51    CompactToolContract, LashSchema, ModelTool, SchemaProjectionOverride, ToolActivation,
52    ToolAgentExecutableSurface, ToolAgentSurface, ToolArgumentProjectionPolicy, ToolAvailability,
53    ToolAvailabilityConfig, ToolContract, ToolDefinition, ToolId, ToolManifest, ToolOutputContract,
54    ToolRetryPolicy, ToolScheduling, schema_for, validate_tool_input,
55};
56pub use tool_output::{
57    ModelToolReturn, ModelToolReturnPart, ToolCallOutcome, ToolCallOutput, ToolCallRecord,
58    ToolCallStatus, ToolCancellation, ToolControl, ToolFailure, ToolFailureClass,
59    ToolFailureSource, ToolRetryDisposition, ToolValue, format_tool_output_content,
60    model_parts_from_tool_output,
61};
62pub use tool_surface::{
63    ToolContractResolver, ToolSurface, ToolSurfaceBuildInput, ToolSurfaceContribution,
64    ToolSurfaceEntry, ToolSurfaceOverride, build_tool_surface,
65};
66pub use turn::{PreparedTurnMachine, SansIoTurnInput, build_turn};
67pub use turn_driver::{
68    TurnDriverConfig, TurnDriverPreamble, TurnLimitFinalMessage, append_assistant_text_part,
69    normalized_response_parts, reasoning_part,
70};
71
72pub fn head_tail_truncate(value: &str, max_chars: usize) -> (String, usize) {
73    let raw_len = value.chars().count();
74    if max_chars == 0 || raw_len <= max_chars {
75        return (value.to_string(), raw_len);
76    }
77    let head_len = max_chars / 2;
78    let tail_len = max_chars.saturating_sub(head_len);
79    let head = value.chars().take(head_len).collect::<String>();
80    let tail = value
81        .chars()
82        .rev()
83        .take(tail_len)
84        .collect::<Vec<_>>()
85        .into_iter()
86        .rev()
87        .collect::<String>();
88    let omitted = raw_len.saturating_sub(head_len + tail_len);
89    (
90        format!("{head}\n\n... ({omitted} characters omitted) ...\n\n{tail}"),
91        raw_len,
92    )
93}