3838import io .sentrius .sso .core .services .security .ZeroTrustRequestService ;
3939import io .sentrius .sso .core .services .terminal .SessionTrackingService ;
4040import io .sentrius .sso .protobuf .Session ;
41+ import io .sentrius .sso .provenance .ProvenanceEvent ;
42+ import io .sentrius .sso .provenance .kafka .ProvenanceKafkaProducer ;
4143import jakarta .servlet .http .HttpServletRequest ;
4244import jakarta .servlet .http .HttpServletResponse ;
4345import lombok .extern .slf4j .Slf4j ;
@@ -69,6 +71,7 @@ public class AgentApiController extends BaseController {
6971 final ZeroTrustAccessTokenService ztatService ;
7072 final ZeroTrustRequestService ztrService ;
7173 final AgentService agentService ;
74+ final ProvenanceKafkaProducer provenanceKafkaProducer ;
7275
7376 public AgentApiController (
7477 UserService userService ,
@@ -77,7 +80,8 @@ public AgentApiController(
7780 AuditService auditService ,
7881 CryptoService cryptoService , SessionTrackingService sessionTrackingService , KeycloakService keycloakService ,
7982 ATPLPolicyService atplPolicyService ,
80- ZeroTrustAccessTokenService ztatService , ZeroTrustRequestService ztrService , AgentService agentService
83+ ZeroTrustAccessTokenService ztatService , ZeroTrustRequestService ztrService , AgentService agentService ,
84+ ProvenanceKafkaProducer provenanceKafkaProducer
8185 ) {
8286 super (userService , systemOptions , errorOutputService );
8387 this .auditService = auditService ;
@@ -88,6 +92,7 @@ public AgentApiController(
8892 this .ztatService = ztatService ;
8993 this .ztrService = ztrService ;
9094 this .agentService = agentService ;
95+ this .provenanceKafkaProducer = provenanceKafkaProducer ;
9196 }
9297
9398 public SessionLog createSession (@ RequestParam String username , @ RequestParam String ipAddress ) {
@@ -129,6 +134,16 @@ public ResponseEntity<?> heartbeat(
129134 }
130135 agentService .recordHeartbeat (operatingUser .getUserId (),status .getName (), status );
131136 log .info ("Heartbeat status recorded for agent: {} {}" , agentId , status );
137+ ProvenanceEvent event = ProvenanceEvent .builder ()
138+ .eventId (UUID .randomUUID ().toString ())
139+ .sessionId (status .getAgentId ())
140+ .actor (operatingUser .getUsername ())
141+ .triggeringUser (operatingUser .getUsername ())
142+ .eventType (ProvenanceEvent .EventType .AGENT_RESPONSE )
143+ .outputSummary ("Heartbeat received from agent: " + status .getName () + " with status: " + status .getStatus ())
144+ .timestamp (LocalDateTime .now ().toInstant (java .time .ZoneOffset .UTC ))
145+ .build ();
146+ provenanceKafkaProducer .send (event );
132147 return ResponseEntity .ok (Map .of ("status" , "success" ));
133148 }
134149
@@ -452,7 +467,16 @@ public ResponseEntity<?> sendMessage(
452467 return ResponseEntity .status (HttpStatus .SC_FORBIDDEN ).body ("User is not allowed to send message to agent" );
453468 }
454469
455-
470+ ProvenanceEvent event = ProvenanceEvent .builder ()
471+ .eventId (requestId )
472+ .sessionId (communicationId )
473+ .actor (operatingUser .getUsername ())
474+ .triggeringUser (comm .getTargetAgent ())
475+ .eventType (ProvenanceEvent .EventType .KNOWLEDGE_GENERATED )
476+ .outputSummary ("Ask agent " + comm .getPayload ())
477+ .timestamp (LocalDateTime .now ().toInstant (java .time .ZoneOffset .UTC ))
478+ .build ();
479+ provenanceKafkaProducer .send (event );
456480
457481
458482 var newAgentComm = agentService .saveCommunication (comm );
0 commit comments