aether-wisp 0.4.14

A terminal UI for AI coding agents via the Agent Client Protocol (ACP)
Documentation
use crate::settings::WISP_HOME_ENV_MUTEX;
use acp_utils::ElicitationSchema;
use acp_utils::notifications::{CreateElicitationRequestParams, ElicitationParams};
use std::path::Path;
use tui::{Event, KeyCode, KeyEvent, KeyModifiers};

pub fn key(code: KeyCode) -> Event {
    Event::Key(key_event(code))
}

pub fn modified_key(code: KeyCode, modifiers: KeyModifiers) -> Event {
    Event::Key(modified_key_event(code, modifiers))
}

pub fn key_event(code: KeyCode) -> KeyEvent {
    modified_key_event(code, KeyModifiers::NONE)
}

pub fn modified_key_event(code: KeyCode, modifiers: KeyModifiers) -> KeyEvent {
    KeyEvent::new(code, modifiers)
}

pub fn elicitation_params(
    server: impl Into<String>,
    message: impl Into<String>,
    requested_schema: ElicitationSchema,
) -> ElicitationParams {
    ElicitationParams {
        server_name: server.into(),
        request: CreateElicitationRequestParams::FormElicitationParams {
            meta: None,
            message: message.into(),
            requested_schema,
        },
    }
}

pub fn url_elicitation_params(
    server: impl Into<String>,
    elicitation_id: impl Into<String>,
    url: impl Into<String>,
) -> ElicitationParams {
    url_elicitation_params_with_message(server, "Auth", elicitation_id, url)
}

pub fn url_elicitation_params_with_message(
    server: impl Into<String>,
    message: impl Into<String>,
    elicitation_id: impl Into<String>,
    url: impl Into<String>,
) -> ElicitationParams {
    ElicitationParams {
        server_name: server.into(),
        request: CreateElicitationRequestParams::UrlElicitationParams {
            meta: None,
            message: message.into(),
            url: url.into(),
            elicitation_id: elicitation_id.into(),
        },
    }
}

pub fn with_wisp_home(path: &Path, f: impl FnOnce()) {
    let _guard = WISP_HOME_ENV_MUTEX.lock().unwrap_or_else(std::sync::PoisonError::into_inner);
    let old = std::env::var_os("WISP_HOME");
    unsafe { std::env::set_var("WISP_HOME", path) };
    f();
    if let Some(value) = old {
        unsafe { std::env::set_var("WISP_HOME", value) };
    } else {
        unsafe { std::env::remove_var("WISP_HOME") };
    }
}

#[allow(dead_code)]
pub const CUSTOM_TMTHEME: &str = r#"<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>name</key>
    <string>Custom</string>
    <key>settings</key>
    <array>
        <dict>
            <key>settings</key>
            <dict>
                <key>foreground</key>
                <string>#112233</string>
                <key>background</key>
                <string>#000000</string>
            </dict>
        </dict>
    </array>
</dict>
</plist>"#;