use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::Arc;
use async_trait::async_trait;
use tokio::sync::{broadcast, RwLock};
use tokio_util::sync::CancellationToken;
use crate::error::AppError;
use crate::metrics_service::MetricsService;
use crate::schedules::{ScheduleManager, ScheduleStore};
use crate::spawn_scheduler::SpawnScheduler;
use bamboo_agent_core::storage::Storage;
use bamboo_agent_core::AgentEvent;
use bamboo_agent_core::{tools::ToolSchema, Message};
use bamboo_engine::McpServerManager;
use bamboo_engine::SkillManager;
use bamboo_infrastructure::registry::ProcessRegistry;
use bamboo_infrastructure::Config;
use bamboo_infrastructure::SessionStoreV2;
use bamboo_infrastructure::{LLMError, LLMProvider, LLMStream};
pub use bamboo_engine::context::{
build_env_prompt_context, build_workspace_prompt_context, workspace_prompt_guidance,
DEFAULT_BASE_PROMPT, ENV_CONTEXT_END_MARKER, ENV_CONTEXT_START_MARKER,
WORKSPACE_CONTEXT_END_MARKER, WORKSPACE_CONTEXT_PREFIX, WORKSPACE_CONTEXT_START_MARKER,
};
struct UnconfiguredProvider {
message: String,
}
#[async_trait]
impl LLMProvider for UnconfiguredProvider {
async fn chat_stream(
&self,
_messages: &[Message],
_tools: &[ToolSchema],
_max_output_tokens: Option<u32>,
_model: &str,
) -> bamboo_infrastructure::provider::Result<LLMStream> {
Err(LLMError::Auth(format!(
"LLM provider is not configured: {}",
self.message
)))
}
async fn list_models(&self) -> bamboo_infrastructure::provider::Result<Vec<String>> {
Err(LLMError::Auth(format!(
"LLM provider is not configured: {}",
self.message
)))
}
}
pub use bamboo_engine::execution::runner_state::{AgentRunner, AgentStatus};
pub struct AppState {
pub app_data_dir: PathBuf,
pub config: Arc<RwLock<Config>>,
pub provider: Arc<RwLock<Arc<dyn LLMProvider>>>,
provider_handle: Arc<dyn LLMProvider>,
pub sessions: Arc<RwLock<HashMap<String, bamboo_agent_core::Session>>>,
pub storage: Arc<dyn Storage>,
pub session_store: Arc<SessionStoreV2>,
pub spawn_scheduler: Arc<SpawnScheduler>,
pub schedule_store: Arc<ScheduleStore>,
pub schedule_manager: Arc<ScheduleManager>,
pub tool_factory: crate::tools::ToolSurfaceFactory,
pub subagent_profiles: Arc<bamboo_domain::subagent::SubagentProfileRegistry>,
pub cancel_tokens: Arc<RwLock<HashMap<String, CancellationToken>>>,
pub skill_manager: Arc<SkillManager>,
pub mcp_manager: Arc<McpServerManager>,
pub metrics_service: Arc<MetricsService>,
pub agent_runners: Arc<RwLock<HashMap<String, AgentRunner>>>,
pub session_event_senders: Arc<RwLock<HashMap<String, broadcast::Sender<AgentEvent>>>>,
pub process_registry: Arc<ProcessRegistry>,
pub metrics_bus: Option<bamboo_engine::metrics::bus::MetricsBus>,
pub agent: Arc<bamboo_engine::Agent>,
pub provider_registry: Arc<bamboo_infrastructure::ProviderRegistry>,
pub provider_router: Arc<bamboo_infrastructure::ProviderModelRouter>,
pub model_catalog: Arc<bamboo_infrastructure::ModelCatalogService>,
}
mod builder;
mod config_runtime;
pub mod init;
mod persistence;
mod provider_api;
pub mod resume_adapter;
pub mod runner_lifecycle;
pub(crate) mod session_events;
mod session_loader;
mod tools;
#[cfg(test)]
mod tests;
#[derive(Debug, Clone, Copy, Default)]
pub struct ConfigUpdateEffects {
pub reload_provider: bool,
pub reconcile_mcp: bool,
}