vtcode-core 0.19.1

Core library for VTCode - a Rust-based terminal coding agent
Documentation
use vtcode_core::config::core::PromptCachingConfig;
use vtcode_core::config::loader::VTCodeConfig;
use vtcode_core::config::types::{
    AgentConfig as CoreAgentConfig, ModelSelectionSource, ReasoningEffortLevel, UiSurfacePreference,
};
use vtcode_core::core::router::{Router, TaskClass};

fn core_cfg(model: &str) -> CoreAgentConfig {
    CoreAgentConfig {
        model: model.to_string(),
        api_key: "test".to_string(),
        provider: "gemini".to_string(),
        workspace: std::env::current_dir().unwrap(),
        verbose: false,
        theme: vtcode_core::ui::theme::DEFAULT_THEME_ID.to_string(),
        reasoning_effort: ReasoningEffortLevel::default(),
        ui_surface: UiSurfacePreference::default(),
        prompt_cache: PromptCachingConfig::default(),
        model_source: ModelSelectionSource::WorkspaceConfig,
    }
}

#[test]
fn classify_simple_and_codegen() {
    assert_eq!(Router::classify_heuristic("list files"), TaskClass::Simple);
    assert_eq!(
        Router::classify_heuristic(
            "```
fn main() {}
```"
        ),
        TaskClass::CodegenHeavy
    );
}

#[test]
fn route_uses_model_mapping() {
    let mut cfg = VTCodeConfig::default();
    cfg.router.enabled = true;
    cfg.router.models.standard = "gemini-2.5-flash-preview-05-20".to_string();
    cfg.router.models.codegen_heavy = "gemini-2.5-pro".to_string();

    let core = core_cfg("gemini-2.5-flash-preview-05-20");
    let r1 = Router::route(&cfg, &core, "summarize this text");
    assert_eq!(r1.selected_model, "gemini-2.5-flash-preview-05-20");

    let r2 = Router::route(&cfg, &core, "Provide a patch:\n```diff\n- a\n+ b\n```\n");
    assert_eq!(r2.selected_model, "gemini-2.5-pro");
}