#[derive(Clone, Copy, PartialEq, Eq)]
pub enum DumpMode {
Off,
Summary,
Full,
}
pub fn dump_mode() -> DumpMode {
match std::env::var("DIRGE_DUMP_REQUESTS").ok().as_deref() {
Some("full") | Some("2") => DumpMode::Full,
Some(s) if !s.is_empty() && s != "0" && !s.eq_ignore_ascii_case("off") => DumpMode::Summary,
_ => DumpMode::Off,
}
}
pub fn enabled() -> bool {
dump_mode() != DumpMode::Off
}
pub fn dump_oneshot(purpose: &str, preamble: &str, prompt: &str) {
match dump_mode() {
DumpMode::Off => {}
DumpMode::Summary => tracing::info!(
target: "dirge::wire",
purpose,
kind = "one-shot",
tools = 0,
preamble_bytes = preamble.len(),
prompt_bytes = prompt.len(),
"provider request",
),
DumpMode::Full => tracing::info!(
target: "dirge::wire",
purpose,
kind = "one-shot",
tools = 0,
preamble_bytes = preamble.len(),
prompt_bytes = prompt.len(),
preamble = %preamble,
prompt = %prompt,
"provider request",
),
}
}
pub fn dump_turn(
provider: Option<&str>,
system_prompt: &str,
history_len: usize,
tool_names: &[String],
reasoning: bool,
) {
match dump_mode() {
DumpMode::Off => {}
DumpMode::Summary => tracing::info!(
target: "dirge::wire",
purpose = "turn",
kind = "agent",
provider = provider.unwrap_or("default"),
system_bytes = system_prompt.len(),
history_len,
tool_count = tool_names.len(),
tools = ?tool_names,
reasoning,
"provider request",
),
DumpMode::Full => tracing::info!(
target: "dirge::wire",
purpose = "turn",
kind = "agent",
provider = provider.unwrap_or("default"),
system_bytes = system_prompt.len(),
history_len,
tool_count = tool_names.len(),
tools = ?tool_names,
reasoning,
system = %system_prompt,
"provider request",
),
}
}
#[cfg(test)]
mod tests {
use super::*;
fn with_env<T>(val: Option<&str>, f: impl FnOnce() -> T) -> T {
match val {
Some(v) => unsafe { std::env::set_var("DIRGE_DUMP_REQUESTS", v) },
None => unsafe { std::env::remove_var("DIRGE_DUMP_REQUESTS") },
}
let out = f();
unsafe { std::env::remove_var("DIRGE_DUMP_REQUESTS") };
out
}
#[test]
fn dump_mode_parses_env() {
with_env(None, || assert!(matches!(dump_mode(), DumpMode::Off)));
with_env(Some(""), || assert!(matches!(dump_mode(), DumpMode::Off)));
with_env(Some("0"), || assert!(matches!(dump_mode(), DumpMode::Off)));
with_env(Some("off"), || {
assert!(matches!(dump_mode(), DumpMode::Off))
});
with_env(Some("1"), || {
assert!(matches!(dump_mode(), DumpMode::Summary))
});
with_env(Some("yes"), || {
assert!(matches!(dump_mode(), DumpMode::Summary))
});
with_env(Some("full"), || {
assert!(matches!(dump_mode(), DumpMode::Full))
});
with_env(Some("2"), || assert!(matches!(dump_mode(), DumpMode::Full)));
}
}