bcode_tui 0.0.1-alpha.0

Terminal user interface for bcode
//! Ralph native TUI plugin launcher.

use std::path::PathBuf;

use serde::Deserialize;

use crate::TuiError;

/// Typed Ralph actions selected in the plugin surface.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RalphHomeAction {
    /// Open guided setup flow.
    #[serde(alias = "plan")]
    Plan,
    /// Save latest assistant planning output into the setup draft.
    #[serde(alias = "save-draft")]
    SaveDraft,
    /// View saved setup draft contents.
    #[serde(alias = "view-draft")]
    ViewDraft,
    /// Build a focused revision prompt for the saved setup draft.
    #[serde(alias = "revise-draft")]
    ReviseDraft,
    /// Start guided setup to rebuild the latest existing loop context.
    #[serde(alias = "rebuild-loop-context")]
    RebuildLoopContext,
    /// Approve the saved setup draft.
    #[serde(alias = "approve-draft")]
    ApproveDraft,
    /// Create loop from approved setup draft.
    #[serde(alias = "create-from-draft")]
    CreateFromDraft,
    /// Apply approved setup draft to existing loop.
    #[serde(alias = "apply-draft-to-loop")]
    ApplyDraftToLoop,
    /// Open quick setup flow.
    #[serde(alias = "start")]
    Start,
    /// Prepare/run autonomous loop.
    Run,
    /// Approve prepared run.
    Approve,
    /// Stop active run.
    Stop,
    /// Resume interrupted run.
    Resume,
    /// Show status.
    Status,
    /// List runs.
    Runs,
    /// List iterations.
    Iterations,
    /// Open progress document.
    Open,
    /// Build audit prompt.
    Audit,
    /// Build replan prompt.
    Replan,
    /// Open goal workflow.
    Goal,
}

pub(crate) async fn open_root_ralph_home_surface(
    repo_path: PathBuf,
    flash_message: Option<&str>,
) -> Result<bcode_plugin_sdk::tui::BoxedPluginTuiSurface, TuiError> {
    open_ralph_home_surface(repo_path, flash_message).await
}

async fn open_ralph_home_surface(
    repo_path: PathBuf,
    flash_message: Option<&str>,
) -> Result<bcode_plugin_sdk::tui::BoxedPluginTuiSurface, TuiError> {
    let runtime = load_ralph_tui_runtime()?;
    let options = flash_message.map_or(
        serde_json::Value::Null,
        |message| serde_json::json!({ "flash_message": message }),
    );
    crate::plugin_tui::open_plugin_tui_surface(
        &runtime,
        "bcode.ralph",
        "ralph-home",
        bcode_plugin_sdk::tui::PluginTuiSurfaceOpenRequest {
            instance_id: "ralph-home".to_string(),
            repo_path: Some(repo_path),
            session_id: None,
            target: None,
            options,
        },
    )
    .await
    .map_err(|error| TuiError::PluginService {
        code: "tui_surface_open_failed".to_string(),
        message: error.to_string(),
    })
}

fn load_ralph_tui_runtime() -> Result<bcode_plugin::PluginRuntimeHost, TuiError> {
    bcode_plugin::PluginRuntimeHost::load_defaults_with_static_bundled(
        &bcode_plugin::PluginSelection::all_enabled(),
        &crate::static_bundled_plugins(),
    )
    .map_err(|error| TuiError::PluginService {
        code: "plugin_runtime_load_failed".to_string(),
        message: error.to_string(),
    })
}