feat: Support multi-tenancy#419
Conversation
🧪 Code Coverage
Generated by coverage-comment.yml |
This comment was marked as outdated.
This comment was marked as outdated.
…bgralewicz/support_multi_tenancy
|
/gemini review |
There was a problem hiding this comment.
Code Review
This pull request introduces comprehensive multi-tenancy support across the client and server components. Key updates include the addition of a tenant field to the ServerCallContext, the implementation of tenant-aware routing in REST, gRPC, and JSON-RPC transports, and the introduction of tenant-scoped data isolation in the in-memory task and push notification stores. While the implementation successfully enables multi-tenant workflows, the review identifies a critical vulnerability in the composite key generation logic used for storage. Specifically, the current key structure is susceptible to collisions between tenanted and global-scope identifiers, which could lead to unintended data overwrites and loss of isolation.
…y added to all requests when specified.
…is also updated to resolvePathTenant.
…disables are needed.
🤖 I have created a release *beep* *boop* --- ## 1.0.0-alpha.0 (2026-05-11) See the [v0.3 -> v1.0-alpha.0 migration guide](https://github.com/a2aproject/a2a-js/blob/v1.0.0-alpha.0/docs/migration-guide.md). **Note**: Enabling backward compatibility with v0.3 is tracked in [#452](#452). ### ⚠ BREAKING CHANGES * Drop support for node 18 ([#368](#368)) * Make ServerCallContext parameter mandatory across all places ([#405](#405)) * Remove JSON-RPC client ([#353](#353)) * Remove transport-specific exports ([#404](#404)) * Update codebase to use A2A 1.0.0 data model ([#375](#375)) * Remove A2AExpressApp ([#363](#363)) ### Features * Add A2A Version Header ([#422](#422)) ([b5f3db7](b5f3db7)) * Add cache-headers logic to the agent card handler ([#435](#435)) ([955b52b](955b52b)) * Add resource scoping ([#450](#450)) ([c527086](c527086)) * Add support for custom authentication scheme and credentials in auth-headers ([#430](#430)) ([5a4389b](5a4389b)) * AgentCardSignature support ([#448](#448)) ([4a41a8c](4a41a8c)) * Enforce events ordering ([#437](#437)) ([157cf48](157cf48)) * Enriched Error Model ([#427](#427)) ([c130778](c130778)) * Implement listTasks method ([#383](#383)) ([7d4c472](7d4c472)) * Send current task as the first event after subscribing to it ([#418](#418)) ([4bfcf5f](4bfcf5f)) * Support multi-tenancy ([#419](#419)) ([1877877](1877877)) ### Code Refactoring * remove A2AExpressApp ([#363](#363)) ([0b84728](0b84728)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: bartek-gralewicz <bgralewicz@google.com> Co-authored-by: Ivan Shymko <ishymko@google.com>
Description
Added support for multi-tenancy.
Multi-Tenancy
This handler supports multi-tenant deployments through the
tenantfield presenton all request objects (per A2A spec Sections 3.1.x and 4.4.6). The tenant value
flows through the system as follows:
Transport layer extracts tenant from the protocol-specific source:
/:tenant/...)params.tenantin the request bodytenantfield in the request messageServerCallContext.tenantcarries the tenant to all downstream components,including
TaskStore,PushNotificationStore, andAgentExecutor.InMemoryTaskStoreandInMemoryPushNotificationStoreusecontext.tenantto scope data with composite keys (
{tenant}:{id}), providing tenant isolation.Similar PR done in Python SDK: a2aproject/a2a-python#758
Fixes #325 🦕