1pub mod emit;
7pub mod layer;
8pub mod record;
9pub mod render;
10
11pub use emit::{
12 emit_cap_decision, emit_ceiling_class, emit_credential_issue, finish_tool_call,
13 instantiation_span, tool_call_span,
14};
15pub use layer::{AuditLayer, Detail};
16pub use record::{
17 CapDecisionRecord, CeilingClassRecord, CredentialIssueRecord, Decision4, Outcome,
18 ToolCallStart, Transport, sha256_hex,
19};
20
21pub const TARGET_AUDIT: &str = "act::audit";
24
25pub const TARGET_GUEST: &str = "act::guest";
30
31pub fn fmt_filter<S>(
40 env_filter: tracing_subscriber::EnvFilter,
41) -> impl tracing_subscriber::layer::Filter<S> {
42 use tracing_subscriber::filter::{FilterExt, filter_fn};
43 env_filter.and(filter_fn(|meta: &tracing::Metadata<'_>| {
44 meta.target() != crate::audit::TARGET_AUDIT && meta.target() != crate::audit::TARGET_GUEST
45 }))
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn fmt_filter_excludes_audit_and_guest_targets() {
54 use std::sync::{Arc, Mutex};
58 use tracing_subscriber::layer::{Context, Layer};
59 use tracing_subscriber::prelude::*;
60 use tracing_subscriber::registry::LookupSpan;
61
62 #[derive(Clone, Default)]
63 struct Capture(Arc<Mutex<Vec<String>>>);
64
65 impl<S> Layer<S> for Capture
66 where
67 S: tracing::Subscriber + for<'a> LookupSpan<'a>,
68 {
69 fn on_event(&self, event: &tracing::Event<'_>, _ctx: Context<'_, S>) {
70 self.0
71 .lock()
72 .unwrap()
73 .push(event.metadata().target().to_string());
74 }
75 }
76
77 let cap = Capture::default();
78 let sink = cap.clone();
79 let env_filter: tracing_subscriber::EnvFilter = "act=info".parse().unwrap();
80 let sub = tracing_subscriber::registry().with(cap.with_filter(fmt_filter(env_filter)));
81
82 tracing::subscriber::with_default(sub, || {
83 tracing::info!(target: TARGET_AUDIT, "audit event");
84 tracing::info!(target: TARGET_GUEST, "guest event");
85 tracing::info!(target: "act::runtime", "ordinary event");
86 });
87
88 let got = sink.0.lock().unwrap().clone();
89 assert_eq!(got, vec!["act::runtime".to_string()]);
90 }
91}