#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AutoModeEnabledState {
Enabled,
Disabled,
OptIn,
}
impl AutoModeEnabledState {
pub fn from_str(s: &str) -> Option<Self> {
match s {
"enabled" => Some(AutoModeEnabledState::Enabled),
"disabled" => Some(AutoModeEnabledState::Disabled),
"opt-in" => Some(AutoModeEnabledState::OptIn),
_ => None,
}
}
}
#[derive(Debug, Clone, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LogEventParams {
pub event_name: String,
pub event_data: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExperimentGatesParams {
pub gates: serde_json::Map<String, serde_json::Value>,
}
#[derive(Debug, Clone, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FileUpdatedParams {
pub file_path: String,
pub old_content: Option<String>,
pub new_content: Option<String>,
}
static VSCODE_MCP_CLIENT: std::sync::OnceLock<VscodeMcpClientState> = std::sync::OnceLock::new();
#[derive(Debug, Clone)]
pub struct VscodeMcpClientState {
pub name: String,
pub client_type: String,
}
pub fn get_vscode_mcp_client() -> Option<&'static VscodeMcpClientState> {
VSCODE_MCP_CLIENT.get()
}
fn is_ant_user() -> bool {
std::env::var("USER_TYPE")
.map(|v| v == "ant")
.unwrap_or(false)
}
fn log_for_debugging(message: &str) {
log::debug!("[VSCode] {}", message);
}
pub fn notify_vscode_file_updated(
file_path: &str,
old_content: Option<&str>,
new_content: Option<&str>,
) {
if !is_ant_user() || get_vscode_mcp_client().is_none() {
return;
}
log_for_debugging(&format!(
"file_updated notification: {} (old: {}, new: {})",
file_path,
old_content.map(|s| "Some").unwrap_or("None"),
new_content.map(|s| "Some").unwrap_or("None")
));
}
pub fn setup_vscode_sdk_mcp(sdk_clients: &[VscodeMcpClientState]) {
if !is_ant_user() {
return;
}
let client = sdk_clients.iter().find(|c| c.name == "claude-vscode");
if let Some(client) = client {
let _ = VSCODE_MCP_CLIENT.set(client.clone());
log_for_debugging("VSCode SDK MCP initialized with claude-vscode client");
} else {
log_for_debugging("No claude-vscode client found, VSCode SDK MCP not initialized");
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_auto_mode_enabled_state_from_str() {
assert_eq!(
AutoModeEnabledState::from_str("enabled"),
Some(AutoModeEnabledState::Enabled)
);
assert_eq!(
AutoModeEnabledState::from_str("disabled"),
Some(AutoModeEnabledState::Disabled)
);
assert_eq!(
AutoModeEnabledState::from_str("opt-in"),
Some(AutoModeEnabledState::OptIn)
);
assert_eq!(AutoModeEnabledState::from_str("unknown"), None);
}
}