agentpool 2.2.3__py3-none-any.whl → 2.5.0__py3-none-any.whl
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.
- acp/__init__.py +0 -4
- acp/acp_requests.py +20 -77
- acp/agent/connection.py +8 -0
- acp/agent/implementations/debug_server/debug_server.py +6 -2
- acp/agent/protocol.py +6 -0
- acp/client/connection.py +38 -29
- acp/client/implementations/default_client.py +3 -2
- acp/client/implementations/headless_client.py +2 -2
- acp/connection.py +2 -2
- acp/notifications.py +18 -49
- acp/schema/__init__.py +2 -0
- acp/schema/agent_responses.py +21 -0
- acp/schema/client_requests.py +3 -3
- acp/schema/session_state.py +63 -29
- acp/task/supervisor.py +2 -2
- acp/utils.py +2 -2
- agentpool/__init__.py +2 -0
- agentpool/agents/acp_agent/acp_agent.py +278 -263
- agentpool/agents/acp_agent/acp_converters.py +150 -17
- agentpool/agents/acp_agent/client_handler.py +35 -24
- agentpool/agents/acp_agent/session_state.py +14 -6
- agentpool/agents/agent.py +471 -643
- agentpool/agents/agui_agent/agui_agent.py +104 -107
- agentpool/agents/agui_agent/helpers.py +3 -4
- agentpool/agents/base_agent.py +485 -32
- agentpool/agents/claude_code_agent/FORKING.md +191 -0
- agentpool/agents/claude_code_agent/__init__.py +13 -1
- agentpool/agents/claude_code_agent/claude_code_agent.py +654 -334
- agentpool/agents/claude_code_agent/converters.py +4 -141
- agentpool/agents/claude_code_agent/models.py +77 -0
- agentpool/agents/claude_code_agent/static_info.py +100 -0
- agentpool/agents/claude_code_agent/usage.py +242 -0
- agentpool/agents/events/__init__.py +22 -0
- agentpool/agents/events/builtin_handlers.py +65 -0
- agentpool/agents/events/event_emitter.py +3 -0
- agentpool/agents/events/events.py +84 -3
- agentpool/agents/events/infer_info.py +145 -0
- agentpool/agents/events/processors.py +254 -0
- agentpool/agents/interactions.py +41 -6
- agentpool/agents/modes.py +13 -0
- agentpool/agents/slashed_agent.py +5 -4
- agentpool/agents/tool_wrapping.py +18 -6
- agentpool/common_types.py +35 -21
- agentpool/config_resources/acp_assistant.yml +2 -2
- agentpool/config_resources/agents.yml +3 -0
- agentpool/config_resources/agents_template.yml +1 -0
- agentpool/config_resources/claude_code_agent.yml +9 -8
- agentpool/config_resources/external_acp_agents.yml +2 -1
- agentpool/delegation/base_team.py +4 -30
- agentpool/delegation/pool.py +104 -265
- agentpool/delegation/team.py +57 -57
- agentpool/delegation/teamrun.py +50 -55
- agentpool/functional/run.py +10 -4
- agentpool/mcp_server/client.py +73 -38
- agentpool/mcp_server/conversions.py +54 -13
- agentpool/mcp_server/manager.py +9 -23
- agentpool/mcp_server/registries/official_registry_client.py +10 -1
- agentpool/mcp_server/tool_bridge.py +114 -79
- agentpool/messaging/connection_manager.py +11 -10
- agentpool/messaging/event_manager.py +5 -5
- agentpool/messaging/message_container.py +6 -30
- agentpool/messaging/message_history.py +87 -8
- agentpool/messaging/messagenode.py +52 -14
- agentpool/messaging/messages.py +2 -26
- agentpool/messaging/processing.py +10 -22
- agentpool/models/__init__.py +1 -1
- agentpool/models/acp_agents/base.py +6 -2
- agentpool/models/acp_agents/mcp_capable.py +124 -15
- agentpool/models/acp_agents/non_mcp.py +0 -23
- agentpool/models/agents.py +66 -66
- agentpool/models/agui_agents.py +1 -1
- agentpool/models/claude_code_agents.py +111 -17
- agentpool/models/file_parsing.py +0 -1
- agentpool/models/manifest.py +70 -50
- agentpool/prompts/conversion_manager.py +1 -1
- agentpool/prompts/prompts.py +5 -2
- agentpool/resource_providers/__init__.py +2 -0
- agentpool/resource_providers/aggregating.py +4 -2
- agentpool/resource_providers/base.py +13 -3
- agentpool/resource_providers/codemode/code_executor.py +72 -5
- agentpool/resource_providers/codemode/helpers.py +2 -2
- agentpool/resource_providers/codemode/provider.py +64 -12
- agentpool/resource_providers/codemode/remote_mcp_execution.py +2 -2
- agentpool/resource_providers/codemode/remote_provider.py +9 -12
- agentpool/resource_providers/filtering.py +3 -1
- agentpool/resource_providers/mcp_provider.py +66 -12
- agentpool/resource_providers/plan_provider.py +111 -18
- agentpool/resource_providers/pool.py +5 -3
- agentpool/resource_providers/resource_info.py +111 -0
- agentpool/resource_providers/static.py +2 -2
- agentpool/sessions/__init__.py +2 -0
- agentpool/sessions/manager.py +2 -3
- agentpool/sessions/models.py +9 -6
- agentpool/sessions/protocol.py +28 -0
- agentpool/sessions/session.py +11 -55
- agentpool/storage/manager.py +361 -54
- agentpool/talk/registry.py +4 -4
- agentpool/talk/talk.py +9 -10
- agentpool/testing.py +1 -1
- agentpool/tool_impls/__init__.py +6 -0
- agentpool/tool_impls/agent_cli/__init__.py +42 -0
- agentpool/tool_impls/agent_cli/tool.py +95 -0
- agentpool/tool_impls/bash/__init__.py +64 -0
- agentpool/tool_impls/bash/helpers.py +35 -0
- agentpool/tool_impls/bash/tool.py +171 -0
- agentpool/tool_impls/delete_path/__init__.py +70 -0
- agentpool/tool_impls/delete_path/tool.py +142 -0
- agentpool/tool_impls/download_file/__init__.py +80 -0
- agentpool/tool_impls/download_file/tool.py +183 -0
- agentpool/tool_impls/execute_code/__init__.py +55 -0
- agentpool/tool_impls/execute_code/tool.py +163 -0
- agentpool/tool_impls/grep/__init__.py +80 -0
- agentpool/tool_impls/grep/tool.py +200 -0
- agentpool/tool_impls/list_directory/__init__.py +73 -0
- agentpool/tool_impls/list_directory/tool.py +197 -0
- agentpool/tool_impls/question/__init__.py +42 -0
- agentpool/tool_impls/question/tool.py +127 -0
- agentpool/tool_impls/read/__init__.py +104 -0
- agentpool/tool_impls/read/tool.py +305 -0
- agentpool/tools/__init__.py +2 -1
- agentpool/tools/base.py +114 -34
- agentpool/tools/manager.py +57 -1
- agentpool/ui/base.py +2 -2
- agentpool/ui/mock_provider.py +2 -2
- agentpool/ui/stdlib_provider.py +2 -2
- agentpool/utils/streams.py +21 -96
- agentpool/vfs_registry.py +7 -2
- {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/METADATA +16 -22
- {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/RECORD +242 -195
- {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/WHEEL +1 -1
- agentpool_cli/__main__.py +20 -0
- agentpool_cli/create.py +1 -1
- agentpool_cli/serve_acp.py +59 -1
- agentpool_cli/serve_opencode.py +1 -1
- agentpool_cli/ui.py +557 -0
- agentpool_commands/__init__.py +12 -5
- agentpool_commands/agents.py +1 -1
- agentpool_commands/pool.py +260 -0
- agentpool_commands/session.py +1 -1
- agentpool_commands/text_sharing/__init__.py +119 -0
- agentpool_commands/text_sharing/base.py +123 -0
- agentpool_commands/text_sharing/github_gist.py +80 -0
- agentpool_commands/text_sharing/opencode.py +462 -0
- agentpool_commands/text_sharing/paste_rs.py +59 -0
- agentpool_commands/text_sharing/pastebin.py +116 -0
- agentpool_commands/text_sharing/shittycodingagent.py +112 -0
- agentpool_commands/utils.py +31 -32
- agentpool_config/__init__.py +30 -2
- agentpool_config/agentpool_tools.py +498 -0
- agentpool_config/converters.py +1 -1
- agentpool_config/event_handlers.py +42 -0
- agentpool_config/events.py +1 -1
- agentpool_config/forward_targets.py +1 -4
- agentpool_config/jinja.py +3 -3
- agentpool_config/mcp_server.py +1 -5
- agentpool_config/nodes.py +1 -1
- agentpool_config/observability.py +44 -0
- agentpool_config/session.py +0 -3
- agentpool_config/storage.py +38 -39
- agentpool_config/task.py +3 -3
- agentpool_config/tools.py +11 -28
- agentpool_config/toolsets.py +22 -90
- agentpool_server/a2a_server/agent_worker.py +307 -0
- agentpool_server/a2a_server/server.py +23 -18
- agentpool_server/acp_server/acp_agent.py +125 -56
- agentpool_server/acp_server/commands/acp_commands.py +46 -216
- agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +8 -7
- agentpool_server/acp_server/event_converter.py +651 -0
- agentpool_server/acp_server/input_provider.py +53 -10
- agentpool_server/acp_server/server.py +1 -11
- agentpool_server/acp_server/session.py +90 -410
- agentpool_server/acp_server/session_manager.py +8 -34
- agentpool_server/agui_server/server.py +3 -1
- agentpool_server/mcp_server/server.py +5 -2
- agentpool_server/opencode_server/ENDPOINTS.md +53 -14
- agentpool_server/opencode_server/OPENCODE_UI_TOOLS_COMPLETE.md +202 -0
- agentpool_server/opencode_server/__init__.py +0 -8
- agentpool_server/opencode_server/converters.py +132 -26
- agentpool_server/opencode_server/input_provider.py +160 -8
- agentpool_server/opencode_server/models/__init__.py +42 -20
- agentpool_server/opencode_server/models/app.py +12 -0
- agentpool_server/opencode_server/models/events.py +203 -29
- agentpool_server/opencode_server/models/mcp.py +19 -0
- agentpool_server/opencode_server/models/message.py +18 -1
- agentpool_server/opencode_server/models/parts.py +134 -1
- agentpool_server/opencode_server/models/question.py +56 -0
- agentpool_server/opencode_server/models/session.py +13 -1
- agentpool_server/opencode_server/routes/__init__.py +4 -0
- agentpool_server/opencode_server/routes/agent_routes.py +33 -2
- agentpool_server/opencode_server/routes/app_routes.py +66 -3
- agentpool_server/opencode_server/routes/config_routes.py +66 -5
- agentpool_server/opencode_server/routes/file_routes.py +184 -5
- agentpool_server/opencode_server/routes/global_routes.py +1 -1
- agentpool_server/opencode_server/routes/lsp_routes.py +1 -1
- agentpool_server/opencode_server/routes/message_routes.py +122 -66
- agentpool_server/opencode_server/routes/permission_routes.py +63 -0
- agentpool_server/opencode_server/routes/pty_routes.py +23 -22
- agentpool_server/opencode_server/routes/question_routes.py +128 -0
- agentpool_server/opencode_server/routes/session_routes.py +139 -68
- agentpool_server/opencode_server/routes/tui_routes.py +1 -1
- agentpool_server/opencode_server/server.py +47 -2
- agentpool_server/opencode_server/state.py +30 -0
- agentpool_storage/__init__.py +0 -4
- agentpool_storage/base.py +81 -2
- agentpool_storage/claude_provider/ARCHITECTURE.md +433 -0
- agentpool_storage/claude_provider/__init__.py +42 -0
- agentpool_storage/{claude_provider.py → claude_provider/provider.py} +190 -8
- agentpool_storage/file_provider.py +149 -15
- agentpool_storage/memory_provider.py +132 -12
- agentpool_storage/opencode_provider/ARCHITECTURE.md +386 -0
- agentpool_storage/opencode_provider/__init__.py +16 -0
- agentpool_storage/opencode_provider/helpers.py +414 -0
- agentpool_storage/opencode_provider/provider.py +895 -0
- agentpool_storage/session_store.py +20 -6
- agentpool_storage/sql_provider/sql_provider.py +135 -2
- agentpool_storage/sql_provider/utils.py +2 -12
- agentpool_storage/zed_provider/__init__.py +16 -0
- agentpool_storage/zed_provider/helpers.py +281 -0
- agentpool_storage/zed_provider/models.py +130 -0
- agentpool_storage/zed_provider/provider.py +442 -0
- agentpool_storage/zed_provider.py +803 -0
- agentpool_toolsets/__init__.py +0 -2
- agentpool_toolsets/builtin/__init__.py +2 -4
- agentpool_toolsets/builtin/code.py +4 -4
- agentpool_toolsets/builtin/debug.py +115 -40
- agentpool_toolsets/builtin/execution_environment.py +54 -165
- agentpool_toolsets/builtin/skills.py +0 -77
- agentpool_toolsets/builtin/subagent_tools.py +64 -51
- agentpool_toolsets/builtin/workers.py +4 -2
- agentpool_toolsets/composio_toolset.py +2 -2
- agentpool_toolsets/entry_points.py +3 -1
- agentpool_toolsets/fsspec_toolset/grep.py +25 -5
- agentpool_toolsets/fsspec_toolset/helpers.py +3 -2
- agentpool_toolsets/fsspec_toolset/toolset.py +350 -66
- agentpool_toolsets/mcp_discovery/data/mcp_servers.parquet +0 -0
- agentpool_toolsets/mcp_discovery/toolset.py +74 -17
- agentpool_toolsets/mcp_run_toolset.py +8 -11
- agentpool_toolsets/notifications.py +33 -33
- agentpool_toolsets/openapi.py +3 -1
- agentpool_toolsets/search_toolset.py +3 -1
- agentpool_config/resources.py +0 -33
- agentpool_server/acp_server/acp_tools.py +0 -43
- agentpool_server/acp_server/commands/spawn.py +0 -210
- agentpool_storage/opencode_provider.py +0 -730
- agentpool_storage/text_log_provider.py +0 -276
- agentpool_toolsets/builtin/chain.py +0 -288
- agentpool_toolsets/builtin/user_interaction.py +0 -52
- agentpool_toolsets/semantic_memory_toolset.py +0 -536
- {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/entry_points.txt +0 -0
- {agentpool-2.2.3.dist-info → agentpool-2.5.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -15,9 +15,9 @@ from agentpool.ui.base import InputProvider
|
|
|
15
15
|
|
|
16
16
|
if TYPE_CHECKING:
|
|
17
17
|
from acp import RequestPermissionResponse
|
|
18
|
+
from agentpool import AgentContext
|
|
18
19
|
from agentpool.agents.context import ConfirmationResult
|
|
19
20
|
from agentpool.messaging import ChatMessage
|
|
20
|
-
from agentpool.messaging.context import NodeContext
|
|
21
21
|
from agentpool.tools.base import Tool
|
|
22
22
|
from agentpool_server.acp_server.session import ACPSession
|
|
23
23
|
|
|
@@ -100,7 +100,7 @@ class ACPInputProvider(InputProvider):
|
|
|
100
100
|
|
|
101
101
|
async def get_tool_confirmation(
|
|
102
102
|
self,
|
|
103
|
-
context:
|
|
103
|
+
context: AgentContext[Any],
|
|
104
104
|
tool: Tool,
|
|
105
105
|
args: dict[str, Any],
|
|
106
106
|
message_history: list[ChatMessage[Any]] | None = None,
|
|
@@ -131,18 +131,53 @@ class ACPInputProvider(InputProvider):
|
|
|
131
131
|
return "skip"
|
|
132
132
|
|
|
133
133
|
# Create a descriptive title for the permission request
|
|
134
|
-
args_str = ", ".join(f"{k}={v}" for k, v in args.items())
|
|
134
|
+
# args_str = ", ".join(f"{k}={v}" for k, v in args.items())
|
|
135
|
+
# Use the tool_call_id from context - this must match the UI tool call
|
|
136
|
+
actual_tool_call_id = getattr(context, "tool_call_id", None)
|
|
137
|
+
if not actual_tool_call_id:
|
|
138
|
+
msg = (
|
|
139
|
+
f"No tool_call_id in context for tool {tool.name!r}. "
|
|
140
|
+
"This indicates a bug in tool call tracking."
|
|
141
|
+
)
|
|
142
|
+
logger.error(msg)
|
|
143
|
+
raise RuntimeError(msg) # noqa: TRY301
|
|
144
|
+
logger.debug(
|
|
145
|
+
"Requesting permission",
|
|
146
|
+
tool_name=tool.name,
|
|
147
|
+
tool_call_id=actual_tool_call_id,
|
|
148
|
+
)
|
|
149
|
+
# Note: We no longer send tool_call_start/progress notifications here.
|
|
150
|
+
# The streaming loop (via ACPEventConverter) already sends ToolCallStart
|
|
151
|
+
# before the permission callback is invoked, so Zed already knows about
|
|
152
|
+
# the tool call. Sending duplicates was causing sync issues.
|
|
153
|
+
|
|
154
|
+
from acp.utils import generate_tool_title
|
|
155
|
+
|
|
156
|
+
title = generate_tool_title(tool.name, args)
|
|
135
157
|
response = await self.session.requests.request_permission(
|
|
136
|
-
tool_call_id=
|
|
137
|
-
title=
|
|
158
|
+
tool_call_id=actual_tool_call_id,
|
|
159
|
+
title=title,
|
|
160
|
+
raw_input=args,
|
|
138
161
|
options=DEFAULT_PERMISSION_OPTIONS,
|
|
139
162
|
)
|
|
163
|
+
logger.info(
|
|
164
|
+
"Permission response received",
|
|
165
|
+
tool_name=tool.name,
|
|
166
|
+
outcome=response.outcome,
|
|
167
|
+
outcome_type=type(response.outcome).__name__,
|
|
168
|
+
)
|
|
140
169
|
# Map ACP permission response to our confirmation result
|
|
141
170
|
if isinstance(response.outcome, AllowedOutcome):
|
|
171
|
+
logger.info(
|
|
172
|
+
"AllowedOutcome detected",
|
|
173
|
+
option_id=response.outcome.option_id,
|
|
174
|
+
tool_name=tool.name,
|
|
175
|
+
)
|
|
142
176
|
return self._handle_permission_response(response.outcome.option_id, tool.name)
|
|
143
177
|
if response.outcome.outcome == "cancelled":
|
|
178
|
+
logger.debug("Permission cancelled", tool_name=tool.name)
|
|
144
179
|
return "skip"
|
|
145
|
-
# Handle other outcomes
|
|
180
|
+
# Handle other unexpected outcomes
|
|
146
181
|
logger.warning("Unexpected permission outcome", outcome=response.outcome.outcome)
|
|
147
182
|
|
|
148
183
|
except Exception:
|
|
@@ -150,20 +185,28 @@ class ACPInputProvider(InputProvider):
|
|
|
150
185
|
# Default to abort on error to be safe
|
|
151
186
|
return "abort_run"
|
|
152
187
|
else:
|
|
153
|
-
return "
|
|
188
|
+
return "skip" # Default to skip for unknown outcomes
|
|
154
189
|
|
|
155
190
|
def _handle_permission_response(self, option_id: str, tool_name: str) -> ConfirmationResult:
|
|
156
191
|
"""Handle permission response and update tool approval state."""
|
|
157
|
-
|
|
192
|
+
# Normalize to hyphen format for matching
|
|
193
|
+
normalized = option_id.replace("_", "-")
|
|
194
|
+
logger.info(
|
|
195
|
+
"Handling permission response",
|
|
196
|
+
option_id=option_id,
|
|
197
|
+
normalized=normalized,
|
|
198
|
+
tool_name=tool_name,
|
|
199
|
+
)
|
|
200
|
+
match normalized:
|
|
158
201
|
case "allow-once":
|
|
159
202
|
return "allow"
|
|
160
203
|
case "allow-always":
|
|
161
204
|
self._tool_approvals[tool_name] = "allow_always"
|
|
162
205
|
logger.info("Tool approval set", tool_name=tool_name, approval="allow_always")
|
|
163
206
|
return "allow"
|
|
164
|
-
case "reject-once":
|
|
207
|
+
case "reject-once" | "deny-once":
|
|
165
208
|
return "skip"
|
|
166
|
-
case "reject-always":
|
|
209
|
+
case "reject-always" | "deny-always":
|
|
167
210
|
self._tool_approvals[tool_name] = "reject_always"
|
|
168
211
|
logger.info("Tool approval set", tool_name=tool_name, approval="reject_always")
|
|
169
212
|
return "skip"
|
|
@@ -169,11 +169,7 @@ class ACPServer(BaseServer):
|
|
|
169
169
|
except Exception:
|
|
170
170
|
self.log.exception("ACP server error")
|
|
171
171
|
|
|
172
|
-
async def swap_pool(
|
|
173
|
-
self,
|
|
174
|
-
config_path: str,
|
|
175
|
-
agent: str | None = None,
|
|
176
|
-
) -> list[str]:
|
|
172
|
+
async def swap_pool(self, config_path: str, agent: str | None = None) -> list[str]:
|
|
177
173
|
"""Swap the current pool with a new one from config.
|
|
178
174
|
|
|
179
175
|
This method handles the full lifecycle of swapping pools:
|
|
@@ -197,17 +193,14 @@ class ACPServer(BaseServer):
|
|
|
197
193
|
self.log.info("Loading new pool configuration", config_path=config_path)
|
|
198
194
|
new_manifest = AgentsManifest.from_file(config_path)
|
|
199
195
|
new_pool = AgentPool(manifest=new_manifest)
|
|
200
|
-
|
|
201
196
|
# 2. Validate agent exists in new pool if specified
|
|
202
197
|
agent_names = list(new_pool.all_agents.keys())
|
|
203
198
|
if not agent_names:
|
|
204
199
|
msg = "New configuration contains no agents"
|
|
205
200
|
raise ValueError(msg)
|
|
206
|
-
|
|
207
201
|
if agent and agent not in agent_names:
|
|
208
202
|
msg = f"Agent {agent!r} not found in new config. Available: {agent_names}"
|
|
209
203
|
raise ValueError(msg)
|
|
210
|
-
|
|
211
204
|
# 3. Enter new pool context first (so we can roll back if it fails)
|
|
212
205
|
try:
|
|
213
206
|
await new_pool.__aenter__()
|
|
@@ -215,18 +208,15 @@ class ACPServer(BaseServer):
|
|
|
215
208
|
self.log.exception("Failed to initialize new pool")
|
|
216
209
|
msg = f"Failed to initialize new pool: {e}"
|
|
217
210
|
raise ValueError(msg) from e
|
|
218
|
-
|
|
219
211
|
# 4. Exit old pool context
|
|
220
212
|
old_pool = self.pool
|
|
221
213
|
try:
|
|
222
214
|
await old_pool.__aexit__(None, None, None)
|
|
223
215
|
except Exception:
|
|
224
216
|
self.log.exception("Error closing old pool (continuing with swap)")
|
|
225
|
-
|
|
226
217
|
# 5. Update references
|
|
227
218
|
self.pool = new_pool
|
|
228
219
|
self.agent = agent
|
|
229
220
|
self.config_path = config_path
|
|
230
|
-
|
|
231
221
|
self.log.info("Pool swapped successfully", agent_names=agent_names, default_agent=agent)
|
|
232
222
|
return agent_names
|