use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeRequest {
pub protocol_version: u32,
pub client_name: String,
pub client_version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeResponse {
pub plugin_name: String,
pub plugin_version: String,
pub supported_models: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompleteRequest {
pub model: String,
pub messages: Vec<Message>,
pub max_tokens: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompleteResponse {
pub content: String,
pub model_id: String,
pub usage: Option<Usage>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub role: String,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Usage {
pub input_tokens: u32,
pub output_tokens: u32,
}
pub const PROTOCOL_VERSION: u32 = 0;
pub const AGENT_KEY_ENV: &str = "NEWT_AGENT_KEY";
#[must_use]
pub fn read_agent_key_envelope_from_env() -> Option<String> {
match std::env::var(AGENT_KEY_ENV) {
Ok(s) if !s.is_empty() => Some(s),
_ => None,
}
}
pub mod emission_shape {
pub const WHOLE_FILES: &str = "whole_files";
pub const UNIFIED_DIFF: &str = "unified_diff";
pub const PROSE: &str = "prose";
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn emission_shape_constants_are_stable_strings() {
assert_eq!(emission_shape::WHOLE_FILES, "whole_files");
assert_eq!(emission_shape::UNIFIED_DIFF, "unified_diff");
assert_eq!(emission_shape::PROSE, "prose");
}
#[test]
fn agent_key_env_name_is_stable() {
assert_eq!(AGENT_KEY_ENV, "NEWT_AGENT_KEY");
}
use std::sync::Mutex;
static ENV_LOCK: Mutex<()> = Mutex::new(());
#[test]
fn read_agent_key_envelope_returns_none_when_unset() {
let _g = ENV_LOCK.lock().unwrap();
std::env::remove_var(AGENT_KEY_ENV);
assert_eq!(read_agent_key_envelope_from_env(), None);
}
#[test]
fn read_agent_key_envelope_returns_value_when_set() {
let _g = ENV_LOCK.lock().unwrap();
std::env::set_var(AGENT_KEY_ENV, "abc123==");
assert_eq!(
read_agent_key_envelope_from_env(),
Some("abc123==".to_string())
);
std::env::remove_var(AGENT_KEY_ENV);
}
#[test]
fn read_agent_key_envelope_treats_empty_as_none() {
let _g = ENV_LOCK.lock().unwrap();
std::env::set_var(AGENT_KEY_ENV, "");
assert_eq!(read_agent_key_envelope_from_env(), None);
std::env::remove_var(AGENT_KEY_ENV);
}
}