Add built-in AssignTask command and AgentTaskAssigned event for AgenticAggregate#329
Add built-in AssignTask command and AgentTaskAssigned event for AgenticAggregate#329
Conversation
Created plans/assign-task/assign-task-plan.md with 5-phase design: - Phase 1: RequestingParty sealed interface (api module) - Phase 2: AssignTaskCommand and AgentTaskAssignedEvent (agentic module) - Phase 3: Built-in handlers and registration (agentic module) - Phase 4: TaskAwareState interface and AssignedTask record (api module) - Phase 5: Integration tests GitHub Issues: #322-#327 (tracking issue: #327) Agent-Logs-Url: https://github.com/elasticsoftwarefoundation/akces-framework/sessions/2c3e5400-d2cc-4fed-a03e-b7478d7dcc71 Co-authored-by: jwijgerd <914840+jwijgerd@users.noreply.github.com>
…icAggregate Phase 1: RequestingParty sealed interface with AgentRequestingParty and HumanRequestingParty (api module) Phase 2: AssignTaskCommand and AgentTaskAssignedEvent with type constants (agentic module) Phase 3: AssignTaskCommandHandler, event-sourcing handler, factory registration, controller schema registration Phase 4: AssignedTask record and TaskAwareState interface (api module) Agent-Logs-Url: https://github.com/elasticsoftwarefoundation/akces-framework/sessions/b6306087-e325-41fe-9b0f-63e42ac8bd4b Co-authored-by: jwijgerd <914840+jwijgerd@users.noreply.github.com>
API module tests: - RequestingPartySerializationTest: sealed interface, annotations, equality, pattern matching - TaskAwareStateTest: AssignedTask record, TaskAwareState interface contract Agentic module tests: - AssignTaskCommandHandlerTest: handler creates AgentProcess, emits event, error cases - TaskEventSourcingTest: event-sourcing handler updates TaskAwareState, dispatch, sequences - AssignTaskTypeConstantsTest: type registration constant verification Agent-Logs-Url: https://github.com/elasticsoftwarefoundation/akces-framework/sessions/b6306087-e325-41fe-9b0f-63e42ac8bd4b Co-authored-by: jwijgerd <914840+jwijgerd@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds framework-level task assignment for AgenticAggregate by introducing a built-in AssignTask command that creates an Embabel AgentProcess and emits an AgentTaskAssigned event, plus API-level types for tracking requesting party and assigned tasks in state.
Changes:
- Introduces
RequestingParty(sealed) +AssignedTask+TaskAwareStateinapiwith accompanying unit tests. - Adds built-in
AssignTaskCommand/AgentTaskAssignedEvent, registers their types/schemas, and wires built-in command + event-sourcing handlers in the agentic runtime. - Adds agentic unit tests for type constants, command handler behavior, and task event-sourcing.
Reviewed changes
Copilot reviewed 18 out of 18 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| plans/assign-task/assign-task-plan.md | Design/implementation plan for built-in task assignment support |
| main/api/src/main/java/org/elasticsoftware/akces/aggregate/RequestingParty.java | Sealed requesting-party abstraction with Jackson polymorphic annotations |
| main/api/src/main/java/org/elasticsoftware/akces/aggregate/AgentRequestingParty.java | Agent requesting-party record |
| main/api/src/main/java/org/elasticsoftware/akces/aggregate/HumanRequestingParty.java | Human requesting-party record |
| main/api/src/main/java/org/elasticsoftware/akces/aggregate/AssignedTask.java | Record to persist assigned task info in aggregate state |
| main/api/src/main/java/org/elasticsoftware/akces/aggregate/TaskAwareState.java | State contract for tracking assigned tasks |
| main/api/src/test/java/org/elasticsoftware/akces/aggregate/RequestingPartySerializationTest.java | Tests for sealed type shape + Jackson annotation presence |
| main/api/src/test/java/org/elasticsoftware/akces/aggregate/TaskAwareStateTest.java | Tests for TaskAwareState contract + AssignedTask usage |
| main/agentic/src/main/java/org/elasticsoftware/akces/agentic/commands/AssignTaskCommand.java | Built-in command definition + schema metadata |
| main/agentic/src/main/java/org/elasticsoftware/akces/agentic/events/AgentTaskAssignedEvent.java | Built-in event definition + schema metadata |
| main/agentic/src/main/java/org/elasticsoftware/akces/agentic/AgenticAggregateRuntime.java | Registers built-in command/event type constants |
| main/agentic/src/main/java/org/elasticsoftware/akces/agentic/runtime/AssignTaskCommandHandler.java | Built-in handler creating AgentProcess and emitting assignment event |
| main/agentic/src/main/java/org/elasticsoftware/akces/agentic/runtime/KafkaAgenticAggregateRuntime.java | Built-in event-sourcing handler to update TaskAwareState |
| main/agentic/src/main/java/org/elasticsoftware/akces/agentic/beans/AgenticAggregateRuntimeFactory.java | Wires built-in command handler + event-sourcing handler into runtime |
| main/agentic/src/main/java/org/elasticsoftware/akces/agentic/runtime/AkcesAgenticAggregateController.java | Registers built-in command schemas in addition to event schemas |
| main/agentic/src/test/java/org/elasticsoftware/akces/agentic/runtime/AssignTaskTypeConstantsTest.java | Verifies built-in type constants |
| main/agentic/src/test/java/org/elasticsoftware/akces/agentic/runtime/AssignTaskCommandHandlerTest.java | Verifies handler creates AgentProcess and emits correct event |
| main/agentic/src/test/java/org/elasticsoftware/akces/agentic/runtime/TaskEventSourcingTest.java | Verifies task event-sourcing handler updates TaskAwareState |
| import tools.jackson.databind.ObjectMapper; | ||
|
|
||
| import java.io.IOException; | ||
| import java.util.ArrayList; |
There was a problem hiding this comment.
java.util.ArrayList is imported but never used in this file. This will fail compilation (unused import). Remove the import or use it if it was intended for new logic.
| import java.util.ArrayList; |
...gentic/src/main/java/org/elasticsoftware/akces/agentic/runtime/AssignTaskCommandHandler.java
Outdated
Show resolved
Hide resolved
| @SuppressWarnings({"unchecked", "rawtypes"}) | ||
| AssignTaskCommandHandler assignTaskHandler = new AssignTaskCommandHandler<>( | ||
| (AgenticAggregate) aggregate, agentPlatform, agenticInfo.value()); |
There was a problem hiding this comment.
The built-in AssignTask handler is registered using raw types and an unchecked cast (@SuppressWarnings({"unchecked", "rawtypes"}) and (AgenticAggregate) aggregate). This reduces type safety and can hide wiring errors at compile time. Prefer keeping the generic type parameter (e.g., AssignTaskCommandHandler<S> or AssignTaskCommandHandler<? extends AggregateState>) and avoid raw casts where possible.
| @SuppressWarnings({"unchecked", "rawtypes"}) | |
| AssignTaskCommandHandler assignTaskHandler = new AssignTaskCommandHandler<>( | |
| (AgenticAggregate) aggregate, agentPlatform, agenticInfo.value()); | |
| if (!(aggregate instanceof AgenticAggregate<?> agenticAggregate)) { | |
| throw new IllegalStateException("Agentic aggregate runtime requires an AgenticAggregate: " | |
| + aggregate.getClass().getName()); | |
| } | |
| @SuppressWarnings("unchecked") | |
| AgenticAggregate<S> typedAgenticAggregate = (AgenticAggregate<S>) agenticAggregate; | |
| AssignTaskCommandHandler<S> assignTaskHandler = new AssignTaskCommandHandler<>( | |
| typedAgenticAggregate, agentPlatform, agenticInfo.value()); |
...src/main/java/org/elasticsoftware/akces/agentic/runtime/AkcesAgenticAggregateController.java
Outdated
Show resolved
Hide resolved
...gentic/src/main/java/org/elasticsoftware/akces/agentic/runtime/AssignTaskCommandHandler.java
Outdated
Show resolved
Hide resolved
...ic/src/main/java/org/elasticsoftware/akces/agentic/runtime/KafkaAgenticAggregateRuntime.java
Outdated
Show resolved
Hide resolved
main/api/src/main/java/org/elasticsoftware/akces/aggregate/HumanRequestingParty.java
Outdated
Show resolved
Hide resolved
- Remove displayName from HumanRequestingParty for GDPR (comment #3064274600) - Replace AssignTaskCommandHandler class with static builtInCommandHandler() factory method on KafkaAgenticAggregateRuntime (comment #3064259933) - Rename handleMemoryEvent to handleBuiltInEvent, merge AgentTaskAssignedEvent support into it, remove handleTaskEvent (comment #3064268880) - Use forceRegisterOnIncompatible flag from environment property instead of automatic force-register in registerBuiltinSchemas (comment #3064241901) - Remove unused ArrayList import from KafkaAgenticAggregateRuntime - Update all tests for new method signatures and 2-arg HumanRequestingParty Agent-Logs-Url: https://github.com/elasticsoftwarefoundation/akces-framework/sessions/83c4f48e-f510-429f-8c85-0f14c17d75d4 Co-authored-by: jwijgerd <914840+jwijgerd@users.noreply.github.com>
Agent-Logs-Url: https://github.com/elasticsoftwarefoundation/akces-framework/sessions/83c4f48e-f510-429f-8c85-0f14c17d75d4 Co-authored-by: jwijgerd <914840+jwijgerd@users.noreply.github.com>
Adds framework-level task assignment to agentic aggregates. An
AssignTaskcommand creates an EmbabelAgentProcessand emits anAgentTaskAssignedevent carrying the process ID and requesting party info.api module — core types
RequestingParty— sealed interface withAgentRequestingPartyandHumanRequestingPartyrecord permits. Jackson@JsonTypeInfo/@JsonSubTypesfor polymorphic serde. Each variant carries aString role.HumanRequestingParty— carries onlyuserIdandrole(no display name, for GDPR compliance)TaskAwareState— mirrorsMemoryAwareStatepattern:withAssignedTask()/withoutAssignedTask()immutable updatesAssignedTask— record holdingagentProcessId,taskDescription,requestingParty,taskMetadata,assignedAtagentic module — command, event, handler
AssignTaskCommand— first framework-ownedCommand. Fields:agenticAggregateId,taskDescription,requestingParty,taskMetadataAgentTaskAssignedEvent— includesagentProcessIdfromAgentProcess.getId(), linking Akces domain to Embabel runtimeKafkaAgenticAggregateRuntime.builtInCommandHandler()— static factory method returning aCommandHandlerFunctionthat resolves the agent from the platform, creates anAgentProcess, and emits the event (follows the same single-dispatch pattern as the built-in event handlers)Registration (follows existing memory event pattern)
AgenticAggregateRuntime—ASSIGN_TASK_COMMAND_TYPEandAGENT_TASK_ASSIGNED_TYPEconstantsAgenticAggregateRuntimeFactory— wiresbuiltInCommandHandler()+ unified event-sourcing handler for all built-in eventsAkcesAgenticAggregateController—BUILTIN_COMMAND_TYPESlist added;registerBuiltinSchemas()registers command schemas withforceRegisterOnIncompatibleflag support (read fromakces.aggregate.schemas.forceRegisterenvironment property, matchingAkcesAggregateControllerbehaviour)KafkaAgenticAggregateRuntime—handleBuiltInEvent()unified static single-dispatch handler forMemoryStoredEvent,MemoryRevokedEvent, andAgentTaskAssignedEvent(renamed fromhandleMemoryEvent)Usage sketch
Tests
RequestingPartySerializationTest(sealed type, annotations, pattern matching),TaskAwareStateTestAssignTaskCommandHandlerTest(mocked AgentPlatform/AgentProcess viabuiltInCommandHandler),TaskEventSourcingTest,AssignTaskTypeConstantsTest