agentenv-framework-protocol 0.1.425__tar.gz → 0.1.426__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/PKG-INFO +18 -1
  2. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/README.md +17 -0
  3. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/pyproject.toml +1 -1
  4. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/__init__.py +2 -0
  5. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/tasks/v1.py +21 -1
  6. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_a2a_agent.py +22 -1
  7. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/.gitignore +0 -0
  8. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/LICENSE +0 -0
  9. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/NOTICE +0 -0
  10. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/THIRD_PARTY_NOTICES.md +0 -0
  11. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/examples/__init__.py +0 -0
  12. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/examples/advanced_agent.py +0 -0
  13. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/examples/basic_agent.py +0 -0
  14. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/examples/custom_extensions_agent.py +0 -0
  15. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/examples/multimodal_agent.py +0 -0
  16. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/examples/reference_model.py +0 -0
  17. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/examples/streaming_agent.py +0 -0
  18. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/__init__.py +0 -0
  19. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/_trajectory_log.py +0 -0
  20. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/_triggers.py +0 -0
  21. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/extensions.py +0 -0
  22. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/framework.py +0 -0
  23. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/peer_agents.py +0 -0
  24. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/proxy.py +0 -0
  25. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/registry.py +0 -0
  26. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/staging.py +0 -0
  27. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/a2a_agent/tasks/__init__.py +0 -0
  28. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/agent_env_environment.py +0 -0
  29. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/client.py +0 -0
  30. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/__init__.py +0 -0
  31. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/_declare.py +0 -0
  32. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/_linux.py +0 -0
  33. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/_load.py +0 -0
  34. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/app.py +0 -0
  35. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/app_data.py +0 -0
  36. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/app_runtime.py +0 -0
  37. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/apps.py +0 -0
  38. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/card.py +0 -0
  39. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/checks.py +0 -0
  40. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/conformance/__init__.py +0 -0
  41. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/conformance/__main__.py +0 -0
  42. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/conformance/checks.py +0 -0
  43. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/conformance/client.py +0 -0
  44. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/conformance/fixture.py +0 -0
  45. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/conformance/mp4.py +0 -0
  46. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/conformance/report.py +0 -0
  47. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/dataplane.py +0 -0
  48. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/driver.py +0 -0
  49. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/errors.py +0 -0
  50. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/extensions.py +0 -0
  51. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/frames.py +0 -0
  52. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/keys.py +0 -0
  53. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/launch.py +0 -0
  54. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/manifest.py +0 -0
  55. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/operations.py +0 -0
  56. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/platform.py +0 -0
  57. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/queue.py +0 -0
  58. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/recording.py +0 -0
  59. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/results.py +0 -0
  60. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/run_install_step.py +0 -0
  61. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/runtime.py +0 -0
  62. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/serve.py +0 -0
  63. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/serve_app.py +0 -0
  64. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/session.py +0 -0
  65. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/settings.py +0 -0
  66. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/skill.py +0 -0
  67. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/spaces.py +0 -0
  68. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/computer/tools.py +0 -0
  69. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/errors.py +0 -0
  70. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/manifest.py +0 -0
  71. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/preflight.py +0 -0
  72. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/tool_access.py +0 -0
  73. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/tool_client.py +0 -0
  74. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/tool_context.py +0 -0
  75. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/transfers.py +0 -0
  76. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/src/agentenv_protocol/types.py +0 -0
  77. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/computer_fake.py +0 -0
  78. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/probe_fake.py +0 -0
  79. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_a2a_agent_examples.py +0 -0
  80. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_a2a_object_transfers.py +0 -0
  81. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_a2a_peer_agents.py +0 -0
  82. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_a2a_proxy.py +0 -0
  83. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_a2a_staging.py +0 -0
  84. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_a2a_trajectory_log.py +0 -0
  85. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_agent_env_environment.py +0 -0
  86. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_client.py +0 -0
  87. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_app_data.py +0 -0
  88. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_app_server.py +0 -0
  89. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_conformance.py +0 -0
  90. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_conformance_checks.py +0 -0
  91. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_conformance_recording.py +0 -0
  92. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_dataplane.py +0 -0
  93. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_declare.py +0 -0
  94. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_driver.py +0 -0
  95. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_extensions.py +0 -0
  96. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_frames.py +0 -0
  97. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_queue.py +0 -0
  98. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_recording.py +0 -0
  99. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_serve.py +0 -0
  100. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_computer_spaces.py +0 -0
  101. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_control_token.py +0 -0
  102. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_data_objects.py +0 -0
  103. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_errors.py +0 -0
  104. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_extension_methods.py +0 -0
  105. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_intake.py +0 -0
  106. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_manifest.py +0 -0
  107. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_preflight.py +0 -0
  108. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_tool_access.py +0 -0
  109. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_tool_annotations.py +0 -0
  110. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_tool_client.py +0 -0
  111. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_tool_context.py +0 -0
  112. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_tool_context_fastmcp.py +0 -0
  113. {agentenv_framework_protocol-0.1.425 → agentenv_framework_protocol-0.1.426}/tests/test_tool_context_injection.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentenv-framework-protocol
