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}