// Demonstrates diagnosing a failed tool call and recording the recovery path.
fn get_store() -> @storage.JsonFileStore {
match @env.get_env_var("MOONTRACE_DIR") {
None => @storage.JsonFileStore::default()
Some(dir) => @storage.JsonFileStore::new(dir)
}
}
fn remote_knowledge_lookup(question : String) -> String raise Failure {
@trace.span(
"tool.knowledge_base",
Some("{\"question\": \"" + question + "\"}"),
() => {
@trace.add_event("request_started", Some("GET /knowledge/search"))
@trace.set_metadata("timeout_ms", "2500")
raise Failure("knowledge base timeout after 2500ms")
},
)
}
fn run_diagnosis() -> String raise Failure {
ignore(@trace.start_trace())
let answer = @trace.span(
"agent.answer",
Some("{\"question\": \"How do I debug a failed MoonBit tool?\"}"),
() => {
@trace.set_metadata("scenario", "tool-timeout-recovery")
let result = try {
remote_knowledge_lookup("MoonBit tool tracing")
} catch {
Failure(message) => {
@trace.add_event("fallback_started", Some("Using cached documentation"))
@trace.set_metadata("recovery", "cache")
"Fallback answer after: " + message
}
}
@trace.span("agent.synthesize", None, () => {
"Diagnosis complete. " + result
})
},
)
match @trace.end_trace() {
None => raise Failure("trace was not closed")
Some(trace) => {
let saved = get_store().save(trace)
if !saved {
raise Failure("failed to save diagnosis trace")
}
println("Saved diagnosis trace: " + trace.id)
println("The failed tool span and recovery event are preserved.")
}
}
answer
}
fn main raise Failure {
println("=== MoonTrace Failure Diagnosis Demo ===")
let answer = run_diagnosis()
println("\nAgent result:\n" + answer)
println("\nInspect all traces: moon run src/cli list")
println("Inspect failures: moon run src/cli errors")
}