3
- Version: 0.1.425
3
+ Version: 0.1.426
4
4
  Summary: Open data-plane protocol and server SDK for agent environments.
5
5
  Project-URL: Homepage, https://www.agentenvframework.com
6
6
  Project-URL: Documentation, https://www.agentenvframework.com/docs
@@ -1063,6 +1063,23 @@ class MyAgentConfig(AgentConfig):
1063
1063
  provider_token: WriteOnly[str | None] = None
1064
1064
  ```
1065
1065
 
1066
+ An agent that can turn its own tools off, such as its shell, file or web tools, takes `builtin_tools`, typed
1067
+ `BuiltinTools` over a `Literal` of its tools' names, so its card's schema names them. A task selects them on
1068
+ `deploy_agent`: `{"disable": "*"}` turns them all off, `{"disable": [...]}` the ones named, and `{"only": [...]}` keeps
1069
+ the ones named; the agent applies `request.config.builtin_tools` to its runtime. The MCP tools AgentEnv gives it are not
1070
+ its own and stay. A selection for an agent whose config has
1071
+ no `builtin_tools`, or that names a tool its schema doesn't, is refused before the deploy sends it anything.
1072
+
1073
+ ```python
1074
+ from typing import Literal
1075
+
1076
+ from agentenv_protocol.a2a_agent import AgentConfig, BuiltinTools
1077
+
1078
+
1079
+ class MyAgentConfig(AgentConfig):
1080
+ builtin_tools: BuiltinTools[Literal["shell", "read_file", "web_fetch"]] | None = None
1081
+ ```
1082
+
1066
1083
  `output_format` is author-owned in v1 rather than a field on the base
1067
1084
  `AgentConfig`. An agent that supports structured output must declare the field
1068
1085
  on its config subclass, apply it to its model or runtime, and return the value
@@ -1007,6 +1007,23 @@ class MyAgentConfig(AgentConfig):
1007
1007
  provider_token: WriteOnly[str | None] = None
1008
1008
  ```
1009
1009
 
1010
+ An agent that can turn its own tools off, such as its shell, file or web tools, takes `builtin_tools`, typed
1011
+ `BuiltinTools` over a `Literal` of its tools' names, so its card's schema names them. A task selects them on
1012
+ `deploy_agent`: `{"disable": "*"}` turns them all off, `{"disable": [...]}` the ones named, and `{"only": [...]}` keeps
1013
+ the ones named; the agent applies `request.config.builtin_tools` to its runtime. The MCP tools AgentEnv gives it are not
1014
+ its own and stay. A selection for an agent whose config has
1015
+ no `builtin_tools`, or that names a tool its schema doesn't, is refused before the deploy sends it anything.
1016
+
1017
+ ```python
1018
+ from typing import Literal
1019
+
1020
+ from agentenv_protocol.a2a_agent import AgentConfig, BuiltinTools
1021
+
1022
+
1023
+ class MyAgentConfig(AgentConfig):
1024
+ builtin_tools: BuiltinTools[Literal["shell", "read_file", "web_fetch"]] | None = None
1025
+ ```
1026
+
1010
1027
  `output_format` is author-owned in v1 rather than a field on the base
1011
1028
  `AgentConfig`. An agent that supports structured output must declare the field
