Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,22 @@ All notable changes to the AxonFlow Java SDK will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.7.0] - 2026-01-23
## [2.7.0] - 2026-01-24

### Added

- **Unified Execution Tracking** (Issue #1075 - EPIC #1074): Consistent status tracking for MAP plans and WCP workflows
- `getExecutionStatus(executionId)` - Get unified execution status by ID
- `listUnifiedExecutions(request)` - List executions with type/status filters
- `ExecutionTypes.ExecutionStatus` class with unified fields for both MAP and WCP executions
- `ExecutionTypes.ExecutionType` enum: `MAP_PLAN`, `WCP_WORKFLOW`
- `ExecutionTypes.ExecutionStatusValue` enum: `PENDING`, `RUNNING`, `COMPLETED`, `FAILED`, `CANCELLED`, `ABORTED`, `EXPIRED`
- `ExecutionTypes.StepStatusValue` enum: `PENDING`, `RUNNING`, `COMPLETED`, `FAILED`, `SKIPPED`, `BLOCKED`, `APPROVAL`
- `ExecutionTypes.UnifiedStepType` enum: `LLM_CALL`, `TOOL_CALL`, `CONNECTOR_CALL`, `HUMAN_TASK`, `SYNTHESIS`, `ACTION`, `GATE`
- `ExecutionTypes.UnifiedStepStatus` class with step-level details (duration, cost, policy decisions)
- Helper methods: `isTerminal()`, `isStepTerminal()`, `isStepBlocking()`, `calculateTotalCost()`, `getCurrentStep()`
- Consistent response format across MAP Multi-Agent Planning and WCP Workflow Control Plane

- **MAS FEAT Compliance Module** (Enterprise): Singapore financial services AI governance
- AI System Registry: `masfeat().registerSystem()`, `masfeat().getSystem()`, `masfeat().updateSystem()`, `masfeat().listSystems()`, `masfeat().activateSystem()`, `masfeat().retireSystem()`, `masfeat().getRegistrySummary()`
- 3-Dimensional Risk Rating: Customer Impact × Model Complexity × Human Reliance
Expand Down
71 changes: 71 additions & 0 deletions src/main/java/com/getaxonflow/sdk/AxonFlow.java
Original file line number Diff line number Diff line change
Expand Up @@ -1624,6 +1624,77 @@ public List<DynamicPolicy> getEffectiveDynamicPolicies(EffectivePoliciesOptions
}, "getEffectiveDynamicPolicies");
}

// ========================================================================
// Unified Execution Tracking (Issue #1075 - EPIC #1074)
// ========================================================================

/**
* Gets the unified execution status for a given execution ID.
*
* <p>This method works for both MAP plans and WCP workflows, returning
* a consistent status format regardless of execution type.
*
* @param executionId the execution ID (plan ID or workflow ID)
* @return the unified execution status
*/
public com.getaxonflow.sdk.types.execution.ExecutionTypes.ExecutionStatus getExecutionStatus(String executionId) {
Objects.requireNonNull(executionId, "executionId cannot be null");

return retryExecutor.execute(() -> {
Request httpRequest = buildOrchestratorRequest("GET", "/api/v1/executions/" + executionId, null);
try (Response response = httpClient.newCall(httpRequest).execute()) {
return parseResponse(response, com.getaxonflow.sdk.types.execution.ExecutionTypes.ExecutionStatus.class);
}
}, "getExecutionStatus");
}

/**
* Lists unified executions with optional filtering.
*
* @param request filter options
* @return paginated list of executions
*/
public com.getaxonflow.sdk.types.execution.ExecutionTypes.UnifiedListExecutionsResponse listUnifiedExecutions(
com.getaxonflow.sdk.types.execution.ExecutionTypes.UnifiedListExecutionsRequest request) {

return retryExecutor.execute(() -> {
StringBuilder path = new StringBuilder("/api/v1/executions");
if (request != null) {
StringBuilder params = new StringBuilder();
if (request.getExecutionType() != null) {
params.append("execution_type=").append(request.getExecutionType().getValue());
}
if (request.getStatus() != null) {
if (params.length() > 0) params.append("&");
params.append("status=").append(request.getStatus().getValue());
}
if (request.getTenantId() != null) {
if (params.length() > 0) params.append("&");
params.append("tenant_id=").append(request.getTenantId());
}
if (request.getOrgId() != null) {
if (params.length() > 0) params.append("&");
params.append("org_id=").append(request.getOrgId());
}
if (request.getLimit() > 0) {
if (params.length() > 0) params.append("&");
params.append("limit=").append(request.getLimit());
}
if (request.getOffset() > 0) {
if (params.length() > 0) params.append("&");
params.append("offset=").append(request.getOffset());
}
if (params.length() > 0) {
path.append("?").append(params);
}
}
Request httpRequest = buildOrchestratorRequest("GET", path.toString(), null);
try (Response response = httpClient.newCall(httpRequest).execute()) {
return parseResponse(response, com.getaxonflow.sdk.types.execution.ExecutionTypes.UnifiedListExecutionsResponse.class);
}
}, "listUnifiedExecutions");
}

// ========================================================================
// Configuration Access
// ========================================================================
Expand Down
Loading
Loading