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.
- Formal Python Bridge SPI contract documented in
prompts/design.md§9 and ADR-012. BridgeRunnernow accepts an optionalstop_timeoutparameter (default remains 10.0s).BridgeConfig.resolve_env()andBridgeDefinition.resolve_env()for opt-in${VAR}/${VAR:-default}environment-variable placeholder resolution.- Active Event Source supervision:
EventSourceSupervisor,RestartPolicy,BridgeHealth,BridgeHealthSnapshot, andPermanentBridgeError. - Optional
Bridge.healthhook andBridgeRunner.healthaggregate snapshot so callers can observe bridge health. - Bridge capability matrix in
prompts/bridge-capabilities.md, documenting direction, Bus modes, session/trace/error mapping, timeout/retry/reconnect, auth, unsupported features, testing, and production readiness for all built-in bridges. - Optional experimental
frame_typefield onEnvelopein Go, Python, and TypeScript SDKs. The framework now dual-writesframe_typealongsideevent_typefor protocol frames (request/response/tool); for known protocol event types,frame_typeis canonical and derived fromevent_type, while unknown event types preserve any explicitframe_type. - Standard error-code constants (
CodeAgentTimeout,CodeAgentUnavailable, etc.) are now exported from the TypeScript SDK (sdk/typescript/src/types.ts). - Cross-language contract test matrix added: Go (
pkg/event/golden_test.go), Python (sdk/python/tests/test_golden_samples.py), and TypeScript (sdk/typescript/test/golden.test.mjs) now validate golden samples againstschema/envelope.schema.jsonand assert required fields, RFC3339 timestamps, UUIDv7 IDs,seq=0omission, terminal/is_finalrules, unknown-field forward compatibility, andErrorPayloadshape.
-
Breaking (TypeScript SDK) —
ErrorPayloadshape unified with Go, Python, and the JSON Schema:detailsrenamed tocauseandretryableis now required. This is an intentional contract tightening for the TypeScript type system.Migration example:
// Before (0.2.3) const error: ErrorPayload = { code: "AGENT_TIMEOUT", message: "timeout", details: { ... }, }; // After (0.3.0+) const error: ErrorPayload = { code: "AGENT_TIMEOUT", message: "timeout", retryable: true, cause: { ... }, };
This release should be versioned as 0.3.0 (or higher) because it changes the TypeScript public API contract.
-
Response metadata inheritance in Go and Python now uses key-by-key merge semantics: handler-provided metadata overrides inherited request keys for the same name and adds new keys, while
acp.*runtime keys are filtered from both inherited and handler-provided metadata. Empty handler metadata maps still inherit request metadata. -
prompts/design.mdrenumbered: Python SDK design moved to §10, ecosystem/interop to §11, HTTP/SSE adapter to §12, etc. -
prompts/design.md§3.2.4,prompts/a2a_prot.md, andROADMAP.mdupdated to reflect the v0.3.x decision: optional experimentalframe_typeis adopted, whilePhaseand aschema_versionbump to 2 are deferred until the Invocation/Task state model is defined. -
prompts/design.md§2 architecture diagram replaced with a Mermaid flowchart that includes the Go/Python/TypeScript SDKs, Bridge SPI & BridgeRunner, built-in bridges, HTTP/SSE Adapter, OTel EnvelopePreparer, and JSON Schema/golden samples; Router is now shown as internal to Bus and JetStream is marked Planned. -
prompts/design.mdmetadata and status updated: version bumped to v0.3.0, status changed from Draft to Implemented (with Experimental/Planned chapters), §16.0 snapshot dated 2026-07-26, §16.1 chapter status labels added, and outdated checkmarks for missing Go examples removed. -
prompts/design.mdSDK module layout updated: §8.1 Go layout reflects the actual repo (noexamples/,cmd/,pkg/transport/jetstream/, orpkg/middleware/metrics/); §10 status bumped to v0.3.0 alpha; §10.1 Python layout addsbridge/and the full examples list; new §10.7 documents the TypeScript HTTP/SSE Client and its limitations; §15 testing strategy updated to cover Go/Python/TypeScript, Bridge, and HTTP/SSE Adapter tests. -
prompts/design.md§12 HTTP/SSE API description rewritten: endpoints are allPOST;invokereturns payload JSON;streamreturns full Envelope SSE withevent/id/retry/data; headers-before/headers-after error handling and cancellation propagation are documented. The cancellation section was subsequently corrected to state that Adapter cancellation currently stops local waiting/SSE output and closes the local Stream/inbox, but does not propagate an active cancellation control frame across transport to the remote handler. -
MatrixEventBridgenow delegates its background sync loop toEventSourceSupervisor, with optionalsupervisionconfig for max restarts, exponential backoff, jitter, and health threshold.
- TypeScript
isErrorPayload()type guard now validates the requiredretryablefield and rejects invalidcausevalues, matching the unifiedErrorPayloadinterface. - Python HTTP/SSE error responses now always serialize the required
retryablefield inErrorPayload-shaped bodies;causeremains omitted when empty. - Go HTTP/SSE timeout error responses now correctly set
retryable: trueforAGENT_TIMEOUT. - Go HTTP adapter
writeErrorJSONnow includes the requiredretryablefield in 4xx/5xx JSON error responses, aligning with the unifiedErrorPayloadcontract and the Python adapter. BridgeRunner.start()now preserves the original start exception when a bridge'sstop()raisesCancelledErrorduring rollback cleanup.BridgeConfig.resolve_env()/BridgeDefinition.resolve_env()now recursively resolve${VAR}/${VAR:-default}placeholders inside nested mappings, lists, and tuples.- Active Event Source bridges (e.g.,
MatrixEventBridge) no longer silently stop when their background task exits, and no longer infinite-retry on permanent configuration/authentication errors. EventSourceSupervisor.stop()now distinguishes child-task cancellation from caller cancellation and propagates externalasyncio.CancelledError.
- Event Envelope v1 with UUIDv7 IDs, W3C Trace Context (
traceparent), streaming semantics (seq,is_final), andmetadatainheritance for proxy chains. - JSON Codec as the default wire format, with a pluggable
Codecinterface. - Transport abstraction with NATS Core and In-Memory implementations for Go and Python.
- Bus runtime API (
Publish,Subscribe,Invoke,StreamInvoke,HandleInvoke,HandleStream) with Go/Python parity. StreamWriterwithStarted/Delta/Final/Errorframes and Go 1.23+iter.Seq2iterator support.- Middleware chain (
Recover,Trace,Logging,Retry,DeadLetter) with metadata-stamped retry attempts (acp.retry.attempt). - OpenTelemetry bridge (
pkg/middleware/otel,openagentio.middleware.otel) as an opt-in subpackage. - Session and trace context propagation via
context.Context(Go) andContextVar(Python). - HTTP/SSE Adapter for Go (
pkg/adapter/http) and Python (openagentio.adapter.http) with BearerAuth, customAuthFunc, timeout/idle-timeout, and SSE retry. transportdialquick-start factory for zero-configinmem/natsswitching via environment variables.- EventType constructor differentiation (
event.NewEvent/event.NewRequest) with runtime contract warnings inInvoke/StreamInvoke. - Cross-language golden samples (
schema/samples/) validating Go/Python wire-format compatibility. - Scene Example demonstrating single-process orchestrator and distributed multi-process modes.
- Echo examples for Go (
examples/echo-agent/) and Python (sdk/python/examples/echo_agent.py).
- Unified Go, Python, and TypeScript SDK versions to
0.2.3.
- Initial alpha release of the Python SDK (
openagentio) with asyncio Bus, NATS/InMem drivers, and HTTP/SSE adapter. - TypeScript SSE client (
@openagentio/client).