Skip to content

feat: multi-tenant server with path-based routing and task isolation#19

Open
zeroasterisk wants to merge 1 commit intoactioncard:mainfrom
zeroasterisk:feat/v1-multi-tenant
Open

feat: multi-tenant server with path-based routing and task isolation#19
zeroasterisk wants to merge 1 commit intoactioncard:mainfrom
zeroasterisk:feat/v1-multi-tenant

Conversation

@zeroasterisk
Copy link
Copy Markdown

Part of #13 (A2A v1.0 Protocol Support)

Adds an optional A2A.Plug.MultiTenant for multi-tenant A2A deployments with path-based routing and per-tenant task isolation.

Changes

New: A2A.Plug.MultiTenant (lib/a2a/plug/multi_tenant.ex)

  • Routes /:tenant/:agent/*path to the correct agent process
  • Extracts tenant from URL path and injects into conn.assigns (:a2a_tenant, :a2a_agent_name)
  • Sets per-tenant base_url for agent cards (e.g., http://host/acme/echo)
  • Flows tenant_id into task metadata via A2A.Plug.put_metadata/2
  • Supports both static agent maps and A2A.Registry-based dynamic lookup
  • Delegates to existing A2A.Plug — no duplication of JSON-RPC handling

Updated: A2A.TaskStore.ETS (lib/a2a/task_store/ets.ex)

  • New tenant_ref/2 function creates namespaced store references
  • All store operations (get, put, delete, list, list_all) support tenant-scoped refs
  • Tenant A's tasks are completely invisible to tenant B
  • Plain (non-tenant) refs work exactly as before — full backward compatibility

Tests (24 new, 413 total, 0 failures)

  • 11 ETS tenant isolation tests (put/get/delete/list scoping, cross-tenant invisibility, backward compat)
  • 13 multi-tenant plug tests (routing, tenant context, per-tenant agent cards, registry lookup, init validation, backward compat)

Design Decisions

  • Optional — existing single-tenant A2A.Plug usage is completely unchanged
  • ComposableMultiTenant wraps A2A.Plug, doesn't replace it
  • Simple — tenant isolation via key namespacing in shared ETS table, no separate tables per tenant

Fixes part of #13

- A2A.Plug.MultiTenant: path-based /:tenant/:agent/* routing
- A2A.TaskStore.ETS.tenant_ref/2: tenant-namespaced ETS keys for isolation
- Task isolation: tenant A cannot see tenant B's tasks
- Per-tenant agent card URLs
- Registry-based or static agent map lookup
- Backward compatible: single-tenant A2A.Plug unchanged
- 11 ETS tenant tests + 15 multi-tenant plug tests
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant