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,232 @@
1
+ """MCP server management for AgentPool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import base64
7
+ from contextlib import AsyncExitStack
8
+ from typing import TYPE_CHECKING, Any, Self, cast
9
+
10
+ import anyio
11
+ from pydantic_ai import BinaryContent, BinaryImage, UsageLimits
12
+
13
+ from agentpool.log import get_logger
14
+ from agentpool.resource_providers import AggregatingResourceProvider, ResourceProvider
15
+ from agentpool.resource_providers.mcp_provider import MCPResourceProvider
16
+ from agentpool_config.mcp_server import BaseMCPServerConfig
17
+
18
+
19
+ if TYPE_CHECKING:
20
+ from collections.abc import Sequence
21
+ from types import TracebackType
22
+
23
+ from mcp import types
24
+ from mcp.shared.context import RequestContext
25
+ from mcp.types import SamplingMessage
26
+ from pydantic_ai import UserContent
27
+
28
+ from agentpool_config.mcp_server import MCPServerConfig
29
+
30
+
31
+ logger = get_logger(__name__)
32
+
33
+
34
+ class MCPManager:
35
+ """Manages MCP server connections and distributes resource providers."""
36
+
37
+ def __init__(
38
+ self,
39
+ name: str = "mcp",
40
+ owner: str | None = None,
41
+ servers: Sequence[MCPServerConfig | str] | None = None,
42
+ accessible_roots: list[str] | None = None,
43
+ ) -> None:
44
+ self.name = name
45
+ self.owner = owner
46
+ self.servers: list[MCPServerConfig] = []
47
+ for server in servers or []:
48
+ self.add_server_config(server)
49
+ self.providers: list[MCPResourceProvider] = []
50
+ self.aggregating_provider = AggregatingResourceProvider(
51
+ providers=cast(list[ResourceProvider], self.providers),
52
+ name=f"{name}_aggregated",
53
+ )
54
+ self.exit_stack = AsyncExitStack()
55
+ self._accessible_roots = accessible_roots
56
+
57
+ def add_server_config(self, cfg: MCPServerConfig | str) -> None:
58
+ """Add a new MCP server to the manager."""
59
+ resolved = BaseMCPServerConfig.from_string(cfg) if isinstance(cfg, str) else cfg
60
+ self.servers.append(resolved)
61
+
62
+ def __repr__(self) -> str:
63
+ return f"MCPManager(name={self.name!r}, servers={len(self.servers)})"
64
+
65
+ async def __aenter__(self) -> Self:
66
+ try:
67
+ if tasks := [self._setup_server(server) for server in self.servers]:
68
+ await asyncio.gather(*tasks)
69
+ except Exception as e:
70
+ await self.__aexit__(type(e), e, e.__traceback__)
71
+ msg = "Failed to initialize MCP manager"
72
+ raise RuntimeError(msg) from e
73
+
74
+ return self
75
+
76
+ async def __aexit__(
77
+ self,
78
+ exc_type: type[BaseException] | None,
79
+ exc_val: BaseException | None,
80
+ exc_tb: TracebackType | None,
81
+ ) -> None:
82
+ await self.cleanup()
83
+
84
+ async def _sampling_callback(
85
+ self,
86
+ messages: list[SamplingMessage],
87
+ params: types.CreateMessageRequestParams,
88
+ context: RequestContext[Any, Any, Any],
89
+ ) -> str:
90
+ """Handle MCP sampling by creating a new agent with specified preferences."""
91
+ from mcp import types
92
+
93
+ from agentpool.agents import Agent
94
+
95
+ # Convert messages to prompts for the agent
96
+ prompts: list[UserContent] = []
97
+ for mcp_msg in messages:
98
+ match mcp_msg.content:
99
+ case types.TextContent(text=text):
100
+ prompts.append(text)
101
+ case types.ImageContent(data=data, mimeType=mime_type):
102
+ binary_data = base64.b64decode(data)
103
+ prompts.append(BinaryImage(data=binary_data, media_type=mime_type))
104
+ case types.AudioContent(data=data, mimeType=mime_type):
105
+ binary_data = base64.b64decode(data)
106
+ prompts.append(BinaryContent(data=binary_data, media_type=mime_type))
107
+
108
+ # Extract model from preferences
109
+ model = None
110
+ if (prefs := params.modelPreferences) and prefs.hints and prefs.hints[0].name:
111
+ model = prefs.hints[0].name
112
+ # Create usage limits from sampling parameters
113
+ limits = UsageLimits(output_tokens_limit=params.maxTokens, request_limit=1)
114
+ # TODO: Apply temperature from params.temperature
115
+ sys_prompt = params.systemPrompt or ""
116
+ agent = Agent(name="sampling-agent", model=model, system_prompt=sys_prompt, session=False)
117
+ try:
118
+ async with agent:
119
+ result = await agent.run(*prompts, store_history=False, usage_limits=limits)
120
+ return result.content
121
+
122
+ except Exception as e:
123
+ logger.exception("Sampling failed")
124
+ return f"Sampling failed: {e!s}"
125
+
126
+ async def _setup_server(self, config: MCPServerConfig) -> None:
127
+ """Set up a single MCP server resource provider."""
128
+ if not config.enabled:
129
+ return
130
+
131
+ provider = MCPResourceProvider(
132
+ server=config,
133
+ name=f"{self.name}_{config.client_id}",
134
+ owner=self.owner,
135
+ source="pool" if self.owner == "pool" else "node",
136
+ sampling_callback=self._sampling_callback,
137
+ accessible_roots=self._accessible_roots,
138
+ )
139
+ provider = await self.exit_stack.enter_async_context(provider)
140
+ self.providers.append(provider)
141
+
142
+ def get_mcp_providers(self) -> list[MCPResourceProvider]:
143
+ """Get all MCP resource providers managed by this manager."""
144
+ return list(self.providers)
145
+
146
+ def get_aggregating_provider(self) -> AggregatingResourceProvider:
147
+ """Get the aggregating provider that contains all MCP providers."""
148
+ return self.aggregating_provider
149
+
150
+ async def setup_server_runtime(self, config: MCPServerConfig) -> MCPResourceProvider:
151
+ """Set up a single MCP server at runtime while manager is running.
152
+
153
+ Returns:
154
+ The newly created and initialized MCPResourceProvider
155
+ """
156
+ if not config.enabled:
157
+ msg = f"Server config {config.client_id} is disabled"
158
+ raise ValueError(msg)
159
+
160
+ # Add the config first
161
+ self.add_server_config(config)
162
+ provider = MCPResourceProvider(
163
+ server=config,
164
+ name=f"{self.name}_{config.client_id}",
165
+ owner=self.owner,
166
+ source="pool" if self.owner == "pool" else "node",
167
+ sampling_callback=self._sampling_callback,
168
+ accessible_roots=self._accessible_roots,
169
+ )
170
+ provider = await self.exit_stack.enter_async_context(provider)
171
+ self.providers.append(provider)
172
+ # Note: AggregatingResourceProvider automatically sees the new provider
173
+ # since it references self.providers list
174
+
175
+ return provider
176
+
177
+ async def cleanup(self) -> None:
178
+ """Clean up all MCP connections and providers."""
179
+ try:
180
+ try:
181
+ # Clean up exit stack (which includes MCP providers)
182
+ await self.exit_stack.aclose()
183
+ except RuntimeError as e:
184
+ if "different task" in str(e):
185
+ # Handle task context mismatch
186
+ current_task = asyncio.current_task()
187
+ if current_task:
188
+ loop = asyncio.get_running_loop()
189
+ await loop.create_task(self.exit_stack.aclose())
190
+ else:
191
+ raise
192
+
193
+ self.providers.clear()
194
+
195
+ except Exception as e:
196
+ msg = "Error during MCP manager cleanup"
197
+ logger.exception(msg, exc_info=e)
198
+ raise RuntimeError(msg) from e
199
+
200
+ @property
201
+ def active_servers(self) -> list[str]:
202
+ """Get IDs of active servers."""
203
+ return [provider.server.client_id for provider in self.providers]
204
+
205
+
206
+ if __name__ == "__main__":
207
+ from agentpool_config.mcp_server import StdioMCPServerConfig
208
+
209
+ cfg = StdioMCPServerConfig(
210
+ command="uv",
211
+ args=["run", "/home/phil65/dev/oss/agentpool/tests/mcp_server/server.py"],
212
+ )
213
+
214
+ async def main() -> None:
215
+ manager = MCPManager(servers=[cfg])
216
+ async with manager:
217
+ providers = manager.get_mcp_providers()
218
+ print(f"Found {len(providers)} providers")
219
+ provider = providers[0]
220
+ prompts = await provider.get_prompts()
221
+ print(f"Found prompts: {prompts}")
222
+ # Test static prompt (no arguments)
223
+ static_prompt = next(p for p in prompts if p.name == "static_prompt")
224
+ print(f"\n--- Testing static prompt: {static_prompt} ---")
225
+ components = await static_prompt.get_components()
226
+ assert components, "No prompt components found"
227
+ print(f"Found {len(components)} prompt components:")
228
+ for i, component in enumerate(components):
229
+ comp_type = type(component).__name__
230
+ print(f" {i + 1}. {comp_type}: {component.content}")
231
+
232
+ anyio.run(main)
@@ -0,0 +1,164 @@
1
+ """FastMCP message handler for agentpool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from typing import TYPE_CHECKING
7
+
8
+ from agentpool.log import get_logger
9
+
10
+
11
+ if TYPE_CHECKING:
12
+ from collections.abc import Awaitable, Callable
13
+
14
+ from mcp.shared.session import RequestResponder
15
+ import mcp.types
16
+
17
+ from agentpool.mcp_server import MCPClient
18
+
19
+ logger = get_logger(__name__)
20
+
21
+
22
+ @dataclass
23
+ class MCPMessageHandler:
24
+ """Custom message handler that bridges FastMCP to agentpool notifications."""
25
+
26
+ client: MCPClient
27
+ """The MCP client instance."""
28
+ tool_change_callback: Callable[[], Awaitable[None]] | None = None
29
+ """Tool change callback."""
30
+ prompt_change_callback: Callable[[], Awaitable[None]] | None = None
31
+ """Prompt change callback."""
32
+ resource_change_callback: Callable[[], Awaitable[None]] | None = None
33
+ """Resource change callback."""
34
+
35
+ async def __call__(
36
+ self,
37
+ message: RequestResponder[mcp.types.ServerRequest, mcp.types.ClientResult]
38
+ | mcp.types.ServerNotification
39
+ | Exception,
40
+ ) -> None:
41
+ """Handle FastMCP messages by dispatching to appropriate handlers."""
42
+ from mcp.shared.session import RequestResponder
43
+ import mcp.types
44
+
45
+ await self.on_message(message)
46
+ match message:
47
+ # requests
48
+ case RequestResponder() as responder:
49
+ await self.on_request(responder)
50
+ # Handle specific requests
51
+ root = responder.request.root
52
+ match root:
53
+ case mcp.types.PingRequest():
54
+ await self.on_ping(root)
55
+ case mcp.types.ListRootsRequest():
56
+ await self.on_list_roots(root)
57
+ case mcp.types.CreateMessageRequest():
58
+ await self.on_create_message(root)
59
+
60
+ case mcp.types.ServerNotification() as notification:
61
+ await self.on_notification(notification)
62
+ root = notification.root
63
+ match root:
64
+ case mcp.types.CancelledNotification():
65
+ await self.on_cancelled(root)
66
+ case mcp.types.ProgressNotification():
67
+ await self.on_progress(root)
68
+ case mcp.types.LoggingMessageNotification():
69
+ await self.on_logging_message(root)
70
+ case mcp.types.ToolListChangedNotification():
71
+ await self.on_tool_list_changed(root)
72
+ case mcp.types.ResourceListChangedNotification():
73
+ await self.on_resource_list_changed(root)
74
+ case mcp.types.PromptListChangedNotification():
75
+ await self.on_prompt_list_changed(root)
76
+ case mcp.types.ResourceUpdatedNotification():
77
+ await self.on_resource_updated(root)
78
+ case mcp.types.ElicitCompleteNotification():
79
+ await self.on_elicit_complete(root)
80
+
81
+ case Exception():
82
+ await self.on_exception(message)
83
+
84
+ async def on_message(
85
+ self,
86
+ message: RequestResponder[mcp.types.ServerRequest, mcp.types.ClientResult]
87
+ | mcp.types.ServerNotification
88
+ | Exception,
89
+ ) -> None:
90
+ """Handle generic messages."""
91
+
92
+ async def on_request(
93
+ self, message: RequestResponder[mcp.types.ServerRequest, mcp.types.ClientResult]
94
+ ) -> None:
95
+ """Handle requests."""
96
+
97
+ async def on_notification(self, message: mcp.types.ServerNotification) -> None:
98
+ """Handle server notifications."""
99
+
100
+ async def on_tool_list_changed(self, message: mcp.types.ToolListChangedNotification) -> None:
101
+ """Handle tool list changes."""
102
+ logger.info("MCP tool list changed", message=message)
103
+ # Call the tool change callback if provided
104
+ if self.tool_change_callback:
105
+ await self.tool_change_callback()
106
+
107
+ async def on_resource_list_changed(
108
+ self, message: mcp.types.ResourceListChangedNotification
109
+ ) -> None:
110
+ """Handle resource list changes."""
111
+ logger.info("MCP resource list changed", message=message)
112
+ # Call the resource change callback if provided
113
+ if self.resource_change_callback:
114
+ await self.resource_change_callback()
115
+
116
+ async def on_resource_updated(self, message: mcp.types.ResourceUpdatedNotification) -> None:
117
+ """Handle resource updates."""
118
+ # ResourceUpdatedNotification has uri directly, not in params
119
+ logger.info("MCP resource updated", uri=getattr(message, "uri", "unknown"))
120
+
121
+ async def on_progress(self, message: mcp.types.ProgressNotification) -> None:
122
+ """Handle progress notifications with proper context."""
123
+ # Note: Progress notifications from MCP servers are now handled per-tool-call
124
+ # with the contextual progress handler, so global notifications are ignored
125
+
126
+ async def on_prompt_list_changed(
127
+ self, message: mcp.types.PromptListChangedNotification
128
+ ) -> None:
129
+ """Handle prompt list changes."""
130
+ logger.info("MCP prompt list changed", message=message)
131
+ # Call the prompt change callback if provided
132
+ if self.prompt_change_callback:
133
+ await self.prompt_change_callback()
134
+
135
+ async def on_cancelled(self, message: mcp.types.CancelledNotification) -> None:
136
+ """Handle cancelled operations."""
137
+ logger.info("MCP operation cancelled", message=message)
138
+
139
+ async def on_logging_message(self, message: mcp.types.LoggingMessageNotification) -> None:
140
+ """Handle server log messages."""
141
+ # This is handled by _log_handler, but keep for completeness
142
+
143
+ async def on_exception(self, message: Exception) -> None:
144
+ """Handle exceptions."""
145
+ logger.error("MCP client exception", error=message)
146
+
147
+ async def on_ping(self, message: mcp.types.PingRequest) -> None:
148
+ """Handle ping requests."""
149
+
150
+ async def on_list_roots(self, message: mcp.types.ListRootsRequest) -> None:
151
+ """Handle list roots requests."""
152
+
153
+ async def on_create_message(self, message: mcp.types.CreateMessageRequest) -> None:
154
+ """Handle create message requests."""
155
+
156
+ async def on_elicit_complete(self, message: mcp.types.ElicitCompleteNotification) -> None:
157
+ """Handle elicitation completion notifications.
158
+
159
+ Sent by servers when a URL mode elicitation completes out-of-band.
160
+ """
161
+ logger.info(
162
+ "MCP elicitation completed",
163
+ elicitation_id=message.params.elicitationId,
164
+ )
@@ -0,0 +1 @@
1
+ """MCP registry clients."""