codetether-agent 4.5.7

A2A-native AI coding agent for the CodeTether ecosystem
Documentation
use crate::session::Session;
use crate::tui::app::commands::set_auto_apply_edits;
use crate::tui::app::state::App;

fn on_off_label(enabled: bool) -> &'static str {
    if enabled { "ON" } else { "OFF" }
}

pub fn network_access_status_message(enabled: bool) -> String {
    format!("TUI network access: {}", on_off_label(enabled))
}

pub async fn set_network_access(app: &mut App, session: &mut Session, next: bool) {
    app.state.allow_network = next;
    session.metadata.allow_network = next;

    if next {
        unsafe {
            std::env::set_var("CODETETHER_SANDBOX_BASH_ALLOW_NETWORK", "1");
        }
    } else {
        unsafe {
            std::env::remove_var("CODETETHER_SANDBOX_BASH_ALLOW_NETWORK");
        }
    }

    match session.save().await {
        Ok(()) => {
            app.state.status = network_access_status_message(next);
        }
        Err(error) => {
            app.state.status = format!(
                "{} (not persisted: {error})",
                network_access_status_message(next)
            );
        }
    }
}

pub async fn toggle_network_access(app: &mut App, session: &mut Session) {
    set_network_access(app, session, !app.state.allow_network).await;
}

pub fn autocomplete_status_message(enabled: bool) -> String {
    format!("TUI slash autocomplete: {}", on_off_label(enabled))
}

pub async fn set_slash_autocomplete(app: &mut App, session: &mut Session, next: bool) {
    app.state.slash_autocomplete = next;
    session.metadata.slash_autocomplete = next;

    match session.save().await {
        Ok(()) => {
            app.state.status = autocomplete_status_message(next);
        }
        Err(error) => {
            app.state.status = format!(
                "{} (not persisted: {error})",
                autocomplete_status_message(next)
            );
        }
    }
}

pub async fn toggle_slash_autocomplete(app: &mut App, session: &mut Session) {
    set_slash_autocomplete(app, session, !app.state.slash_autocomplete).await;
}

pub fn worktree_status_message(enabled: bool) -> String {
    format!("TUI worktree isolation: {}", on_off_label(enabled))
}

pub async fn set_use_worktree(app: &mut App, session: &mut Session, next: bool) {
    app.state.use_worktree = next;
    session.metadata.use_worktree = next;

    match session.save().await {
        Ok(()) => {
            app.state.status = worktree_status_message(next);
        }
        Err(error) => {
            app.state.status =
                format!("{} (not persisted: {error})", worktree_status_message(next));
        }
    }
}

pub async fn toggle_selected_setting(app: &mut App, session: &mut Session) {
    match app.state.selected_settings_index {
        0 => set_auto_apply_edits(app, session, !app.state.auto_apply_edits).await,
        1 => set_network_access(app, session, !app.state.allow_network).await,
        2 => set_slash_autocomplete(app, session, !app.state.slash_autocomplete).await,
        3 => set_use_worktree(app, session, !app.state.use_worktree).await,
        _ => {}
    }
}