@a2a-wrapper/core changelog
Release notes for @a2a-wrapper/core.
This page is generated from
packages/core/CHANGELOG.mdand stays in sync with the repository.
2.1.1
Patch Changes
- 4e2bd82: No code changes. A prior release run published every package's exact
target version under the
canarynpm dist-tag instead oflatest(thecanaryjob's snapshot step no-ops when there are no pending changesets, which was the case immediately after that Version Packages PR merged — see the canary-job fix in a preceding commit). Since npm never allows republishing an already-used version string, the only way to get alatest-tagged release out is a fresh patch bump.
2.1.0
Major Changes
-
d6c2701: Add native A2A protocol v1.0 support, built on
@a2a-js/[email protected], while preserving full backward compatibility with A2A v0.3.x clients.@a2a-wrapper/core(breaking):buildAgentCard()now produces the native v1.0AgentCardshape (supportedInterfaces[]instead ofurl/additionalInterfaces/protocolVersion;capabilities.extendedAgentCardinstead ofsupportsAuthenticatedExtendedCard;stateTransitionHistoryremoved). Callers reading the old v0.3 fields directly off the return value must update — the server itself still serves a fully v0.3-shaped card to legacy clients (see below).createA2AServer()'s JSON-RPC/REST transports and the/.well-known/agent-card.jsonroute now negotiate protocol version per-request via theA2A-Versionheader:1.0/absent-with-recent-header gets the native v1.0 card and wire shapes, while0.3/no-header-at-all (matching the SDK's own default) gets a fully v0.3-shaped card and JSON-RPC/REST translation via@a2a-js/sdk'scompat/v0_3layer.ServerOptions.protocolVersiondefault changed from"0.3"to"1.0".- New
ServerOptions.onListeninghook andServerOptions.agentCardSigningoption (Signed Agent Cards, RFC 7515 JWS, opt-in viaAgentCardConfig.signingor the programmatic option). - New
extractUserText(message)export centralizing inboundPartparsing for the v1.0 proto-oneofPartshape. TaskStateis now re-exported as a value (real numeric enum in v1.0, was a string-literal type in v0.3).@a2a-js/sdkpeer/dev dependency bumped to^1.0.0.
Wrapper packages (
a2a-claude,a2a-codex,a2a-copilot,a2a-opencode,a2a-antigravity):- Each wrapper's
createA2AServer()public API is unchanged, but is now a thin delegate to@a2a-wrapper/core'screateA2AServerinstead of duplicating Express/SDK server wiring — restoring the "A2A protocol code lives only in core" design. a2a-copilotanda2a-opencodeno longer ship their own localevent-publisher.ts; both now use@a2a-wrapper/core's (v1.0-aware) event publisher.@a2a-js/sdkdependency bumped to^1.0.0(previously an inconsistent mix of^0.3.9/^0.3.13).
Minor Changes
-
f3c7062: Handle Claude rate limit events instead of failing the turn generically.
Rate-limit signals were previously unrecognised:
rate_limit_event,system/api_retry, and assistantrate_limiterrors all fell through to a debug log, and the turn surfaced asfailedwith"Error during execution."A rejection now ends the turn immediately with an
input-requiredstatus naming the limit type and reset time, plus structured metadata (reason,rateLimitType,resetsAt,resetsAtIso,utilization, anderrorCode/canPurchaseCreditswhen the SDK reports them). The task stays non-terminal, so the client continues the same conversation on the same task once the limit resets. Configurable viarateLimit.taskStatefor clients that require a terminal state.This does not shorten the SDK's own retry behaviour: a
system/api_retryis deliberately treated as a warning that does not end the turn, so the SDK's internal retries still run to exhaustion inside the sametimeouts.promptwindow. The turn ends only once the SDK gives up and emits an assistantrate_limiterror. Those retries are at least visible now, asrate_limitsideband events withaction: "retrying"carrying the SDK'sattempt,maxRetries, anddelayMs.A rejection whose overage window is still open is treated as a warning rather than a rejection, since the request may proceed on overage credits; if it does not, the assistant
rate_limiterror still ends the turn. Limit details are never fabricated — a limit type or reset time is inherited by a later signal only from a snapshot that reported pressure, utilization is never inherited, and a reset time that is not in the future is dropped.Adds a
rate_limitsideband event type to@a2a-wrapper/core, gated byfeatures.emitRateLimitEvents. -
41e2d82: Hold the A2A Task open while Claude has background work in flight.
A Task used to reach a terminal state as soon as Claude's first turn ended — even when that turn had just started a background process and said it was waiting on the result. A2A gives an agent no way to open a new turn against a terminal Task, so the follow-up report had nowhere to land.
The Task now stays in
workingfor as long as Claude reports background work running, and completes only once a turn ends with nothing left. Each turn publishes its ownresponseartifact and a non-finalworkingstatus update whosemetadata.backgroundTaskslists what is still in flight. Chains of any length work this way, as rounds of one Task rather than several Tasks.Controlled by
features.holdTaskForBackgroundWork(defaulttrue; setfalsefor the old complete-at-first-result behavior) andfeatures.emitBackgroundTaskEvents(defaulttrue), which publishes a newbackground_taskssideband event — added to@a2a-wrapper/core— each time the live set changes.Bumps
@anthropic-ai/claude-agent-sdkfrom0.3.202to0.3.245. The feature needs at least0.3.235, the first version to emitbackground_tasks_changed.Three changes apply even with
holdTaskForBackgroundWorkoff:- Queries now use streaming input rather than a string prompt. A string prompt makes the SDK close the CLI subprocess's stdin on the first result, which ends the process before a second round is possible. This is not switchable.
agent_started/agent_finishedare emitted once per A2A Task rather than once per SDK turn.- A success result with empty text no longer publishes an empty
responseartifact.
See the a2a-claude README for caveats, including how
claude.maxTurnsandtimeouts.promptnow span a held-open Task's rounds.
1.7.0
Minor Changes
- feat: add comprehensive LLM usage telemetry and tracking
1.6.1 — 2026-06-06
Added
publishTask— new exported helper. Registers a bareTaskobject with the A2A result manager before any status events are published. Previously duplicated in each wrapper; now shared from core so all wrappers can import it without a local copy.
1.6.0 — 2026-06-03
Added
substituteEnvTokensInString— new exported helper. Replaces${VAR}(explicit form) and$VAR(bare form) tokens in a single string. Works mid-string, e.g."Bearer ${TOKEN}".substituteEnvTokensInRecord— new exported helper. Applies env-var substitution to every value of aRecord<string, string>, e.g. HTTP headers or process environment maps. Returnsundefinedforundefinedinput.- Both helpers are exported from the
@a2a-wrapper/corebarrel so wrapper loaders don't duplicate the implementation.
Changed
substituteEnvTokens(existing) — now supports${VAR}in addition to bare$VAR. Backward-compatible.
1.5.0 — 2026-05-13
Added
- A2A Sub-Agents — new
subAgentsconfig section lets a parent A2A agent expose remote A2A agents as MCP tools by spawninga2a-mcp-skillmapas a stdio MCP child process. The bridge is registered under the reserveda2a-subagentskey in the resolvedmcpmap, so wrapper-side MCP wiring discovers it without any wrapper-specific code. - Bootstrap pipeline — single entry point
bootstrapSubAgents()orchestrates the full sequence: validate → build → write bridge config → probe → synthesize MCP descriptor. Wrapper integration is ~10 lines per wrapper. - Pinned skillmap version — new
SKILLMAP_PACKAGE_VERSIONconstant pins thea2a-mcp-skillmapversion invoked vianpx(pinned to0.2.1). Bumping the pin is a deliberate, reviewable change. - Reachability probe —
probeSubAgents()runs parallel HTTP probes against each sub-agent's effective URL at startup with structuredProbeResults. Failures log warnings but never abort startup. - Sync budget — new
SubAgentsOptions.syncBudgetMsfield controls how long the bridge waits for an A2A response before returning a task handle for async polling. - Reserved-key collision detection — fail-fast validation rejects configs that manually define an MCP server under
a2a-subagents. - Env-var substitution —
auth.tokenmay reference environment variables via${VAR}syntax. Missing variables produce a startup warning and the auth block is omitted. BaseAgentConfig.subAgents— optionalsubAgents?: SubAgentsConfigfield added to the base config type.- JSON schema —
schemas/agent-config.schema.jsongenerated from TypeScript types vianpm run schema. Drift-detection and schema validation tests ship in CI.
New Exports
- Types:
SubAgentConfig,SubAgentAuthConfig,SubAgentsOptions,SubAgentsConfig,SynthesizedMcpDescriptor,ProbeResult,BootstrapInput,BootstrapResult,BridgeConfigSource,BridgeConfigAgentEntry,BridgeConfig,ValidationOutcome,SubAgentValidationReason,SubAgentValidationErrorDetails - Functions:
validateSubAgents,buildBridgeConfig,resolveBridgeConfigPath,writeBridgeConfig,probeSubAgents,buildSynthesizedMcpEntry,bootstrapSubAgents - Error class:
SubAgentValidationError - Constants:
SUBAGENTS_MCP_KEY,SKILLMAP_PACKAGE_VERSION
1.4.0
Added
- Memory Persistence — new
memoryconfig section allows agents to declare instructions and skills that are materialized into the workspace at startup. The core package provides a backend-agnostic materializer (materializeMemory()) that reads source files, validates SKILL.md frontmatter, and writes content to backend-specific paths before the executor handles its first request. - SKILL.md Parser —
parseSkillManifest(),formatSkillManifest(), andvalidateSkillManifest()functions for parsing YAML frontmatter from skill files. Uses a lightweight regex-based parser (no js-yaml dependency). Supports kebab-case name validation, arrays, quoted strings, and round-trip fidelity. - Well-Known Backend Paths —
WELL_KNOWN_PATHSconstant with pre-defined path mappings for Copilot (.github/), Claude (CLAUDE.md+.claude/), OpenCode (.opencode/), and Codex (.codex/+.agents/). Wrappers can use these or define their ownBackendPaths. - Path Resolution —
resolveMemoryPath()utility for resolving relative/absolute paths against the config directory. - BaseAgentConfig extended — added optional
memory?: MemoryConfigandconfigDir?: stringfields to the base config type. - CLI scaffold injects configDir —
createCli()now automatically populatesconfigDirfrom the config file path for memory path resolution.
New Exports
- Types:
MemoryConfig,SkillManifest,ParsedSkill,BackendPaths,MaterializeOptions - Functions:
materializeMemory,parseSkillManifest,formatSkillManifest,validateSkillManifest,resolveMemoryPath - Constants:
WELL_KNOWN_PATHS
1.3.0
Added
- Event Transport Abstraction — new pluggable transport layer for sideband observability events. Built-in
A2ATransport(default, publishes trace artifacts on the A2A EventBus) andHttpTransport(POSTs events as JSON to any HTTP collector). Custom transports (Kafka, Redis, DB) supported via the programmaticcreateA2AServer()API. - AgentEventEmitter — per-execution emitter that stamps every event with agent identity, trace context, UUID, and ISO timestamp before routing through the transport.
- EventsConfig — new config section on
BaseAgentConfigfor controlling event emission, transport type, HTTP endpoint, timeout, and custom headers. - TRACE_EXTENSION_URI — agent cards now declare
urn:x-a2a:trace:v1incapabilities.extensionsso orchestrators can discover sideband trace data. - ServerOptions.eventTransport —
createA2AServer()now accepts an optional custom event transport for programmatic use.
Changed
- Trace artifacts now include extension metadata —
publishTraceArtifact()andpublishThoughtArtifact()now emitextensions: [TRACE_EXTENSION_URI]andmetadata: { traceType, timestamp }on every trace artifact, allowing orchestrators to reliably distinguish trace artifacts from response artifacts. - Fix flaky property-based test — excluded
-0from thefc.double()arbitrary in the config loader round-trip test.-0doesn't survive JSON serialization (JSON.stringify(-0)→"0"→+0), causing intermittent failures.
1.2.1
Changed
- Fix post-release bugs: Node 22 ESM resolution (postinstall patch for vscode-jsonrpc), auth error message clarity (GITHUB_TOKEN guidance), README corrections (message/* method names, messageId in examples), and ResultManager race condition (publish task event before status-update in both executors).
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.
1.2.0 - 2026-04-02
Added
- Initial extraction of shared infrastructure from
a2a-copilotanda2a-opencode. Loggerclass withcreateLoggerfactory,LogLevelenum, and hierarchical child loggers.Deferred<T>interface withcreateDeferredandsleeputilities.deepMergefunction with immutable recursive merge andsubstituteEnvTokensfor env var interpolation.BaseAgentConfig<TBackend>generic config type system withAgentCardConfig,ServerConfig,SessionConfig,BaseFeatureFlags,TimeoutConfig,LoggingConfig,BaseMcpServerConfig, andSkillConfig.loadConfigFile<T>andresolveConfig<T>for layered config resolution (defaults ← file ← env ← CLI).- Event publisher functions:
publishStatus,publishFinalArtifact,publishStreamingChunk,publishLastChunkMarker,publishTraceArtifact,publishThoughtArtifact. buildAgentCardfor constructing A2A-spec-compliant agent cards from config.createA2AServer<T>server factory with standard A2A routes, dynamic agent card URL rewriting, and configurableA2A-Versionheader.BaseSessionManager<TSession>abstract class with TTL-based cleanup and task tracking.A2AExecutorinterface defining the executor contract for wrapper projects.createCli<T>CLI scaffold with common flag parsing, graceful shutdown, and extensible arg definitions.- Barrel export (
src/index.ts) with A2A SDK type re-exports for upgrade isolation. - 19 property-based tests (fast-check) covering all correctness properties from the design document.