agentpool 2.1.9__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.

Potentially problematic release.


This version of agentpool might be problematic. Click here for more details.

Files changed (474) hide show
  1. acp/README.md +64 -0
  2. acp/__init__.py +172 -0
  3. acp/__main__.py +10 -0
  4. acp/acp_requests.py +285 -0
  5. acp/agent/__init__.py +6 -0
  6. acp/agent/connection.py +256 -0
  7. acp/agent/implementations/__init__.py +6 -0
  8. acp/agent/implementations/debug_server/__init__.py +1 -0
  9. acp/agent/implementations/debug_server/cli.py +79 -0
  10. acp/agent/implementations/debug_server/debug.html +234 -0
  11. acp/agent/implementations/debug_server/debug_server.py +496 -0
  12. acp/agent/implementations/testing.py +91 -0
  13. acp/agent/protocol.py +65 -0
  14. acp/bridge/README.md +162 -0
  15. acp/bridge/__init__.py +6 -0
  16. acp/bridge/__main__.py +91 -0
  17. acp/bridge/bridge.py +246 -0
  18. acp/bridge/py.typed +0 -0
  19. acp/bridge/settings.py +15 -0
  20. acp/client/__init__.py +7 -0
  21. acp/client/connection.py +251 -0
  22. acp/client/implementations/__init__.py +7 -0
  23. acp/client/implementations/default_client.py +185 -0
  24. acp/client/implementations/headless_client.py +266 -0
  25. acp/client/implementations/noop_client.py +110 -0
  26. acp/client/protocol.py +61 -0
  27. acp/connection.py +280 -0
  28. acp/exceptions.py +46 -0
  29. acp/filesystem.py +524 -0
  30. acp/notifications.py +832 -0
  31. acp/py.typed +0 -0
  32. acp/schema/__init__.py +265 -0
  33. acp/schema/agent_plan.py +30 -0
  34. acp/schema/agent_requests.py +126 -0
  35. acp/schema/agent_responses.py +256 -0
  36. acp/schema/base.py +39 -0
  37. acp/schema/capabilities.py +230 -0
  38. acp/schema/client_requests.py +247 -0
  39. acp/schema/client_responses.py +96 -0
  40. acp/schema/common.py +81 -0
  41. acp/schema/content_blocks.py +188 -0
  42. acp/schema/mcp.py +82 -0
  43. acp/schema/messages.py +171 -0
  44. acp/schema/notifications.py +82 -0
  45. acp/schema/protocol_stuff.md +3 -0
  46. acp/schema/session_state.py +160 -0
  47. acp/schema/session_updates.py +419 -0
  48. acp/schema/slash_commands.py +51 -0
  49. acp/schema/terminal.py +15 -0
  50. acp/schema/tool_call.py +347 -0
  51. acp/stdio.py +250 -0
  52. acp/task/__init__.py +53 -0
  53. acp/task/debug.py +197 -0
  54. acp/task/dispatcher.py +93 -0
  55. acp/task/queue.py +69 -0
  56. acp/task/sender.py +82 -0
  57. acp/task/state.py +87 -0
  58. acp/task/supervisor.py +93 -0
  59. acp/terminal_handle.py +30 -0
  60. acp/tool_call_reporter.py +199 -0
  61. acp/tool_call_state.py +178 -0
  62. acp/transports.py +104 -0
  63. acp/utils.py +240 -0
  64. agentpool/__init__.py +63 -0
  65. agentpool/__main__.py +7 -0
  66. agentpool/agents/__init__.py +30 -0
  67. agentpool/agents/acp_agent/__init__.py +5 -0
  68. agentpool/agents/acp_agent/acp_agent.py +837 -0
  69. agentpool/agents/acp_agent/acp_converters.py +294 -0
  70. agentpool/agents/acp_agent/client_handler.py +317 -0
  71. agentpool/agents/acp_agent/session_state.py +44 -0
  72. agentpool/agents/agent.py +1264 -0
  73. agentpool/agents/agui_agent/__init__.py +19 -0
  74. agentpool/agents/agui_agent/agui_agent.py +677 -0
  75. agentpool/agents/agui_agent/agui_converters.py +423 -0
  76. agentpool/agents/agui_agent/chunk_transformer.py +204 -0
  77. agentpool/agents/agui_agent/event_types.py +83 -0
  78. agentpool/agents/agui_agent/helpers.py +192 -0
  79. agentpool/agents/architect.py +71 -0
  80. agentpool/agents/base_agent.py +177 -0
  81. agentpool/agents/claude_code_agent/__init__.py +11 -0
  82. agentpool/agents/claude_code_agent/claude_code_agent.py +1021 -0
  83. agentpool/agents/claude_code_agent/converters.py +243 -0
  84. agentpool/agents/context.py +105 -0
  85. agentpool/agents/events/__init__.py +61 -0
  86. agentpool/agents/events/builtin_handlers.py +129 -0
  87. agentpool/agents/events/event_emitter.py +320 -0
  88. agentpool/agents/events/events.py +561 -0
  89. agentpool/agents/events/tts_handlers.py +186 -0
  90. agentpool/agents/interactions.py +419 -0
  91. agentpool/agents/slashed_agent.py +244 -0
  92. agentpool/agents/sys_prompts.py +178 -0
  93. agentpool/agents/tool_wrapping.py +184 -0
  94. agentpool/base_provider.py +28 -0
  95. agentpool/common_types.py +226 -0
  96. agentpool/config_resources/__init__.py +16 -0
  97. agentpool/config_resources/acp_assistant.yml +24 -0
  98. agentpool/config_resources/agents.yml +109 -0
  99. agentpool/config_resources/agents_template.yml +18 -0
  100. agentpool/config_resources/agui_test.yml +18 -0
  101. agentpool/config_resources/claude_code_agent.yml +16 -0
  102. agentpool/config_resources/claude_style_subagent.md +30 -0
  103. agentpool/config_resources/external_acp_agents.yml +77 -0
  104. agentpool/config_resources/opencode_style_subagent.md +19 -0
  105. agentpool/config_resources/tts_test_agents.yml +78 -0
  106. agentpool/delegation/__init__.py +8 -0
  107. agentpool/delegation/base_team.py +504 -0
  108. agentpool/delegation/message_flow_tracker.py +39 -0
  109. agentpool/delegation/pool.py +1129 -0
  110. agentpool/delegation/team.py +325 -0
  111. agentpool/delegation/teamrun.py +343 -0
  112. agentpool/docs/__init__.py +5 -0
  113. agentpool/docs/gen_examples.py +42 -0
  114. agentpool/docs/utils.py +370 -0
  115. agentpool/functional/__init__.py +20 -0
  116. agentpool/functional/py.typed +0 -0
  117. agentpool/functional/run.py +80 -0
  118. agentpool/functional/structure.py +136 -0
  119. agentpool/hooks/__init__.py +20 -0
  120. agentpool/hooks/agent_hooks.py +247 -0
  121. agentpool/hooks/base.py +119 -0
  122. agentpool/hooks/callable.py +140 -0
  123. agentpool/hooks/command.py +180 -0
  124. agentpool/hooks/prompt.py +122 -0
  125. agentpool/jinja_filters.py +132 -0
  126. agentpool/log.py +224 -0
  127. agentpool/mcp_server/__init__.py +17 -0
  128. agentpool/mcp_server/client.py +429 -0
  129. agentpool/mcp_server/constants.py +32 -0
  130. agentpool/mcp_server/conversions.py +172 -0
  131. agentpool/mcp_server/helpers.py +47 -0
  132. agentpool/mcp_server/manager.py +232 -0
  133. agentpool/mcp_server/message_handler.py +164 -0
  134. agentpool/mcp_server/registries/__init__.py +1 -0
  135. agentpool/mcp_server/registries/official_registry_client.py +345 -0
  136. agentpool/mcp_server/registries/pulsemcp_client.py +88 -0
  137. agentpool/mcp_server/tool_bridge.py +548 -0
  138. agentpool/messaging/__init__.py +58 -0
  139. agentpool/messaging/compaction.py +928 -0
  140. agentpool/messaging/connection_manager.py +319 -0
  141. agentpool/messaging/context.py +66 -0
  142. agentpool/messaging/event_manager.py +426 -0
  143. agentpool/messaging/events.py +39 -0
  144. agentpool/messaging/message_container.py +209 -0
  145. agentpool/messaging/message_history.py +491 -0
  146. agentpool/messaging/messagenode.py +377 -0
  147. agentpool/messaging/messages.py +655 -0
  148. agentpool/messaging/processing.py +76 -0
  149. agentpool/mime_utils.py +95 -0
  150. agentpool/models/__init__.py +21 -0
  151. agentpool/models/acp_agents/__init__.py +22 -0
  152. agentpool/models/acp_agents/base.py +308 -0
  153. agentpool/models/acp_agents/mcp_capable.py +790 -0
  154. agentpool/models/acp_agents/non_mcp.py +842 -0
  155. agentpool/models/agents.py +450 -0
  156. agentpool/models/agui_agents.py +89 -0
  157. agentpool/models/claude_code_agents.py +238 -0
  158. agentpool/models/file_agents.py +116 -0
  159. agentpool/models/file_parsing.py +367 -0
  160. agentpool/models/manifest.py +658 -0
  161. agentpool/observability/__init__.py +9 -0
  162. agentpool/observability/observability_registry.py +97 -0
  163. agentpool/prompts/__init__.py +1 -0
  164. agentpool/prompts/base.py +27 -0
  165. agentpool/prompts/builtin_provider.py +75 -0
  166. agentpool/prompts/conversion_manager.py +95 -0
  167. agentpool/prompts/convert.py +96 -0
  168. agentpool/prompts/manager.py +204 -0
  169. agentpool/prompts/parts/zed.md +33 -0
  170. agentpool/prompts/prompts.py +581 -0
  171. agentpool/py.typed +0 -0
  172. agentpool/queries/tree-sitter-language-pack/README.md +7 -0
  173. agentpool/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
  174. agentpool/queries/tree-sitter-language-pack/c-tags.scm +9 -0
  175. agentpool/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
  176. agentpool/queries/tree-sitter-language-pack/clojure-tags.scm +7 -0
  177. agentpool/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
  178. agentpool/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
  179. agentpool/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
  180. agentpool/queries/tree-sitter-language-pack/d-tags.scm +26 -0
  181. agentpool/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
  182. agentpool/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
  183. agentpool/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
  184. agentpool/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
  185. agentpool/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
  186. agentpool/queries/tree-sitter-language-pack/go-tags.scm +42 -0
  187. agentpool/queries/tree-sitter-language-pack/java-tags.scm +20 -0
  188. agentpool/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
  189. agentpool/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
  190. agentpool/queries/tree-sitter-language-pack/matlab-tags.scm +10 -0
  191. agentpool/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
  192. agentpool/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
  193. agentpool/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
  194. agentpool/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
  195. agentpool/queries/tree-sitter-language-pack/python-tags.scm +14 -0
  196. agentpool/queries/tree-sitter-language-pack/r-tags.scm +21 -0
  197. agentpool/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
  198. agentpool/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
  199. agentpool/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
  200. agentpool/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
  201. agentpool/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
  202. agentpool/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
  203. agentpool/queries/tree-sitter-languages/README.md +24 -0
  204. agentpool/queries/tree-sitter-languages/c-tags.scm +9 -0
  205. agentpool/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
  206. agentpool/queries/tree-sitter-languages/cpp-tags.scm +15 -0
  207. agentpool/queries/tree-sitter-languages/dart-tags.scm +91 -0
  208. agentpool/queries/tree-sitter-languages/elisp-tags.scm +8 -0
  209. agentpool/queries/tree-sitter-languages/elixir-tags.scm +54 -0
  210. agentpool/queries/tree-sitter-languages/elm-tags.scm +19 -0
  211. agentpool/queries/tree-sitter-languages/fortran-tags.scm +15 -0
  212. agentpool/queries/tree-sitter-languages/go-tags.scm +30 -0
  213. agentpool/queries/tree-sitter-languages/haskell-tags.scm +3 -0
  214. agentpool/queries/tree-sitter-languages/hcl-tags.scm +77 -0
  215. agentpool/queries/tree-sitter-languages/java-tags.scm +20 -0
  216. agentpool/queries/tree-sitter-languages/javascript-tags.scm +88 -0
  217. agentpool/queries/tree-sitter-languages/julia-tags.scm +60 -0
  218. agentpool/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
  219. agentpool/queries/tree-sitter-languages/matlab-tags.scm +10 -0
  220. agentpool/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
  221. agentpool/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
  222. agentpool/queries/tree-sitter-languages/php-tags.scm +26 -0
  223. agentpool/queries/tree-sitter-languages/python-tags.scm +12 -0
  224. agentpool/queries/tree-sitter-languages/ql-tags.scm +26 -0
  225. agentpool/queries/tree-sitter-languages/ruby-tags.scm +64 -0
  226. agentpool/queries/tree-sitter-languages/rust-tags.scm +60 -0
  227. agentpool/queries/tree-sitter-languages/scala-tags.scm +65 -0
  228. agentpool/queries/tree-sitter-languages/typescript-tags.scm +41 -0
  229. agentpool/queries/tree-sitter-languages/zig-tags.scm +3 -0
  230. agentpool/repomap.py +1231 -0
  231. agentpool/resource_providers/__init__.py +17 -0
  232. agentpool/resource_providers/aggregating.py +54 -0
  233. agentpool/resource_providers/base.py +172 -0
  234. agentpool/resource_providers/codemode/__init__.py +9 -0
  235. agentpool/resource_providers/codemode/code_executor.py +215 -0
  236. agentpool/resource_providers/codemode/default_prompt.py +19 -0
  237. agentpool/resource_providers/codemode/helpers.py +83 -0
  238. agentpool/resource_providers/codemode/progress_executor.py +212 -0
  239. agentpool/resource_providers/codemode/provider.py +150 -0
  240. agentpool/resource_providers/codemode/remote_mcp_execution.py +143 -0
  241. agentpool/resource_providers/codemode/remote_provider.py +171 -0
  242. agentpool/resource_providers/filtering.py +42 -0
  243. agentpool/resource_providers/mcp_provider.py +246 -0
  244. agentpool/resource_providers/plan_provider.py +196 -0
  245. agentpool/resource_providers/pool.py +69 -0
  246. agentpool/resource_providers/static.py +289 -0
  247. agentpool/running/__init__.py +20 -0
  248. agentpool/running/decorators.py +56 -0
  249. agentpool/running/discovery.py +101 -0
  250. agentpool/running/executor.py +284 -0
  251. agentpool/running/injection.py +111 -0
  252. agentpool/running/py.typed +0 -0
  253. agentpool/running/run_nodes.py +87 -0
  254. agentpool/server.py +122 -0
  255. agentpool/sessions/__init__.py +13 -0
  256. agentpool/sessions/manager.py +302 -0
  257. agentpool/sessions/models.py +71 -0
  258. agentpool/sessions/session.py +239 -0
  259. agentpool/sessions/store.py +163 -0
  260. agentpool/skills/__init__.py +5 -0
  261. agentpool/skills/manager.py +120 -0
  262. agentpool/skills/registry.py +210 -0
  263. agentpool/skills/skill.py +36 -0
  264. agentpool/storage/__init__.py +17 -0
  265. agentpool/storage/manager.py +419 -0
  266. agentpool/storage/serialization.py +136 -0
  267. agentpool/talk/__init__.py +13 -0
  268. agentpool/talk/registry.py +128 -0
  269. agentpool/talk/stats.py +159 -0
  270. agentpool/talk/talk.py +604 -0
  271. agentpool/tasks/__init__.py +20 -0
  272. agentpool/tasks/exceptions.py +25 -0
  273. agentpool/tasks/registry.py +33 -0
  274. agentpool/testing.py +129 -0
  275. agentpool/text_templates/__init__.py +39 -0
  276. agentpool/text_templates/system_prompt.jinja +30 -0
  277. agentpool/text_templates/tool_call_default.jinja +13 -0
  278. agentpool/text_templates/tool_call_markdown.jinja +25 -0
  279. agentpool/text_templates/tool_call_simple.jinja +5 -0
  280. agentpool/tools/__init__.py +16 -0
  281. agentpool/tools/base.py +269 -0
  282. agentpool/tools/exceptions.py +9 -0
  283. agentpool/tools/manager.py +255 -0
  284. agentpool/tools/tool_call_info.py +87 -0
  285. agentpool/ui/__init__.py +2 -0
  286. agentpool/ui/base.py +89 -0
  287. agentpool/ui/mock_provider.py +81 -0
  288. agentpool/ui/stdlib_provider.py +150 -0
  289. agentpool/utils/__init__.py +44 -0
  290. agentpool/utils/baseregistry.py +185 -0
  291. agentpool/utils/count_tokens.py +62 -0
  292. agentpool/utils/dag.py +184 -0
  293. agentpool/utils/importing.py +206 -0
  294. agentpool/utils/inspection.py +334 -0
  295. agentpool/utils/model_capabilities.py +25 -0
  296. agentpool/utils/network.py +28 -0
  297. agentpool/utils/now.py +22 -0
  298. agentpool/utils/parse_time.py +87 -0
  299. agentpool/utils/result_utils.py +35 -0
  300. agentpool/utils/signatures.py +305 -0
  301. agentpool/utils/streams.py +112 -0
  302. agentpool/utils/tasks.py +186 -0
  303. agentpool/vfs_registry.py +250 -0
  304. agentpool-2.1.9.dist-info/METADATA +336 -0
  305. agentpool-2.1.9.dist-info/RECORD +474 -0
  306. agentpool-2.1.9.dist-info/WHEEL +4 -0
  307. agentpool-2.1.9.dist-info/entry_points.txt +14 -0
  308. agentpool-2.1.9.dist-info/licenses/LICENSE +22 -0
  309. agentpool_cli/__init__.py +34 -0
  310. agentpool_cli/__main__.py +66 -0
  311. agentpool_cli/agent.py +175 -0
  312. agentpool_cli/cli_types.py +23 -0
  313. agentpool_cli/common.py +163 -0
  314. agentpool_cli/create.py +175 -0
  315. agentpool_cli/history.py +217 -0
  316. agentpool_cli/log.py +78 -0
  317. agentpool_cli/py.typed +0 -0
  318. agentpool_cli/run.py +84 -0
  319. agentpool_cli/serve_acp.py +177 -0
  320. agentpool_cli/serve_api.py +69 -0
  321. agentpool_cli/serve_mcp.py +74 -0
  322. agentpool_cli/serve_vercel.py +233 -0
  323. agentpool_cli/store.py +171 -0
  324. agentpool_cli/task.py +84 -0
  325. agentpool_cli/utils.py +104 -0
  326. agentpool_cli/watch.py +54 -0
  327. agentpool_commands/__init__.py +180 -0
  328. agentpool_commands/agents.py +199 -0
  329. agentpool_commands/base.py +45 -0
  330. agentpool_commands/commands.py +58 -0
  331. agentpool_commands/completers.py +110 -0
  332. agentpool_commands/connections.py +175 -0
  333. agentpool_commands/markdown_utils.py +31 -0
  334. agentpool_commands/models.py +62 -0
  335. agentpool_commands/prompts.py +78 -0
  336. agentpool_commands/py.typed +0 -0
  337. agentpool_commands/read.py +77 -0
  338. agentpool_commands/resources.py +210 -0
  339. agentpool_commands/session.py +48 -0
  340. agentpool_commands/tools.py +269 -0
  341. agentpool_commands/utils.py +189 -0
  342. agentpool_commands/workers.py +163 -0
  343. agentpool_config/__init__.py +53 -0
  344. agentpool_config/builtin_tools.py +265 -0
  345. agentpool_config/commands.py +237 -0
  346. agentpool_config/conditions.py +301 -0
  347. agentpool_config/converters.py +30 -0
  348. agentpool_config/durable.py +331 -0
  349. agentpool_config/event_handlers.py +600 -0
  350. agentpool_config/events.py +153 -0
  351. agentpool_config/forward_targets.py +251 -0
  352. agentpool_config/hook_conditions.py +331 -0
  353. agentpool_config/hooks.py +241 -0
  354. agentpool_config/jinja.py +206 -0
  355. agentpool_config/knowledge.py +41 -0
  356. agentpool_config/loaders.py +350 -0
  357. agentpool_config/mcp_server.py +243 -0
  358. agentpool_config/nodes.py +202 -0
  359. agentpool_config/observability.py +191 -0
  360. agentpool_config/output_types.py +55 -0
  361. agentpool_config/pool_server.py +267 -0
  362. agentpool_config/prompt_hubs.py +105 -0
  363. agentpool_config/prompts.py +185 -0
  364. agentpool_config/py.typed +0 -0
  365. agentpool_config/resources.py +33 -0
  366. agentpool_config/session.py +119 -0
  367. agentpool_config/skills.py +17 -0
  368. agentpool_config/storage.py +288 -0
  369. agentpool_config/system_prompts.py +190 -0
  370. agentpool_config/task.py +162 -0
  371. agentpool_config/teams.py +52 -0
  372. agentpool_config/tools.py +112 -0
  373. agentpool_config/toolsets.py +1033 -0
  374. agentpool_config/workers.py +86 -0
  375. agentpool_prompts/__init__.py +1 -0
  376. agentpool_prompts/braintrust_hub.py +235 -0
  377. agentpool_prompts/fabric.py +75 -0
  378. agentpool_prompts/langfuse_hub.py +79 -0
  379. agentpool_prompts/promptlayer_provider.py +59 -0
  380. agentpool_prompts/py.typed +0 -0
  381. agentpool_server/__init__.py +9 -0
  382. agentpool_server/a2a_server/__init__.py +5 -0
  383. agentpool_server/a2a_server/a2a_types.py +41 -0
  384. agentpool_server/a2a_server/server.py +190 -0
  385. agentpool_server/a2a_server/storage.py +81 -0
  386. agentpool_server/acp_server/__init__.py +22 -0
  387. agentpool_server/acp_server/acp_agent.py +786 -0
  388. agentpool_server/acp_server/acp_tools.py +43 -0
  389. agentpool_server/acp_server/commands/__init__.py +18 -0
  390. agentpool_server/acp_server/commands/acp_commands.py +594 -0
  391. agentpool_server/acp_server/commands/debug_commands.py +376 -0
  392. agentpool_server/acp_server/commands/docs_commands/__init__.py +39 -0
  393. agentpool_server/acp_server/commands/docs_commands/fetch_repo.py +169 -0
  394. agentpool_server/acp_server/commands/docs_commands/get_schema.py +176 -0
  395. agentpool_server/acp_server/commands/docs_commands/get_source.py +110 -0
  396. agentpool_server/acp_server/commands/docs_commands/git_diff.py +111 -0
  397. agentpool_server/acp_server/commands/docs_commands/helpers.py +33 -0
  398. agentpool_server/acp_server/commands/docs_commands/url_to_markdown.py +90 -0
  399. agentpool_server/acp_server/commands/spawn.py +210 -0
  400. agentpool_server/acp_server/converters.py +235 -0
  401. agentpool_server/acp_server/input_provider.py +338 -0
  402. agentpool_server/acp_server/server.py +288 -0
  403. agentpool_server/acp_server/session.py +969 -0
  404. agentpool_server/acp_server/session_manager.py +313 -0
  405. agentpool_server/acp_server/syntax_detection.py +250 -0
  406. agentpool_server/acp_server/zed_tools.md +90 -0
  407. agentpool_server/aggregating_server.py +309 -0
  408. agentpool_server/agui_server/__init__.py +11 -0
  409. agentpool_server/agui_server/server.py +128 -0
  410. agentpool_server/base.py +189 -0
  411. agentpool_server/http_server.py +164 -0
  412. agentpool_server/mcp_server/__init__.py +6 -0
  413. agentpool_server/mcp_server/server.py +314 -0
  414. agentpool_server/mcp_server/zed_wrapper.py +110 -0
  415. agentpool_server/openai_api_server/__init__.py +5 -0
  416. agentpool_server/openai_api_server/completions/__init__.py +1 -0
  417. agentpool_server/openai_api_server/completions/helpers.py +81 -0
  418. agentpool_server/openai_api_server/completions/models.py +98 -0
  419. agentpool_server/openai_api_server/responses/__init__.py +1 -0
  420. agentpool_server/openai_api_server/responses/helpers.py +74 -0
  421. agentpool_server/openai_api_server/responses/models.py +96 -0
  422. agentpool_server/openai_api_server/server.py +242 -0
  423. agentpool_server/py.typed +0 -0
  424. agentpool_storage/__init__.py +9 -0
  425. agentpool_storage/base.py +310 -0
  426. agentpool_storage/file_provider.py +378 -0
  427. agentpool_storage/formatters.py +129 -0
  428. agentpool_storage/memory_provider.py +396 -0
  429. agentpool_storage/models.py +108 -0
  430. agentpool_storage/py.typed +0 -0
  431. agentpool_storage/session_store.py +262 -0
  432. agentpool_storage/sql_provider/__init__.py +21 -0
  433. agentpool_storage/sql_provider/cli.py +146 -0
  434. agentpool_storage/sql_provider/models.py +249 -0
  435. agentpool_storage/sql_provider/queries.py +15 -0
  436. agentpool_storage/sql_provider/sql_provider.py +444 -0
  437. agentpool_storage/sql_provider/utils.py +234 -0
  438. agentpool_storage/text_log_provider.py +275 -0
  439. agentpool_toolsets/__init__.py +15 -0
  440. agentpool_toolsets/builtin/__init__.py +33 -0
  441. agentpool_toolsets/builtin/agent_management.py +239 -0
  442. agentpool_toolsets/builtin/chain.py +288 -0
  443. agentpool_toolsets/builtin/code.py +398 -0
  444. agentpool_toolsets/builtin/debug.py +291 -0
  445. agentpool_toolsets/builtin/execution_environment.py +381 -0
  446. agentpool_toolsets/builtin/file_edit/__init__.py +11 -0
  447. agentpool_toolsets/builtin/file_edit/file_edit.py +747 -0
  448. agentpool_toolsets/builtin/file_edit/fuzzy_matcher/__init__.py +5 -0
  449. agentpool_toolsets/builtin/file_edit/fuzzy_matcher/example_usage.py +311 -0
  450. agentpool_toolsets/builtin/file_edit/fuzzy_matcher/streaming_fuzzy_matcher.py +443 -0
  451. agentpool_toolsets/builtin/history.py +36 -0
  452. agentpool_toolsets/builtin/integration.py +85 -0
  453. agentpool_toolsets/builtin/skills.py +77 -0
  454. agentpool_toolsets/builtin/subagent_tools.py +324 -0
  455. agentpool_toolsets/builtin/tool_management.py +90 -0
  456. agentpool_toolsets/builtin/user_interaction.py +52 -0
  457. agentpool_toolsets/builtin/workers.py +128 -0
  458. agentpool_toolsets/composio_toolset.py +96 -0
  459. agentpool_toolsets/config_creation.py +192 -0
  460. agentpool_toolsets/entry_points.py +47 -0
  461. agentpool_toolsets/fsspec_toolset/__init__.py +7 -0
  462. agentpool_toolsets/fsspec_toolset/diagnostics.py +115 -0
  463. agentpool_toolsets/fsspec_toolset/grep.py +450 -0
  464. agentpool_toolsets/fsspec_toolset/helpers.py +631 -0
  465. agentpool_toolsets/fsspec_toolset/streaming_diff_parser.py +249 -0
  466. agentpool_toolsets/fsspec_toolset/toolset.py +1384 -0
  467. agentpool_toolsets/mcp_run_toolset.py +61 -0
  468. agentpool_toolsets/notifications.py +146 -0
  469. agentpool_toolsets/openapi.py +118 -0
  470. agentpool_toolsets/py.typed +0 -0
  471. agentpool_toolsets/search_toolset.py +202 -0
  472. agentpool_toolsets/semantic_memory_toolset.py +536 -0
  473. agentpool_toolsets/streaming_tools.py +265 -0
  474. agentpool_toolsets/vfs_toolset.py +124 -0
