1use std::collections::{HashMap, HashSet, VecDeque};
10use std::path::PathBuf;
11use std::sync::{Arc, RwLock};
12use std::time::Instant;
13
14use tokio::sync::{Notify, mpsc, watch};
15use tokio_util::sync::CancellationToken;
16use zeph_llm::any::AnyProvider;
17use zeph_llm::provider::Message;
18use zeph_llm::stt::SpeechToText;
19
20use crate::config::{ProviderEntry, SecurityConfig, SkillPromptMode, TimeoutConfig};
21use crate::config_watcher::ConfigEvent;
22use crate::context::EnvironmentContext;
23use crate::cost::CostTracker;
24use crate::instructions::{InstructionBlock, InstructionEvent, InstructionReloadState};
25use crate::metrics::MetricsSnapshot;
26use crate::vault::Secret;
27use zeph_memory::TokenCounter;
28use zeph_memory::semantic::SemanticMemory;
29use zeph_sanitizer::ContentSanitizer;
30use zeph_sanitizer::quarantine::QuarantinedSummarizer;
31use zeph_skills::matcher::SkillMatcherBackend;
32use zeph_skills::registry::SkillRegistry;
33use zeph_skills::watcher::SkillEvent;
34
35use super::message_queue::QueuedMessage;
36
37pub(crate) struct MemoryState {
38 pub(crate) memory: Option<Arc<SemanticMemory>>,
39 pub(crate) conversation_id: Option<zeph_memory::ConversationId>,
40 pub(crate) history_limit: u32,
41 pub(crate) recall_limit: usize,
42 pub(crate) summarization_threshold: usize,
43 pub(crate) cross_session_score_threshold: f32,
44 pub(crate) autosave_assistant: bool,
45 pub(crate) autosave_min_length: usize,
46 pub(crate) tool_call_cutoff: usize,
47 pub(crate) unsummarized_count: usize,
48 pub(crate) document_config: crate::config::DocumentConfig,
49 pub(crate) graph_config: crate::config::GraphConfig,
50 pub(crate) compression_guidelines_config: zeph_memory::CompressionGuidelinesConfig,
51 pub(crate) shutdown_summary: bool,
52 pub(crate) shutdown_summary_min_messages: usize,
53 pub(crate) shutdown_summary_max_messages: usize,
54 pub(crate) shutdown_summary_timeout_secs: u64,
55 pub(crate) structured_summaries: bool,
58}
59
60pub(crate) struct SkillState {
61 pub(crate) registry: std::sync::Arc<std::sync::RwLock<SkillRegistry>>,
62 pub(crate) skill_paths: Vec<PathBuf>,
63 pub(crate) managed_dir: Option<PathBuf>,
64 pub(crate) trust_config: crate::config::TrustConfig,
65 pub(crate) matcher: Option<SkillMatcherBackend>,
66 pub(crate) max_active_skills: usize,
67 pub(crate) disambiguation_threshold: f32,
68 pub(crate) embedding_model: String,
69 pub(crate) skill_reload_rx: Option<mpsc::Receiver<SkillEvent>>,
70 pub(crate) active_skill_names: Vec<String>,
71 pub(crate) last_skills_prompt: String,
72 pub(crate) prompt_mode: SkillPromptMode,
73 pub(crate) available_custom_secrets: HashMap<String, Secret>,
75 pub(crate) cosine_weight: f32,
76 pub(crate) hybrid_search: bool,
77 pub(crate) bm25_index: Option<zeph_skills::bm25::Bm25Index>,
78}
79
80pub(crate) struct McpState {
81 pub(crate) tools: Vec<zeph_mcp::McpTool>,
82 pub(crate) registry: Option<zeph_mcp::McpToolRegistry>,
83 pub(crate) manager: Option<std::sync::Arc<zeph_mcp::McpManager>>,
84 pub(crate) allowed_commands: Vec<String>,
85 pub(crate) max_dynamic: usize,
86 pub(crate) shared_tools: Option<std::sync::Arc<std::sync::RwLock<Vec<zeph_mcp::McpTool>>>>,
88 pub(crate) tool_rx: Option<tokio::sync::watch::Receiver<Vec<zeph_mcp::McpTool>>>,
90}
91
92pub(crate) struct IndexState {
93 pub(crate) retriever: Option<std::sync::Arc<zeph_index::retriever::CodeRetriever>>,
94 pub(crate) repo_map_tokens: usize,
95 pub(crate) cached_repo_map: Option<(String, std::time::Instant)>,
96 pub(crate) repo_map_ttl: std::time::Duration,
97}
98
99pub(crate) struct RuntimeConfig {
100 pub(crate) security: SecurityConfig,
101 pub(crate) timeouts: TimeoutConfig,
102 pub(crate) model_name: String,
103 pub(crate) active_provider_name: String,
106 pub(crate) permission_policy: zeph_tools::PermissionPolicy,
107 pub(crate) redact_credentials: bool,
108 pub(crate) rate_limiter: super::rate_limiter::ToolRateLimiter,
109 pub(crate) semantic_cache_enabled: bool,
110 pub(crate) semantic_cache_threshold: f32,
111 pub(crate) semantic_cache_max_candidates: u32,
112 pub(crate) dependency_config: zeph_tools::DependencyConfig,
114}
115
116pub(crate) struct FeedbackState {
118 pub(crate) detector: super::feedback_detector::FeedbackDetector,
119 pub(crate) judge: Option<super::feedback_detector::JudgeDetector>,
120 pub(crate) llm_classifier: Option<zeph_llm::classifier::llm::LlmClassifier>,
123}
124
125pub(crate) struct SecurityState {
127 pub(crate) sanitizer: ContentSanitizer,
128 pub(crate) quarantine_summarizer: Option<QuarantinedSummarizer>,
129 pub(crate) exfiltration_guard: zeph_sanitizer::exfiltration::ExfiltrationGuard,
130 pub(crate) flagged_urls: HashSet<String>,
131 pub(crate) user_provided_urls: Arc<RwLock<HashSet<String>>>,
135 pub(crate) pii_filter: zeph_sanitizer::pii::PiiFilter,
136 #[cfg(feature = "classifiers")]
140 pub(crate) pii_ner_backend: Option<std::sync::Arc<dyn zeph_llm::classifier::ClassifierBackend>>,
141 #[cfg(feature = "classifiers")]
143 pub(crate) pii_ner_timeout_ms: u64,
144 pub(crate) memory_validator: zeph_sanitizer::memory_validation::MemoryWriteValidator,
145 #[cfg(feature = "guardrail")]
147 pub(crate) guardrail: Option<zeph_sanitizer::guardrail::GuardrailFilter>,
148 pub(crate) response_verifier: zeph_sanitizer::response_verifier::ResponseVerifier,
150}
151
152pub(crate) struct DebugState {
154 pub(crate) debug_dumper: Option<crate::debug_dump::DebugDumper>,
155 pub(crate) dump_format: crate::debug_dump::DumpFormat,
156 pub(crate) trace_collector: Option<crate::debug_dump::trace::TracingCollector>,
157 pub(crate) iteration_counter: usize,
160 pub(crate) anomaly_detector: Option<zeph_tools::AnomalyDetector>,
161 pub(crate) logging_config: crate::config::LoggingConfig,
162 pub(crate) dump_dir: Option<PathBuf>,
164 pub(crate) trace_service_name: String,
166 pub(crate) trace_redact: bool,
168 pub(crate) current_iteration_span_id: Option<[u8; 8]>,
171}
172
173pub(crate) struct LifecycleState {
175 pub(crate) shutdown: watch::Receiver<bool>,
176 pub(crate) start_time: Instant,
177 pub(crate) cancel_signal: Arc<Notify>,
178 pub(crate) cancel_token: CancellationToken,
179 pub(crate) config_path: Option<PathBuf>,
180 pub(crate) config_reload_rx: Option<mpsc::Receiver<ConfigEvent>>,
181 pub(crate) warmup_ready: Option<watch::Receiver<bool>>,
182 pub(crate) update_notify_rx: Option<mpsc::Receiver<String>>,
183 pub(crate) custom_task_rx: Option<mpsc::Receiver<String>>,
184}
185
186pub struct ProviderConfigSnapshot {
191 pub claude_api_key: Option<String>,
192 pub openai_api_key: Option<String>,
193 pub gemini_api_key: Option<String>,
194 pub compatible_api_keys: std::collections::HashMap<String, String>,
195 pub llm_request_timeout_secs: u64,
196 pub embedding_model: String,
197}
198
199pub(crate) struct ProviderState {
201 pub(crate) summary_provider: Option<AnyProvider>,
202 pub(crate) provider_override: Option<Arc<std::sync::RwLock<Option<AnyProvider>>>>,
204 pub(crate) judge_provider: Option<AnyProvider>,
205 pub(crate) probe_provider: Option<AnyProvider>,
208 pub(crate) cached_prompt_tokens: u64,
209 pub(crate) server_compaction_active: bool,
212 pub(crate) stt: Option<Box<dyn SpeechToText>>,
213 pub(crate) provider_pool: Vec<ProviderEntry>,
215 pub(crate) provider_config_snapshot: Option<ProviderConfigSnapshot>,
217}
218
219pub(crate) struct MetricsState {
221 pub(crate) metrics_tx: Option<watch::Sender<MetricsSnapshot>>,
222 pub(crate) cost_tracker: Option<CostTracker>,
223 pub(crate) token_counter: Arc<TokenCounter>,
224 pub(crate) extended_context: bool,
227}
228
229pub(crate) struct OrchestrationState {
231 pub(crate) planner_provider: Option<AnyProvider>,
234 pub(crate) pending_graph: Option<crate::orchestration::TaskGraph>,
236 pub(crate) plan_cancel_token: Option<CancellationToken>,
245 pub(crate) subagent_manager: Option<crate::subagent::SubAgentManager>,
247 pub(crate) subagent_config: crate::config::SubAgentConfig,
248 pub(crate) orchestration_config: crate::config::OrchestrationConfig,
249 pub(crate) plan_cache: Option<crate::orchestration::PlanCache>,
252 pub(crate) pending_goal_embedding: Option<Vec<f32>>,
255}
256
257pub(crate) struct InstructionState {
259 pub(crate) blocks: Vec<InstructionBlock>,
260 pub(crate) reload_rx: Option<mpsc::Receiver<InstructionEvent>>,
261 pub(crate) reload_state: Option<InstructionReloadState>,
262}
263
264pub(crate) struct ExperimentState {
266 #[cfg(feature = "experiments")]
267 pub(crate) config: crate::config::ExperimentConfig,
268 #[cfg(feature = "experiments")]
270 pub(crate) cancel: Option<tokio_util::sync::CancellationToken>,
271 #[cfg(feature = "experiments")]
273 pub(crate) baseline: crate::experiments::ConfigSnapshot,
274 #[cfg(feature = "experiments")]
277 pub(crate) eval_provider: Option<AnyProvider>,
278 pub(crate) notify_rx: Option<tokio::sync::mpsc::Receiver<String>>,
281 #[cfg(feature = "experiments")]
283 pub(crate) notify_tx: tokio::sync::mpsc::Sender<String>,
284}
285
286#[cfg(feature = "context-compression")]
288pub(crate) struct SubgoalExtractionResult {
289 pub(crate) current: String,
291 pub(crate) completed: Option<String>,
293}
294
295#[cfg(feature = "context-compression")]
297pub(crate) struct CompressionState {
298 pub(crate) current_task_goal: Option<String>,
301 pub(crate) task_goal_user_msg_hash: Option<u64>,
303 pub(crate) pending_task_goal: Option<tokio::task::JoinHandle<Option<String>>>,
306 pub(crate) pending_sidequest_result: Option<tokio::task::JoinHandle<Option<Vec<usize>>>>,
309 pub(crate) subgoal_registry: crate::agent::compaction_strategy::SubgoalRegistry,
311 pub(crate) pending_subgoal: Option<tokio::task::JoinHandle<Option<SubgoalExtractionResult>>>,
313 pub(crate) subgoal_user_msg_hash: Option<u64>,
315}
316
317pub(crate) struct SessionState {
319 pub(crate) env_context: EnvironmentContext,
320 pub(crate) response_cache: Option<std::sync::Arc<zeph_memory::ResponseCache>>,
321 pub(crate) parent_tool_use_id: Option<String>,
325 pub(crate) status_tx: Option<tokio::sync::mpsc::UnboundedSender<String>>,
327 #[cfg(feature = "lsp-context")]
330 pub(crate) lsp_hooks: Option<crate::lsp_hooks::LspHookRunner>,
331 #[cfg(feature = "policy-enforcer")]
333 pub(crate) policy_config: Option<zeph_tools::PolicyConfig>,
334}
335
336pub(crate) struct MessageState {
338 pub(crate) messages: Vec<Message>,
339 #[allow(private_interfaces)]
341 pub(crate) message_queue: VecDeque<QueuedMessage>,
342 pub(crate) pending_image_parts: Vec<zeph_llm::provider::MessagePart>,
344}
345
346#[cfg(test)]
347mod tests;