vtcode 0.137.0

A Rust-based terminal coding agent with modular architecture supporting multiple LLM providers
use crate::startup::StartupContext;
use anyhow::Result;
use vtcode_core::cli::args::{AskCommandOptions, Cli, Commands};

use super::adapters::ask_options;

#[derive(Debug, Clone)]
pub(crate) enum ResolvedCliAction {
    Ask {
        prompt: Option<String>,
        options: AskCommandOptions,
    },
    FullAuto {
        prompt: String,
    },
    Resume {
        mode: crate::startup::SessionResumeMode,
    },
    Command(Commands),
    Chat,
}

pub(crate) fn resolve_action(
    args: &Cli,
    startup: &StartupContext,
    print_mode: Option<String>,
) -> Result<ResolvedCliAction> {
    if let Some(print_value) = print_mode {
        return Ok(ResolvedCliAction::Ask {
            prompt: Some(crate::main_helpers::build_print_prompt(print_value)?),
            options: ask_options(args, None, startup.skip_confirmations),
        });
    }

    if let Some(prompt) = startup.automation_prompt.clone() {
        return Ok(ResolvedCliAction::FullAuto { prompt });
    }

    if let Some(mode) = startup.session_resume.clone() {
        return Ok(ResolvedCliAction::Resume { mode });
    }

    // The `continue` subcommand mirrors the `--continue` flag: resume the most
    // recent conversation automatically. A custom session id turns it into a
    // fork of the latest session.
    if matches!(args.command, Some(Commands::Continue)) {
        let mode = if startup.custom_session_id.is_some() {
            crate::startup::SessionResumeMode::Fork("__latest__".to_string())
        } else {
            crate::startup::SessionResumeMode::Latest
        };
        return Ok(ResolvedCliAction::Resume { mode });
    }

    Ok(match args.command.clone() {
        Some(command) => ResolvedCliAction::Command(command),
        None => ResolvedCliAction::Chat,
    })
}