From 37eb56332a17708c09a57624df03418242778093 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sat, 4 Apr 2026 16:21:55 +0200 Subject: [PATCH] fix: use environmentId from heartbeat body for auto-heal HeartbeatRequest now carries environmentId (cameleer3-common update). Auto-heal prefers the heartbeat value (most current) over the JWT claim, ensuring agents recover their correct environment immediately on the first heartbeat after server restart. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../app/controller/AgentRegistrationController.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java index 79b0de86..3d3cd60a 100644 --- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java +++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java @@ -206,19 +206,22 @@ public class AgentRegistrationController { @RequestBody(required = false) HeartbeatRequest request, HttpServletRequest httpRequest) { Map capabilities = request != null ? request.getCapabilities() : null; + String heartbeatEnv = request != null ? request.getEnvironmentId() : null; boolean found = registryService.heartbeat(id, capabilities); if (!found) { - // Auto-heal: re-register agent from JWT claims after server restart + // Auto-heal: re-register agent from heartbeat body + JWT claims after server restart var jwtResult = (JwtService.JwtValidationResult) httpRequest.getAttribute( JwtAuthenticationFilter.JWT_RESULT_ATTR); if (jwtResult != null) { String application = jwtResult.application() != null ? jwtResult.application() : "default"; - String env = jwtResult.environment() != null ? jwtResult.environment() : "default"; + // Prefer environment from heartbeat body (most current), fall back to JWT claim + String env = heartbeatEnv != null ? heartbeatEnv + : jwtResult.environment() != null ? jwtResult.environment() : "default"; Map caps = capabilities != null ? capabilities : Map.of(); registryService.register(id, id, application, env, "unknown", List.of(), caps); registryService.heartbeat(id); - log.info("Auto-registered agent {} (app={}) from heartbeat after server restart", id, application); + log.info("Auto-registered agent {} (app={}, env={}) from heartbeat after server restart", id, application, env); } else { return ResponseEntity.notFound().build(); }