Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
2a8668e
Merge branch '1.0-dev' of https://github.com/sokoliva/a2a-python into…
sokoliva Mar 20, 2026
2f94c4e
Merge branch '1.0-dev' of https://github.com/sokoliva/a2a-python into…
sokoliva Mar 20, 2026
72a8a7f
feat: Enforce ServerCallContext in all TaskStore operations
sokoliva Mar 20, 2026
93e3e20
make ServerCallCOntext mandatory in task manager
sokoliva Mar 25, 2026
dc49636
Merge branch '1.0-dev' into Server-Call-Context-Mandatory
sokoliva Mar 25, 2026
2af7880
Make ServerCallContext mandatory in CopyingTaskStore
sokoliva Mar 25, 2026
fbab840
format
sokoliva Mar 25, 2026
cdeb9f9
Merge branch '1.0-dev' into Server-Call-Context-Mandatory
sokoliva Mar 25, 2026
4c9089c
Merge branch '1.0-dev' into Server-Call-Context-Mandatory
sokoliva Mar 25, 2026
3541781
move mandatory parameters to top
sokoliva Mar 26, 2026
ae9cec9
Merge branch 'Server-Call-Context-Mandatory' of https://github.com/so…
sokoliva Mar 26, 2026
a21a16a
Merge branch '1.0-dev' into Server-Call-Context-Mandatory
sokoliva Mar 26, 2026
50cf655
Make `ServerCallContext` mandatory in `RequestContext`
sokoliva Mar 26, 2026
cf3c9fe
Merge branch '1.0-dev' into Server-Call-Context-Mandatory
sokoliva Mar 26, 2026
fddfec7
fix
sokoliva Mar 26, 2026
e77f8d9
Merge branch 'Server-Call-Context-Mandatory' of https://github.com/so…
sokoliva Mar 26, 2026
4cd6708
make ServerCallCOntext mandatory
sokoliva Mar 26, 2026
006cff8
test descr
sokoliva Mar 26, 2026
b9136dc
Merge branch '1.0-dev' into Server-Call-Context-Mandatory
sokoliva Mar 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions src/a2a/server/owner_resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@


# Definition
OwnerResolver = Callable[[ServerCallContext | None], str]
OwnerResolver = Callable[[ServerCallContext], str]


# Example Default Implementation
def resolve_user_scope(context: ServerCallContext | None) -> str:
def resolve_user_scope(context: ServerCallContext) -> str:
"""Resolves the owner scope based on the user in the context."""
if not context:
return 'unknown'
# Example: Basic user name. Adapt as needed for your user model.
return context.user.user_name
12 changes: 4 additions & 8 deletions src/a2a/server/tasks/database_task_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,7 @@ def _from_orm(self, task_model: TaskModel) -> Task:
# Legacy conversion
return compat_task_model_to_core(task_model)

async def save(
self, task: Task, context: ServerCallContext | None = None
) -> None:
async def save(self, task: Task, context: ServerCallContext) -> None:
"""Saves or updates a task in the database for the resolved owner."""
await self._ensure_initialized()
owner = self.owner_resolver(context)
Expand All @@ -185,7 +183,7 @@ async def save(
)

async def get(
self, task_id: str, context: ServerCallContext | None = None
self, task_id: str, context: ServerCallContext
) -> Task | None:
"""Retrieves a task from the database by ID, for the given owner."""
await self._ensure_initialized()
Expand Down Expand Up @@ -216,7 +214,7 @@ async def get(
async def list(
self,
params: a2a_pb2.ListTasksRequest,
context: ServerCallContext | None = None,
context: ServerCallContext,
) -> a2a_pb2.ListTasksResponse:
"""Retrieves tasks from the database based on provided parameters, for the given owner."""
await self._ensure_initialized()
Expand Down Expand Up @@ -315,9 +313,7 @@ async def list(
page_size=page_size,
)

async def delete(
self, task_id: str, context: ServerCallContext | None = None
) -> None:
async def delete(self, task_id: str, context: ServerCallContext) -> None:
"""Deletes a task from the database by ID, for the given owner."""
await self._ensure_initialized()
owner = self.owner_resolver(context)
Expand Down
12 changes: 4 additions & 8 deletions src/a2a/server/tasks/inmemory_task_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,7 @@ def __init__(
def _get_owner_tasks(self, owner: str) -> dict[str, Task]:
return self.tasks.get(owner, {})

async def save(
self, task: Task, context: ServerCallContext | None = None
) -> None:
async def save(self, task: Task, context: ServerCallContext) -> None:
"""Saves or updates a task in the in-memory store for the resolved owner."""
owner = self.owner_resolver(context)
if owner not in self.tasks:
Expand All @@ -49,7 +47,7 @@ async def save(
)

async def get(
self, task_id: str, context: ServerCallContext | None = None
self, task_id: str, context: ServerCallContext
) -> Task | None:
"""Retrieves a task from the in-memory store by ID, for the given owner."""
owner = self.owner_resolver(context)
Expand All @@ -76,7 +74,7 @@ async def get(
async def list(
self,
params: a2a_pb2.ListTasksRequest,
context: ServerCallContext | None = None,
context: ServerCallContext,
) -> a2a_pb2.ListTasksResponse:
"""Retrieves a list of tasks from the store, for the given owner."""
owner = self.owner_resolver(context)
Expand Down Expand Up @@ -155,9 +153,7 @@ async def list(
page_size=page_size,
)

async def delete(
self, task_id: str, context: ServerCallContext | None = None
) -> None:
async def delete(self, task_id: str, context: ServerCallContext) -> None:
"""Deletes a task from the in-memory store by ID, for the given owner."""
owner = self.owner_resolver(context)
async with self.lock:
Expand Down
12 changes: 4 additions & 8 deletions src/a2a/server/tasks/task_store.py
Comment thread
sokoliva marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,23 @@ class TaskStore(ABC):
"""

@abstractmethod
async def save(
self, task: Task, context: ServerCallContext | None = None
) -> None:
async def save(self, task: Task, context: ServerCallContext) -> None:
"""Saves or updates a task in the store."""

@abstractmethod
async def get(
self, task_id: str, context: ServerCallContext | None = None
self, task_id: str, context: ServerCallContext
) -> Task | None:
"""Retrieves a task from the store by ID."""

@abstractmethod
async def list(
self,
params: ListTasksRequest,
context: ServerCallContext | None = None,
context: ServerCallContext,
) -> ListTasksResponse:
"""Retrieves a list of tasks from the store."""

@abstractmethod
async def delete(
self, task_id: str, context: ServerCallContext | None = None
) -> None:
async def delete(self, task_id: str, context: ServerCallContext) -> None:
"""Deletes a task from the store by ID."""
Loading
Loading