pub mod compress;
pub mod index;
pub mod spill;
use super::adapters::{self, IntegrationKind};
use super::config::{GatewayConfig, GatewayServer};
pub fn process(
cfg: &GatewayConfig,
server: &GatewayServer,
tool: &str,
text: String,
project_root: &str,
) -> String {
let kind = IntegrationKind::parse(&server.integration);
if !cfg.postprocess_active() && kind.is_none() {
return text;
}
if cfg.index_output && !project_root.is_empty() && !text.trim().is_empty() {
let claimed = adapters::ingest_spawn(kind, &server.name, tool, &text, project_root);
if !claimed {
index::spawn(
server.name.clone(),
tool.to_string(),
text.clone(),
project_root.to_string(),
);
}
}
let budget = cfg.effective_output_budget();
if let Some(transformed) = adapters::transform(kind, &server.name, tool, &text, budget) {
return transformed;
}
if cfg.handle_spill
&& let Some(handle) = spill::maybe_spill(&server.name, tool, &text, budget)
{
return handle;
}
if cfg.compress_output {
return compress::to_budget(&text, budget);
}
text
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::gateway::config::GatewayServer;
use std::fmt::Write as _;
fn server(name: &str) -> GatewayServer {
GatewayServer {
name: name.into(),
command: "x".into(),
..Default::default()
}
}
#[test]
fn all_flags_off_is_identity() {
let cfg = GatewayConfig::default();
let big = "line\n".repeat(5000);
let out = process(&cfg, &server("s"), "t", big.clone(), "");
assert_eq!(out, big, "default config must be a pure pass-through");
}
#[test]
fn compress_flag_shrinks_oversized_output() {
let cfg = GatewayConfig {
compress_output: true,
output_budget_tokens: 256,
..Default::default()
};
let big = (0..4000).fold(String::new(), |mut s, i| {
let _ = writeln!(s, "item number {i} value");
s
});
let out = process(&cfg, &server("s"), "t", big.clone(), "");
assert!(out.len() < big.len(), "compress_output must reduce size");
}
}