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,210 @@
1
+ """Spawn subagent slash command."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Any
6
+ import uuid
7
+
8
+ from pydantic_ai import (
9
+ FinalResultEvent,
10
+ FunctionToolCallEvent,
11
+ FunctionToolResultEvent,
12
+ PartDeltaEvent,
13
+ PartStartEvent,
14
+ RetryPromptPart,
15
+ TextPart,
16
+ TextPartDelta,
17
+ ThinkingPart,
18
+ ThinkingPartDelta,
19
+ ToolCallPartDelta,
20
+ ToolReturnPart,
21
+ )
22
+ from slashed import CommandContext, CommandError # noqa: TC002
23
+
24
+ from agentpool.agents.events import StreamCompleteEvent, ToolCallProgressEvent
25
+ from agentpool.log import get_logger
26
+ from agentpool.messaging.context import NodeContext # noqa: TC001
27
+ from agentpool_commands.base import NodeCommand
28
+ from agentpool_server.acp_server.session import ACPSession # noqa: TC001
29
+
30
+
31
+ if TYPE_CHECKING:
32
+ from agentpool.agents.events import RichAgentStreamEvent
33
+
34
+
35
+ logger = get_logger(__name__)
36
+
37
+
38
+ class SpawnSubagentCommand(NodeCommand):
39
+ """Spawn a subagent to execute a specific task.
40
+
41
+ The subagent runs concurrently and reports progress in a dedicated tool call box.
42
+
43
+ Usage:
44
+ /spawn "agent-name" "prompt for the subagent"
45
+ /spawn "code-reviewer" "Review the main.py file for potential bugs"
46
+ """
47
+
48
+ name = "spawn"
49
+ category = "agents"
50
+
51
+ async def execute_command(
52
+ self,
53
+ ctx: CommandContext[NodeContext[ACPSession]],
54
+ agent_name: str,
55
+ task_prompt: str,
56
+ ) -> None:
57
+ """Spawn a subagent to execute a task.
58
+
59
+ Args:
60
+ ctx: Command context with ACP session
61
+ agent_name: Name of the agent to spawn
62
+ task_prompt: Task prompt for the subagent
63
+ """
64
+ session = ctx.context.data
65
+ assert session, "ACP session required for spawn command"
66
+ # Generate unique tool call ID
67
+ tool_call_id = f"spawn-{agent_name}-{uuid.uuid4().hex[:8]}"
68
+ try:
69
+ # Check if agent exists in pool
70
+ if not session.agent_pool or agent_name not in session.agent_pool.agents:
71
+ available = list(session.agent_pool.agents.keys())
72
+ error_msg = f"Agent {agent_name!r} not found. Available agents: {available}"
73
+ await ctx.print(f"❌ {error_msg}")
74
+ return
75
+
76
+ target_agent = session.agent_pool.get_agent(agent_name)
77
+ await session.notifications.tool_call_start(
78
+ tool_call_id=tool_call_id,
79
+ title=f"Spawning agent: {agent_name}",
80
+ kind="execute",
81
+ raw_input={
82
+ "agent_name": agent_name,
83
+ "task_prompt": task_prompt,
84
+ },
85
+ )
86
+
87
+ aggregated_content: list[str] = [] # Aggregate output as we stream
88
+ try:
89
+ # Run the subagent and handle events
90
+ async for event in target_agent.run_stream(task_prompt):
91
+ await _handle_subagent_event(event, tool_call_id, aggregated_content, session)
92
+
93
+ final_content = "".join(aggregated_content).strip()
94
+ await session.notifications.tool_call_progress(
95
+ tool_call_id=tool_call_id,
96
+ status="completed",
97
+ content=[final_content] if final_content else None,
98
+ )
99
+ except Exception as e:
100
+ error_msg = f"Subagent execution failed: {e}"
101
+ logger.exception("Subagent execution error", error=str(e))
102
+ await session.notifications.tool_call_progress(
103
+ tool_call_id=tool_call_id,
104
+ status="failed",
105
+ raw_output=error_msg,
106
+ )
107
+
108
+ except Exception as e:
109
+ error_msg = f"Failed to spawn agent '{agent_name}': {e}"
110
+ logger.exception("Spawn command error", error=str(e))
111
+ raise CommandError(error_msg) from e
112
+
113
+
114
+ async def _handle_subagent_event(
115
+ event: RichAgentStreamEvent[Any],
116
+ tool_call_id: str,
117
+ aggregated_content: list[str],
118
+ session: ACPSession,
119
+ ) -> None:
120
+ """Handle events from spawned subagent and convert to tool_call_progress.
121
+
122
+ Args:
123
+ event: Event from the subagent stream
124
+ tool_call_id: ID of the tool call box
125
+ aggregated_content: List to accumulate content for final display
126
+ session: ACP session for notifications
127
+ """
128
+ match event:
129
+ case (
130
+ PartStartEvent(part=TextPart(content=delta))
131
+ | PartDeltaEvent(delta=TextPartDelta(content_delta=delta))
132
+ ):
133
+ # Subagent text output → accumulate and update progress
134
+ aggregated_content.append(delta)
135
+ await session.notifications.tool_call_progress(
136
+ tool_call_id=tool_call_id,
137
+ status="in_progress",
138
+ content=["".join(aggregated_content)],
139
+ )
140
+
141
+ case (
142
+ PartStartEvent(part=ThinkingPart(content=delta))
143
+ | PartDeltaEvent(delta=ThinkingPartDelta(content_delta=delta))
144
+ ):
145
+ # Subagent thinking → show thinking indicator
146
+ if delta:
147
+ thinking_text = f"💭 {delta}"
148
+ aggregated_content.append(thinking_text)
149
+ await session.notifications.tool_call_progress(
150
+ tool_call_id=tool_call_id,
151
+ status="in_progress",
152
+ content=["".join(aggregated_content)],
153
+ )
154
+
155
+ case FunctionToolCallEvent(part=part):
156
+ # Subagent calls a tool → show nested tool call
157
+ tool_text = f"\n🔧 Using tool: {part.tool_name}\n"
158
+ aggregated_content.append(tool_text)
159
+ await session.notifications.tool_call_progress(
160
+ tool_call_id=tool_call_id,
161
+ status="in_progress",
162
+ content=["".join(aggregated_content)],
163
+ )
164
+
165
+ case FunctionToolResultEvent(
166
+ result=ToolReturnPart(content=content, tool_name=tool_name),
167
+ ):
168
+ # Subagent tool completes → show tool result
169
+ result_text = f"✅ {tool_name}: {content}\n"
170
+ aggregated_content.append(result_text)
171
+ await session.notifications.tool_call_progress(
172
+ tool_call_id=tool_call_id,
173
+ status="in_progress",
174
+ content=["".join(aggregated_content)],
175
+ )
176
+
177
+ case FunctionToolResultEvent(
178
+ result=RetryPromptPart(tool_name=tool_name) as result,
179
+ ):
180
+ # Tool call failed and needs retry
181
+ error_message = result.model_response()
182
+ error_text = f"❌ {tool_name or 'unknown'}: Error: {error_message}\n"
183
+ aggregated_content.append(error_text)
184
+ await session.notifications.tool_call_progress(
185
+ tool_call_id=tool_call_id,
186
+ status="in_progress",
187
+ content=["".join(aggregated_content)],
188
+ )
189
+
190
+ case ToolCallProgressEvent(message=message, tool_name=tool_name):
191
+ # Progress event from tools
192
+ if message:
193
+ progress_text = f"🔄 {tool_name}: {message}\n"
194
+ aggregated_content.append(progress_text)
195
+ await session.notifications.tool_call_progress(
196
+ tool_call_id=tool_call_id,
197
+ status="in_progress",
198
+ content=["".join(aggregated_content)],
199
+ )
200
+
201
+ case (
202
+ PartStartEvent()
203
+ | PartDeltaEvent(delta=ToolCallPartDelta())
204
+ | FinalResultEvent()
205
+ | StreamCompleteEvent()
206
+ ):
207
+ pass # These events don't need special handling
208
+
209
+ case _:
210
+ logger.debug("Unhandled subagent event", event_type=type(event).__name__)
@@ -0,0 +1,235 @@
1
+ """Content conversion utilities for ACP (Agent Client Protocol) integration.
2
+
3
+ This module handles conversion between pydantic-ai message formats and ACP protocol
4
+ content blocks, session updates, and other data structures using the external acp library.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import base64
10
+ from typing import TYPE_CHECKING, Any, assert_never, overload
11
+
12
+ from pydantic import HttpUrl
13
+ from pydantic_ai import AudioUrl, BinaryContent, BinaryImage, DocumentUrl, ImageUrl, VideoUrl
14
+
15
+ from acp.schema import (
16
+ AudioContentBlock,
17
+ BlobResourceContents,
18
+ EmbeddedResourceContentBlock,
19
+ HttpMcpServer,
20
+ ImageContentBlock,
21
+ ResourceContentBlock,
22
+ SessionMode,
23
+ SseMcpServer,
24
+ StdioMcpServer,
25
+ TextContentBlock,
26
+ TextResourceContents,
27
+ )
28
+ from agentpool.log import get_logger
29
+ from agentpool_config.mcp_server import (
30
+ SSEMCPServerConfig,
31
+ StdioMCPServerConfig,
32
+ StreamableHTTPMCPServerConfig,
33
+ )
34
+
35
+
36
+ if TYPE_CHECKING:
37
+ from collections.abc import Sequence
38
+
39
+ from pydantic_ai import UserContent
40
+
41
+ from acp.schema import ContentBlock, McpServer
42
+ from agentpool.messaging import MessageNode
43
+ from agentpool_config.mcp_server import MCPServerConfig
44
+ from agentpool_config.nodes import ToolConfirmationMode
45
+
46
+ logger = get_logger(__name__)
47
+
48
+
49
+ @overload
50
+ def convert_acp_mcp_server_to_config(
51
+ acp_server: HttpMcpServer,
52
+ ) -> StreamableHTTPMCPServerConfig: ...
53
+
54
+
55
+ @overload
56
+ def convert_acp_mcp_server_to_config(
57
+ acp_server: SseMcpServer,
58
+ ) -> SSEMCPServerConfig: ...
59
+
60
+
61
+ @overload
62
+ def convert_acp_mcp_server_to_config(
63
+ acp_server: StdioMcpServer,
64
+ ) -> StdioMCPServerConfig: ...
65
+
66
+
67
+ @overload
68
+ def convert_acp_mcp_server_to_config(acp_server: McpServer) -> MCPServerConfig: ...
69
+
70
+
71
+ def convert_acp_mcp_server_to_config(acp_server: McpServer) -> MCPServerConfig:
72
+ """Convert ACP McpServer to native MCPServerConfig.
73
+
74
+ Args:
75
+ acp_server: ACP McpServer object from session/new request
76
+
77
+ Returns:
78
+ MCPServerConfig instance
79
+ """
80
+ match acp_server:
81
+ case StdioMcpServer(name=name, command=cmd, args=args, env=env_vars):
82
+ env = {var.name: var.value for var in env_vars}
83
+ return StdioMCPServerConfig(name=name, command=cmd, args=list(args), env=env)
84
+ case SseMcpServer(name=name, url=url, headers=headers):
85
+ h = {h.name: h.value for h in headers}
86
+ return SSEMCPServerConfig(name=name, url=HttpUrl(url), headers=h)
87
+ case HttpMcpServer(name=name, url=url, headers=headers):
88
+ h = {h.name: h.value for h in acp_server.headers}
89
+ return StreamableHTTPMCPServerConfig(name=name, url=HttpUrl(url), headers=h)
90
+ case _ as unreachable:
91
+ assert_never(unreachable)
92
+
93
+
94
+ def format_uri_as_link(uri: str) -> str:
95
+ """Format URI as markdown-style link similar to other ACP implementations.
96
+
97
+ Args:
98
+ uri: URI to format (file://, zed://, etc.)
99
+
100
+ Returns:
101
+ Markdown-style link in format [@name](uri)
102
+ """
103
+ if uri.startswith("file://"):
104
+ path = uri[7:] # Remove "file://"
105
+ name = path.split("/")[-1] or path
106
+ return f"[@{name}]({uri})"
107
+ if uri.startswith("zed://"):
108
+ parts = uri.split("/")
109
+ name = parts[-1] or uri
110
+ return f"[@{name}]({uri})"
111
+ return uri
112
+
113
+
114
+ def from_acp_content(blocks: Sequence[ContentBlock]) -> Sequence[UserContent]:
115
+ """Convert ACP content blocks to pydantic-ai UserContent objects.
116
+
117
+ Args:
118
+ blocks: List of ACP ContentBlock objects
119
+
120
+ Returns:
121
+ List of pydantic-ai UserContent objects (str, ImageUrl, BinaryContent, etc.)
122
+ """
123
+ content: list[UserContent] = []
124
+
125
+ for block in blocks:
126
+ match block:
127
+ case TextContentBlock(text=text):
128
+ content.append(text)
129
+
130
+ case ImageContentBlock(data=data, mime_type=mime_type):
131
+ # ACP image data is base64 encoded
132
+ binary_data = base64.b64decode(data)
133
+ content.append(BinaryImage(data=binary_data, media_type=mime_type))
134
+
135
+ case AudioContentBlock(data=data, mime_type=mime_type):
136
+ binary_data = base64.b64decode(data)
137
+ content.append(BinaryContent(data=binary_data, media_type=mime_type))
138
+
139
+ case ResourceContentBlock(uri=uri, mime_type=mime_type):
140
+ # Convert to appropriate URL type based on MIME type
141
+ if mime_type:
142
+ if mime_type.startswith("image/"):
143
+ content.append(ImageUrl(url=uri))
144
+ elif mime_type.startswith("audio/"):
145
+ content.append(AudioUrl(url=uri))
146
+ elif mime_type.startswith("video/"):
147
+ content.append(VideoUrl(url=uri))
148
+ elif mime_type == "application/pdf":
149
+ content.append(DocumentUrl(url=uri))
150
+ else:
151
+ # Generic resource - convert to text link
152
+ content.append(format_uri_as_link(uri))
153
+ else:
154
+ # No MIME type - fallback to text link
155
+ content.append(format_uri_as_link(uri))
156
+
157
+ case EmbeddedResourceContentBlock(resource=resource):
158
+ match resource:
159
+ case TextResourceContents(uri=uri, text=text):
160
+ content.append(format_uri_as_link(uri))
161
+ content.append(f'\n<context ref="{uri}">\n{text}\n</context>')
162
+ case BlobResourceContents(blob=blob, mime_type=mime_type):
163
+ # Convert embedded binary to appropriate content type
164
+ binary_data = base64.b64decode(blob)
165
+ if mime_type and mime_type.startswith("image/"):
166
+ content.append(BinaryImage(data=binary_data, media_type=mime_type))
167
+ elif mime_type and mime_type.startswith("audio/"):
168
+ content.append(BinaryContent(data=binary_data, media_type=mime_type))
169
+ elif mime_type == "application/pdf":
170
+ content.append(
171
+ BinaryContent(data=binary_data, media_type="application/pdf")
172
+ )
173
+ else:
174
+ # Unknown binary type - describe it
175
+ formatted_uri = format_uri_as_link(resource.uri)
176
+ content.append(f"Binary Resource: {formatted_uri}")
177
+
178
+ return content
179
+
180
+
181
+ def agent_to_mode(agent: MessageNode[Any, Any]) -> SessionMode:
182
+ """Convert agent to a session mode (deprecated - use get_confirmation_modes)."""
183
+ desc = agent.description or f"Switch to {agent.name} agent"
184
+ return SessionMode(id=agent.name, name=agent.display_name, description=desc)
185
+
186
+
187
+ def get_confirmation_modes() -> list[SessionMode]:
188
+ """Get available tool confirmation modes as ACP session modes.
189
+
190
+ Returns standard ACP-compatible modes for tool confirmation levels.
191
+ """
192
+ return [
193
+ SessionMode(
194
+ id="default",
195
+ name="Default",
196
+ description="Require confirmation for tools marked as needing it",
197
+ ),
198
+ SessionMode(
199
+ id="acceptEdits",
200
+ name="Accept Edits",
201
+ description="Auto-approve all tool calls without confirmation",
202
+ ),
203
+ ]
204
+
205
+
206
+ def mode_id_to_confirmation_mode(mode_id: str) -> ToolConfirmationMode | None:
207
+ """Map ACP mode ID to ToolConfirmationMode.
208
+
209
+ Returns:
210
+ ToolConfirmationMode value or None if mode_id is invalid
211
+ """
212
+ mapping: dict[str, ToolConfirmationMode] = {
213
+ "default": "per_tool",
214
+ "acceptEdits": "never",
215
+ "bypassPermissions": "never",
216
+ # "plan": "..."
217
+ }
218
+ return mapping.get(mode_id)
219
+
220
+
221
+ def confirmation_mode_to_mode_id(mode: ToolConfirmationMode) -> str:
222
+ """Map ToolConfirmationMode to ACP mode ID.
223
+
224
+ Args:
225
+ mode: Tool confirmation mode
226
+
227
+ Returns:
228
+ ACP mode ID string
229
+ """
230
+ mapping: dict[ToolConfirmationMode, str] = {
231
+ "per_tool": "default",
232
+ "always": "default", # No direct ACP equivalent, use default (requires confirmation)
233
+ "never": "acceptEdits",
234
+ }
235
+ return mapping.get(mode, "default")