chore: rename cameleer3 to cameleer
Rename Java packages from com.cameleer3 to com.cameleer, module directories from cameleer3-* to cameleer-*, and all references throughout workflows, Dockerfiles, docs, migrations, and pom.xml. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,21 +5,21 @@ type: execute
|
||||
wave: 1
|
||||
depends_on: []
|
||||
files_modified:
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentInfo.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentState.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentCommand.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/CommandStatus.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/CommandType.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentRegistryService.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentEventListener.java
|
||||
- cameleer3-server-core/src/test/java/com/cameleer3/server/core/agent/AgentRegistryServiceTest.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/AgentRegistryConfig.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/AgentRegistryBeanConfig.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/AgentLifecycleMonitor.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/Cameleer3ServerApplication.java
|
||||
- cameleer3-server-app/src/main/resources/application.yml
|
||||
- cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentRegistrationControllerIT.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentInfo.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentState.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentCommand.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/CommandStatus.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/CommandType.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentRegistryService.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentEventListener.java
|
||||
- cameleer-server-core/src/test/java/com/cameleer/server/core/agent/AgentRegistryServiceTest.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/config/AgentRegistryConfig.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/config/AgentRegistryBeanConfig.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/agent/AgentLifecycleMonitor.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentRegistrationController.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/CameleerServerApplication.java
|
||||
- cameleer-server-app/src/main/resources/application.yml
|
||||
- cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentRegistrationControllerIT.java
|
||||
autonomous: true
|
||||
requirements:
|
||||
- AGNT-01
|
||||
@@ -34,13 +34,13 @@ must_haves:
|
||||
- "Server transitions agents LIVE->STALE after 90s without heartbeat, STALE->DEAD 5 minutes after staleTransitionTime"
|
||||
- "Agent list endpoint GET /api/v1/agents returns all agents, filterable by ?status=LIVE|STALE|DEAD"
|
||||
artifacts:
|
||||
- path: "cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentRegistryService.java"
|
||||
- path: "cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentRegistryService.java"
|
||||
provides: "Agent registration, heartbeat, lifecycle transitions, find/filter"
|
||||
- path: "cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentInfo.java"
|
||||
- path: "cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentInfo.java"
|
||||
provides: "Agent record with id, name, group, version, routeIds, capabilities, state, timestamps"
|
||||
- path: "cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java"
|
||||
- path: "cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentRegistrationController.java"
|
||||
provides: "POST /register, POST /{id}/heartbeat, GET /agents endpoints"
|
||||
- path: "cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/AgentLifecycleMonitor.java"
|
||||
- path: "cameleer-server-app/src/main/java/com/cameleer/server/app/agent/AgentLifecycleMonitor.java"
|
||||
provides: "@Scheduled lifecycle transitions LIVE->STALE->DEAD"
|
||||
key_links:
|
||||
- from: "AgentRegistrationController"
|
||||
@@ -76,14 +76,14 @@ Output: Core domain types (AgentInfo, AgentState, AgentCommand, CommandStatus, C
|
||||
@.planning/phases/03-agent-registry-sse-push/03-CONTEXT.md
|
||||
@.planning/phases/03-agent-registry-sse-push/03-RESEARCH.md
|
||||
|
||||
@cameleer3-server-core/src/main/java/com/cameleer3/server/core/ingestion/IngestionService.java
|
||||
@cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/IngestionBeanConfig.java
|
||||
@cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/IngestionConfig.java
|
||||
@cameleer3-server-app/src/main/java/com/cameleer3/server/app/ingestion/ClickHouseFlushScheduler.java
|
||||
@cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/WebConfig.java
|
||||
@cameleer3-server-app/src/main/java/com/cameleer3/server/app/Cameleer3ServerApplication.java
|
||||
@cameleer3-server-app/src/main/resources/application.yml
|
||||
@cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractClickHouseIT.java
|
||||
@cameleer-server-core/src/main/java/com/cameleer/server/core/ingestion/IngestionService.java
|
||||
@cameleer-server-app/src/main/java/com/cameleer/server/app/config/IngestionBeanConfig.java
|
||||
@cameleer-server-app/src/main/java/com/cameleer/server/app/config/IngestionConfig.java
|
||||
@cameleer-server-app/src/main/java/com/cameleer/server/app/ingestion/ClickHouseFlushScheduler.java
|
||||
@cameleer-server-app/src/main/java/com/cameleer/server/app/config/WebConfig.java
|
||||
@cameleer-server-app/src/main/java/com/cameleer/server/app/CameleerServerApplication.java
|
||||
@cameleer-server-app/src/main/resources/application.yml
|
||||
@cameleer-server-app/src/test/java/com/cameleer/server/app/AbstractClickHouseIT.java
|
||||
|
||||
<interfaces>
|
||||
<!-- Established codebase patterns the executor must follow -->
|
||||
@@ -99,10 +99,10 @@ Pattern: Controller accepts raw String body:
|
||||
|
||||
Pattern: @Scheduled for periodic tasks:
|
||||
- ClickHouseFlushScheduler uses @Scheduled(fixedDelayString = "${ingestion.flush-interval-ms:1000}")
|
||||
- @EnableScheduling already on Cameleer3ServerApplication
|
||||
- @EnableScheduling already on CameleerServerApplication
|
||||
|
||||
Pattern: @EnableConfigurationProperties registration:
|
||||
- Cameleer3ServerApplication has @EnableConfigurationProperties(IngestionConfig.class)
|
||||
- CameleerServerApplication has @EnableConfigurationProperties(IngestionConfig.class)
|
||||
- New config classes must be added to this annotation
|
||||
|
||||
Pattern: ProtocolVersionInterceptor:
|
||||
@@ -116,14 +116,14 @@ Pattern: ProtocolVersionInterceptor:
|
||||
<task type="auto" tdd="true">
|
||||
<name>Task 1: Core domain types and AgentRegistryService with unit tests</name>
|
||||
<files>
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentInfo.java,
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentState.java,
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentCommand.java,
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/CommandStatus.java,
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/CommandType.java,
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentRegistryService.java,
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentEventListener.java,
|
||||
cameleer3-server-core/src/test/java/com/cameleer3/server/core/agent/AgentRegistryServiceTest.java
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentInfo.java,
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentState.java,
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentCommand.java,
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/agent/CommandStatus.java,
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/agent/CommandType.java,
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentRegistryService.java,
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentEventListener.java,
|
||||
cameleer-server-core/src/test/java/com/cameleer/server/core/agent/AgentRegistryServiceTest.java
|
||||
</files>
|
||||
<behavior>
|
||||
- register: new agent ID creates AgentInfo with state LIVE, returns AgentInfo
|
||||
@@ -142,7 +142,7 @@ Pattern: ProtocolVersionInterceptor:
|
||||
- findPendingCommands: returns PENDING commands for given agentId
|
||||
</behavior>
|
||||
<action>
|
||||
Create the agent domain model in the core module (package com.cameleer3.server.core.agent):
|
||||
Create the agent domain model in the core module (package com.cameleer.server.core.agent):
|
||||
|
||||
1. **AgentState enum**: LIVE, STALE, DEAD
|
||||
|
||||
@@ -182,7 +182,7 @@ Pattern: ProtocolVersionInterceptor:
|
||||
Write tests FIRST (RED), then implement (GREEN). Test class: AgentRegistryServiceTest.
|
||||
</action>
|
||||
<verify>
|
||||
<automated>mvn test -pl cameleer3-server-core -Dtest=AgentRegistryServiceTest</automated>
|
||||
<automated>mvn test -pl cameleer-server-core -Dtest=AgentRegistryServiceTest</automated>
|
||||
</verify>
|
||||
<done>All unit tests pass: registration (new + re-register), heartbeat (known + unknown), lifecycle transitions (LIVE->STALE->DEAD, heartbeat revives STALE), findAll/findByState/findById, command add/acknowledge/expire. AgentEventListener interface defined.</done>
|
||||
</task>
|
||||
@@ -190,13 +190,13 @@ Pattern: ProtocolVersionInterceptor:
|
||||
<task type="auto">
|
||||
<name>Task 2: Registration/heartbeat/list controllers, config, lifecycle monitor, integration tests</name>
|
||||
<files>
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/AgentRegistryConfig.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/AgentRegistryBeanConfig.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/AgentLifecycleMonitor.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/Cameleer3ServerApplication.java,
|
||||
cameleer3-server-app/src/main/resources/application.yml,
|
||||
cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentRegistrationControllerIT.java
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/config/AgentRegistryConfig.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/config/AgentRegistryBeanConfig.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/agent/AgentLifecycleMonitor.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentRegistrationController.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/CameleerServerApplication.java,
|
||||
cameleer-server-app/src/main/resources/application.yml,
|
||||
cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentRegistrationControllerIT.java
|
||||
</files>
|
||||
<action>
|
||||
Wire the agent registry into the Spring Boot app and create REST endpoints:
|
||||
@@ -214,7 +214,7 @@ Pattern: ProtocolVersionInterceptor:
|
||||
- @Bean AgentRegistryService: `new AgentRegistryService(config.getStaleThresholdMs(), config.getDeadThresholdMs(), config.getCommandExpiryMs())`
|
||||
Follow IngestionBeanConfig pattern.
|
||||
|
||||
3. **Update Cameleer3ServerApplication**: Add AgentRegistryConfig.class to @EnableConfigurationProperties.
|
||||
3. **Update CameleerServerApplication**: Add AgentRegistryConfig.class to @EnableConfigurationProperties.
|
||||
|
||||
4. **Update application.yml**: Add agent-registry section with all defaults (see RESEARCH.md code example). Also add `spring.mvc.async.request-timeout: -1` for SSE support (Plan 02 needs it, but set it now).
|
||||
|
||||
@@ -242,7 +242,7 @@ Pattern: ProtocolVersionInterceptor:
|
||||
- Use TestRestTemplate (already available from AbstractClickHouseIT's @SpringBootTest)
|
||||
</action>
|
||||
<verify>
|
||||
<automated>mvn test -pl cameleer3-server-core,cameleer3-server-app -Dtest="Agent*"</automated>
|
||||
<automated>mvn test -pl cameleer-server-core,cameleer-server-app -Dtest="Agent*"</automated>
|
||||
</verify>
|
||||
<done>POST /register returns 200 with agentId + sseEndpoint + heartbeatIntervalMs. POST /{id}/heartbeat returns 200 for known agents, 404 for unknown. GET /agents returns all agents with optional ?status= filter. AgentLifecycleMonitor runs on schedule. All integration tests pass. mvn clean verify passes.</done>
|
||||
</task>
|
||||
|
||||
@@ -27,22 +27,22 @@ tech-stack:
|
||||
|
||||
key-files:
|
||||
created:
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentInfo.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentState.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentCommand.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/CommandStatus.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/CommandType.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentRegistryService.java
|
||||
- cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentEventListener.java
|
||||
- cameleer3-server-core/src/test/java/com/cameleer3/server/core/agent/AgentRegistryServiceTest.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/AgentRegistryConfig.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/AgentRegistryBeanConfig.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/AgentLifecycleMonitor.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java
|
||||
- cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentRegistrationControllerIT.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentInfo.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentState.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentCommand.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/CommandStatus.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/CommandType.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentRegistryService.java
|
||||
- cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentEventListener.java
|
||||
- cameleer-server-core/src/test/java/com/cameleer/server/core/agent/AgentRegistryServiceTest.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/config/AgentRegistryConfig.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/config/AgentRegistryBeanConfig.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/agent/AgentLifecycleMonitor.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentRegistrationController.java
|
||||
- cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentRegistrationControllerIT.java
|
||||
modified:
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/Cameleer3ServerApplication.java
|
||||
- cameleer3-server-app/src/main/resources/application.yml
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/CameleerServerApplication.java
|
||||
- cameleer-server-app/src/main/resources/application.yml
|
||||
|
||||
key-decisions:
|
||||
- "AgentInfo as Java record with wither-style methods for immutable ConcurrentHashMap swapping"
|
||||
@@ -103,7 +103,7 @@ _Note: Task 1 used TDD with separate RED/GREEN commits_
|
||||
- `AgentRegistrationController.java` - REST endpoints for agents
|
||||
- `AgentRegistryServiceTest.java` - 23 unit tests
|
||||
- `AgentRegistrationControllerIT.java` - 7 integration tests
|
||||
- `Cameleer3ServerApplication.java` - Added AgentRegistryConfig to @EnableConfigurationProperties
|
||||
- `CameleerServerApplication.java` - Added AgentRegistryConfig to @EnableConfigurationProperties
|
||||
- `application.yml` - Added agent-registry config section and spring.mvc.async.request-timeout
|
||||
|
||||
## Decisions Made
|
||||
|
||||
@@ -5,12 +5,12 @@ type: execute
|
||||
wave: 2
|
||||
depends_on: ["03-01"]
|
||||
files_modified:
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/SseConnectionManager.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentSseController.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentCommandController.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/WebConfig.java
|
||||
- cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentSseControllerIT.java
|
||||
- cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentCommandControllerIT.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/agent/SseConnectionManager.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentSseController.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentCommandController.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/config/WebConfig.java
|
||||
- cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentSseControllerIT.java
|
||||
- cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentCommandControllerIT.java
|
||||
autonomous: true
|
||||
requirements:
|
||||
- AGNT-04
|
||||
@@ -30,11 +30,11 @@ must_haves:
|
||||
- "SSE events include event ID for Last-Event-ID reconnection support (no replay of missed events)"
|
||||
- "Agent can acknowledge command receipt via POST /api/v1/agents/{id}/commands/{commandId}/ack"
|
||||
artifacts:
|
||||
- path: "cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/SseConnectionManager.java"
|
||||
- path: "cameleer-server-app/src/main/java/com/cameleer/server/app/agent/SseConnectionManager.java"
|
||||
provides: "Per-agent SseEmitter management, event sending, ping keepalive"
|
||||
- path: "cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentSseController.java"
|
||||
- path: "cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentSseController.java"
|
||||
provides: "GET /{id}/events SSE endpoint"
|
||||
- path: "cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentCommandController.java"
|
||||
- path: "cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentCommandController.java"
|
||||
provides: "POST command endpoints (single, group, broadcast) + ack endpoint"
|
||||
key_links:
|
||||
- from: "AgentCommandController"
|
||||
@@ -75,49 +75,49 @@ Output: SseConnectionManager, SSE endpoint, command controller (single/group/bro
|
||||
@.planning/phases/03-agent-registry-sse-push/03-RESEARCH.md
|
||||
@.planning/phases/03-agent-registry-sse-push/03-01-SUMMARY.md
|
||||
|
||||
@cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/WebConfig.java
|
||||
@cameleer3-server-app/src/main/resources/application.yml
|
||||
@cameleer3-server-app/src/test/java/com/cameleer3/server/app/AbstractClickHouseIT.java
|
||||
@cameleer-server-app/src/main/java/com/cameleer/server/app/config/WebConfig.java
|
||||
@cameleer-server-app/src/main/resources/application.yml
|
||||
@cameleer-server-app/src/test/java/com/cameleer/server/app/AbstractClickHouseIT.java
|
||||
|
||||
<interfaces>
|
||||
<!-- From Plan 01 (must exist before this plan executes) -->
|
||||
|
||||
From cameleer3-server-core/.../agent/AgentInfo.java:
|
||||
From cameleer-server-core/.../agent/AgentInfo.java:
|
||||
```java
|
||||
// Record or class with fields:
|
||||
// id, name, group, version, routeIds, capabilities, state, registeredAt, lastHeartbeat, staleTransitionTime
|
||||
// Methods: withState(), withLastHeartbeat(), etc.
|
||||
```
|
||||
|
||||
From cameleer3-server-core/.../agent/AgentState.java:
|
||||
From cameleer-server-core/.../agent/AgentState.java:
|
||||
```java
|
||||
public enum AgentState { LIVE, STALE, DEAD }
|
||||
```
|
||||
|
||||
From cameleer3-server-core/.../agent/CommandType.java:
|
||||
From cameleer-server-core/.../agent/CommandType.java:
|
||||
```java
|
||||
public enum CommandType { CONFIG_UPDATE, DEEP_TRACE, REPLAY }
|
||||
```
|
||||
|
||||
From cameleer3-server-core/.../agent/CommandStatus.java:
|
||||
From cameleer-server-core/.../agent/CommandStatus.java:
|
||||
```java
|
||||
public enum CommandStatus { PENDING, DELIVERED, ACKNOWLEDGED, EXPIRED }
|
||||
```
|
||||
|
||||
From cameleer3-server-core/.../agent/AgentCommand.java:
|
||||
From cameleer-server-core/.../agent/AgentCommand.java:
|
||||
```java
|
||||
// Record: id (UUID string), type (CommandType), payload (String JSON), targetAgentId, createdAt, status
|
||||
// Method: withStatus()
|
||||
```
|
||||
|
||||
From cameleer3-server-core/.../agent/AgentEventListener.java:
|
||||
From cameleer-server-core/.../agent/AgentEventListener.java:
|
||||
```java
|
||||
public interface AgentEventListener {
|
||||
void onCommandReady(String agentId, AgentCommand command);
|
||||
}
|
||||
```
|
||||
|
||||
From cameleer3-server-core/.../agent/AgentRegistryService.java:
|
||||
From cameleer-server-core/.../agent/AgentRegistryService.java:
|
||||
```java
|
||||
// Key methods:
|
||||
// register(id, name, group, version, routeIds, capabilities) -> AgentInfo
|
||||
@@ -131,7 +131,7 @@ From cameleer3-server-core/.../agent/AgentRegistryService.java:
|
||||
// setEventListener(listener) -> void
|
||||
```
|
||||
|
||||
From cameleer3-server-app/.../config/AgentRegistryConfig.java:
|
||||
From cameleer-server-app/.../config/AgentRegistryConfig.java:
|
||||
```java
|
||||
// @ConfigurationProperties(prefix = "agent-registry")
|
||||
// getPingIntervalMs(), getCommandExpiryMs(), etc.
|
||||
@@ -144,11 +144,11 @@ From cameleer3-server-app/.../config/AgentRegistryConfig.java:
|
||||
<task type="auto">
|
||||
<name>Task 1: SseConnectionManager, SSE controller, and command controller</name>
|
||||
<files>
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/SseConnectionManager.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentSseController.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentCommandController.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/AgentRegistryBeanConfig.java,
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/WebConfig.java
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/agent/SseConnectionManager.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentSseController.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentCommandController.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/config/AgentRegistryBeanConfig.java,
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/config/WebConfig.java
|
||||
</files>
|
||||
<action>
|
||||
Build the SSE infrastructure and command delivery system:
|
||||
@@ -181,7 +181,7 @@ From cameleer3-server-app/.../config/AgentRegistryConfig.java:
|
||||
5. **Update WebConfig**: The SSE endpoint GET /api/v1/agents/{id}/events is already covered by the interceptor pattern "/api/v1/agents/**". Agents send the protocol version header on all requests (per research recommendation), so no exclusion needed. However, if the SSE GET causes issues because browsers/clients may not easily add custom headers to EventSource, add the SSE events path to excludePathPatterns: `/api/v1/agents/*/events`. This is a practical consideration -- add the exclusion to be safe.
|
||||
</action>
|
||||
<verify>
|
||||
<automated>mvn compile -pl cameleer3-server-core,cameleer3-server-app</automated>
|
||||
<automated>mvn compile -pl cameleer-server-core,cameleer-server-app</automated>
|
||||
</verify>
|
||||
<done>SseConnectionManager, AgentSseController, and AgentCommandController compile. SSE endpoint returns SseEmitter. Command endpoints accept type/payload and deliver via SSE. Ping keepalive scheduled. WebConfig updated if needed.</done>
|
||||
</task>
|
||||
@@ -189,8 +189,8 @@ From cameleer3-server-app/.../config/AgentRegistryConfig.java:
|
||||
<task type="auto">
|
||||
<name>Task 2: Integration tests for SSE, commands, and full flow</name>
|
||||
<files>
|
||||
cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentSseControllerIT.java,
|
||||
cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentCommandControllerIT.java
|
||||
cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentSseControllerIT.java,
|
||||
cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentCommandControllerIT.java
|
||||
</files>
|
||||
<action>
|
||||
Write integration tests covering SSE connection, command delivery, ping, and acknowledgement:
|
||||
@@ -224,7 +224,7 @@ From cameleer3-server-app/.../config/AgentRegistryConfig.java:
|
||||
**Test configuration**: If ping interval needs to be shorter for tests, add to test application.yml or use @TestPropertySource with agent-registry.ping-interval-ms=1000.
|
||||
</action>
|
||||
<verify>
|
||||
<automated>mvn test -pl cameleer3-server-core,cameleer3-server-app -Dtest="Agent*"</automated>
|
||||
<automated>mvn test -pl cameleer-server-core,cameleer-server-app -Dtest="Agent*"</automated>
|
||||
</verify>
|
||||
<done>All SSE integration tests pass: connect/disconnect, config-update/deep-trace/replay delivery via SSE, ping keepalive received, Last-Event-ID accepted, command targeting (single/group/broadcast), command acknowledgement. mvn clean verify passes with all existing tests still green.</done>
|
||||
</task>
|
||||
|
||||
@@ -24,14 +24,14 @@ tech-stack:
|
||||
|
||||
key-files:
|
||||
created:
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/SseConnectionManager.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentSseController.java
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentCommandController.java
|
||||
- cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentSseControllerIT.java
|
||||
- cameleer3-server-app/src/test/java/com/cameleer3/server/app/controller/AgentCommandControllerIT.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/agent/SseConnectionManager.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentSseController.java
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentCommandController.java
|
||||
- cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentSseControllerIT.java
|
||||
- cameleer-server-app/src/test/java/com/cameleer/server/app/controller/AgentCommandControllerIT.java
|
||||
modified:
|
||||
- cameleer3-server-app/src/main/java/com/cameleer3/server/app/config/WebConfig.java
|
||||
- cameleer3-server-app/src/test/resources/application-test.yml
|
||||
- cameleer-server-app/src/main/java/com/cameleer/server/app/config/WebConfig.java
|
||||
- cameleer-server-app/src/test/resources/application-test.yml
|
||||
|
||||
key-decisions:
|
||||
- "SSE events path excluded from ProtocolVersionInterceptor for EventSource client compatibility"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
## Summary
|
||||
|
||||
This phase adds agent registration, heartbeat-based lifecycle management (LIVE/STALE/DEAD), and real-time command push via SSE to the Cameleer3 server. The technology stack is straightforward: Spring MVC's `SseEmitter` for server-push, `ConcurrentHashMap` for the in-memory agent registry, and `@Scheduled` for periodic lifecycle checks (same pattern already used by `ClickHouseFlushScheduler`).
|
||||
This phase adds agent registration, heartbeat-based lifecycle management (LIVE/STALE/DEAD), and real-time command push via SSE to the Cameleer server. The technology stack is straightforward: Spring MVC's `SseEmitter` for server-push, `ConcurrentHashMap` for the in-memory agent registry, and `@Scheduled` for periodic lifecycle checks (same pattern already used by `ClickHouseFlushScheduler`).
|
||||
|
||||
The main architectural challenge is managing per-agent SSE connections reliably -- handling disconnections, timeouts, and cleanup without leaking threads or emitters. The command delivery model (PENDING with 60s expiry, acknowledgement) adds a second concurrent data structure to manage alongside the registry itself.
|
||||
|
||||
@@ -93,7 +93,7 @@ No new dependencies required. Everything is already on the classpath.
|
||||
|
||||
### Recommended Project Structure
|
||||
```
|
||||
cameleer3-server-core/src/main/java/com/cameleer3/server/core/
|
||||
cameleer-server-core/src/main/java/com/cameleer/server/core/
|
||||
├── agent/
|
||||
│ ├── AgentInfo.java # Record: id, name, group, version, routeIds, capabilities, state, timestamps
|
||||
│ ├── AgentState.java # Enum: LIVE, STALE, DEAD
|
||||
@@ -101,7 +101,7 @@ cameleer3-server-core/src/main/java/com/cameleer3/server/core/
|
||||
│ ├── AgentCommand.java # Record: id, type, payload, targetAgentId, createdAt, status
|
||||
│ └── CommandStatus.java # Enum: PENDING, DELIVERED, ACKNOWLEDGED, EXPIRED
|
||||
|
||||
cameleer3-server-app/src/main/java/com/cameleer3/server/app/
|
||||
cameleer-server-app/src/main/java/com/cameleer/server/app/
|
||||
├── config/
|
||||
│ ├── AgentRegistryConfig.java # @ConfigurationProperties(prefix = "agent-registry")
|
||||
│ └── AgentRegistryBeanConfig.java # @Configuration: wires AgentRegistryService as bean
|
||||
@@ -452,30 +452,30 @@ spring:
|
||||
|----------|-------|
|
||||
| Framework | JUnit 5 + Spring Boot Test (via spring-boot-starter-test) |
|
||||
| Config file | pom.xml (Surefire + Failsafe configured) |
|
||||
| Quick run command | `mvn test -pl cameleer3-server-core -Dtest=AgentRegistryServiceTest` |
|
||||
| Quick run command | `mvn test -pl cameleer-server-core -Dtest=AgentRegistryServiceTest` |
|
||||
| Full suite command | `mvn clean verify` |
|
||||
|
||||
### Phase Requirements to Test Map
|
||||
| Req ID | Behavior | Test Type | Automated Command | File Exists? |
|
||||
|--------|----------|-----------|-------------------|-------------|
|
||||
| AGNT-01 | Agent registers and gets response | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentRegistrationControllerIT#registerAgent*` | No - Wave 0 |
|
||||
| AGNT-02 | Lifecycle transitions LIVE/STALE/DEAD | unit | `mvn test -pl cameleer3-server-core -Dtest=AgentRegistryServiceTest#lifecycle*` | No - Wave 0 |
|
||||
| AGNT-03 | Heartbeat updates timestamp, returns 200/404 | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentRegistrationControllerIT#heartbeat*` | No - Wave 0 |
|
||||
| AGNT-04 | Config-update pushed via SSE | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#configUpdate*` | No - Wave 0 |
|
||||
| AGNT-05 | Deep-trace command pushed via SSE | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#deepTrace*` | No - Wave 0 |
|
||||
| AGNT-06 | Replay command pushed via SSE | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#replay*` | No - Wave 0 |
|
||||
| AGNT-07 | SSE ping keepalive + Last-Event-ID | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#pingKeepalive*` | No - Wave 0 |
|
||||
| AGNT-01 | Agent registers and gets response | integration | `mvn test -pl cameleer-server-app -Dtest=AgentRegistrationControllerIT#registerAgent*` | No - Wave 0 |
|
||||
| AGNT-02 | Lifecycle transitions LIVE/STALE/DEAD | unit | `mvn test -pl cameleer-server-core -Dtest=AgentRegistryServiceTest#lifecycle*` | No - Wave 0 |
|
||||
| AGNT-03 | Heartbeat updates timestamp, returns 200/404 | integration | `mvn test -pl cameleer-server-app -Dtest=AgentRegistrationControllerIT#heartbeat*` | No - Wave 0 |
|
||||
| AGNT-04 | Config-update pushed via SSE | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#configUpdate*` | No - Wave 0 |
|
||||
| AGNT-05 | Deep-trace command pushed via SSE | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#deepTrace*` | No - Wave 0 |
|
||||
| AGNT-06 | Replay command pushed via SSE | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#replay*` | No - Wave 0 |
|
||||
| AGNT-07 | SSE ping keepalive + Last-Event-ID | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#pingKeepalive*` | No - Wave 0 |
|
||||
|
||||
### Sampling Rate
|
||||
- **Per task commit:** `mvn test -pl cameleer3-server-core,cameleer3-server-app -Dtest="Agent*"` (agent-related tests only)
|
||||
- **Per task commit:** `mvn test -pl cameleer-server-core,cameleer-server-app -Dtest="Agent*"` (agent-related tests only)
|
||||
- **Per wave merge:** `mvn clean verify`
|
||||
- **Phase gate:** Full suite green before /gsd:verify-work
|
||||
|
||||
### Wave 0 Gaps
|
||||
- [ ] `cameleer3-server-core/.../agent/AgentRegistryServiceTest.java` -- covers AGNT-02, AGNT-03 (unit tests for registry logic)
|
||||
- [ ] `cameleer3-server-app/.../controller/AgentRegistrationControllerIT.java` -- covers AGNT-01, AGNT-03
|
||||
- [ ] `cameleer3-server-app/.../controller/AgentSseControllerIT.java` -- covers AGNT-04, AGNT-05, AGNT-06, AGNT-07
|
||||
- [ ] `cameleer3-server-app/.../controller/AgentCommandControllerIT.java` -- covers command targeting (single, group, all)
|
||||
- [ ] `cameleer-server-core/.../agent/AgentRegistryServiceTest.java` -- covers AGNT-02, AGNT-03 (unit tests for registry logic)
|
||||
- [ ] `cameleer-server-app/.../controller/AgentRegistrationControllerIT.java` -- covers AGNT-01, AGNT-03
|
||||
- [ ] `cameleer-server-app/.../controller/AgentSseControllerIT.java` -- covers AGNT-04, AGNT-05, AGNT-06, AGNT-07
|
||||
- [ ] `cameleer-server-app/.../controller/AgentCommandControllerIT.java` -- covers command targeting (single, group, all)
|
||||
- [ ] No new framework install needed -- JUnit 5 + Spring Boot Test + Awaitility already in place
|
||||
|
||||
### SSE Test Strategy
|
||||
|
||||
@@ -18,8 +18,8 @@ created: 2026-03-11
|
||||
| Property | Value |
|
||||
|----------|-------|
|
||||
| **Framework** | JUnit 5 + Spring Boot Test + Testcontainers ClickHouse 25.3 |
|
||||
| **Config file** | cameleer3-server-app/pom.xml (Surefire + Failsafe configured) |
|
||||
| **Quick run command** | `mvn test -pl cameleer3-server-core -Dtest=AgentRegistryServiceTest` |
|
||||
| **Config file** | cameleer-server-app/pom.xml (Surefire + Failsafe configured) |
|
||||
| **Quick run command** | `mvn test -pl cameleer-server-core -Dtest=AgentRegistryServiceTest` |
|
||||
| **Full suite command** | `mvn clean verify` |
|
||||
| **Estimated runtime** | ~50 seconds |
|
||||
|
||||
@@ -27,7 +27,7 @@ created: 2026-03-11
|
||||
|
||||
## Sampling Rate
|
||||
|
||||
- **After every task commit:** Run `mvn test -pl cameleer3-server-core,cameleer3-server-app -Dtest="Agent*"`
|
||||
- **After every task commit:** Run `mvn test -pl cameleer-server-core,cameleer-server-app -Dtest="Agent*"`
|
||||
- **After every plan wave:** Run `mvn clean verify`
|
||||
- **Before `/gsd:verify-work`:** Full suite must be green
|
||||
- **Max feedback latency:** 50 seconds
|
||||
@@ -38,13 +38,13 @@ created: 2026-03-11
|
||||
|
||||
| Task ID | Plan | Wave | Requirement | Test Type | Automated Command | File Exists | Status |
|
||||
|---------|------|------|-------------|-----------|-------------------|-------------|--------|
|
||||
| 03-01-01 | 01 | 1 | AGNT-01 | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentRegistrationControllerIT#registerAgent*` | ❌ W0 | ⬜ pending |
|
||||
| 03-01-02 | 01 | 1 | AGNT-02 | unit | `mvn test -pl cameleer3-server-core -Dtest=AgentRegistryServiceTest#lifecycle*` | ❌ W0 | ⬜ pending |
|
||||
| 03-01-03 | 01 | 1 | AGNT-03 | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentRegistrationControllerIT#heartbeat*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-01 | 02 | 1 | AGNT-04 | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#configUpdate*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-02 | 02 | 1 | AGNT-05 | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#deepTrace*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-03 | 02 | 1 | AGNT-06 | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#replay*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-04 | 02 | 1 | AGNT-07 | integration | `mvn test -pl cameleer3-server-app -Dtest=AgentSseControllerIT#pingKeepalive*` | ❌ W0 | ⬜ pending |
|
||||
| 03-01-01 | 01 | 1 | AGNT-01 | integration | `mvn test -pl cameleer-server-app -Dtest=AgentRegistrationControllerIT#registerAgent*` | ❌ W0 | ⬜ pending |
|
||||
| 03-01-02 | 01 | 1 | AGNT-02 | unit | `mvn test -pl cameleer-server-core -Dtest=AgentRegistryServiceTest#lifecycle*` | ❌ W0 | ⬜ pending |
|
||||
| 03-01-03 | 01 | 1 | AGNT-03 | integration | `mvn test -pl cameleer-server-app -Dtest=AgentRegistrationControllerIT#heartbeat*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-01 | 02 | 1 | AGNT-04 | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#configUpdate*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-02 | 02 | 1 | AGNT-05 | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#deepTrace*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-03 | 02 | 1 | AGNT-06 | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#replay*` | ❌ W0 | ⬜ pending |
|
||||
| 03-02-04 | 02 | 1 | AGNT-07 | integration | `mvn test -pl cameleer-server-app -Dtest=AgentSseControllerIT#pingKeepalive*` | ❌ W0 | ⬜ pending |
|
||||
|
||||
*Status: ⬜ pending · ✅ green · ❌ red · ⚠️ flaky*
|
||||
|
||||
|
||||
@@ -51,18 +51,18 @@ re_verification: false
|
||||
|
||||
| Artifact | Expected | Status | Details |
|
||||
|----------|----------|--------|---------|
|
||||
| `cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentRegistryService.java` | Registration, heartbeat, lifecycle, find/filter, commands | VERIFIED | 281 lines; full implementation with ConcurrentHashMap, compute-based atomic swaps, eventListener bridge |
|
||||
| `cameleer3-server-core/src/main/java/com/cameleer3/server/core/agent/AgentInfo.java` | Immutable record with all fields and wither methods | VERIFIED | 63 lines; record with 10 fields and 5 wither-style methods |
|
||||
| `cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentRegistrationController.java` | POST /register, POST /{id}/heartbeat, GET /agents | VERIFIED | 153 lines; all three endpoints implemented with OpenAPI annotations |
|
||||
| `cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/AgentLifecycleMonitor.java` | @Scheduled LIVE->STALE->DEAD transitions | VERIFIED | 37 lines; calls `registryService.checkLifecycle()` and `expireOldCommands()` on schedule |
|
||||
| `cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentRegistryService.java` | Registration, heartbeat, lifecycle, find/filter, commands | VERIFIED | 281 lines; full implementation with ConcurrentHashMap, compute-based atomic swaps, eventListener bridge |
|
||||
| `cameleer-server-core/src/main/java/com/cameleer/server/core/agent/AgentInfo.java` | Immutable record with all fields and wither methods | VERIFIED | 63 lines; record with 10 fields and 5 wither-style methods |
|
||||
| `cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentRegistrationController.java` | POST /register, POST /{id}/heartbeat, GET /agents | VERIFIED | 153 lines; all three endpoints implemented with OpenAPI annotations |
|
||||
| `cameleer-server-app/src/main/java/com/cameleer/server/app/agent/AgentLifecycleMonitor.java` | @Scheduled LIVE->STALE->DEAD transitions | VERIFIED | 37 lines; calls `registryService.checkLifecycle()` and `expireOldCommands()` on schedule |
|
||||
|
||||
### Plan 02 Artifacts
|
||||
|
||||
| Artifact | Expected | Status | Details |
|
||||
|----------|----------|--------|---------|
|
||||
| `cameleer3-server-app/src/main/java/com/cameleer3/server/app/agent/SseConnectionManager.java` | Per-agent SseEmitter management, event sending, ping | VERIFIED | 158 lines; implements AgentEventListener, reference-equality removal, @PostConstruct registration |
|
||||
| `cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentSseController.java` | GET /{id}/events SSE endpoint | VERIFIED | 67 lines; checks agent exists, delegates to connectionManager.connect() |
|
||||
| `cameleer3-server-app/src/main/java/com/cameleer3/server/app/controller/AgentCommandController.java` | POST commands (single/group/broadcast) + ack | VERIFIED | 182 lines; all four endpoints implemented |
|
||||
| `cameleer-server-app/src/main/java/com/cameleer/server/app/agent/SseConnectionManager.java` | Per-agent SseEmitter management, event sending, ping | VERIFIED | 158 lines; implements AgentEventListener, reference-equality removal, @PostConstruct registration |
|
||||
| `cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentSseController.java` | GET /{id}/events SSE endpoint | VERIFIED | 67 lines; checks agent exists, delegates to connectionManager.connect() |
|
||||
| `cameleer-server-app/src/main/java/com/cameleer/server/app/controller/AgentCommandController.java` | POST commands (single/group/broadcast) + ack | VERIFIED | 182 lines; all four endpoints implemented |
|
||||
|
||||
### Supporting Artifacts (confirmed present)
|
||||
|
||||
@@ -77,7 +77,7 @@ re_verification: false
|
||||
| `AgentRegistryBeanConfig.java` (@Configuration) | VERIFIED — creates AgentRegistryService with config values |
|
||||
| `application.yml` | VERIFIED — agent-registry section present; `spring.mvc.async.request-timeout: -1` present |
|
||||
| `application-test.yml` | VERIFIED — `agent-registry.ping-interval-ms: 1000` for fast SSE test assertions |
|
||||
| `Cameleer3ServerApplication.java` | VERIFIED — `AgentRegistryConfig.class` added to `@EnableConfigurationProperties` |
|
||||
| `CameleerServerApplication.java` | VERIFIED — `AgentRegistryConfig.class` added to `@EnableConfigurationProperties` |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user