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,251 @@
1
+ """Client ACP Connection."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from functools import partial
6
+ from typing import TYPE_CHECKING, Any, Self
7
+
8
+ import logfire
9
+
10
+
11
+ if TYPE_CHECKING:
12
+ from types import TracebackType
13
+
14
+ from anyio.abc import ByteReceiveStream, ByteSendStream
15
+
16
+ from acp.client.protocol import Client
17
+ from acp.connection import StreamObserver
18
+ from acp.schema import (
19
+ AuthenticateRequest,
20
+ CancelNotification,
21
+ ClientMethod,
22
+ CreateTerminalResponse,
23
+ ForkSessionRequest,
24
+ InitializeRequest,
25
+ KillTerminalCommandResponse,
26
+ ListSessionsRequest,
27
+ LoadSessionRequest,
28
+ NewSessionRequest,
29
+ PromptRequest,
30
+ ReadTextFileResponse,
31
+ ReleaseTerminalResponse,
32
+ RequestPermissionResponse,
33
+ ResumeSessionRequest,
34
+ SetSessionModelRequest,
35
+ SetSessionModeRequest,
36
+ TerminalOutputResponse,
37
+ WaitForTerminalExitResponse,
38
+ WriteTextFileResponse,
39
+ )
40
+
41
+ from acp.agent.protocol import Agent
42
+ from acp.connection import Connection
43
+ from acp.exceptions import RequestError
44
+ from acp.schema import (
45
+ AuthenticateResponse,
46
+ CreateTerminalRequest,
47
+ ForkSessionResponse,
48
+ InitializeResponse,
49
+ KillTerminalCommandRequest,
50
+ ListSessionsResponse,
51
+ LoadSessionResponse,
52
+ NewSessionResponse,
53
+ PromptResponse,
54
+ ReadTextFileRequest,
55
+ ReleaseTerminalRequest,
56
+ RequestPermissionRequest,
57
+ ResumeSessionResponse,
58
+ SessionNotification,
59
+ SetSessionModelResponse,
60
+ SetSessionModeResponse,
61
+ TerminalOutputRequest,
62
+ WaitForTerminalExitRequest,
63
+ WriteTextFileRequest,
64
+ )
65
+
66
+
67
+ if TYPE_CHECKING:
68
+ from collections.abc import Callable
69
+
70
+
71
+ class ClientSideConnection(Agent):
72
+ """Client-side connection.
73
+
74
+ Use when you implement the Client and need to talk to an Agent.
75
+
76
+ Args:
77
+ to_client: factory that receives this connection and returns your Client
78
+ input: ByteSendStream (local -> peer)
79
+ output: ByteReceiveStream (peer -> local)
80
+ """
81
+
82
+ def __init__(
83
+ self,
84
+ to_client: Callable[[Agent], Client],
85
+ input_stream: ByteSendStream,
86
+ output_stream: ByteReceiveStream,
87
+ observers: list[StreamObserver] | None = None,
88
+ ) -> None:
89
+ # Build client first so handler can delegate
90
+ client = to_client(self)
91
+ handler = partial(_handle_client_method, client)
92
+ self._conn = Connection(handler, input_stream, output_stream, observers=observers)
93
+
94
+ # agent-bound methods (client -> agent)
95
+ async def initialize(self, params: InitializeRequest) -> InitializeResponse:
96
+ dct = params.model_dump(
97
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
98
+ )
99
+ resp = await self._conn.send_request("initialize", dct)
100
+ return InitializeResponse.model_validate(resp)
101
+
102
+ async def new_session(self, params: NewSessionRequest) -> NewSessionResponse:
103
+ # Don't exclude_defaults - MCP server 'type' field is required for discriminated unions
104
+ dct = params.model_dump(mode="json", by_alias=True, exclude_none=True)
105
+ resp = await self._conn.send_request("session/new", dct)
106
+ return NewSessionResponse.model_validate(resp)
107
+
108
+ async def load_session(self, params: LoadSessionRequest) -> LoadSessionResponse:
109
+ dct = params.model_dump(
110
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
111
+ )
112
+ resp = await self._conn.send_request("session/load", dct)
113
+ payload = resp if isinstance(resp, dict) else {}
114
+ return LoadSessionResponse.model_validate(payload)
115
+
116
+ async def list_sessions(self, params: ListSessionsRequest) -> ListSessionsResponse:
117
+ dct = params.model_dump(
118
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
119
+ )
120
+ resp = await self._conn.send_request("session/list", dct)
121
+ return ListSessionsResponse.model_validate(resp)
122
+
123
+ async def fork_session(self, params: ForkSessionRequest) -> ForkSessionResponse:
124
+ dct = params.model_dump(
125
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
126
+ )
127
+ resp = await self._conn.send_request("session/fork", dct)
128
+ return ForkSessionResponse.model_validate(resp)
129
+
130
+ async def resume_session(self, params: ResumeSessionRequest) -> ResumeSessionResponse:
131
+ dct = params.model_dump(
132
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
133
+ )
134
+ resp = await self._conn.send_request("session/resume", dct)
135
+ payload = resp if isinstance(resp, dict) else {}
136
+ return ResumeSessionResponse.model_validate(payload)
137
+
138
+ async def set_session_mode(self, params: SetSessionModeRequest) -> SetSessionModeResponse:
139
+ dct = params.model_dump(
140
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
141
+ )
142
+ resp = await self._conn.send_request("session/set_mode", dct)
143
+ payload = resp if isinstance(resp, dict) else {}
144
+ return SetSessionModeResponse.model_validate(payload)
145
+
146
+ async def set_session_model(self, params: SetSessionModelRequest) -> SetSessionModelResponse:
147
+ dct = params.model_dump(
148
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
149
+ )
150
+ resp = await self._conn.send_request("session/set_model", dct)
151
+ payload = resp if isinstance(resp, dict) else {}
152
+ return SetSessionModelResponse.model_validate(payload)
153
+
154
+ async def authenticate(self, params: AuthenticateRequest) -> AuthenticateResponse:
155
+ dct = params.model_dump(
156
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
157
+ )
158
+ resp = await self._conn.send_request("authenticate", dct)
159
+ payload = resp if isinstance(resp, dict) else {}
160
+ return AuthenticateResponse.model_validate(payload)
161
+
162
+ async def prompt(self, params: PromptRequest) -> PromptResponse:
163
+ # Don't exclude_defaults here - the 'type' field in content blocks has a default
164
+ # value but is required for discriminated unions to work
165
+ dct = params.model_dump(mode="json", by_alias=True, exclude_none=True)
166
+ resp = await self._conn.send_request("session/prompt", dct)
167
+ return PromptResponse.model_validate(resp)
168
+
169
+ async def cancel(self, params: CancelNotification) -> None:
170
+ dct = params.model_dump(
171
+ mode="json", by_alias=True, exclude_none=True, exclude_defaults=True
172
+ )
173
+ await self._conn.send_notification("session/cancel", dct)
174
+
175
+ async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any]:
176
+ return await self._conn.send_request(f"_{method}", params) # type: ignore[no-any-return]
177
+
178
+ async def ext_notification(self, method: str, params: dict[str, Any]) -> None:
179
+ await self._conn.send_notification(f"_{method}", params)
180
+
181
+ async def close(self) -> None:
182
+ await self._conn.close()
183
+
184
+ async def __aenter__(self) -> Self:
185
+ return self
186
+
187
+ async def __aexit__(
188
+ self,
189
+ exc_type: type[BaseException] | None,
190
+ exc_val: BaseException | None,
191
+ exc_tb: TracebackType | None,
192
+ ) -> None:
193
+ await self.close()
194
+
195
+
196
+ @logfire.instrument(r"Handle Client Method {method}")
197
+ async def _handle_client_method( # noqa: PLR0911
198
+ client: Client,
199
+ method: ClientMethod | str,
200
+ params: dict[str, Any] | None,
201
+ is_notification: bool,
202
+ ) -> (
203
+ WriteTextFileResponse
204
+ | ReadTextFileResponse
205
+ | RequestPermissionResponse
206
+ | SessionNotification
207
+ | CreateTerminalResponse
208
+ | TerminalOutputResponse
209
+ | WaitForTerminalExitResponse
210
+ | ReleaseTerminalResponse
211
+ | KillTerminalCommandResponse
212
+ | dict[str, Any]
213
+ | None
214
+ ):
215
+ """Handle client method calls."""
216
+ match method:
217
+ case "fs/write_text_file":
218
+ write_file_request = WriteTextFileRequest.model_validate(params)
219
+ return await client.write_text_file(write_file_request)
220
+ case "fs/read_text_file":
221
+ read_file_request = ReadTextFileRequest.model_validate(params)
222
+ return await client.read_text_file(read_file_request)
223
+ case "session/request_permission":
224
+ permission_request = RequestPermissionRequest.model_validate(params)
225
+ return await client.request_permission(permission_request)
226
+ case "session/update":
227
+ notification = SessionNotification.model_validate(params)
228
+ await client.session_update(notification)
229
+ return None
230
+ case "terminal/create":
231
+ create_request = CreateTerminalRequest.model_validate(params)
232
+ return await client.create_terminal(create_request)
233
+ case "terminal/output":
234
+ output_request = TerminalOutputRequest.model_validate(params)
235
+ return await client.terminal_output(output_request)
236
+ case "terminal/release":
237
+ release_request = ReleaseTerminalRequest.model_validate(params)
238
+ return await client.release_terminal(release_request)
239
+ case "terminal/wait_for_exit":
240
+ wait_request = WaitForTerminalExitRequest.model_validate(params)
241
+ return await client.wait_for_terminal_exit(wait_request)
242
+ case "terminal/kill":
243
+ kill_request = KillTerminalCommandRequest.model_validate(params)
244
+ return await client.kill_terminal(kill_request)
245
+ case str() if method.startswith("_") and is_notification:
246
+ await client.ext_notification(method[1:], params or {})
247
+ return None
248
+ case str() if method.startswith("_") and is_notification:
249
+ return await client.ext_method(method[1:], params or {})
250
+ case _:
251
+ raise RequestError.method_not_found(method)
@@ -0,0 +1,7 @@
1
+ """ACP Client implementations."""
2
+
3
+ from acp.client.implementations.default_client import DefaultACPClient
4
+ from acp.client.implementations.headless_client import HeadlessACPClient
5
+ from acp.client.implementations.noop_client import NoOpClient
6
+
7
+ __all__ = ["DefaultACPClient", "HeadlessACPClient", "NoOpClient"]
@@ -0,0 +1,185 @@
1
+ """Default ACP client implementation.
2
+
3
+ This module provides a basic client implementation for the Agent Client Protocol (ACP)
4
+ that can be used for testing or as a base for more sophisticated client implementations.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from pathlib import Path
10
+ from typing import TYPE_CHECKING, Any
11
+
12
+ from acp.client import Client
13
+ from acp.schema import ReadTextFileResponse, RequestPermissionResponse, WriteTextFileResponse
14
+ from agentpool import log
15
+
16
+
17
+ if TYPE_CHECKING:
18
+ from acp.schema import (
19
+ AllowedOutcome,
20
+ CreateTerminalRequest,
21
+ CreateTerminalResponse,
22
+ DeniedOutcome,
23
+ KillTerminalCommandRequest,
24
+ KillTerminalCommandResponse,
25
+ ReadTextFileRequest,
26
+ ReleaseTerminalRequest,
27
+ ReleaseTerminalResponse,
28
+ RequestPermissionRequest,
29
+ SessionNotification,
30
+ TerminalOutputRequest,
31
+ TerminalOutputResponse,
32
+ WaitForTerminalExitRequest,
33
+ WaitForTerminalExitResponse,
34
+ WriteTextFileRequest,
35
+ )
36
+
37
+ logger = log.get_logger(__name__)
38
+
39
+
40
+ class DefaultACPClient(Client):
41
+ """Default implementation of ACP Client interface for basic operations.
42
+
43
+ This provides a basic client implementation that can be used for testing
44
+ or as a base for more sophisticated client implementations.
45
+ """
46
+
47
+ def __init__(
48
+ self,
49
+ *,
50
+ allow_file_operations: bool = False,
51
+ permission_outcomes: list[dict[str, DeniedOutcome | AllowedOutcome]] | None = None,
52
+ use_real_files: bool = True,
53
+ ) -> None:
54
+ """Initialize default ACP client.
55
+
56
+ Args:
57
+ allow_file_operations: Whether to allow file read/write operations
58
+ permission_outcomes: Queue of permission outcomes for testing
59
+ use_real_files: Whether to use real filesystem or in-memory storage
60
+ """
61
+ self.allow_file_operations = allow_file_operations
62
+ self.use_real_files = use_real_files
63
+ self.permission_outcomes = permission_outcomes or []
64
+ self.files: dict[str, str] = {} # In-memory file storage for testing
65
+ self.ext_calls: list[tuple[str, dict[str, Any]]] = []
66
+ self.ext_notes: list[tuple[str, dict[str, Any]]] = []
67
+ self.notifications: list[SessionNotification] = []
68
+
69
+ async def request_permission(
70
+ self, params: RequestPermissionRequest
71
+ ) -> RequestPermissionResponse:
72
+ """Default permission handler - grants all permissions or uses test queue."""
73
+ title = params.tool_call.title or "operation"
74
+ logger.info("Permission requested", title=title)
75
+
76
+ # If we have test outcomes queued, use them
77
+ if self.permission_outcomes:
78
+ outcome = self.permission_outcomes.pop(0)
79
+ return RequestPermissionResponse.model_validate({"outcome": outcome})
80
+
81
+ # Default: grant permission for the first option
82
+ if params.options:
83
+ id_ = params.options[0].option_id
84
+ return RequestPermissionResponse.allowed(id_)
85
+
86
+ # No options - deny
87
+ return RequestPermissionResponse.denied()
88
+
89
+ async def session_update(self, params: SessionNotification) -> None:
90
+ """Handle session update notifications."""
91
+ msg = "Session update for %s: %s"
92
+ logger.debug(msg, params.session_id, params.update.session_update)
93
+ self.notifications.append(params)
94
+
95
+ async def write_text_file(self, params: WriteTextFileRequest) -> WriteTextFileResponse:
96
+ """Write text to file (if allowed)."""
97
+ if not self.allow_file_operations:
98
+ raise RuntimeError("File operations not allowed")
99
+
100
+ if self.use_real_files:
101
+ try:
102
+ path = Path(params.path)
103
+ path.write_text(params.content, encoding="utf-8")
104
+ logger.info("Wrote file", path=params.path)
105
+ except Exception:
106
+ logger.exception("Failed to write file", path=params.path)
107
+ raise
108
+ else:
109
+ # In-memory storage for testing
110
+ self.files[str(params.path)] = params.content
111
+
112
+ return WriteTextFileResponse()
113
+
114
+ async def read_text_file(self, params: ReadTextFileRequest) -> ReadTextFileResponse:
115
+ """Read text from file (if allowed)."""
116
+ if not self.allow_file_operations:
117
+ raise RuntimeError("File operations not allowed")
118
+
119
+ if self.use_real_files:
120
+ try:
121
+ path = Path(params.path)
122
+
123
+ if not path.exists():
124
+ raise FileNotFoundError(f"File not found: {params.path}") # noqa: TRY301
125
+
126
+ content = path.read_text(encoding="utf-8")
127
+
128
+ # Apply line filtering if requested
129
+ if params.line is not None or params.limit is not None:
130
+ lines = content.splitlines()
131
+ start_line = (params.line - 1) if params.line else 0
132
+ end_line = start_line + params.limit if params.limit else len(lines)
133
+ content = "\n".join(lines[start_line:end_line])
134
+
135
+ logger.info("Read file", path=params.path)
136
+ return ReadTextFileResponse(content=content)
137
+
138
+ except Exception:
139
+ logger.exception("Failed to read file", path=params.path)
140
+ raise
141
+ else:
142
+ # In-memory storage for testing
143
+ content = self.files.get(str(params.path), "default content")
144
+ return ReadTextFileResponse(content=content)
145
+
146
+ async def create_terminal(self, params: CreateTerminalRequest) -> CreateTerminalResponse:
147
+ """Create terminal (not implemented)."""
148
+ raise NotImplementedError("Terminal operations not implemented")
149
+
150
+ async def terminal_output(self, params: TerminalOutputRequest) -> TerminalOutputResponse:
151
+ """Get terminal output (not implemented)."""
152
+ raise NotImplementedError("Terminal operations not implemented")
153
+
154
+ async def release_terminal(
155
+ self, params: ReleaseTerminalRequest
156
+ ) -> ReleaseTerminalResponse | None:
157
+ """Release terminal (not implemented)."""
158
+ raise NotImplementedError("Terminal operations not implemented")
159
+
160
+ async def wait_for_terminal_exit(
161
+ self, params: WaitForTerminalExitRequest
162
+ ) -> WaitForTerminalExitResponse:
163
+ """Wait for terminal exit (not implemented)."""
164
+ raise NotImplementedError("Terminal operations not implemented")
165
+
166
+ async def kill_terminal(
167
+ self, params: KillTerminalCommandRequest
168
+ ) -> KillTerminalCommandResponse | None:
169
+ """Kill terminal (not implemented)."""
170
+ raise NotImplementedError("Terminal operations not implemented")
171
+
172
+ def get_session_updates(self) -> list[SessionNotification]:
173
+ """Get all received session updates."""
174
+ return self.notifications.copy()
175
+
176
+ def clear_session_updates(self) -> None:
177
+ """Clear all stored session updates."""
178
+ self.notifications.clear()
179
+
180
+ async def ext_method(self, method: str, params: dict[str, Any]) -> dict[str, Any]:
181
+ self.ext_calls.append((method, params))
182
+ return {"ok": True, "method": method}
183
+
184
+ async def ext_notification(self, method: str, params: dict[str, Any]) -> None:
185
+ self.ext_notes.append((method, params))