1012
1029
  on its config subclass, apply it to its model or runtime, and return the value
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "agentenv-framework-protocol"
3
- version = "0.1.425"
3
+ version = "0.1.426"
4
4
  description = "Open data-plane protocol and server SDK for agent environments."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -102,6 +102,7 @@ from .registry import (
102
102
  from .staging import STAGING_ENDPOINT, STAGING_V1_URI, StagingStore, staging_routes
103
103
  from .tasks.v1 import (
104
104
  AgentConfig,
105
+ BuiltinTools,
105
106
  AgentRunResult,
106
107
  DataPart,
107
108
  FilePart,
@@ -154,6 +155,7 @@ __all__ = [
154
155
  "AgentIdentity",
155
156
  "AgentRunResult",
156
157
  "AttributionProbeResponse",
158
+ "BuiltinTools",
157
159
  "BundleSkillRequest",
158
160
  "ChangelogIncrement",
159
161
  "ContextEventsTrajectoryRequest",
@@ -17,7 +17,7 @@ from pathlib import Path
17
17
  from typing import Annotated, Any, Generic, Literal, TypeAlias, TypeVar, Union
18
18
 
19
19
  from a2a.types import TaskStatusUpdateEvent
20
- from pydantic import BaseModel, ConfigDict, Field
20
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
21
21
 
22
22
  logger = logging.getLogger(__name__)
23
23
 
@@ -127,6 +127,26 @@ class AgentConfig(BaseModel):
127
127
  timeout_seconds: int = 600
128
128
 
129
129
 
130
+ ToolName = TypeVar("ToolName", bound=str)
131
+
132
+
133
+ class BuiltinTools(BaseModel, Generic[ToolName]):
134
+ """Which of an agent's own tools it may use, as a task selects them: ``disable`` turns off the ones it names, or
135
+ all of them with ``"*"``; ``only`` keeps the ones it names. An agent's config takes it as
136
+ ``builtin_tools: BuiltinTools[<a Literal of its tools>] | None``, so its card's agent-config schema names them."""
137
+
138
+ model_config = ConfigDict(extra="forbid", frozen=True)
139
+
140
+ disable: Literal["*"] | list[ToolName] | None = None
141
+ only: list[ToolName] | None = None
142
+
143
+ @model_validator(mode="after")
144
+ def _one_of(self) -> BuiltinTools:
145
+ if (self.disable is None) == (self.only is None):
146
+ raise ValueError("builtin_tools takes exactly one of disable and only")
147
+ return self
148
+
149
+
130
150
  ConfigT = TypeVar("ConfigT", bound=AgentConfig)
131
151
 
132
152
 
@@ -6,7 +6,7 @@ import json
6
6
  import time
7
7
  from dataclasses import FrozenInstanceError
8
8
  from functools import wraps
9
- from typing import Any, Union
9
+ from typing import Any, Literal, Union
10
10
  from unittest.mock import MagicMock
11
11
 
12
12
  import httpx
@@ -44,6 +44,7 @@ from agentenv_protocol.a2a_agent import (
44
44
  AgentEnvAgent,
45
45
  AgentIdentity,
46
46
  AttributionProbeResponse,
47
+ BuiltinTools,
47
48
  BundleSkillRequest,
48
49
  ContextObjectTrajectoryRequest,
49
50
  ContextTrajectoryRequest,
@@ -1774,6 +1775,26 @@ def test_agent_card_config_schema_omits_literal_defaults() -> None:
1774
1775
  assert "default" not in schema["$defs"]["NestedConfig"]["properties"]["token"]
1775
1776
 
1776
1777
 
1778
+ def test_builtin_tools_names_the_agents_own_tools_on_its_card_and_takes_one_selection() -> None:
1779
+ class RuntimeConfig(AgentConfig):
1780
+ builtin_tools: BuiltinTools[Literal["Bash", "Read", "WebFetch"]] | None = None
1781
+
1782
+ @a2a_agent(identity=AgentIdentity(name="tooled", description="test", version="1"), config=RuntimeConfig)
1783
+ class Agent(AgentEnvAgent):
1784
+ async def run(self, request: TaskRequest[RuntimeConfig]) -> TaskResult:
1785
+ return TaskResult.text("ok")
1786
+
1787
+ with TestClient(Agent().create_app()) as client:
1788
+ card = client.get("/.well-known/agent-card.json").json()
1789
+ statuses = [_operation(client, card, AGENT_CONFIG_V1.uri, "set", {"builtin_tools": selection}).status_code
1790
+ for selection in ({"disable": "*"}, {"only": ["Read"]}, {"disable": ["Glob"]},
1791
+ {"disable": "*", "only": ["Read"]}, {})]
1792
+
1793
+ request = _extension(card, AGENT_CONFIG_V1.uri)["params"]["methods"]["set"]["request"]
1794
+ assert "builtin_tools" in request["supported"] and '"enum": ["Bash", "Read", "WebFetch"]' in json.dumps(request)
1795
+ assert statuses == [200, 200, 400, 400, 400]
1796
+
1797
+
1777
1798
  def test_validation_errors_do_not_echo_rejected_values() -> None:
1778
1799
  secret = "sk-live-SUPERSECRET"
1779
1800