1use crate::resolver::ResolverConfig;
4use crate::session::SessionConfig;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Deserialize, Serialize)]
8pub struct CloakPipeConfig {
9 pub proxy: ProxyConfig,
10 pub vault: VaultConfig,
11 #[serde(default)]
13 pub profile: Option<String>,
14 pub detection: DetectionConfig,
15 #[serde(default)]
16 pub tree: TreeConfig,
17 #[serde(default)]
18 pub vectors: VectorConfig,
19 #[serde(default)]
20 pub local: LocalConfig,
21 #[serde(default)]
22 pub audit: AuditConfig,
23 #[serde(default)]
24 pub session: SessionConfig,
25}
26
27#[derive(Debug, Clone, Deserialize, Serialize)]
28pub struct ProxyConfig {
29 pub listen: String,
30 pub upstream: String,
31 #[serde(default = "default_api_key_env")]
32 pub api_key_env: String,
33 #[serde(default = "default_timeout")]
34 pub timeout_seconds: u64,
35 #[serde(default = "default_max_concurrent")]
36 pub max_concurrent: usize,
37 #[serde(default = "default_mode")]
38 pub mode: String,
39}
40
41#[derive(Debug, Clone, Deserialize, Serialize)]
42pub struct VaultConfig {
43 pub path: String,
44 #[serde(default = "default_encryption")]
45 pub encryption: String,
46 pub key_env: Option<String>,
47 #[serde(default)]
48 pub key_keyring: bool,
49 #[serde(default = "default_vault_backend")]
50 pub backend: String,
51}
52
53#[derive(Debug, Clone, Deserialize, Serialize)]
54pub struct DetectionConfig {
55 #[serde(default = "default_true")]
56 pub secrets: bool,
57 #[serde(default = "default_true")]
58 pub financial: bool,
59 #[serde(default = "default_true")]
60 pub dates: bool,
61 #[serde(default = "default_true")]
62 pub emails: bool,
63 #[serde(default)]
64 pub phone_numbers: bool,
65 #[serde(default)]
66 pub ip_addresses: bool,
67 #[serde(default)]
68 pub urls_internal: bool,
69 #[serde(default)]
70 pub ner: NerConfig,
71 #[serde(default)]
72 pub custom: CustomConfig,
73 #[serde(default)]
74 pub overrides: OverrideConfig,
75 #[serde(default)]
76 pub resolver: ResolverConfig,
77}
78
79#[derive(Debug, Clone, Default, Deserialize, Serialize)]
80pub struct NerConfig {
81 #[serde(default)]
82 pub enabled: bool,
83 pub model: Option<String>,
84 #[serde(default = "default_confidence")]
85 pub confidence_threshold: f64,
86 #[serde(default)]
87 pub entity_types: Vec<String>,
88}
89
90#[derive(Debug, Clone, Default, Deserialize, Serialize)]
91pub struct CustomConfig {
92 #[serde(default)]
93 pub patterns: Vec<CustomPattern>,
94}
95
96#[derive(Debug, Clone, Deserialize, Serialize)]
97pub struct CustomPattern {
98 pub name: String,
99 pub regex: String,
100 pub category: String,
101}
102
103#[derive(Debug, Clone, Default, Deserialize, Serialize)]
104pub struct OverrideConfig {
105 #[serde(default)]
106 pub preserve: Vec<String>,
107 #[serde(default)]
108 pub force: Vec<String>,
109}
110
111#[derive(Debug, Clone, Deserialize, Serialize)]
112pub struct TreeConfig {
113 #[serde(default = "default_true")]
114 pub enabled: bool,
115 #[serde(default = "default_tree_path")]
116 pub storage_path: String,
117 #[serde(default = "default_tree_model")]
118 pub index_model: String,
119 #[serde(default = "default_tree_model")]
120 pub search_model: String,
121 #[serde(default = "default_max_pages")]
122 pub max_pages_per_node: usize,
123 #[serde(default = "default_max_tokens")]
124 pub max_tokens_per_node: usize,
125 #[serde(default = "default_true")]
126 pub add_node_summaries: bool,
127 #[serde(default = "default_true")]
128 pub pseudonymize_summaries: bool,
129}
130
131#[derive(Debug, Clone, Default, Deserialize, Serialize)]
132pub struct VectorConfig {
133 #[serde(default)]
134 pub encrypt: bool,
135 #[serde(default = "default_adcpe")]
136 pub algorithm: String,
137 pub key_env: Option<String>,
138}
139
140#[derive(Debug, Clone, Default, Deserialize, Serialize)]
141pub struct LocalConfig {
142 pub embeddings_model: Option<String>,
143 #[serde(default = "default_vector_db")]
144 pub vector_db: String,
145 pub vector_db_path: Option<String>,
146 pub llm_model: Option<String>,
147 pub llm_backend: Option<String>,
148}
149
150#[derive(Debug, Clone, Deserialize, Serialize)]
151pub struct AuditConfig {
152 #[serde(default = "default_true")]
153 pub enabled: bool,
154 #[serde(default = "default_audit_path")]
155 pub log_path: String,
156 #[serde(default = "default_jsonl")]
157 pub format: String,
158 #[serde(default = "default_retention")]
159 pub retention_days: u32,
160 #[serde(default = "default_true")]
161 pub log_entities: bool,
162 #[serde(default)]
163 pub log_mappings: bool,
164 #[serde(default = "default_audit_backend")]
165 pub backend: String,
166}
167
168fn default_true() -> bool { true }
170fn default_api_key_env() -> String { "OPENAI_API_KEY".into() }
171fn default_timeout() -> u64 { 120 }
172fn default_max_concurrent() -> usize { 256 }
173fn default_mode() -> String { "cloaktree".into() }
174fn default_encryption() -> String { "aes-256-gcm".into() }
175fn default_vault_backend() -> String { "file".into() }
176fn default_audit_backend() -> String { "jsonl".into() }
177fn default_confidence() -> f64 { 0.85 }
178fn default_tree_path() -> String { "./trees/".into() }
179fn default_tree_model() -> String { "gpt-4o".into() }
180fn default_max_pages() -> usize { 10 }
181fn default_max_tokens() -> usize { 20000 }
182fn default_adcpe() -> String { "adcpe".into() }
183fn default_vector_db() -> String { "lancedb".into() }
184fn default_audit_path() -> String { "./audit/".into() }
185fn default_jsonl() -> String { "jsonl".into() }
186fn default_retention() -> u32 { 90 }
187
188impl Default for TreeConfig {
189 fn default() -> Self {
190 Self {
191 enabled: true,
192 storage_path: default_tree_path(),
193 index_model: default_tree_model(),
194 search_model: default_tree_model(),
195 max_pages_per_node: default_max_pages(),
196 max_tokens_per_node: default_max_tokens(),
197 add_node_summaries: true,
198 pseudonymize_summaries: true,
199 }
200 }
201}
202
203impl Default for AuditConfig {
204 fn default() -> Self {
205 Self {
206 enabled: true,
207 log_path: default_audit_path(),
208 format: default_jsonl(),
209 retention_days: default_retention(),
210 log_entities: true,
211 log_mappings: false,
212 backend: default_audit_backend(),
213 }
214 }
215}