a3s 0.10.5

a3s — A3S coding agent CLI; `a3s code` launches the interactive TUI
Documentation
use std::sync::Arc;

use a3s_boot::{Module, ProviderDefinition, ProviderToken, Result as BootResult};

use super::router::RemoteIntentRouter;
use super::service::RemoteAgentReadService;
use crate::api::code_web::kernel::{KernelModule, ManagedSessionReadPort};
use crate::api::code_web::state::CodeWebState;

pub(in crate::api::code_web) struct RemoteModule;

impl Module for RemoteModule {
    fn name(&self) -> &'static str {
        "a3s-code-web-remote"
    }

    fn imports(&self) -> Vec<Arc<dyn Module>> {
        vec![Arc::new(KernelModule)]
    }

    fn providers(&self) -> BootResult<Vec<ProviderDefinition>> {
        Ok(vec![
            ProviderDefinition::factory_arc::<RemoteAgentReadService, _>(|module_ref| {
                let managed = module_ref.get::<ManagedSessionReadPort>()?;
                Ok(Arc::new(RemoteAgentReadService::new(managed)))
            }),
            ProviderDefinition::factory_arc::<RemoteIntentRouter, _>(|module_ref| {
                let state = module_ref.get::<CodeWebState>()?;
                let llm = crate::session_llm::resolve_config_llm_client(
                    &state.code_config_snapshot(),
                    &a3s_code_core::SessionOptions::new(),
                    "weixin-intent-router",
                )
                .ok();
                Ok(Arc::new(RemoteIntentRouter::with_optional_llm(llm)))
            }),
        ])
    }

    fn exports(&self) -> BootResult<Vec<ProviderToken>> {
        Ok(vec![
            ProviderToken::of::<RemoteAgentReadService>(),
            ProviderToken::of::<RemoteIntentRouter>(),
        ])
    }
}