synaptic_secrets/
middleware.rs1use std::sync::Arc;
2
3use async_trait::async_trait;
4use synaptic_core::SynapticError;
5use synaptic_middleware::{AgentMiddleware, ModelRequest, ModelResponse};
6
7use crate::SecretRegistry;
8
9pub struct SecretMaskingMiddleware {
14 registry: Arc<SecretRegistry>,
15}
16
17impl SecretMaskingMiddleware {
18 pub fn new(registry: Arc<SecretRegistry>) -> Self {
19 Self { registry }
20 }
21}
22
23#[async_trait]
24impl AgentMiddleware for SecretMaskingMiddleware {
25 async fn before_model(&self, request: &mut ModelRequest) -> Result<(), SynapticError> {
26 if let Some(ref prompt) = request.system_prompt {
28 request.system_prompt = Some(self.registry.inject(prompt)?);
29 }
30 Ok(())
31 }
32
33 async fn after_model(
34 &self,
35 _request: &ModelRequest,
36 response: &mut ModelResponse,
37 ) -> Result<(), SynapticError> {
38 let content = response.message.content().to_string();
40 let masked = self.registry.mask_output(&content);
41 if masked != content {
42 response.message.set_content(masked);
43 }
44 Ok(())
45 }
46}