use std::path::Path;
use crate::marked_block;
use super::claude::anthropic_api_key_available;
use super::commandcode::{commandcode_auth_available, render_commandcode_shell_exports};
use super::grok::{ShellFlavor, effective_grok_auth_mode, render_grok_shell_exports};
use super::util::{ANTHROPIC_OMITTED_NOTE, PROXY_ENV_END, PROXY_ENV_START, is_proxy_reachable};
pub(crate) fn install_shell_exports(home: &Path, port: u16, quiet: bool, force_endpoint: bool) {
if !is_proxy_reachable(port) {
if !quiet {
println!(" Skipping shell proxy exports (proxy not running on port {port})");
}
return;
}
let base = format!("http://127.0.0.1:{port}");
let openai_base = format!("{base}/v1");
let include_anthropic = anthropic_api_key_available(home);
let grok_mode = effective_grok_auth_mode(home, force_endpoint);
let posix_grok = render_grok_shell_exports(&base, grok_mode, ShellFlavor::Posix);
let commandcode_available = commandcode_auth_available(home) || force_endpoint;
let posix_commandcode =
render_commandcode_shell_exports(&base, commandcode_available, ShellFlavor::Posix);
let posix_anthropic = if include_anthropic {
format!(r#"export ANTHROPIC_BASE_URL="{base}""#)
} else {
format!("# {ANTHROPIC_OMITTED_NOTE}")
};
let posix_block = format!(
r#"{PROXY_ENV_START}
{posix_anthropic}
export OPENAI_BASE_URL="{openai_base}"
export GEMINI_API_BASE_URL="{base}"
{posix_grok}
{posix_commandcode}
{PROXY_ENV_END}"#
);
for rc in &[home.join(".zshrc"), home.join(".bashrc")] {
if rc.exists() {
let label = format!(
"proxy env in ~/{}",
rc.file_name().unwrap_or_default().to_string_lossy()
);
marked_block::upsert(
rc,
PROXY_ENV_START,
PROXY_ENV_END,
&posix_block,
quiet,
&label,
);
}
}
let fish_config = home.join(".config/fish/config.fish");
if fish_config.exists() {
let fish_anthropic = if include_anthropic {
format!(r#"set -gx ANTHROPIC_BASE_URL "{base}""#)
} else {
format!("# {ANTHROPIC_OMITTED_NOTE}")
};
let fish_grok = render_grok_shell_exports(&base, grok_mode, ShellFlavor::Fish);
let fish_commandcode =
render_commandcode_shell_exports(&base, commandcode_available, ShellFlavor::Fish);
let fish_block = format!(
r#"{PROXY_ENV_START}
{fish_anthropic}
set -gx OPENAI_BASE_URL "{openai_base}"
set -gx GEMINI_API_BASE_URL "{base}"
{fish_grok}
{fish_commandcode}
{PROXY_ENV_END}"#
);
marked_block::upsert(
&fish_config,
PROXY_ENV_START,
PROXY_ENV_END,
&fish_block,
quiet,
"proxy env in ~/.config/fish/config.fish",
);
}
let ps_profile =
dirs::home_dir().map(|h| crate::shell::platform::resolve_powershell_profile_path(&h));
if let Some(ref ps) = ps_profile
&& ps.exists()
{
let ps_anthropic = if include_anthropic {
format!(r#"$env:ANTHROPIC_BASE_URL = "{base}""#)
} else {
format!("# {ANTHROPIC_OMITTED_NOTE}")
};
let ps_grok = render_grok_shell_exports(&base, grok_mode, ShellFlavor::PowerShell);
let ps_commandcode =
render_commandcode_shell_exports(&base, commandcode_available, ShellFlavor::PowerShell);
let ps_block = format!(
r#"{PROXY_ENV_START}
{ps_anthropic}
$env:OPENAI_BASE_URL = "{openai_base}"
$env:GEMINI_API_BASE_URL = "{base}"
{ps_grok}
{ps_commandcode}
{PROXY_ENV_END}"#
);
marked_block::upsert(
ps,
PROXY_ENV_START,
PROXY_ENV_END,
&ps_block,
quiet,
"proxy env in PowerShell profile",
);
}
}