All notable changes to the AxonFlow Java SDK will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Upgrade strongly recommended. Over the past month we've shipped substantial production, quality, and security hardening across the AxonFlow SDKs and platform — upgrade to the latest major for a more secure, reliable, and bug-free experience.
Security highlights from this release cycle:
- Webhook signing-key now exposed by SDK response type (this release). The
secret(HMAC-SHA256) field onWebhookSubscription— returned bycreateWebhook— was missing from the SDK type, so callers had no way to retrieve the signing key and webhook signature verification was effectively un-implementable. The field is now wired through end-to-end. Documented inGHSA-248h-974q-xrc2. DO_NOT_TRACKopt-out removed in favor ofAXONFLOW_TELEMETRY=off(this release).DO_NOT_TRACKwas unreliable because host CLIs and runtimes commonly injectDO_NOT_TRACK=1regardless of user intent; an explicit AxonFlow-scoped opt-out is the only signal we honor now. Maven Surefire and Failsafe environment blocks were tightened so localmvn testruns no longer inherit a hostDO_NOT_TRACK=1and emit accidental pings.- Test-harness opt-out hygiene (last cycle, v6.x). Test environments that mutate
DO_NOT_TRACKno longer silently leak real pings from CI; transport is mocked at the test boundary.
Major release across the AxonFlow SDK family. Companion releases ship the same day: TypeScript v7.0.0 / Python v7.0.0 / Go v7.0.0 (with /v7 module path migration) / Java v7.0.0. The full set of platform-side security fixes shipped alongside this release is documented in the consolidated platform advisory GHSA-9h64-2846-7x7f.
Reliability and bug-fix highlights:
retry_context+idempotency_keyfor cross-step de-duplication (last cycle, v6.x). Workflow steps that retry across pod restarts no longer record duplicate audit entries; idempotency_key flows end-to-end through MAP HITL approve/reject responses.mapTimeoutconfig field — SDK parity with Go / Python / TypeScript (last cycle, v6.x). MAP plan generation has its own timeout knob distinct from the per-request timeout, so multi-LLM-call decompositions no longer cancel the wrong path under load.LLMProvidersource compatibility restored (last cycle, v6.x). The 7-arg primitive constructor and primitivegetPriority()/getWeight()accessors are back; null-safe boxed accessors split off asgetPriorityBoxed()/getWeightBoxed()for callers needing "explicitly 0 vs not set" disambiguation.
DO_NOT_TRACKis no longer honored as an AxonFlow telemetry opt-out. UseAXONFLOW_TELEMETRY=offinstead. Host tools and CLIs commonly injectDO_NOT_TRACK=1regardless of user intent, which makes it unreliable as a signal.- (Test API) Package-private
TelemetryReporter.isEnabledandTelemetryReporter.sendPingoverloads no longer accept aString doNotTrackparameter. The remainingString axonflowTelemetryparameter is the sole opt-out signal accepted by the testability surface.
- TLS verification bypass closed (CWE-295).
HttpClientFactorypreviously honoredinsecureSkipVerify(true)onAxonFlowConfigas a single-flag opt-in to a permissiveX509TrustManagerthat accepted ANY server certificate, including attacker-presented certificates in MITM scenarios. The insecure path is now double-gated: it activates only if bothinsecureSkipVerify(true)is set on the builder AND theAXONFLOW_INSECURE_TLSenvironment variable is set totrue(or1). When the builder flag is set without the env var, the SDK logs a warning and keeps the JVM's defaultTrustManagerin place. A loud*** SECURITY WARNING ***is logged whenever the insecure path actually activates. Default behavior — and behavior in production environments without the env var — uses standard JDK + system trust-store validation. Resolves code-scanning alert #8.
- The
DO_NOT_TRACK=1 is deprecated...logger.warnis no longer emitted on every telemetry decision whenDO_NOT_TRACK=1is set.
- Telemetry now follows the 7-day delivered-heartbeat contract instead of firing on every
new AxonFlow()construction. The SDK emits at most one anonymous heartbeat per environment every 7 days during SDK activity. A stamp file at the OS-native user cache dir tracks last successful delivery; mtime is the source of truth across process restarts. Failed POSTs do NOT advance the stamp — a transient network error does not silence telemetry for 7 days. An in-memory 1-hour cache capsFiles.getLastModifiedTimecalls on hot request paths; aReentrantLock-guarded in-flight flag coalesces concurrent threads so only one ping fires under load.AXONFLOW_TELEMETRY=offis re-evaluated on every gate run. Restricted environments where no cache dir is available (e.g. AWS Lambda with noHOME/LOCALAPPDATA) fall back transparently to the previous "one ping per construction" behavior.
- CI workflows (
ci.yml,integration.yml,release.yml,wire-shape-contract.yml,validate-version-alignment.yml) now useAXONFLOW_TELEMETRY=offto suppress telemetry during automated runs.
Minor release. New LLM-provider listing API closes the parity gap with the Python + Go SDKs; the rest of the cycle restores LLMProvider source-compatibility for callers using the 7-arg primitive shape. Coordinated cycle: TypeScript v6.2.0 / Python v6.9.0 / Go v6.0.0 (major: see SDKCompatibility breaking type change in that release) ship same day.
axonflow.listLLMProviders()+listLLMProviders(String type, Boolean enabled)— list configured LLM providers and their per-provider health snapshot. CallsGET /api/v1/llm-providers. NewLLMProviderandLLMProviderHealthtypes incom.getaxonflow.sdk.types. Async variantlistLLMProvidersAsync(). Closes the parity gap with the Python SDK'slist_providers()and the Go SDK'sListProviders().examples/basic/— minimal smoke example exercisinghealthCheck(),proxyLLMCall(), andlistConnectors()against a running AxonFlow agent. Uses try-with-resources so OkHttp's dispatcher + connection pool are cleaned up at exit. Run viamvn -q compile exec:javaaftermvn install -DskipTestsat the SDK root.
LLMProvidersource compatibility restored. The 7-arg primitive constructorLLMProvider(name, type, enabled:bool, priority:int, weight:int, hasApiKey:bool, health)is back (delegates to the new 13-arg boxed form, marked@Deprecatedso new callers move to the boxed shape).getPriority()/getWeight()return primitiveintagain (null-safe-unbox to 0). Boxed accessors are available asgetPriorityBoxed()/getWeightBoxed()/getEnabledBoxed()/getHasApiKeyBoxed()for callers that need to distinguish "explicitly 0" from "field not present".
Minor release. Surfaces fields the AxonFlow agent has emitted since v7.1.0 (Plugin Batch 1) but the SDK didn't declare. Pure field-additions on existing methods — additive only, no breaking changes. The pre-existing constructors are preserved as source-compat overloads. Documented in OpenAPI via platform v7.4.3.
Coordinated cycle: TypeScript v6.1.0 / Python v6.8.0 / Go v5.8.0 ship same day with the same field set.
MCPCheckInputResponsegains 5 optional Plugin Batch 1 fields:decisionId: String— audit correlatorriskLevel: String—low|medium|high|criticalpolicyMatches: List<ExplainPolicy>— per-policy explainability recordsoverrideAvailable: Boolean— whether session override is permitted for the matched policies (boxed so callers can distinguish "unset" fromfalseon older platforms)overrideExistingId: String— already-active override consumed by this decision (if any)
MCPCheckOutputResponsegains 3 optional fields:decisionId: StringpolicyMatches: List<ExplainPolicy>redactedMessage: String— text-redaction counterpart toredactedData(used when the connector returned a string message rather than tabular rows; e.g. execute-style responses)
ExplainPolicy already shipped — same Jackson-annotated record now reused on the MCP response types. Pre-v7.1.0 platforms leave all new fields as null; callers should treat null as "context not available" rather than an error.
Both MCPCheckInputResponse and MCPCheckOutputResponse retain their v6.0.0 constructor signatures as overloads that delegate to the new @JsonCreator constructors with null for the new fields. Existing callers that build response instances locally compile unchanged. equals() / hashCode() / toString() updated to include the new fields.
client.explainDecision(decisionId) and the full ExplainRule / DecisionExplanation type surface are tracked separately as feature work. This release ships only field-surfacing on existing methods.
This is a major release. The bump is driven by a single observable-contract change: WebhookSubscription.equals() and .hashCode() now compare on id only, not every field. Coordinated with the TypeScript SDK v6.0.0 release (PolicyInfo rename) as a v6 alignment cycle for the SDKs that needed breaking changes; Python (v6.7.0) and Go (v5.7.0) ship as minor on the same day because their changes are purely additive.
WebhookSubscription is an entity, not a value object. Two instances with the same id represent the same logical webhook regardless of whether one view has loaded secret (only returned by createWebhook) and another has not, or whether updatedAt / active have moved between fetches.
Previously equals() / hashCode() compared every field. That meant a webhook constructed locally with the legacy 6-arg constructor compared unequal to the same logical webhook deserialized from a server response that included secret / tenantId / orgId. Set<WebhookSubscription>, Map keying, and identity-tracking caches all broke under those semantics.
Identity-based equality is the canonical entity semantics; the prior value-based equality was a bug. Because equals() / hashCode() are part of the observable Java contract that callers depend on for set deduplication, map lookup, and identity caches, the fix is a breaking change per strict semver — even though the new behaviour corrects incorrect semantics rather than introducing them.
If you need content-equality (e.g. to detect a rotated secret), compare the relevant getters directly. The 6-arg constructor is preserved as a source-compat overload for callers building local instances; only equals() / hashCode() semantics changed. toString() is unchanged (still emits full state with secret redacted).
- Version alignment check (
.github/workflows/validate-version-alignment.yml). CI now fails any PR or push tomainwherepom.xml's<version>drifts from the first released## [X.Y.Z]section inCHANGELOG.md. Matches the pattern in the platform repo and the Go SDK. - Wire-shape contract gate (
.github/workflows/wire-shape-contract.yml). CI fails any PR that introduces drift between Java@JsonPropertyannotations and the OpenAPI specs pinned attests/fixtures/wire-shape-baseline.json::openapi_specs_sha. Four gates: cross-spec schema divergence, intra-file schema duplicates, per-type SDK-vs-spec drift, and registered-type rename-escape. The pinned spec SHA is itself guarded by aspec-pin-bumpPR label so a single PR can't both move the SHA and silence drift. Source-discovery walks brace depth so nested classes (e.g.WorkflowTypes.CreateWorkflowRequest) and inner enums are attributed to the correct type rather than the file's outer class. Mirrors the Python, Go, and TypeScript gates. WebhookSubscription.secret— HMAC-SHA256 signing key now exposed on the response fromcreateWebhook. Required to verify theX-AxonFlow-Signatureheader on inbound webhook deliveries; without it, callers can't validate payload authenticity. Also addstenantIdandorgId(ownership scoping). The 6-arg constructor is preserved as a source-compat overload that delegates to the 9-arg with nulls for the new fields.toString()redactssecretto avoid log leakage.BudgetAlert.acknowledged— alert dismissal flag. Also adds@JsonPropertyannotations on previously-unannotated fields (id,threshold,message) so the wire-shape gate can see them; Jackson's default name mapping was correct, but the validator's discovery walks@JsonPropertyonly.
- Telemetry pings now deliver reliably from short-lived JVMs (CLI, serverless, cold-starts).
AxonFlowconstruction blocks briefly while the ping is sent synchronously (bounded by the telemetry timeout). - Telemetry path is bounded at
TIMEOUT_SECONDS(3s) total; the/healthprobe and checkpoint POST share a single monotonic deadline instead of stacking independent timeouts.
- Rich
ApproveStepResponse/RejectStepResponse— both classes now carry the same shape as the step-gate response:decisionresolves to"allow"or"block",retryContextmirrors the gate response retry state,approvedBy/approvedAt/rejectedBy/rejectedAtcarry reviewer identity,approvalIdis the deterministic HITL queue UUID,policiesMatchedreconstructs the governance trail. The legacyworkflowId/stepId/statusfields remain for back-compat. planIdon approve/reject responses — populated when the response comes from the MAP plan-scoped endpoint; empty on WCP plane responses. Same types work across both endpoints.- Back-compat 3-arg constructors —
new ApproveStepResponse(workflowId, stepId, status)andnew RejectStepResponse(workflowId, stepId, status)still compile, so existing test fixtures and SDK consumers keep working without changes. getPendingPlanApprovals/getPendingPlanApprovalsAsync— new client methods that list MAP-plane pending approvals (GET /api/v1/plans/approvals/pending), the counterpart ofgetPendingApprovalsfor the WCP plane. The two-arg form accepts an optionalplanIdfilter so reviewer tools can scope the listing to one plan. Available on Evaluation+ licenses (same tier gate as the MAP step approve/reject endpoints).PendingApproval.planId— populated on MAP-plane entries, null on WCP-plane entries. Mirrors the approve/reject asymmetry.PendingApprovalalso gainsstepIndex,decision,decisionReason, andapprovalStatusso reviewer tools can render the full approval context without a second request. The existing 6-arg back-compat constructor still works; new fields default to null / 0 for callers that don't pass them.
approveStep/rejectStep/getPendingApprovalsendpoint URLs — all three previously targeted non-existent paths under/api/v1/workflow-control/and would fail against a real AxonFlow server. Corrected to the canonical/api/v1/workflows/{id}/steps/{step_id}/(approve|reject)and/api/v1/workflows/approvals/pendingroutes. Customers using these methods against a live deployment were receiving 404s; this release makes them work.PendingApprovalsResponsegetters and JSON field names aligned with the wire shape — the class previously declaredgetApprovals()/getTotal()over a JSON body with keysapprovals/total, which never matched the server (pending_approvals/count). Getters renamed togetPendingApprovals()/getCount()with the correct JSON bindings. Callers that readresponse.getApprovals()orresponse.getTotal()need to update to the new getter names.
DO_NOT_TRACK=1as an AxonFlow telemetry opt-out — scheduled for removal after 2026-05-05 in the next major release. UseAXONFLOW_TELEMETRY=offinstead. The SDK emits a one-line migration warning whenDO_NOT_TRACK=1is the active control andAXONFLOW_TELEMETRY=offis not also set.
approveStep(workflowId, stepId)/rejectStep(workflowId, stepId, reason)method signatures onAxonFloware unchanged — only the response fields grew.
retry_contextandidempotency_keysupport on the step gate —StepGateResponsenow carries aRetryContextobject on every gate call with the true(workflow_id, step_id)lifecycle:gateCount,completionCount,priorCompletionStatus(PriorCompletionStatusenum —NONE/COMPLETED/GATED_NOT_COMPLETED),priorOutputAvailable,priorOutput,priorCompletionAt,firstAttemptAt,lastAttemptAt,lastDecision, andidempotencyKey. Prefer these to the legacycached/decisionSourcefields.stepGate(workflowId, stepId, request, options)overload — new 4-arg overload takingStepGateOptions. UseStepGateOptions.includePriorOutput()to send?include_prior_output=truesoretryContext.priorOutputis populated when a prior/completehas landed. Existing 3-arg overload keeps its signature and delegates withStepGateOptions.defaults().StepGateRequest.idempotencyKey— caller-supplied opaque business-level key (max 255 chars; validated at construction). Immutable once recorded on the first gate call for a(workflow, step); subsequent gate/complete calls must pass the same key.MarkStepCompletedRequest.idempotencyKey— must match the key set on the corresponding gate call, if any. Mismatch (including missing-vs-set on either side) surfaces as a typedIdempotencyKeyMismatchException.IdempotencyKeyMismatchException— new typed exception incom.getaxonflow.sdk.exceptions. Thrown bystepGateandmarkStepCompletedwhen the platform returns HTTP 409 witherror.code == "IDEMPOTENCY_KEY_MISMATCH". SurfacesworkflowId,stepId,expectedIdempotencyKey,receivedIdempotencyKey, plus inheritedstatusCode=409anderrorCode="IDEMPOTENCY_KEY_MISMATCH".RetryContext,PriorCompletionStatus,StepGateOptions— exported inWorkflowTypes.
- 409 dispatch on step gate/complete — previously all 409 responses on
markStepCompletedfell through to a genericAxonFlowException(..., 409, "VERSION_CONFLICT"), conflating step idempotency conflicts with plan version conflicts. The step gate/complete call sites now inspect the 409 body and dispatch toIdempotencyKeyMismatchExceptionwhenerror.codematches, falling back to a genericAxonFlowExceptionotherwise. Plan update paths (which also use 409) are untouched.
StepGateResponse.isCached()andStepGateResponse.getDecisionSource()— marked@Deprecated. UsegetRetryContext().getGateCount() > 1andgetRetryContext().getPriorCompletionStatus()instead. Planned for removal in a future major version.
Companion to the platform change that introduces retry_context on
POST /api/v1/workflows/{workflow_id}/steps/{step_id}/gate. Additive only — existing
callers that never set idempotencyKey or pass StepGateOptions see no behavior
change. Binary-compatibility preserved: old StepGateRequest, StepGateResponse, and
MarkStepCompletedRequest constructors kept alongside new ones.
mapTimeoutfield onAxonFlowConfig— brings Java to parity with the TypeScript, Python, and Go SDKs (all three already had a separate MAP timeout). The sharedtimeout(default 60s) only covered single- request endpoints; MAP plans routinely take 60-120s because they chain multiple LLM calls end-to-end, and the global timeout was cutting them off. New constantDEFAULT_MAP_TIMEOUT = 120s, new builder methodAxonFlowConfig.builder().mapTimeout(Duration.ofSeconds(300)), and new environment variableAXONFLOW_MAP_TIMEOUT_SECONDS. All plan-lifecycle methods (generatePlan,executePlan,getPlanStatus,updatePlan,cancelPlan,resumePlan,rollbackPlan,getPlanVersions) now use a plan-specificOkHttpClientclone withcallTimeout/readTimeout/writeTimeoutset tomapTimeout. Shares connection pool + interceptors + dispatcher with the main client; only the timeout attributes differ. KeepmapTimeout≤ serverAXONFLOW_MAP_MAX_TIMEOUT_SECONDS(default 300s) ≤ front-door ALBidle_timeout.timeout_seconds(default 300s), or the connection is killed mid-stream.
- Execution boundary semantics —
retryPolicyfield onStepGateRequest(via builder:.retryPolicy("reevaluate")). Controls cached vs fresh evaluation for the same step boundary. - Step gate response metadata —
cached(boolean) anddecisionSource(String) fields onStepGateResponseviaisCached()andgetDecisionSource(). - Workflow checkpoints —
getCheckpoints(workflowId)lists step-gate checkpoints.resumeFromLastCheckpoint(workflowId)resumes from last checkpoint (Evaluation+).resumeFromCheckpoint(workflowId, checkpointId)resumes from a specific checkpoint (Enterprise). - Checkpoint types —
Checkpoint,CheckpointListResponse, andResumeFromCheckpointResponsewith Jackson deserialization. AxonFlow.explainDecision(decisionId)(+explainDecisionAsync) — fetches the full explanation for a previously-made policy decision viaGET /api/v1/decisions/:id/explain. Returns aDecisionExplanationwith matched policies, risk level, reason, override availability, existing override ID (if any), and a rolling-24h session hit count for the matched rule. Shape is frozen (future extra fields ignored via Jackson's@JsonIgnoreProperties(ignoreUnknown = true)); additive-only fields ensure forward compatibility.DecisionExplanation,ExplainPolicy,ExplainRule— new immutable DTOs incom.getaxonflow.sdk.types.AuditSearchRequest.Builder.decisionId,policyName,overrideId— three new optional filter fields onsearchAuditLogs. UsedecisionIdto gather every record tied to one decision;policyNameto find everything matched by a specific policy;overrideIdto reconstruct an override's full lifecycle.
Companion to platform v7.1.0. Works against plugin releases (OpenClaw v1.3.0+,
Claude Code v0.5.0+, Cursor v0.5.0+, Codex v0.4.0+) that surface the
DecisionExplanation shape. Audit filter fields pass through when unset;
server-side filtering activates on v7.1.0+ platforms.
AXONFLOW_TRY=1environment variable to connect totry.getaxonflow.comshared evaluation serverAxonFlowTry.register()helper for self-registering a tenant- Checkpoint telemetry reports
endpoint_type: "community-saas"when try mode is active
- Telemetry
endpoint_typefield. The anonymous telemetry ping now includes an SDK-derived classification of the configured AxonFlow endpoint as one oflocalhost,private_network,remote, orunknown. The raw URL is never sent and is not hashed. This helps distinguish self-hosted evaluation from real production deployments on the checkpoint dashboard. Opt out as before viaDO_NOT_TRACK=1orAXONFLOW_TELEMETRY=off. TelemetryReporter.classifyEndpoint(url)method andTelemetryReporter.EndpointTypeconstants exported publicly for applications that want to inspect the classification.
- Examples and documentation updated to reflect the new AxonFlow platform v6.2.0 defaults for
PII_ACTION(nowwarn— wasredact) and the newAXONFLOW_PROFILEenv var. No SDK API changes.
GovernedTooladapter — framework-agnostic tool governance wrapper. Wraps anyToolinterface with input/output policy enforcement (mcpCheckInputbefore execution,mcpCheckOutputafter). Factory:GovernedTool.wrap(tool, client), builder pattern, batch helper:GovernedTool.governTools(tools, client).checkToolInput()/checkToolOutput()— generic aliases for tool governance. ExistingmcpCheckInput()/mcpCheckOutput()remain supported. Async variants included.
- Anonymous telemetry is now enabled by default for all endpoints, including localhost/self-hosted evaluation. Opt out with
DO_NOT_TRACK=1orAXONFLOW_TELEMETRY=off.
X-Tenant-IDheader removed. The SDK no longer sendsX-Tenant-ID. The server derives tenant from OAuth2 Client Credentials (Basic auth). Requires platform v6.0.0+.getMaterialityClassification()method renamed. MAS FEATgetMateriality()renamed togetMaterialityClassification()to match server JSON fieldmateriality_classification.
Statusfield onPlanResponse. The server returns plan status (pending, executing, completed, failed, cancelled) which was previously not parsed by the SDK.
- MCP examples missing
client_idanduser_tokenin request body for enterprise MCP handler authentication.
simulatePolicies()/simulatePoliciesAsync()— dry-run all active policies against an input query. Returns allowed/blocked status, applied policies, risk score, and daily usage. Requires Evaluation tier or above.getPolicyImpactReport()/getPolicyImpactReportAsync()— test a single policy against multiple inputs and get aggregate match/block statistics.detectPolicyConflicts()/detectPolicyConflictsAsync()— analyze active policies for contradictions, shadows, and redundancies. Optionally filter to conflicts involving a specific policy.- Types in
com.getaxonflow.sdk.simulationpackage:SimulatePoliciesRequest,SimulatePoliciesResponse,SimulationDailyUsage,ImpactReportInput,ImpactReportRequest,ImpactReportResult,ImpactReportResponse,PolicyConflictRef,PolicyConflict,PolicyConflictResponse
- Hardened insecure TLS trust manager (
HttpClientFactory) to suppress CodeQLjava/insecure-trustmanageralert. The trust-allX509TrustManageris only activated when the user explicitly opts in viainsecureSkipVerify=trueinAxonFlowConfig. Addedlgtmsuppression comments, clarified intent in code comments, and enhanced the warning log message to explicitly discourage production use.
LangGraphAdapterclass — wraps LangGraph workflows with AxonFlow governance gates and per-tool policy enforcement. Includes:checkGate()/stepCompleted()— step-level governance at LangGraph node boundariescheckToolGate()/toolCompleted()— per-tool governance within tool_call nodes (each tool gets its own gate check)mcpToolInterceptor()— factory returning an interceptor enforcingmcpCheckInput → handler → mcpCheckOutputaround every MCP tool callwaitForApproval()— poll until a step is approved or rejectedstartWorkflow()/completeWorkflow()/abortWorkflow()/failWorkflow()— workflow lifecycle management- Builder pattern construction, implements
AutoCloseable
WorkflowBlockedErrorandWorkflowApprovalRequiredErrorexception classes- Builder-based option classes:
CheckGateOptions,StepCompletedOptions,CheckToolGateOptions,ToolCompletedOptions - MCP interceptor types:
MCPInterceptorOptions,MCPToolRequest,MCPToolHandler,MCPToolInterceptor getCircuitBreakerStatus()/getCircuitBreakerStatusAsync()— query active circuit breaker circuits and emergency stop stategetCircuitBreakerHistory(limit)/getCircuitBreakerHistoryAsync(limit)— retrieve circuit breaker trip/reset audit trailgetCircuitBreakerConfig(tenantId)/getCircuitBreakerConfigAsync(tenantId)— get effective circuit breaker config (global or tenant-specific)updateCircuitBreakerConfig(config)/updateCircuitBreakerConfigAsync(config)— update per-tenant circuit breaker thresholds
auditToolCall()— record non-LLM tool calls (API, MCP, function) in the audit trail. Returns audit ID, status, and timestamp. Requires Platform v5.1.0+getAuditLogsByTenant()— retrieve audit logs for a tenant with optional paginationsearchAuditLogs()— search audit logs with filters (client ID, request type, limit)
- Telemetry pings now suppressed for localhost/127.0.0.1/[::1] endpoints unless
telemetryEnabledis explicitly set totrue. Prevents telemetry noise during local development.
- Removed
totalStepsfromCreateWorkflowRequest. Requires Platform v4.5.0+ (recommended v5.0.0+). Total steps are auto-computed when the workflow reaches a terminal state. mcpCheckInput()defaultoperationchanged from"query"to"execute"(#104). Callers relying on the implicit"query"default must now passoperation("query")explicitly. The check-input endpoint is used by external orchestrators managing their own MCP execution, so"execute"(conservative) is the correct default over"query"(read-only).
- README install snippets updated from
3.2.0to4.0.0for Maven and Gradle
MediaAnalysisResult.getExtractedText() was replaced by hasExtractedText() + getExtractedTextLength()
in v3.5.0. This major version formally acknowledges that breaking change.
healthCheck()now returnscapabilitieslist andsdkCompatibilityinHealthStatushasCapability(name)method onHealthStatusto check if platform supports a specific featureSDK_VERSIONconstant onAxonFlowConfigfor programmatic SDK version access- User-Agent header corrected from
axonflow-java-sdk/1.0.0toaxonflow-sdk-java/{version} - Version mismatch warning logged when SDK version is below platform's
min_sdk_version PlatformCapabilityandSDKCompatibilitytypestraceIdfield onCreateWorkflowRequest,CreateWorkflowResponse,WorkflowStatusResponse, andListWorkflowsOptionsfor distributed tracing correlationToolContexttype for per-tool governance within workflow stepstoolContextfield onStepGateRequestfor tool-level policy enforcementlistWorkflows()now supportstraceIdfilter parameter- Anonymous runtime telemetry for version adoption tracking and feature usage signals
TelemetryEnabled/telemetryconfiguration option to explicitly control telemetryAXONFLOW_TELEMETRY=offandDO_NOT_TRACK=1environment variable opt-out support
- Default User-Agent was hardcoded to
1.0.0regardless of actual SDK version
- MCP Policy-Check Endpoints (Platform v4.6.0+): Standalone policy validation for external orchestrators (LangGraph, CrewAI) to enforce AxonFlow policies without executing connector queries
mcpCheckInput(connectorType, statement): Validate SQL/commands against input policies (SQLi detection, dangerous query blocking, PII in queries, dynamic policies). ReturnsMCPCheckInputResponsewithisAllowed()orgetBlockReason()mcpCheckOutput(connectorType, responseData): Validate MCP response data against output policies (PII redaction, exfiltration limits, dynamic policies). Returns original or redacted data withPolicyInfo- New types:
MCPCheckInputRequest,MCPCheckInputResponse,MCPCheckOutputRequest,MCPCheckOutputResponse - Sync + async variants with overloads for additional options (
parameters,operation) - Supports both query-style (
responseData) and execute-style (message+metadata) output validation
- Media governance configuration methods:
getMediaGovernanceConfig(),updateMediaGovernanceConfig(),getMediaGovernanceStatus() - Media governance types:
MediaGovernanceConfig,MediaGovernanceStatus - Media policy category constants:
CATEGORY_MEDIA_SAFETY,CATEGORY_MEDIA_BIOMETRIC,CATEGORY_MEDIA_PII,CATEGORY_MEDIA_DOCUMENT PolicyCategoryenum values:MEDIA_SAFETY,MEDIA_BIOMETRIC,MEDIA_PII,MEDIA_DOCUMENTMarkStepCompletedRequestnow accepts post-execution metrics (tokens_in,tokens_out,cost_usd)
- Media Governance Types:
MediaContent,MediaAnalysisResult,MediaAnalysisResponsefor multimodal image governance - Media support in
proxyLLMCall(): Pass images (base64 or URL) viaClientRequest.Builder.media()for governance analysis before LLM routing
- Response cache skipped for media requests: Requests containing media bypass the response cache (binary content makes cache keys unreliable)
MediaAnalysisResult.getExtractedText()replaced byisHasExtractedText()(boolean) andgetExtractedTextLength()(int). Raw extracted text is no longer exposed in API responses.
- failWorkflow() (#1187): Fail a workflow with optional reason
failWorkflow(workflowId, reason)+ async variant + overload without reason- Sends
POST /api/v1/workflows/{id}/fail
- HITL Queue API (Enterprise): Human-in-the-loop approval queue management
listHITLQueue(opts): list pending approvals with filteringgetHITLRequest(requestId): get approval detailsapproveHITLRequest(requestId, review): approve a requestrejectHITLRequest(requestId, review): reject a requestgetHITLStats(): dashboard statistics- New types:
HITLApprovalRequest,HITLQueueListOptions,HITLQueueListResponse,HITLReviewInput,HITLStats
listUnifiedExecutionsdeserialization: Fixed Jackson deserialization failure onUnifiedListExecutionsResponse. Added@JsonCreatorand@JsonPropertyannotations to constructor. Without this,listUnifiedExecutions()threw "no Creators, like default constructor, exist" error.- SSE streaming endpoint path:
streamExecutionStatus()now uses correct/api/v1/unified/executions/{id}/streampath (was incorrectly pointing to/api/v1/executions/{id}/streamwhich is the Execution Replay API)
-
WCP Approval Gates (Issue #1169): HITL approval and rejection for workflow steps
approveStep(workflowId, stepId)- Approve a pending workflow steprejectStep(workflowId, stepId, reason)- Reject a step with reason (backward-compatible overload without reason preserved)rejectStepAsync(workflowId, stepId, reason)- Async variant with reasongetPendingApprovals(limit)- List steps awaiting human approval
-
MAP Plan Cancellation (Issue #1072): Cancel running multi-agent plans
cancelPlan(planId, reason)- Cancel a plan with optional reason
-
MAP Plan Update (Issue #1072): Modify plan configuration before or during execution
updatePlan(planId, request)- Update execution mode, domain, or version
-
MAP Plan Versioning and Rollback (Issue #1072): Version history and rollback support
getPlanVersions(planId)- List plan version historyrollbackPlan(planId, version)- Rollback to a previous version (throws on 409 conflict)- New types:
RollbackPlanResponse,PlanVersion
-
Webhook Subscriptions (Issue #1169): Event notification management
createWebhook(request)- Create a webhook subscriptionlistWebhooks()- List active webhook subscriptionsgetWebhook(webhookId)- Get webhook detailsupdateWebhook(webhookId, request)- Update webhook configurationdeleteWebhook(webhookId)- Delete a webhook subscription- New type:
WebhookSubscription
-
Unified Execution Cancellation (EPIC #1074): Cancel running executions across both MAP and WCP subsystems
cancelExecution(executionId, reason)- Cancel a unified execution viaPOST /api/v1/unified/executions/{id}/cancel- Overloaded
cancelExecution(executionId)variant without reason parameter - Propagates to MAP
cancelPlan()or WCPabortWorkflow()based on execution type
executePlanstatus hardcoded:executePlan()always returnedstatus: "completed"regardless of actual server response. Now reads status from response (data.status>metadata.status> default), correctly surfacingawaiting_approvalfor WCP confirm mode.- Unified execution API URLs (EPIC #1074):
getExecutionStatus()andlistUnifiedExecutions()now use correct/api/v1/unified/executionspath (was incorrectly pointing to/api/v1/executionswhich is the Execution Replay API) rejectStepreason parameter: Addedreasonparameter torejectStep()andrejectStepAsync()with backward-compatible 2-arg overloads
- Dynamic policy tier support:
tier(PolicyTier) andorganizationIdfields onCreateDynamicPolicyRequest,UpdateDynamicPolicyRequest, andDynamicPolicyresponse. Defaults toPolicyTier.TENANTwhen not specified. Builder:.tier(PolicyTier.ORGANIZATION).organizationId("org-123"). ListDynamicPoliciesOptionsfilters: Filter dynamic policies bytierandorganizationId, matchingListStaticPoliciesOptionsparity.
- Simplified internal endpoint handling by removing legacy helper names
getPortalUrl()andgetOrchestratorUrl(). - Internal request URL construction is now standardized on
config.getEndpoint(). - No public API change.
- Removed
executeQuery(): UseproxyLLMCall()instead (deprecated since v2.7.0). Removed both sync and async (executeQueryAsync) variants.
isRedacted()verification: VerifiedMCPExecuteResponse.isRedacted()works correctly for execute responses with PII redaction
- Updated all internal references, Javadoc examples, and tests from
executeQuerytoproxyLLMCall
- Gateway Mode smart defaults:
getPolicyApprovedContext()andauditLLMCall()now use"community"as default clientId when not configured, enabling zero-config usage for community/self-hosted deployments
- PolicyCategory enum: Added
PII_SINGAPORE("pii-singapore")value for Singapore PII detection policies (NRIC, FIN, UEN patterns) - proxyLLMCall clientId auto-injection: Auto-populate
clientIdfrom config when not explicitly set inClientRequest, matching Go/Python/TypeScript SDK behavior
-
Unified Execution Tracking (Issue #1075 - EPIC #1074): Consistent status tracking for MAP plans and WCP workflows
getExecutionStatus(executionId)- Get unified execution status by IDlistUnifiedExecutions(request)- List executions with type/status filtersExecutionTypes.ExecutionStatusclass with unified fields for both MAP and WCP executionsExecutionTypes.ExecutionTypeenum:MAP_PLAN,WCP_WORKFLOWExecutionTypes.ExecutionStatusValueenum:PENDING,RUNNING,COMPLETED,FAILED,CANCELLED,ABORTED,EXPIREDExecutionTypes.StepStatusValueenum:PENDING,RUNNING,COMPLETED,FAILED,SKIPPED,BLOCKED,APPROVALExecutionTypes.UnifiedStepTypeenum:LLM_CALL,TOOL_CALL,CONNECTOR_CALL,HUMAN_TASK,SYNTHESIS,ACTION,GATEExecutionTypes.UnifiedStepStatusclass 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
- Materiality Classification: High (sum≥12), Medium (sum≥8), Low (sum<8)
- FEAT Assessments:
masfeat().createAssessment(),masfeat().getAssessment(),masfeat().updateAssessment(),masfeat().listAssessments(),masfeat().submitAssessment(),masfeat().approveAssessment(),masfeat().rejectAssessment() - Assessment Lifecycle: pending → in_progress → completed → approved/rejected
- Kill Switch:
masfeat().getKillSwitch(),masfeat().configureKillSwitch(),masfeat().checkKillSwitch(),masfeat().triggerKillSwitch(),masfeat().restoreKillSwitch(),masfeat().enableKillSwitch(),masfeat().disableKillSwitch(),masfeat().getKillSwitchHistory() - Automatic model shutdown based on accuracy, bias, and error rate thresholds
- New types:
AISystemRegistry,AISystemUseCase,MaterialityClassification,SystemStatus,FEATAssessment,FEATAssessmentStatus,FEATPillar,KillSwitch,KillSwitchStatus,KillSwitchEvent,KillSwitchEventType,RegistrySummary
- AI System Registry:
-
proxyLLMCall(): New primary method for Proxy Mode with improved documentation
- Clearly describes Proxy Mode behavior (AxonFlow makes the LLM call on your behalf)
- Documents when to use Proxy Mode vs Gateway Mode
- Both sync (
proxyLLMCall) and async (proxyLLMCallAsync) variants
-
BudgetInfo:
QueryResponse.getBudgetInfo()for budget enforcement (HTTP 402)
- executeQuery(): Deprecated in favor of proxyLLMCall()
- Marked with
@Deprecatedannotation - Will be removed in v3.0.0
- Logs deprecation warning in debug mode
- Remains functional as a wrapper around proxyLLMCall()
- Marked with
- Workflow Policy Enforcement (Issues #1019, #1020, #1021): Policy transparency for workflow operations
StepGateResponsenow includesgetPoliciesEvaluated()andgetPoliciesMatched()methods withPolicyMatchtypePolicyMatchclass withgetPolicyId(),getPolicyName(),getAction(),getReason()for policy transparencyPolicyEvaluationResultclass for MAP execution withisAllowed(),getAppliedPolicies(),getRiskScore()- Workflow operations (
workflow_created,workflow_step_gate,workflow_completed) logged to audit trail
- Workflow Control Plane (Issue #834): Governance gates for external orchestrators
- "LangChain runs the workflow. AxonFlow decides when it's allowed to move forward."
createWorkflow()- Register workflows from LangChain/LangGraph/CrewAI/externalstepGate()- Check if step is allowed to proceed (allow/block/require_approval)markStepCompleted()- Mark a step as completed with optional output datagetWorkflow()- Get workflow status and step historylistWorkflows()- List workflows with filters (status, source, pagination)completeWorkflow()- Mark workflow as completedabortWorkflow()- Abort workflow with reasonresumeWorkflow()- Resume after approval- New types:
WorkflowStatus,WorkflowSource,GateDecision,StepType,ApprovalStatus,MarkStepCompletedRequest - Helper methods on
StepGateResponse:isAllowed(),isBlocked(),requiresApproval() - Helper methods on
WorkflowStatusandWorkflowStatusResponse:isTerminal()
-
MCP Exfiltration Detection (Issue #966):
ConnectorPolicyInfonow includesgetExfiltrationCheck()with row/volume limit informationExfiltrationCheckInfotype withgetRowsReturned(),getRowLimit(),getBytesReturned(),getByteLimit(),isWithinLimits()methods- Prevents large-scale data extraction via MCP queries
- Configurable via
MCP_MAX_ROWS_PER_QUERYandMCP_MAX_BYTES_PER_QUERYenvironment variables
-
MCP Dynamic Policies (Issue #968):
ConnectorPolicyInfonow includesgetDynamicPolicyInfo()for Orchestrator-evaluated policiesDynamicPolicyInfotype withgetPoliciesEvaluated(),getMatchedPolicies(),isOrchestratorReachable(),getProcessingTimeMs()DynamicPolicyMatchtype withgetPolicyId(),getPolicyName(),getPolicyType(),getAction(),getReason()- Supports rate limiting, budget controls, time-based access, and role-based access policies
- Optional feature - enable via
MCP_DYNAMIC_POLICIES_ENABLED=true
-
MCP Policy Enforcement Response Fields:
mcpQuery()andmcpExecute()now return policy enforcement metadataisRedacted()- Whether any fields were redacted by PII policiesgetRedactedFields()- JSON paths of redacted fields (e.g.,rows[0].ssn)getPolicyInfo()- Full policy evaluation metadata
-
PolicyInfo types: New types for policy enforcement metadata
ConnectorPolicyInfo- ContainsgetPoliciesEvaluated(),isBlocked(),getBlockReason(),getRedactionsApplied(),getProcessingTimeMs(),getMatchedPolicies()PolicyMatchInfo- Details of matched policies includinggetPolicyId(),getPolicyName(),getCategory(),getSeverity(),getAction()
-
OAuth2-style client credentials: New
clientId()andclientSecret()builder methods following OAuth2 client credentials pattern.clientIdis used for request identification (required for most API calls)clientSecretis optional - community/self-hosted deployments work without it
-
Enterprise: Close PR (
closePR): Close a PR without merging and optionally delete the branch- Useful for cleaning up test/demo PRs created by code governance examples
- Supports all Git providers: GitHub, GitLab, Bitbucket
- Requires enterprise portal authentication
- Simplified authentication: For community mode, simply provide
clientIdfor request identification. NoclientSecretneeded.
// Community mode - no secret needed
AxonFlowClient client = AxonFlowClient.builder()
.endpoint("http://localhost:8080")
.clientId("my-app") // Used for request identification
.build();- getPlanStatus endpoint: Fixed endpoint path from
/api/v1/orchestrator/plan/{id}to/api/v1/plan/{id}to match agent proxy routes
- OAuth2 Basic auth:
Authorization: Basic base64(clientId:clientSecret)replacesX-License-Keyheader - Removed
licenseKey()builder method (useclientId()/clientSecret())
-
Gateway Mode clientId not sent in request body: Fixed
getPolicyApprovedContext()to auto-populateclient_idin request body from config when not explicitly provided- Server requires
client_idin JSON body for/api/policy/pre-checkendpoint - Previously only sent as header (X-Client-ID), causing "client_id field is required" errors
- Now matches Go SDK behavior which auto-populates from
config.ClientID - Affects all Gateway Mode pre-check calls
- Server requires
-
executePlan() using non-existent endpoint: Fixed
executePlan()to use correct Agent API endpoint- Changed from
/api/v1/orchestrator/plan/{planId}/execute(404) to/api/requestwithrequest_type: "execute-plan" - Now matches Go SDK pattern for plan execution
- Fixes MAP (Multi-Agent Planning) two-step execution flow
- Changed from
- Null Policies List Handling: Fixed
NullPointerExceptionin list-returning policy methods when API returns null instead of empty array- Affected methods:
listDynamicPolicies(),getEffectiveDynamicPolicies(),listStaticPolicies(),getEffectiveStaticPolicies() - Added explicit null check for wrapper and list fields before returning
- Returns empty list when wrapper or list field is null
- Affected methods:
- Sensitive Data Category: Added
SENSITIVE_DATAtoPolicyCategoryenum for policies that returnsensitive-datacategory - Provider Restrictions for Compliance: Support for
allowed_providersin dynamic policy action config- Specify allowed providers via
DynamicPolicyActionwithconfig.put("allowed_providers", List.of(...)) - Enables GDPR, HIPAA, and RBI compliance by restricting LLM routing to specific providers
- Example:
new DynamicPolicyAction("route", Map.of("allowed_providers", List.of("ollama", "azure-eu")))
- Specify allowed providers via
- Category field: Added
categoryfield toCreateDynamicPolicyRequestandUpdateDynamicPolicyRequest - Dynamic Policy Response Wrappers: Added
DynamicPoliciesResponseandDynamicPolicyResponsewrapper types
- toggleDynamicPolicy HTTP Method: Changed from PATCH to PUT to match API specification
- Dynamic Policy Response Parsing: Fixed all dynamic policy methods to correctly parse wrapped API responses (Issue #886)
- Agent proxy returns
{"policies": [...]}and{"policy": {...}}wrappers - Updated
listDynamicPolicies,getDynamicPolicy,createDynamicPolicy,updateDynamicPolicy,toggleDynamicPolicy,getEffectiveDynamicPolicies
- Agent proxy returns
- X-Tenant-ID Header for Orchestrator Requests: Fixed missing X-Tenant-ID header in orchestrator API calls
- Added
addTenantIdHeader()call tobuildOrchestratorRequest()method - Ensures tenant identification works in community/self-hosted mode without full credentials
- Added
- BREAKING: Renamed
agentUrltoendpointinAxonFlowConfig.Builder - BREAKING: Removed
orchestratorUrlandportalUrlconfig options (Agent now proxies all routes) - BREAKING: Dynamic policy API path changed from
/api/v1/policies/dynamicto/api/v1/dynamic-policies
- Audit Log Reading: Added
searchAuditLogs()for searching audit logs with filters (user email, client ID, time range, request type) - Tenant Audit Logs: Added
getAuditLogsByTenant()for retrieving audit logs scoped to a specific tenant - Audit Types: Added
AuditLogEntry,AuditSearchRequest,AuditQueryOptions, andAuditSearchResponsetypes - PII Redaction Support: Added
isRequiresRedaction()method toPolicyApprovalResult(Issue #891)- When
true, PII was detected with redact action and response should be processed for redaction - Supports new detection defaults: PII defaults to redact instead of block
- When
- All SDK methods now route through single Agent endpoint
- Simplified configuration - only
endpoint()builder method needed - Removed
getOrchestratorUrl()andgetPortalUrl()config methods (now return endpoint directly) - Added
@Deprecatedannotation onagentUrl()builder method for backwards compatibility
Before (v1.x):
AxonFlowConfig config = AxonFlowConfig.builder()
.agentUrl("http://localhost:8080")
.orchestratorUrl("http://localhost:8081")
.portalUrl("http://localhost:8082")
.clientId("my-client")
.clientSecret("my-secret")
.build();After (v2.x):
AxonFlowConfig config = AxonFlowConfig.builder()
.endpoint("http://localhost:8080")
.clientId("my-client")
.clientSecret("my-secret")
.build();- Portal Authentication: Added
loginToPortal()andlogoutFromPortal()for session-based authentication - Portal URL Configuration: New
portalUrlconfig option for Code Governance portal endpoints - CSV Export: Added
exportCodeGovernanceDataCsv()for CSV format exports
- Code Governance Authentication: Changed Code Governance methods to use portal session-based auth instead of API key auth
- Get Connector:
getConnector(id)to retrieve details for a specific connector - Connector Health Check:
getConnectorHealth(id)to check health status of an installed connector - ConnectorHealthStatus type: New type for connector health responses
- Orchestrator Health Check:
orchestratorHealthCheck()to verify Orchestrator service health - Uninstall Connector:
uninstallConnector()to remove installed MCP connectors
- Connector API Endpoints: Fixed endpoints to use Orchestrator (port 8081) instead of Agent
listConnectors()- Changed from Agent/api/connectorsto Orchestrator/api/v1/connectorsinstallConnector()- Fixed path to/api/v1/connectors/{id}/install
- Dynamic Policies Endpoint: Changed from Agent
/api/v1/policiesto Orchestrator/api/v1/policies/dynamic
-
Execution Replay API: Debug governed workflows with step-by-step state capture
listExecutions()- List executions with filtering (status, time range)getExecution()- Get execution with all step snapshotsgetExecutionSteps()- Get individual step snapshotsgetExecutionTimeline()- Timeline view for visualizationexportExecution()- Export for compliance/archivaldeleteExecution()- Delete execution records
-
Cost Controls: Budget management and LLM usage tracking
createBudget()/getBudget()/listBudgets()- Budget CRUDupdateBudget()/deleteBudget()- Budget managementgetBudgetStatus()- Check current budget usagecheckBudget()- Pre-request budget validationrecordUsage()- Record LLM token usagegetUsageSummary()- Usage analytics and reporting
- Gateway Mode Community Fix: Removed client-side credential validation from Gateway Mode methods
getPolicyApprovedContext()andauditLLMCall()now work without credentials in community/self-hosted deployments- Server decides auth requirements based on
DEPLOYMENT_MODE - Matches TypeScript SDK v1.11.1 behavior
- Community Mode: Credentials are now optional for self-hosted/community deployments
- SDK can be initialized without
licenseKeyorclientId/clientSecretfor community features executeQuery()andhealthCheck()work without credentials- Auth headers are only sent when credentials are configured
- SDK can be initialized without
hasCredentials()method inAxonFlowConfigto check if credentials are configuredrequireCredentials()helper for enterprise feature validation
- Fixed
PolicyOverrideJSON field mappings (action_override,override_reason) - Fixed
listPolicyOverrides()endpoint path and response parsing - Fixed
getStaticPolicyVersions()response parsing
Note: v1.7.0 on Maven Central does not include community mode. Use v1.8.0 instead.
-
Enterprise Policy Features:
organizationId()builder method inCreateStaticPolicyRequestfor organization-tier policiesorganizationId()builder method inListStaticPoliciesOptionsfor filtering by organizationlistPolicyOverrides()method to list all active policy overrides
-
Convenience Methods:
listStaticPolicies(PolicyTier tier, String organizationId)- filter by tier and organizationlistStaticPolicies(PolicyTier tier, PolicyCategory category)- filter by tier and categorylistStaticPolicies(PolicyCategory category)- filter by categorygetEffectiveStaticPolicies(PolicyCategory category)- filter effective policies by category
-
Code Governance Metrics & Export APIs (Enterprise): Compliance reporting for AI-generated code
getCodeGovernanceMetrics()- Returns aggregated statistics (PR counts, file totals, security findings)exportCodeGovernanceData()- Exports PR records as JSON for auditorsexportCodeGovernanceDataCSV()- Exports PR records as CSV
-
New Types:
CodeGovernanceMetrics,ExportOptions,ExportResponse
-
Code Governance Git Provider APIs (Enterprise): Create PRs from LLM-generated code
validateGitProvider()- Validate credentials before savingconfigureGitProvider()- Configure GitHub, GitLab, or BitbucketlistGitProviders()- List configured providersdeleteGitProvider()- Remove a providercreatePR()- Create PR from generated code with audit traillistPRs()- List PRs with filteringgetPR()- Get PR detailssyncPRStatus()- Sync status from Git provider
-
New Types:
GitProviderType,FileAction,CodeFile,CreatePRRequest,CreatePRResponse,PRRecord,ListPRsOptions,ListPRsResponse -
Supported Git Providers:
- GitHub (Cloud and Enterprise Server)
- GitLab (Cloud and Self-Managed)
- Bitbucket (Cloud and Server/Data Center)
- MCP Connector Queries: Fixed endpoint mismatch causing 404 errors
- Changed
queryConnector()to use/api/requestwithrequest_type: "mcp-query"(matches Go and TypeScript SDKs) - Previously used non-existent
/api/v1/connectors/queryendpoint - MCP connector examples now work correctly with configured connectors
- Changed
-
HITL Support:
PolicyAction.REQUIRE_APPROVALfor human oversight policies- Use with
createStaticPolicy()to trigger approval workflows - Enterprise: Full HITL queue integration
- Community: Auto-approves immediately
- Use with
-
Code Governance:
CodeArtifacttype for LLM-generated code detection- Language and code type identification
- Potential secrets and unsafe pattern detection
-
Policy CRUD Methods: Full policy management support for Unified Policy Architecture v2.0.0
listStaticPolicies()- List policies with filteringgetStaticPolicy()- Get single policy by IDcreateStaticPolicy()- Create custom policyupdateStaticPolicy()- Update existing policydeleteStaticPolicy()- Delete policytoggleStaticPolicy()- Enable/disable policygetEffectiveStaticPolicies()- Get merged hierarchytestPattern()- Test regex pattern
-
Policy Override Methods (Enterprise)
-
Dynamic Policy Methods
-
New Types:
StaticPolicy,DynamicPolicy,PolicyOverride
- Java 11 Compatibility - Fixed compilation error on Java 11
- Replaced
Stream.toList()(Java 16+) withCollectors.toList()(Java 8+) - MAP plan parsing now works correctly on all supported Java versions (11, 17, 21)
- Replaced
- MAP Endpoint - Fixed
generatePlan()to use correct Agent API endpoint- Changed from
/api/v1/orchestrator/planto/api/requestwithrequest_type: "multi-agent-plan" - Added proper response parsing for Agent API format
- Fixed null-safety issues with request context
- Changed from
- LLM Interceptors - Transparent governance for LLM API calls (#1)
OpenAIInterceptorfor OpenAI API interceptionAnthropicInterceptorfor Anthropic API interceptionGeminiInterceptorfor Google Generative AI interception- Policy enforcement and audit logging for all providers
- Full feature parity with other SDKs for LLM interceptors
- Self-Hosted Zero-Config Tests - Auth header verification for localhost (#2)
- Tests verify auth headers are skipped for localhost endpoints
- Initial release of AxonFlow Java SDK
- Core client with
executeQuery()for governed AI calls - Policy enforcement with
PolicyViolationException - Gateway Mode support
getPolicyApprovedContext()for pre-checksauditLLMCall()for compliance logging
- Multi-Agent Planning
generatePlan()for creating execution plansexecutePlan()for running plansgetPlanStatus()for checking plan status
- MCP Connectors
listConnectors()for available connectorsinstallConnector()for connector installationqueryConnector()for connector queries
- Comprehensive type definitions with Jackson
- Retry logic with exponential backoff (OkHttp)
- Response caching with Caffeine
- Self-hosted mode for localhost deployments
- Java 11+ compatibility
- Maven Central publishing support