@@ -0,0 +1,43 @@
1
+ """ACP resource providers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from exxec.acp_provider import ACPExecutionEnvironment
8
+
9
+ from agentpool.resource_providers import PlanProvider
10
+ from agentpool_toolsets.builtin import CodeTools, ExecutionEnvironmentTools
11
+ from agentpool_toolsets.fsspec_toolset import FSSpecTools
12
+
13
+
14
+ if TYPE_CHECKING:
15
+ from agentpool.resource_providers.aggregating import AggregatingResourceProvider
16
+ from agentpool_server.acp_server.session import ACPSession
17
+
18
+
19
+ def get_acp_provider(session: ACPSession) -> AggregatingResourceProvider:
20
+ """Create aggregated resource provider with ACP-specific toolsets.
21
+
22
+ Args:
23
+ session: The ACP session to create providers for
24
+
25
+ Returns:
26
+ AggregatingResourceProvider with execution, filesystem, and code tools
27
+ """
28
+ from agentpool.resource_providers.aggregating import AggregatingResourceProvider
29
+
30
+ execution_env = ACPExecutionEnvironment(
31
+ fs=session.fs, requests=session.requests, cwd=session.cwd
32
+ )
33
+
34
+ providers = [
35
+ PlanProvider(),
36
+ ExecutionEnvironmentTools(env=execution_env, name=f"acp_execution_{session.session_id}"),
37
+ FSSpecTools(execution_env, name=f"acp_fs_{session.session_id}", cwd=session.cwd),
38
+ CodeTools(execution_env, name=f"acp_code_{session.session_id}", cwd=session.cwd),
39
+ ]
40
+ return AggregatingResourceProvider(providers=providers, name=f"acp_{session.session_id}")
41
+
42
+
43
+ __all__ = ["get_acp_provider"]
@@ -0,0 +1,18 @@
1
+ """Slash commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from .docs_commands import get_docs_commands
6
+ from .acp_commands import get_acp_commands
7
+ from typing import TYPE_CHECKING
8
+
9
+ if TYPE_CHECKING:
10
+ from slashed import SlashedCommand
11
+
12
+
13
+ def get_commands() -> list[type[SlashedCommand]]:
14
+ """Get all ACP-specific commands."""
15
+ return [*get_acp_commands(), *get_docs_commands()]
16
+
17
+
18
+ __all__ = ["get_acp_commands", "get_docs_commands"]
@@ -0,0 +1,594 @@
1
+ """ACP-specific slash commands for session management."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from slashed import CommandContext # noqa: TC002
8
+
9
+ from agentpool.messaging.context import NodeContext # noqa: TC001
10
+ from agentpool_commands.base import NodeCommand
11
+ from agentpool_config.session import SessionQuery
12
+ from agentpool_server.acp_server.session import ACPSession # noqa: TC001
13
+
14
+
15
+ if TYPE_CHECKING:
16
+ from pydantic_ai import ModelRequest, ModelResponse
17
+
18
+
19
+ class ListSessionsCommand(NodeCommand):
20
+ """List all available ACP sessions.
21
+
22
+ Shows:
23
+ - Session ID and status (active/stored)
24
+ - Agent name and working directory
25
+ - Creation time and last activity
26
+
27
+ Options:
28
+ --active Show only active sessions
29
+ --stored Show only stored sessions
30
+ """
31
+
32
+ name = "list-sessions"
33
+ category = "acp"
34
+
35
+ async def execute_command(
36
+ self,
37
+ ctx: CommandContext[NodeContext[ACPSession]],
38
+ *,
39
+ active: bool = False,
40
+ stored: bool = False,
41
+ ) -> None:
42
+ """List available ACP sessions.
43
+
44
+ Args:
45
+ ctx: Command context with ACP session
46
+ active: Show only active sessions
47
+ stored: Show only stored sessions
48
+ """
49
+ session = ctx.context.data
50
+ if not session:
51
+ raise RuntimeError("Session not available in command context")
52
+
53
+ if not session.manager:
54
+ await ctx.output.print("❌ **Session manager not available**")
55
+ return
56
+
57
+ # If no filter specified, show both
58
+ if not active and not stored:
59
+ active = stored = True
60
+
61
+ try:
62
+ output_lines = ["## 📋 ACP Sessions\n"]
63
+
64
+ # Show active sessions
65
+ if active:
66
+ output_lines.append("### 🟢 Active Sessions")
67
+ active_sessions = session.manager._active
68
+
69
+ if not active_sessions:
70
+ output_lines.append("*No active sessions*\n")
71
+ else:
72
+ for session_id, sess in active_sessions.items():
73
+ agent_name = sess.current_agent_name
74
+ cwd = sess.cwd or "unknown"
75
+ is_current = session_id == session.session_id
76
+
77
+ # Get title from SessionData
78
+ session_data = await session.manager.session_manager.store.load(session_id)
79
+ title = session_data.title if session_data else None
80
+
81
+ status = " *(current)*" if is_current else ""
82
+ title_text = f": {title}" if title else ""
83
+ output_lines.append(f"- **{session_id}**{status}{title_text}")
84
+ output_lines.append(f" - Agent: `{agent_name}`")
85
+ output_lines.append(f" - Directory: `{cwd}`")
86
+ output_lines.append("")
87
+
88
+ # Show stored sessions
89
+ if stored:
90
+ output_lines.append("### 💾 Stored Sessions")
91
+
92
+ try:
93
+ stored_session_ids = await session.manager.session_manager.store.list_sessions()
94
+ # Filter out active ones if we already showed them
95
+ if active:
96
+ stored_session_ids = [
97
+ sid for sid in stored_session_ids if sid not in session.manager._active
98
+ ]
99
+
100
+ if not stored_session_ids:
101
+ output_lines.append("*No stored sessions*\n")
102
+ else:
103
+ for session_id in stored_session_ids:
104
+ session_data = await session.manager.session_manager.store.load(
105
+ session_id
106
+ )
107
+ if session_data:
108
+ title_text = f": {session_data.title}" if session_data.title else ""
109
+ output_lines.append(f"- **{session_id}**{title_text}")
110
+ output_lines.append(f" - Agent: `{session_data.agent_name}`")
111
+ output_lines.append(
112
+ f" - Directory: `{session_data.cwd or 'unknown'}`"
113
+ )
114
+ output_lines.append(
115
+ f" - Last active: {session_data.last_active.strftime('%Y-%m-%d %H:%M')}" # noqa: E501
116
+ )
117
+ output_lines.append("")
118
+ except Exception as e: # noqa: BLE001
119
+ output_lines.append(f"*Error loading stored sessions: {e}*\n")
120
+
121
+ await ctx.output.print("\n".join(output_lines))
122
+
123
+ except Exception as e: # noqa: BLE001
124
+ await ctx.output.print(f"❌ **Error listing sessions:** {e}")
125
+
126
+
127
+ class LoadSessionCommand(NodeCommand):
128
+ """Load a previous ACP session with conversation replay.
129
+
130
+ This command will:
131
+ 1. Look up the session by ID
132
+ 2. Replay the conversation history via ACP notifications
133
+ 3. Restore the session context (agent, working directory)
134
+
135
+ Options:
136
+ --preview Show session info without loading
137
+ --no-replay Load session without replaying conversation
138
+
139
+ Examples:
140
+ /load-session sess_abc123def456
141
+ /load-session sess_abc123def456 --preview
142
+ /load-session sess_abc123def456 --no-replay
143
+ """
144
+
145
+ name = "load-session"
146
+ category = "acp"
147
+
148
+ async def execute_command( # noqa: PLR0915
149
+ self,
150
+ ctx: CommandContext[NodeContext[ACPSession]],
151
+ session_id: str,
152
+ *,
153
+ preview: bool = False,
154
+ no_replay: bool = False,
155
+ ) -> None:
156
+ """Load a previous ACP session.
157
+
158
+ Args:
159
+ ctx: Command context with ACP session
160
+ session_id: Session identifier to load
161
+ preview: Show session info without loading
162
+ no_replay: Load session without replaying conversation
163
+ """
164
+ session = ctx.context.data
165
+ if not session:
166
+ raise RuntimeError("Session not available in command context")
167
+
168
+ if not session.manager:
169
+ await ctx.output.print("❌ **Session manager not available**")
170
+ return
171
+
172
+ try:
173
+ # Load session data from storage
174
+ session_data = await session.manager.session_manager.store.load(session_id)
175
+
176
+ if not session_data:
177
+ await ctx.output.print(f"❌ **Session not found:** `{session_id}`")
178
+ return
179
+
180
+ # Get conversation history from storage
181
+ storage = session.agent_pool.storage
182
+ messages = []
183
+ if storage:
184
+ query = SessionQuery(name=session_data.conversation_id)
185
+ messages = await storage.filter_messages(query)
186
+
187
+ if preview:
188
+ # Show session preview without loading
189
+ preview_lines = [
190
+ f"## 📋 Session Preview: `{session_id}`\n",
191
+ ]
192
+
193
+ if session_data.title:
194
+ preview_lines.append(f"**Title:** {session_data.title}")
195
+
196
+ preview_lines.extend([
197
+ f"**Agent:** `{session_data.agent_name}`",
198
+ f"**Directory:** `{session_data.cwd or 'unknown'}`",
199
+ f"**Created:** {session_data.created_at.strftime('%Y-%m-%d %H:%M')}",
200
+ f"**Last active:** {session_data.last_active.strftime('%Y-%m-%d %H:%M')}",
201
+ f"**Conversation ID:** `{session_data.conversation_id}`",
202
+ f"**Messages:** {len(messages)}",
203
+ ])
204
+
205
+ if session_data.metadata:
206
+ preview_lines.append(
207
+ f"**Protocol:** {session_data.metadata.get('protocol', 'unknown')}"
208
+ )
209
+
210
+ await ctx.output.print("\n".join(preview_lines))
211
+ return
212
+
213
+ # Actually load the session
214
+ await ctx.output.print(f"🔄 **Loading session `{session_id}`...**")
215
+
216
+ # Switch to the session's agent if different
217
+ if session_data.agent_name != session.current_agent_name:
218
+ if session_data.agent_name in session.agent_pool.all_agents:
219
+ await session.switch_active_agent(session_data.agent_name)
220
+ await ctx.output.print(f"📌 **Switched to agent:** `{session_data.agent_name}`")
221
+ else:
222
+ await ctx.output.print(
223
+ f"⚠️ **Agent `{session_data.agent_name}` not found, keeping current agent**"
224
+ )
225
+
226
+ # Update working directory if specified
227
+ if session_data.cwd and session_data.cwd != session.cwd:
228
+ session.cwd = session_data.cwd
229
+ await ctx.output.print(f"📂 **Working directory:** `{session_data.cwd}`")
230
+
231
+ # Replay conversation history unless disabled
232
+ if not no_replay and messages:
233
+ await ctx.output.print(f"📽️ **Replaying {len(messages)} messages...**")
234
+
235
+ # Extract ModelRequest/ModelResponse from ChatMessage.messages field
236
+
237
+ model_messages: list[ModelRequest | ModelResponse] = []
238
+ for chat_msg in messages:
239
+ if chat_msg.messages:
240
+ model_messages.extend(chat_msg.messages)
241
+
242
+ if model_messages:
243
+ # Use ACPNotifications.replay() which handles all content types properly
244
+ try:
245
+ await session.notifications.replay(model_messages)
246
+ await ctx.output.print(
247
+ f"✅ **Replayed {len(model_messages)} model messages**"
248
+ )
249
+ except Exception as e: # noqa: BLE001
250
+ session.log.warning("Failed to replay conversation history", error=str(e))
251
+ await ctx.output.print(f"⚠️ **Failed to replay messages:** {e}")
252
+ else:
253
+ await ctx.output.print("📭 **No model messages to replay**")
254
+ elif no_replay:
255
+ await ctx.output.print("⏭️ **Skipped conversation replay**")
256
+ else:
257
+ await ctx.output.print("📭 **No conversation history to replay**")
258
+
259
+ await ctx.output.print(f"✅ **Session `{session_id}` loaded successfully**")
260
+
261
+ except Exception as e: # noqa: BLE001
262
+ await ctx.output.print(f"❌ **Error loading session:** {e}")
263
+
264
+
265
+ class SaveSessionCommand(NodeCommand):
266
+ """Save the current ACP session to persistent storage.
267
+
268
+ This will save:
269
+ - Current agent configuration
270
+ - Working directory
271
+ - Session metadata
272
+
273
+ Note: Conversation history is automatically saved if storage is enabled.
274
+
275
+ Options:
276
+ --description "text" Optional description for the session
277
+
278
+ Examples:
279
+ /save-session
280
+ /save-session --description "Working on feature X"
281
+ """
282
+
283
+ name = "save-session"
284
+ category = "acp"
285
+
286
+ async def execute_command(
287
+ self,
288
+ ctx: CommandContext[NodeContext[ACPSession]],
289
+ *,
290
+ description: str | None = None,
291
+ ) -> None:
292
+ """Save the current ACP session.
293
+
294
+ Args:
295
+ ctx: Command context with ACP session
296
+ description: Optional description for the session
297
+ """
298
+ session = ctx.context.data
299
+ if not session:
300
+ raise RuntimeError("Session not available in command context")
301
+
302
+ if not session.manager:
303
+ await ctx.output.print("❌ **Session manager not available**")
304
+ return
305
+
306
+ try:
307
+ # Load current session data
308
+ session_data = await session.manager.session_manager.store.load(session.session_id)
309
+
310
+ if session_data:
311
+ # Update metadata if description provided
312
+ if description:
313
+ session_data = session_data.with_metadata(description=description)
314
+
315
+ # Touch to update last_active
316
+ session_data.touch()
317
+
318
+ # Save back
319
+ await session.manager.session_manager.save(session_data)
320
+
321
+ await ctx.output.print(f"💾 **Session `{session.session_id}` saved successfully**")
322
+ if description:
323
+ await ctx.output.print(f"📝 **Description:** {description}")
324
+ else:
325
+ await ctx.output.print(f"⚠️ **Session `{session.session_id}` not found in storage**")
326
+
327
+ except Exception as e: # noqa: BLE001
328
+ await ctx.output.print(f"❌ **Error saving session:** {e}")
329
+
330
+
331
+ class DeleteSessionCommand(NodeCommand):
332
+ """Delete a stored ACP session.
333
+
334
+ This permanently removes the session from storage.
335
+ Use with caution as this action cannot be undone.
336
+
337
+ Options:
338
+ --confirm Skip confirmation prompt
339
+
340
+ Examples:
341
+ /delete-session sess_abc123def456
342
+ /delete-session sess_abc123def456 --confirm
343
+ """
344
+
345
+ name = "delete-session"
346
+ category = "acp"
347
+
348
+ async def execute_command(
349
+ self,
350
+ ctx: CommandContext[NodeContext[ACPSession]],
351
+ session_id: str,
352
+ *,
353
+ confirm: bool = False,
354
+ ) -> None:
355
+ """Delete a stored ACP session.
356
+
357
+ Args:
358
+ ctx: Command context with ACP session
359
+ session_id: Session identifier to delete
360
+ confirm: Skip confirmation prompt
361
+ """
362
+ session = ctx.context.data
363
+ if not session:
364
+ raise RuntimeError("Session not available in command context")
365
+
366
+ if not session.manager:
367
+ await ctx.output.print("❌ **Session manager not available**")
368
+ return
369
+
370
+ # Prevent deleting current session
371
+ if session_id == session.session_id:
372
+ await ctx.output.print("❌ **Cannot delete the current active session**")
373
+ return
374
+
375
+ try:
376
+ # Check if session exists
377
+ session_data = await session.manager.session_manager.store.load(session_id)
378
+
379
+ if not session_data:
380
+ await ctx.output.print(f"❌ **Session not found:** `{session_id}`")
381
+ return
382
+
383
+ if not confirm:
384
+ await ctx.output.print(f"⚠️ **About to delete session `{session_id}`**")
385
+ await ctx.output.print(f"📌 **Agent:** `{session_data.agent_name}`")
386
+ await ctx.output.print(
387
+ f"📅 **Last active:** {session_data.last_active.strftime('%Y-%m-%d %H:%M')}"
388
+ )
389
+ await ctx.output.print(
390
+ f"**To confirm, run:** `/delete-session {session_id} --confirm`"
391
+ )
392
+ return
393
+
394
+ # Delete the session
395
+ deleted = await session.manager.session_manager.store.delete(session_id)
396
+
397
+ if deleted:
398
+ await ctx.output.print(f"🗑️ **Session `{session_id}` deleted successfully**")
399
+ else:
400
+ await ctx.output.print(f"⚠️ **Failed to delete session `{session_id}`**")
401
+
402
+ except Exception as e: # noqa: BLE001
403
+ await ctx.output.print(f"❌ **Error deleting session:** {e}")
404
+
405
+
406
+ class ListPoolsCommand(NodeCommand):
407
+ """List available agent pool configurations.
408
+
409
+ Shows:
410
+ - Stored configurations from ConfigStore (name -> path mapping)
411
+ - Currently active pool configuration
412
+ - Available agents in the current pool
413
+
414
+ Examples:
415
+ /list-pools
416
+ """
417
+
418
+ name = "list-pools"
419
+ category = "acp"
420
+
421
+ async def execute_command(
422
+ self,
423
+ ctx: CommandContext[NodeContext[ACPSession]],
424
+ ) -> None:
425
+ """List available pool configurations.
426
+
427
+ Args:
428
+ ctx: Command context with ACP session
429
+ """
430
+ from agentpool_cli import agent_store
431
+
432
+ session = ctx.context.data
433
+ if not session:
434
+ raise RuntimeError("Session not available in command context")
435
+
436
+ try:
437
+ output_lines = ["## 🏊 Agent Pool Configurations\n"]
438
+
439
+ # Show current pool info
440
+ output_lines.append("### 📍 Current Pool")
441
+ current_config = (
442
+ session.acp_agent.server.config_path if session.acp_agent.server else None
443
+ )
444
+ if current_config:
445
+ output_lines.append(f"**Config:** `{current_config}`")
446
+ else:
447
+ output_lines.append("**Config:** *(default/built-in)*")
448
+
449
+ # Show agents in current pool
450
+ agent_names = list(session.agent_pool.all_agents.keys())
451
+ output_lines.append(f"**Agents:** {', '.join(f'`{n}`' for n in agent_names)}")
452
+ output_lines.append(f"**Active agent:** `{session.current_agent_name}`")
453
+ output_lines.append("")
454
+
455
+ # Show stored configurations
456
+ output_lines.append("### 💾 Stored Configurations")
457
+ stored_configs = agent_store.list_configs()
458
+ active_config = agent_store.get_active()
459
+
460
+ if not stored_configs:
461
+ output_lines.append("*No stored configurations*")
462
+ output_lines.append("")
463
+ output_lines.append("Use `agentpool add <name> <path>` to add configurations.")
464
+ else:
465
+ # Build markdown table
466
+ output_lines.append("| Name | Path |")
467
+ output_lines.append("|------|------|")
468
+ for name, path in stored_configs:
469
+ is_active = active_config and active_config.name == name
470
+ is_current = current_config and path == current_config
471
+ markers = []
472
+ if is_active:
473
+ markers.append("default")
474
+ if is_current:
475
+ markers.append("current")
476
+ name_col = f"{name} ({', '.join(markers)})" if markers else name
477
+ output_lines.append(f"| {name_col} | `{path}` |")
478
+
479
+ output_lines.append("")
480
+ output_lines.append("*Use `/set-pool <name>` or `/set-pool <path>` to switch pools.*")
481
+
482
+ await ctx.output.print("\n".join(output_lines))
483
+
484
+ except Exception as e: # noqa: BLE001
485
+ await ctx.output.print(f"❌ **Error listing pools:** {e}")
486
+
487
+
488
+ class SetPoolCommand(NodeCommand):
489
+ """Switch to a different agent pool configuration.
490
+
491
+ This command will:
492
+ 1. Close all active sessions
493
+ 2. Load the new pool configuration
494
+ 3. Initialize the new pool with all agents
495
+
496
+ The configuration can be specified as:
497
+ - A stored config name (from `agentpool add`)
498
+ - A direct path to a configuration file
499
+
500
+ Options:
501
+ --agent <name> Specify which agent to use as default
502
+
503
+ Examples:
504
+ /set-pool prod
505
+ /set-pool /path/to/agents.yml
506
+ /set-pool dev --agent=coder
507
+ """
508
+
509
+ name = "set-pool"
510
+ category = "acp"
511
+
512
+ async def execute_command(
513
+ self,
514
+ ctx: CommandContext[NodeContext[ACPSession]],
515
+ config: str,
516
+ *,
517
+ agent: str | None = None,
518
+ ) -> None:
519
+ """Switch to a different agent pool.
520
+
521
+ Args:
522
+ ctx: Command context with ACP session
523
+ config: Config name (from store) or path to config file
524
+ agent: Optional specific agent to use as default
525
+ """
526
+ from pathlib import Path
527
+
528
+ from agentpool_cli import agent_store
529
+
530
+ session = ctx.context.data
531
+ if not session:
532
+ raise RuntimeError("Session not available in command context")
533
+
534
+ if not session.acp_agent.server:
535
+ await ctx.output.print("❌ **Server reference not available - cannot switch pools**")
536
+ return
537
+
538
+ try:
539
+ # Resolve config path
540
+ config_path: str | None = None
541
+ config_name: str | None = None
542
+
543
+ # First try as stored config name
544
+ try:
545
+ config_path = agent_store.get_config(config)
546
+ config_name = config
547
+ except KeyError:
548
+ # Not a stored config, try as direct path
549
+ path = Path(config)
550
+ if path.exists() and path.is_file():
551
+ config_path = str(path.resolve())
552
+ else:
553
+ await ctx.output.print(f"❌ **Config not found:** `{config}`")
554
+ await ctx.output.print("Provide a stored config name or a valid file path.")
555
+ return
556
+
557
+ # Show what we're doing
558
+ if config_name:
559
+ await ctx.output.print(f"🔄 **Switching pool to `{config_name}`...**")
560
+ else:
561
+ await ctx.output.print(f"🔄 **Switching pool to `{config_path}`...**")
562
+
563
+ # Perform the swap
564
+ agent_names = await session.acp_agent.swap_pool(config_path, agent)
565
+
566
+ # Report success
567
+ await ctx.output.print("✅ **Pool switched successfully**")
568
+ await ctx.output.print(f"**Agents:** {', '.join(f'`{n}`' for n in agent_names)}")
569
+ if agent:
570
+ await ctx.output.print(f"**Default agent:** `{agent}`")
571
+ else:
572
+ await ctx.output.print(f"**Default agent:** `{agent_names[0]}`")
573
+
574
+ await ctx.output.print("")
575
+ await ctx.output.print("*Note: A new session will be created on your next message.*")
576
+
577
+ except FileNotFoundError as e:
578
+ await ctx.output.print(f"❌ **Config file not found:** {e}")
579
+ except ValueError as e:
580
+ await ctx.output.print(f"❌ **Invalid configuration:** {e}")
581
+ except Exception as e: # noqa: BLE001
582
+ await ctx.output.print(f"❌ **Error switching pool:** {e}")
583
+
584
+
585
+ def get_acp_commands() -> list[type[NodeCommand]]:
586
+ """Get all ACP-specific slash commands."""
587
+ return [
588
+ ListSessionsCommand,
589
+ LoadSessionCommand,
590
+ SaveSessionCommand,
591
+ DeleteSessionCommand,
592
+ ListPoolsCommand,
593
+ SetPoolCommand,
594
+ ]