All notable changes to this project will be documented in this file. Format follows Keep a Changelog. Versions use Semantic Versioning.
Development work lands here before the next versioned release.
This release adopts the awaken crate name on crates.io. Versions 0.1–0.3 of
awaken belonged to a separate, now-archived crate maintained by
@brayniac, who generously transferred the name —
thank you. The codebase continues the line that previously shipped as
awaken-agent; the 0.4 jump exists only to skip past the prior versions
already published under the awaken name. There is no 0.3 release of this
codebase. Rust imports remain awaken either way.
The headline work since awaken-agent 0.2.1: streaming LLM calls now survive
mid-stream failures and can resume across processes; threads carry a durable
parent-child lineage with explicit child-delete strategies; provider keys and
admin tokens redact themselves through RedactedString.
- New
AgentEvent::ToolCallCancelandAgentEvent::StreamResetvariants so consumers can drop partial deltas during stream recovery without ambiguity. StreamCheckpointStorecontract for cross-process stream resume (the in-process retry loop already covered same-process recovery).ProviderSpec.adapter_options: a non-secretBTreeMap<String, Value>that adapters can read for things like custom headers on OpenAI-compatible proxies; unknown keys are accepted by the schema but ignored at build time.- Filtered thread queries (
ThreadQuery/ThreadPage) and message paging (MessageQuery/MessagePage) onThreadStore, consumed by the AG-UI and AI SDK v6 protocol routes. - Thread parent-child lineage:
Thread.parent_thread_id,RunRequestSnapshot.parent_thread_id, andThreadStore::delete_thread_with_strategy(reject/detach/cascade), with backend-native overrides on the file, PostgreSQL, and NATS-buffered stores. AdminApiConfig.expose_config_routestoggle andConfigRuntimeManager::with_min_apply_intervalfor hardening and debouncing the admin/config plane. Provider executors are reused across applies whoseProviderSpecis unchanged.awaken::RedactedStringre-export from the facade so secret-handling code no longer needs a directawaken-contractdependency.
ProviderSpec.api_key,AdminApiConfig.bearer_token, andServerConfig.a2a_extended_card_bearer_tokenare nowOption<RedactedString>. JSON wire format is unchanged. Code that reads these fields must call.expose_secret(); logging that relied onDebug/Displaynow prints***.InferenceExecutionErroris#[non_exhaustive]and splits into retryable (Provider,RateLimited,Overloaded,Timeout,StreamInterrupted), permanent (ContextOverflow,InvalidRequest,Unauthorized,ModelNotFound,ContentFiltered), and fail-fast (AllModelsUnavailable,Cancelled) classes.RateLimitedandOverloadedcarry an optionalretry_afterparsed fromRetry-After. Preferis_retryable(),counts_toward_circuit_breaker(), andretry_after()over matching specific variants.- Context compaction runs on a background task with single-flight semantics
and swaps the summary back through the owner inbox; the synchronous
compact_with_llmpath is removed.
- NATS buffered thread store now quarantines poison WAL messages with bounded NAK and a stable hash, so an unrecoverable entry no longer stalls the WAL.
- Background-task spawn commit failures surface through
SpawnErrorand a metric, rather than silently dropping the spawn. - Self-cancel commands now cascade across runs in the same lineage.
- Thread-query history ordering hardened across server CI surfaces.
- Existing serialized config keeps loading;
RedactedStringserializes and deserializes as a plain JSON string. - The 0.4 jump is solely a name-collision skip; the Rust API additions and changes are limited to the items above.
- 0.2.0 mailbox and server-facing types remain compatible. The NATS backend
is additive behind the
awaken-stores/natsfeature.
- NATS-backed
MailboxStoreandThreadRunStoreimplementations through theawaken-stores/natsfeature, including JetStream dispatch wakeups, KV-backed dispatch state, buffered checkpoint WAL, and read-your-writes overlays. - Live mailbox steering for active runs, with durable dispatch fallback when no live subscriber acknowledges the command.
- NATS mailbox operational metrics, delayed dispatch-signal NAK backoff, sweeper republish TTL, configurable signal-loop tuning, and stress coverage for multi-node contention and large KV buckets.
- Preserved 0.2.0 public API compatibility for mailbox and server-facing types while keeping new dispatch signal behavior additive.
- Hardened distributed mailbox scheduling around thread claim guards,
available_atretry windows, dispatch epoch checks, stale claim rejection, dedupe lock reconciliation, and terminal claim-field cleanup. - Fixed NATS buffered thread flushing so WAL messages are ACKed only after both
the inner checkpoint and
flushed_seqwatermark write succeed. - Wired NATS credentials config into both mailbox and buffered thread store connections.
- Normalized NATS KV Delete/Purge tombstones across claim guards, dedupe locks, thread indexes, epochs, and dispatch control paths.
- Made terminal dispatch GC authoritative and changed expired-lease reclaim to use thread-claim guard records instead of scanning all dispatch records.
- Updated
genaito0.6.0-beta.17. - Aligned Rust toolchain metadata with the current workspace MSRV.
cargo semver-checkspasses againstv0.2.0; this release is intended as a non-breaking 0.2 patch release.- The NATS backend is additive and behind the
awaken-stores/natsfeature.
- Agent and model configuration now uses the canonical
model_id->ModelBinding { provider_id, upstream_model }chain. Legacymodel,provider,model_name, andfallback_modelsfields are rejected in managed Awaken config. - A2A HTTP routes and payloads use the v1
message:send,message:stream, task wrapper,supportedInterfaces, and enum naming shapes. Oldertasks/sendand top-level AgentCardid/urlshapes are not emitted. - Tool interception should move to
ToolGateHookviaPluginRegistrar::register_tool_gate_hook().BeforeToolExecutenow represents execution-time hooks only. - Remote agent endpoints use the canonical
RemoteEndpointshape:backend,base_url,auth,target,timeout_ms, andoptions. Legacy A2A endpoint fields are accepted only as an isolated migration input and cannot be mixed with canonical fields.
- Canonical
ExecutionBackendcontract for local and remote agent execution, including root execution, delegate execution, abort, remote state continuation, input/auth waits, and output capability reporting. - Managed configuration API for
agents,models,providers, andmcp-servers, backed byConfigStoreand runtime snapshot validation. - Admin Console app for editing runtime configuration through the Config API.
- SQLite mailbox store via
SqliteMailboxStoreand theawaken-stores/sqlitefeature. - A2A streaming, task subscription, push notification config routes, extended agent cards, and official protocol interop coverage.
- MCP Streamable HTTP session lifecycle, including
MCP-Session-Id, strict initialize/session validation, streamingtools/call, andDELETE /v1/mcpsession termination. - OpenUI chat example and expanded generative UI support for A2UI, JSON Render, and OpenUI Lang integrations.
- The runtime lifecycle now includes a pure
ToolGatedecision point before tool execution, making permission and interception behavior independent from execution-time side effects. - Runtime-managed config changes compile and validate a candidate registry snapshot before it replaces the active runtime snapshot.
- A2A remote execution preserves backend task lifecycle state across polling, streaming, interruption, cancellation, and continuation.
- Provider/model retry and inference overrides now operate on upstream model names for the already resolved provider.
- Documentation and examples now use
awaken-agent = 0.2dependency snippets and canonical model/provider APIs.
- Existing Rust imports continue to use
awakeneven though the crate is published asawaken-agent. awaken_runtime::extensions::a2astill re-exports compatibility aliases such asAgentBackend,AgentBackendFactory, andDelegateRunResult, but new code should useExecutionBackend,ExecutionBackendFactory, andBackendRunResult.RemoteEndpointdeserializes legacybearer_token,agent_id, andpoll_interval_msonly when no canonical fields are present. New serialized config should useauth,target, andoptions.
- Phase pipeline with 8 lifecycle hooks:
RunStart,StepStart,BeforeInference,AfterInference,BeforeToolExecute,AfterToolExecute,StepEnd,RunEnd - Plugin system with typed effect handlers, scheduled actions, and commit hooks for state mutation
AgentResolvertrait for dynamic agent resolution with composite and config-backed registry implementationsStopPolicytrait with built-in policies: max rounds, token budget, wall-clock timeout, consecutive errors- Agent handoff extension for same-thread dynamic agent switching without run termination
- Background task extension for spawning, tracking, and cancelling long-running tasks across runs
- Sub-agent delegation via
AgentToolwith local and remote (A2A) backends - Context compaction with configurable summarization and artifact truncation to manage long conversations
- LLM retry policy with exponential backoff, per-model circuit breaker, and ordered fallback model list
AgentRuntimeBuilderfor ergonomic runtime assembly with plugins, tools, and registry wiringStateStorewith typed slot access, snapshot, and batched mutation commits
LlmExecutortrait for provider-neutral streaming inference withgenaias the default backendToolandTypedTooltraits with JSON Schema descriptors andToolCallContextToolBehaviorBundlefor grouping tools and plugin references by bundle IDSuspensionandResumeDecisionActionfor human-in-the-loop tool approval flowsMailboxJob,MailboxStore, andMailboxInterruptfor persistent run queuing with lease semanticsAgentSpecandRemoteEndpointtypes for declarative agent configuration inawaken.tomlAgentCardwith auth descriptor for A2A discoveryPhaseenum withis_run_level/is_step_levelclassification helpersInferenceRequestTransformtrait for pre-inference prompt mutationToolInterceptPayloadfor plugin-level tool call interception before execution
- AI SDK v6 HTTP+SSE protocol (
/v1/ai-sdk/...) for Vercel AI SDK frontend integration - AG-UI protocol (
/v1/ag-ui/...) with CopilotKit frontend support - Google A2A protocol (
/v1/a2a/...) including agent card discovery, task send/status/cancel, andmessage:send - ACP protocol with both HTTP and stdio transports
- MCP Streamable HTTP transport (
POST /v1/mcp,GET /v1/mcp) and stdio transport for tool exposure - SSE reconnection replay buffer so clients can catch up on missed events after a disconnect
- Thread and run REST API (
/v1/threads,/v1/runs) with pagination, metadata patch, and cancel endpoints - HITL decision endpoints:
POST /v1/threads/:id/decisionandPOST /v1/runs/:id/decision - Mailbox dispatch endpoint (
/v1/threads/:id/mailbox) for enqueuing background jobs - Health check endpoint (
/health) with per-component store liveness reporting
InMemoryStorefor threads, messages, and runs — suitable for testing and ephemeral deploymentsFileStorewith crash-safe atomic writes and.checkpoint_pendingrecovery on restartPostgresStorefor production thread, message, and run persistenceInMemoryMailboxStorefor lease-based job queuing in tests and local developmentProfileStoretrait for per-agent profile persistence withProfileOwnerscoping
PermissionPlugin: declarative allow/deny/ask rules with glob and regex matching on tool names and arguments, firewall-style priority (Deny > Allow > Ask)ObservabilityPlugin: per-inference and per-tool metrics aligned with OpenTelemetry GenAI semantic conventions; pluggableMetricsSinkwith in-memory, batching, persistent, composite, and OTel backendsDeferredToolsPlugin: lazy tool loading withToolSearchtool for runtime capability discoverySkillsPlugin: filesystem and compile-time embedded skills with markdown frontmatter,FsSkilldiscovery, and optional MCP bridgeReminderPlugin: declarative post-tool-execution context injection rules with input/output pattern matchingA2uiPlugin(generative UI): streaming sub-agent UI rendering via OpenUI Lang with JSON render and data model updatesCompactionPluginandContextTransformPlugin: automatic context window management with configurable summarization LLM and artifact compaction thresholdsHandoffPlugin: zero-cost in-loop agent variant switching with per-variant system prompt, model, and tool overlaysBackgroundTaskPlugin: long-lived task lifecycle with status queries and cancellation exposed as agent tools
awakenfacade crate withfullfeature flag and granular opt-in features:permission,observability,mcp,skills,reminder,server,generative-uiawaken::preludere-export for ergonomic imports- Example: generative UI parent/sub-agent delegation pipeline
- Example: AI SDK starter with Next.js frontend wiring
- Example: CopilotKit AG-UI starter
awaken-doctestcrate for compile-checked documentation examples- TOML-based agent configuration (
awaken.toml) with JSON Schema for editor validation