Skip to main content

swink_agent_policies/
lib.rs

1#![forbid(unsafe_code)]
2//! Policy implementations for [`swink_agent`].
3//!
4//! This crate provides all policy implementations built against `swink-agent`'s
5//! public policy trait API. Each policy is feature-gated independently:
6//!
7//! ## Core policies
8//!
9//! - **`budget`**: `BudgetPolicy` — stops the loop when cost or token limits are exceeded
10//! - **`max-turns`**: `MaxTurnsPolicy` — stops the loop after a configured number of turns
11//! - **`deny-list`**: `ToolDenyListPolicy` — rejects tool calls by name
12//! - **`sandbox`**: `SandboxPolicy` — restricts file paths to an allowed root directory
13//! - **`loop-detection`**: `LoopDetectionPolicy` — detects repeated tool call patterns
14//! - **`checkpoint`**: `CheckpointPolicy` — persists agent state after each turn
15//!
16//! ## Application policies
17//!
18//! - **`prompt-guard`**: `PromptInjectionGuard` — blocks prompt injection in user messages and tool results
19//! - **`pii`**: `PiiRedactor` — redacts personally identifiable information from assistant responses
20//! - **`content-filter`**: `ContentFilter` — keyword/regex blocklist for assistant output
21//! - **`audit`**: `AuditLogger` — records every turn to a pluggable sink
22//! - **`memory-nudge`**: `MemoryNudgePolicy` — heuristic detection of save-worthy content in agent turns
23#[cfg(any(feature = "prompt-guard", feature = "pii", feature = "content-filter"))]
24mod patterns;
25
26// ── Core policies ───────────────────────────────────────────────────────────
27
28#[cfg(feature = "budget")]
29mod budget;
30#[cfg(feature = "budget")]
31pub use budget::BudgetPolicy;
32
33#[cfg(feature = "max-turns")]
34mod max_turns;
35#[cfg(feature = "max-turns")]
36pub use max_turns::MaxTurnsPolicy;
37
38#[cfg(feature = "deny-list")]
39mod deny_list;
40#[cfg(feature = "deny-list")]
41pub use deny_list::ToolDenyListPolicy;
42
43#[cfg(feature = "sandbox")]
44mod sandbox;
45#[cfg(feature = "sandbox")]
46pub use sandbox::SandboxPolicy;
47
48#[cfg(feature = "loop-detection")]
49mod loop_detection;
50#[cfg(feature = "loop-detection")]
51pub use loop_detection::{LoopDetectionAction, LoopDetectionPolicy};
52
53#[cfg(feature = "checkpoint")]
54mod checkpoint;
55#[cfg(feature = "checkpoint")]
56pub use checkpoint::CheckpointPolicy;
57
58// ── Application policies ────────────────────────────────────────────────────
59
60#[cfg(feature = "prompt-guard")]
61mod prompt_guard;
62#[cfg(feature = "prompt-guard")]
63pub use prompt_guard::PromptInjectionGuard;
64
65#[cfg(feature = "pii")]
66mod pii_redactor;
67#[cfg(feature = "pii")]
68pub use pii_redactor::{PiiMode, PiiPattern, PiiRedactor};
69
70#[cfg(feature = "content-filter")]
71mod content_filter;
72#[cfg(feature = "content-filter")]
73pub use content_filter::{ContentFilter, ContentFilterError, FilterRule};
74
75#[cfg(feature = "audit")]
76mod audit_logger;
77#[cfg(feature = "audit")]
78pub use audit_logger::{
79    AuditCost, AuditLogger, AuditRecord, AuditSink, AuditUsage, JsonlAuditSink,
80};
81
82#[cfg(feature = "memory-nudge")]
83mod memory_nudge;
84#[cfg(feature = "memory-nudge")]
85pub use memory_nudge::{MemoryNudge, MemoryNudgeCategory, MemoryNudgePolicy, NudgeSensitivity};