All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.15.0 - 2026-08-21
Correctness and supply-chain hygiene. No protocol or public API changes: the ACP surface is identical to 0.14.0, so this is a drop-in upgrade.
- Notification ordering. Incoming notifications were dispatched as independent
fire-and-forget subscriptions, so a handler doing any async work could observe them out of
order — visible with agents that stream many rapid
session/updatechunks. They are now serialized through a sink drained byconcatMap, preserving arrival order. Reported and fixed by @ljiro (#13, closes #11). - Notifications lost on graceful close. Following from the above,
closeGracefully()completed the notification sink and disposed the drain subscription in the same synchronous block, discarding anything still queued. BecauseAcpClient.SyncSpecwraps every syncsessionUpdateConsumerwithsubscribeOn(SYNC_HANDLER_SCHEDULER), sync clients always have async handlers, so a rapid burst could be lost entirely on close.closeGracefully()now waits for the drain to terminate before tearing the session down, bounded by the session'srequestTimeoutso a handler that never completes cannot hang shutdown.close()still interrupts immediately — the two methods now differ, as their names imply. - Notifications arriving after shutdown has begun are still dropped — a graceful shutdown stops accepting new work while draining what is queued, and JSON-RPC notifications carry no delivery guarantee — but the log severity now distinguishes that expected case (DEBUG) from overflow, zero-subscriber and non-serialized emission, which lose traffic on a live session (ERROR).
- Jackson 2.21.2 → 2.21.5 and Jetty 12.0.14 → 12.0.37, clearing 17 known advisories
(5 high severity) reported against the published dependency closure. Both reach consumers as
compile-scope transitives of
acp-coreandacp-websocket-jetty.
LICENSEis now the verbatim Apache License 2.0. The previous file was a paraphrase: it omitted section 6 (Trademarks) entirely, renumbered the sections that follow, rewrote the section 2 copyright grant, and narrowed theLicensorandWorkdefinitions. Automated license detection classified the repository asNOASSERTIONwhile every published POM declared Apache-2.0.LICENSEand a newNOTICEare now packaged underMETA-INFin every module artifact.- Removed a redundant
<repositories>declaration from the published parent POM; consumers no longer inherit a repository definition with snapshots enabled.
- Integration tests now execute. Three
*ITclasses existed, but Surefire's default includes do not match*ITand no Failsafe plugin was configured, somvn verifysilently skipped them. - All GitHub Actions are pinned to commit SHAs.
HandlerExceptionTestno longer races the async dispatch with a fixed sleep.
Protocol currency: catching up to ACP spec v0.13.6 (June 2026). Supersedes the never-published 0.13.0 (its content ships here).
logoutmethod (AcpAsyncClient/AcpSyncClient.logout,@Logout, agent handler) — clears stored credentials.session/deletemethod (deleteSession,@DeleteSession, agent handler) — permanently deletes a stored session; gated on thesessionCapabilities.deletecapability.additionalDirectoriesonsession/new,session/load,session/resume,session/forkrequests and onSessionInfo— extra workspace roots beyondcwd.- Per-chunk
messageIdonAgentMessageChunk,AgentThoughtChunk,UserMessageChunk, plussendMessage(text, messageId)/sendThought(text, messageId)convenience overloads onPromptContextandSyncPromptContext. - Provider configuration methods (
providers/list,providers/set,providers/disable), marked@UnstableAcpApi: client methodslistProviders/setProvider/disableProvider, agent handlers +@ListProviders/@SetProvider/@DisableProvider, theProviderInfo/ProviderCurrentConfig/ProvidersCapabilitiestypes, and aproviderscapability onAgentCapabilitiessurfaced viaNegotiatedCapabilities.supportsProviders(). sessionCapabilities.deleteandsessionCapabilities.additionalDirectories, surfaced viaNegotiatedCapabilities(supports*/require*).
- Promoted the session config-option API to stable: removed
@UnstableAcpApifromSetSessionConfigOptionRequest/SetSessionConfigOptionResponse,SessionConfigOption,SessionConfigSelect,SessionConfigSelectOption,ConfigOptionUpdate, and@SetSessionConfigOption—session/set_config_optionandsession/set_modeare now in the stable ACP schema. Thebooleanconfig-option variant (SessionConfigBoolean) remains an unstable SDK extension. - Aligned Jackson to 2.21.2 (matches the agentworks-bom managed set / Spring Boot's jackson-bom).
- WebSocket transport maximum message size increased to 4 MB.
- The session-model API —
session/set_model(setSessionModel,@SetSessionModel, handler),SetSessionModelRequest/SetSessionModelResponse,SessionModelState,ModelInfo, and themodelsfield on the new/load/resume/fork session responses — is deprecated for removal. The spec removed it (June 2026, v0.13.5); expose model selection throughsession/set_config_optionwith a config option whosecategoryis"model"instead. Scheduled for removal in a future release.
- WebSocket client transport no longer echoes agent requests back to the agent.
0.9.0 - 2026-02-XX
- Pure Java implementation of Agent Client Protocol (ACP) specification
AcpSchema— complete protocol type definitions (sealed interfaces and records)AcpSyncClient— synchronous blocking clientAcpAsyncClient— reactive async client with Project ReactorAcpClientSession— low-level client session implementationStdioAcpClientTransport— stdio transport for launching agents as subprocessesWebSocketAcpClientTransport— JDK-native WebSocket client transport (no extra dependencies)AgentParameters— process configuration builder for agent launch
AcpSyncAgent— synchronous agent with blocking handlersAcpAsyncAgent— reactive agent withMono-returning handlersStdioAcpAgentTransport— stdio transport for agentsSyncPromptContext— convenience API for sending messages, reading files, requesting permissions- All handler types: initialize, newSession, loadSession, prompt, setSessionMode, setSessionModel, cancel
@AcpAgent— class-level agent annotation with name/version@Initialize,@NewSession,@LoadSession,@Prompt,@Cancel— handler annotations@SetSessionMode,@SetSessionModel— session configuration annotations@SessionId,@SessionState— parameter annotationsAcpAgentSupport— bootstrap and builder for annotation-based agents- Flexible method signatures with automatic parameter resolution
- Auto-conversion of return values (
String→PromptResponse,void→endTurn()) - Interceptor support for cross-cutting concerns
- Custom argument resolvers and return value handlers
NegotiatedCapabilities— capability negotiation between client and agent- Client capabilities: file read/write, terminal execution, permission requests
- Agent capabilities: load session, image content, slash commands
require*()methods that throwAcpCapabilityExceptionif unsupported
AcpProtocolException— structured JSON-RPC errors with codesAcpCapabilityException— capability not supportedAcpConnectionException— transport-level failures- Standard error codes via
AcpErrorCodes
- Stdio transport (client and agent)
- WebSocket client transport (JDK-native)
- WebSocket agent transport (Jetty-based,
acp-websocket-jettymodule) - In-memory transport pair for testing (
acp-testmodule)
InMemoryTransportPair— bidirectional in-memory transport for unit testsMockAcpClient— mock client builder with file content fixtures- Fast, deterministic testing without subprocess I/O
- Full SessionUpdate types: AgentMessageChunk, AgentThoughtChunk, ToolCall, ToolCallUpdateNotification, Plan, AvailableCommandsUpdate, CurrentModeUpdate
- MCP server configuration in session requests
_metaextensibility on all protocol messages- All StopReason values: END_TURN, MAX_TOKENS, REFUSAL, CANCELLED
- Maven Central Portal publishing configuration
- CI workflow with GitHub Actions
- 258 unit tests
- Integration tests with Gemini CLI
- Java 17 (LTS)
- Project Reactor 2023.0.12
- Jackson 2.18.2
- MCP JSON utilities 0.15.0-SNAPSHOT
- SLF4J 2.0.16