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,347 @@
1
+ """Tool call schema definitions."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import base64
6
+ from collections.abc import Sequence # noqa: TC003
7
+ from typing import TYPE_CHECKING, Any, Literal, Self
8
+
9
+ from pydantic import Field
10
+
11
+ from acp.schema.base import AnnotatedObject, Schema
12
+ from acp.schema.content_blocks import ( # noqa: TC001
13
+ Annotations,
14
+ Audience,
15
+ AudioContentBlock,
16
+ BlobResourceContents,
17
+ ContentBlock,
18
+ EmbeddedResourceContentBlock,
19
+ ImageContentBlock,
20
+ ResourceContentBlock,
21
+ TextContentBlock,
22
+ TextResourceContents,
23
+ )
24
+
25
+
26
+ if TYPE_CHECKING:
27
+ from datetime import datetime
28
+
29
+
30
+ ToolCallKind = Literal[
31
+ "read",
32
+ "edit",
33
+ "delete",
34
+ "move",
35
+ "search",
36
+ "execute",
37
+ "think",
38
+ "fetch",
39
+ "switch_mode",
40
+ "other",
41
+ ]
42
+ ToolCallStatus = Literal["pending", "in_progress", "completed", "failed"]
43
+ PermissionKind = Literal["allow_once", "allow_always", "reject_once", "reject_always"]
44
+
45
+
46
+ class ToolCall(AnnotatedObject):
47
+ """Details about the tool call requiring permission."""
48
+
49
+ content: Sequence[ToolCallContent] | None = None
50
+ """Replace the content collection."""
51
+
52
+ kind: ToolCallKind | None = None
53
+ """Update the tool kind."""
54
+
55
+ locations: Sequence[ToolCallLocation] | None = None
56
+ """Replace the locations collection."""
57
+
58
+ raw_input: Any | None = None
59
+ """Update the raw input."""
60
+
61
+ raw_output: Any | None = None
62
+ """Update the raw output."""
63
+
64
+ status: ToolCallStatus | None = None
65
+ """Update the execution status."""
66
+
67
+ title: str | None = None
68
+ """Update the human-readable title."""
69
+
70
+ tool_call_id: str
71
+ """The ID of the tool call being updated."""
72
+
73
+
74
+ class FileEditToolCallContent(AnnotatedObject):
75
+ """File modification shown as a diff."""
76
+
77
+ type: Literal["diff"] = Field(default="diff", init=False)
78
+ """File modification shown as a diff."""
79
+
80
+ new_text: str
81
+ """The new content after modification."""
82
+
83
+ old_text: str | None
84
+ """The original content (None for new files)."""
85
+
86
+ path: str
87
+ """The file path being modified."""
88
+
89
+
90
+ class TerminalToolCallContent(Schema):
91
+ """Embed a terminal created with `terminal/create` by its id.
92
+
93
+ The terminal must be added before calling `terminal/release`.
94
+ See protocol docs: [Terminal](https://agentclientprotocol.com/protocol/terminal)
95
+ """
96
+
97
+ type: Literal["terminal"] = Field(default="terminal", init=False)
98
+ """Terminal tool call content."""
99
+
100
+ terminal_id: str
101
+ """The ID of the terminal being embedded."""
102
+
103
+
104
+ class ContentToolCallContent[TContentBlock: ContentBlock = ContentBlock](Schema):
105
+ """Standard content block (text, images, resources)."""
106
+
107
+ type: Literal["content"] = Field(default="content", init=False)
108
+ """Standard content block (text, images, resources)."""
109
+
110
+ content: TContentBlock
111
+ """The actual content block."""
112
+
113
+ @classmethod
114
+ def text(
115
+ cls,
116
+ text: str,
117
+ *,
118
+ audience: Audience | None = None,
119
+ last_modified: datetime | str | None = None,
120
+ priority: float | None = None,
121
+ ) -> Self:
122
+ """Create a ToolCallContent containing text.
123
+
124
+ Args:
125
+ text: The text content.
126
+ audience: The audience for the text.
127
+ last_modified: The last modified date of the text.
128
+ priority: The priority of the text.
129
+ """
130
+ annotations = Annotations.optionally_create(
131
+ audience=audience,
132
+ last_modified=last_modified,
133
+ priority=priority,
134
+ )
135
+ return cls(content=TextContentBlock(text=text, annotations=annotations))
136
+
137
+ @classmethod
138
+ def image(
139
+ cls,
140
+ data: str | bytes,
141
+ mime_type: str,
142
+ uri: str | None = None,
143
+ audience: Audience | None = None,
144
+ last_modified: datetime | str | None = None,
145
+ priority: float | None = None,
146
+ ) -> Self:
147
+ """Create a ToolCallContent containing an embedded image resource.
148
+
149
+ Args:
150
+ data: The image data.
151
+ mime_type: The MIME type of the image.
152
+ uri: The URI of the image.
153
+ audience: The audience for the image.
154
+ last_modified: The last modified date of the image.
155
+ priority: The priority of the image.
156
+ """
157
+ if isinstance(data, bytes):
158
+ data = base64.b64encode(data).decode()
159
+ annotations = Annotations.optionally_create(
160
+ audience=audience,
161
+ last_modified=last_modified,
162
+ priority=priority,
163
+ )
164
+ image = ImageContentBlock(data=data, mime_type=mime_type, uri=uri, annotations=annotations)
165
+ return cls(content=image)
166
+
167
+ @classmethod
168
+ def audio(
169
+ cls,
170
+ data: str | bytes,
171
+ mime_type: str,
172
+ audience: Audience | None = None,
173
+ last_modified: datetime | str | None = None,
174
+ priority: float | None = None,
175
+ ) -> Self:
176
+ """Create a ToolCallContent containing audio content.
177
+
178
+ Args:
179
+ data: The audio data.
180
+ mime_type: The MIME type of the audio data.
181
+ audience: The audience for the audio chunk.
182
+ last_modified: The last modified date of the audio chunk.
183
+ priority: The priority of the audio chunk.
184
+ """
185
+ if isinstance(data, bytes):
186
+ data = base64.b64encode(data).decode()
187
+ annotations = Annotations.optionally_create(
188
+ audience=audience,
189
+ last_modified=last_modified,
190
+ priority=priority,
191
+ )
192
+ content = AudioContentBlock(data=data, mime_type=mime_type, annotations=annotations)
193
+ return cls(content=content)
194
+
195
+ @classmethod
196
+ def resource(
197
+ cls,
198
+ name: str,
199
+ uri: str,
200
+ description: str | None = None,
201
+ mime_type: str | None = None,
202
+ size: int | None = None,
203
+ title: str | None = None,
204
+ audience: Audience | None = None,
205
+ last_modified: datetime | str | None = None,
206
+ priority: float | None = None,
207
+ ) -> Self:
208
+ """Create a ToolCallContent containing a resource content block.
209
+
210
+ Args:
211
+ name: The name of the resource.
212
+ uri: The URI of the resource.
213
+ description: The description of the resource.
214
+ mime_type: The MIME type of the resource.
215
+ size: The size of the resource.
216
+ title: The title of the resource.
217
+ audience: The audience of the resource.
218
+ last_modified: The last modified date of the resource.
219
+ priority: The priority of the resource.
220
+ """
221
+ annotations = Annotations.optionally_create(
222
+ audience=audience,
223
+ last_modified=last_modified,
224
+ priority=priority,
225
+ )
226
+ block = ResourceContentBlock(
227
+ name=name,
228
+ uri=uri,
229
+ description=description,
230
+ mime_type=mime_type,
231
+ size=size,
232
+ title=title,
233
+ annotations=annotations,
234
+ )
235
+ return cls(content=block)
236
+
237
+ @classmethod
238
+ def embedded_text_resource(
239
+ cls,
240
+ text: str,
241
+ uri: str,
242
+ mime_type: str | None = None,
243
+ audience: Audience | None = None,
244
+ last_modified: datetime | str | None = None,
245
+ priority: float | None = None,
246
+ ) -> Self:
247
+ """Create a ToolCallContent containing an embedded text resource.
248
+
249
+ Args:
250
+ text: The text to embed.
251
+ uri: The URI of the resource.
252
+ mime_type: The MIME type of the resource.
253
+ audience: The audience to apply to the resource.
254
+ last_modified: The last modified date of the resource.
255
+ priority: The priority of the resource.
256
+ """
257
+ annotations = Annotations.optionally_create(
258
+ audience=audience,
259
+ last_modified=last_modified,
260
+ priority=priority,
261
+ )
262
+ contents = TextResourceContents(text=text, mime_type=mime_type, uri=uri)
263
+ content = EmbeddedResourceContentBlock(annotations=annotations, resource=contents)
264
+ return cls(content=content) # ty: ignore[invalid-argument-type]
265
+
266
+ @classmethod
267
+ def embedded_blob_resource(
268
+ cls,
269
+ data: bytes | str,
270
+ uri: str,
271
+ mime_type: str | None = None,
272
+ audience: Audience | None = None,
273
+ last_modified: datetime | str | None = None,
274
+ priority: float | None = None,
275
+ ) -> Self:
276
+ """Create a ToolCallContent containing an embedded blob resource.
277
+
278
+ Args:
279
+ data: The data to embed.
280
+ uri: The URI of the resource.
281
+ mime_type: The MIME type of the resource.
282
+ audience: The audience to apply to the resource.
283
+ last_modified: The last modified date of the resource.
284
+ priority: The priority of the resource.
285
+ """
286
+ if isinstance(data, bytes):
287
+ data = base64.b64encode(data).decode()
288
+ annotations = Annotations.optionally_create(
289
+ audience=audience,
290
+ last_modified=last_modified,
291
+ priority=priority,
292
+ )
293
+ resource = BlobResourceContents(blob=data, mime_type=mime_type, uri=uri)
294
+ content = EmbeddedResourceContentBlock(annotations=annotations, resource=resource)
295
+ return cls(content=content) # ty: ignore[invalid-argument-type]
296
+
297
+
298
+ class ToolCallLocation(AnnotatedObject):
299
+ """A file location being accessed or modified by a tool.
300
+
301
+ Enables clients to implement "follow-along" features that track
302
+ which files the agent is working with in real-time.
303
+ See protocol docs: [Following the Agent](https://agentclientprotocol.com/protocol/tool-calls#following-the-agent)
304
+ """
305
+
306
+ line: int = Field(default=0, ge=0)
307
+ """Line number within the file (0 = beginning/unspecified)."""
308
+
309
+ path: str
310
+ """The file path being accessed or modified."""
311
+
312
+
313
+ class DeniedOutcome(Schema):
314
+ """The prompt turn was cancelled before the user responded.
315
+
316
+ When a client sends a `session/cancel` notification to cancel an ongoing
317
+ prompt turn, it MUST respond to all pending `session/request_permission`
318
+ requests with this `Cancelled` outcome.
319
+ See protocol docs: [Cancellation](https://agentclientprotocol.com/protocol/prompt-turn#cancellation)
320
+ """
321
+
322
+ outcome: Literal["cancelled"] = Field(default="cancelled", init=False)
323
+
324
+
325
+ class AllowedOutcome(Schema):
326
+ """The user selected one of the provided options."""
327
+
328
+ option_id: str
329
+ """The ID of the option the user selected."""
330
+
331
+ outcome: Literal["selected"] = Field(default="selected", init=False)
332
+
333
+
334
+ class PermissionOption(AnnotatedObject):
335
+ """An option presented to the user when requesting permission."""
336
+
337
+ kind: PermissionKind
338
+ """Hint about the nature of this permission option."""
339
+
340
+ name: str
341
+ """Human-readable label to display to the user."""
342
+
343
+ option_id: str
344
+ """Unique identifier for this permission option."""
345
+
346
+
347
+ ToolCallContent = ContentToolCallContent | FileEditToolCallContent | TerminalToolCallContent
acp/stdio.py ADDED
@@ -0,0 +1,250 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ from contextlib import asynccontextmanager
5
+ import sys
6
+ from typing import TYPE_CHECKING, Any
7
+
8
+ import anyio
9
+
10
+ from acp.agent.connection import AgentSideConnection
11
+ from acp.client.connection import ClientSideConnection
12
+ from acp.connection import Connection
13
+ from acp.transports import spawn_stdio_transport
14
+
15
+
16
+ if TYPE_CHECKING:
17
+ from collections.abc import AsyncIterator, Callable, Mapping
18
+ from pathlib import Path
19
+
20
+ from anyio.abc import ByteReceiveStream, ByteSendStream, Process
21
+
22
+ from acp.agent.protocol import Agent
23
+ from acp.client.protocol import Client
24
+ from acp.connection import MethodHandler, StreamObserver
25
+
26
+ __all__ = [
27
+ "connect_to_agent",
28
+ "run_agent",
29
+ "spawn_agent_process",
30
+ "spawn_client_process",
31
+ "spawn_stdio_connection",
32
+ "stdio_streams",
33
+ ]
34
+
35
+
36
+ class StdinStream(anyio.abc.ByteReceiveStream):
37
+ """Wrapper for stdin that implements ByteReceiveStream interface."""
38
+
39
+ async def receive(self, max_bytes: int = 65536) -> bytes:
40
+ """Read bytes from stdin.
41
+
42
+ Uses read1() which returns as soon as any data is available,
43
+ rather than blocking until max_bytes are read.
44
+ """
45
+ loop = asyncio.get_running_loop()
46
+ # read1() returns immediately when any data is available (up to max_bytes)
47
+ # unlike read() which blocks until exactly max_bytes are read or EOF
48
+ data: bytes = await loop.run_in_executor(None, sys.stdin.buffer.read1, max_bytes) # type: ignore[union-attr]
49
+ if not data:
50
+ raise anyio.EndOfStream
51
+ return data
52
+
53
+ async def aclose(self) -> None:
54
+ """Close is a no-op for stdin."""
55
+
56
+
57
+ class StdoutStream(anyio.abc.ByteSendStream):
58
+ """Wrapper for stdout that implements ByteSendStream interface."""
59
+
60
+ async def send(self, item: bytes) -> None:
61
+ """Write bytes to stdout."""
62
+ loop = asyncio.get_running_loop()
63
+ await loop.run_in_executor(None, self._write, item)
64
+
65
+ def _write(self, data: bytes) -> None:
66
+ sys.stdout.buffer.write(data)
67
+ sys.stdout.buffer.flush()
68
+
69
+ async def aclose(self) -> None:
70
+ """Close is a no-op for stdout."""
71
+
72
+
73
+ async def stdio_streams() -> tuple[StdinStream, StdoutStream]:
74
+ """Create stdio anyio-compatible streams (cross-platform).
75
+
76
+ Returns (stdin, stdout) as byte stream wrappers compatible with
77
+ ByteReceiveStream and ByteSendStream interfaces.
78
+ """
79
+ return StdinStream(), StdoutStream()
80
+
81
+
82
+ @asynccontextmanager
83
+ async def spawn_stdio_connection(
84
+ handler: MethodHandler,
85
+ command: str,
86
+ *args: str,
87
+ env: Mapping[str, str] | None = None,
88
+ cwd: str | Path | None = None,
89
+ observers: list[StreamObserver] | None = None,
90
+ **transport_kwargs: Any,
91
+ ) -> AsyncIterator[tuple[Connection, Process]]:
92
+ """Spawn a subprocess and bind its stdio to a low-level Connection."""
93
+ async with spawn_stdio_transport(command, *args, env=env, cwd=cwd, **transport_kwargs) as (
94
+ reader,
95
+ writer,
96
+ process,
97
+ ):
98
+ conn = Connection(handler, writer, reader, observers=observers)
99
+ try:
100
+ yield conn, process
101
+ finally:
102
+ await conn.close()
103
+
104
+
105
+ @asynccontextmanager
106
+ async def spawn_agent_process(
107
+ to_client: Callable[[Agent], Client],
108
+ command: str,
109
+ *args: str,
110
+ env: Mapping[str, str] | None = None,
111
+ cwd: str | Path | None = None,
112
+ transport_kwargs: Mapping[str, Any] | None = None,
113
+ **connection_kwargs: Any,
114
+ ) -> AsyncIterator[tuple[ClientSideConnection, Process]]:
115
+ """Spawn an ACP agent subprocess and return a ClientSideConnection to it."""
116
+ async with spawn_stdio_transport(
117
+ command,
118
+ *args,
119
+ env=env,
120
+ cwd=cwd,
121
+ **(dict(transport_kwargs) if transport_kwargs else {}),
122
+ ) as (reader, writer, process):
123
+ conn = ClientSideConnection(to_client, writer, reader, **connection_kwargs)
124
+ try:
125
+ yield conn, process
126
+ finally:
127
+ await conn.close()
128
+
129
+
130
+ @asynccontextmanager
131
+ async def spawn_client_process(
132
+ to_agent: Callable[[AgentSideConnection], Agent],
133
+ command: str,
134
+ *args: str,
135
+ env: Mapping[str, str] | None = None,
136
+ cwd: str | Path | None = None,
137
+ transport_kwargs: Mapping[str, Any] | None = None,
138
+ **connection_kwargs: Any,
139
+ ) -> AsyncIterator[tuple[AgentSideConnection, Process]]:
140
+ """Spawn an ACP client subprocess and return an AgentSideConnection to it."""
141
+ async with spawn_stdio_transport(
142
+ command,
143
+ *args,
144
+ env=env,
145
+ cwd=cwd,
146
+ **(dict(transport_kwargs) if transport_kwargs else {}),
147
+ ) as (reader, writer, process):
148
+ conn = AgentSideConnection(to_agent, writer, reader, **connection_kwargs)
149
+ try:
150
+ yield conn, process
151
+ finally:
152
+ await conn.close()
153
+
154
+
155
+ async def run_agent(
156
+ agent: Agent | Callable[[AgentSideConnection], Agent],
157
+ input_stream: ByteSendStream | None = None,
158
+ output_stream: ByteReceiveStream | None = None,
159
+ **connection_kwargs: Any,
160
+ ) -> None:
161
+ """Run an ACP agent over stdio or provided streams.
162
+
163
+ This is the recommended entry point for running agents. It handles stream
164
+ setup and connection lifecycle automatically.
165
+
166
+ Args:
167
+ agent: An Agent implementation or a factory callable that takes
168
+ an AgentSideConnection and returns an Agent. Using a factory allows
169
+ the agent to access the connection for client communication.
170
+ input_stream: Optional ByteSendStream for output (defaults to stdio).
171
+ output_stream: Optional ByteReceiveStream for input (defaults to stdio).
172
+ **connection_kwargs: Additional keyword arguments for AgentSideConnection.
173
+
174
+ Example with direct agent:
175
+ ```python
176
+ class MyAgent(Agent):
177
+ async def initialize(self, params: InitializeRequest) -> InitializeResponse:
178
+ return InitializeResponse(protocol_version=params.protocol_version)
179
+ # ... implement protocol methods ...
180
+
181
+ await run_agent(MyAgent())
182
+ ```
183
+
184
+ Example with factory:
185
+ ```python
186
+ class MyAgent(Agent):
187
+ def __init__(self, connection: AgentSideConnection):
188
+ self.connection = connection
189
+ # ... implement protocol methods ...
190
+
191
+ def create_agent(conn: AgentSideConnection) -> MyAgent:
192
+ return MyAgent(conn)
193
+
194
+ await run_agent(create_agent)
195
+ ```
196
+ """
197
+ if input_stream is None or output_stream is None:
198
+ # For stdio, we need to create byte streams from the text wrappers
199
+ # This follows the MCP SDK server pattern
200
+ _stdin_file, _stdout_file = await stdio_streams()
201
+ # Note: run_agent expects ByteSendStream/ByteReceiveStream but stdio_streams
202
+ # returns text AsyncFiles. For now, we'll use the underlying buffer.
203
+ # TODO: Consider refactoring to use memory object streams like MCP SDK
204
+ msg = "run_agent with stdio streams requires explicit stream arguments for now"
205
+ raise NotImplementedError(msg)
206
+
207
+ # Wrap agent instance in factory if needed
208
+ if callable(agent):
209
+ agent_factory = agent # pyright: ignore[reportAssignmentType]
210
+ else:
211
+
212
+ def agent_factory(connection: AgentSideConnection) -> Agent:
213
+ return agent # ty: ignore[invalid-return-type]
214
+
215
+ conn = AgentSideConnection(agent_factory, input_stream, output_stream, **connection_kwargs)
216
+ shutdown_event = asyncio.Event()
217
+ try:
218
+ # Keep the connection alive until cancelled
219
+ await shutdown_event.wait()
220
+ except asyncio.CancelledError:
221
+ pass
222
+ finally:
223
+ await conn.close()
224
+
225
+
226
+ def connect_to_agent(
227
+ client: Client,
228
+ input_stream: ByteSendStream,
229
+ output_stream: ByteReceiveStream,
230
+ **connection_kwargs: Any,
231
+ ) -> ClientSideConnection:
232
+ """Create a ClientSideConnection to an ACP agent.
233
+
234
+ This is the recommended entry point for client-side connections.
235
+
236
+ Args:
237
+ client: The client implementation.
238
+ input_stream: ByteSendStream for sending to the agent.
239
+ output_stream: ByteReceiveStream for receiving from the agent.
240
+ **connection_kwargs: Additional keyword arguments for ClientSideConnection.
241
+
242
+ Returns:
243
+ A ClientSideConnection connected to the agent.
244
+ """
245
+
246
+ # Create a factory that ignores the connection parameter
247
+ def client_factory(connection: Agent) -> Client:
248
+ return client
249
+
250
+ return ClientSideConnection(client_factory, input_stream, output_stream, **connection_kwargs)
acp/task/__init__.py ADDED
@@ -0,0 +1,53 @@
1
+ """Task package."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from dataclasses import dataclass
6
+ from enum import Enum
7
+ from typing import Any
8
+
9
+ __all__ = ["RpcTask", "RpcTaskKind"]
10
+
11
+
12
+ class RpcTaskKind(Enum):
13
+ """RpcTaskKind represents the kind of task to be executed by the agent."""
14
+
15
+ REQUEST = "request"
16
+ NOTIFICATION = "notification"
17
+
18
+
19
+ @dataclass(slots=True)
20
+ class RpcTask:
21
+ """RpcTask represents a task to be executed by the agent."""
22
+
23
+ kind: RpcTaskKind
24
+ message: dict[str, Any]
25
+
26
+
27
+ from .dispatcher import (
28
+ DefaultMessageDispatcher,
29
+ MessageDispatcher,
30
+ NotificationRunner,
31
+ RequestRunner,
32
+ )
33
+ from .queue import InMemoryMessageQueue, MessageQueue
34
+ from .sender import MessageSender, SenderFactory
35
+ from .state import InMemoryMessageStateStore, MessageStateStore
36
+ from .supervisor import TaskSupervisor
37
+ from .debug import DebugEntry, DebuggingMessageStateStore
38
+
39
+ __all__ += [
40
+ "DebugEntry",
41
+ "DebuggingMessageStateStore",
42
+ "DefaultMessageDispatcher",
43
+ "InMemoryMessageQueue",
44
+ "InMemoryMessageStateStore",
45
+ "MessageDispatcher",
46
+ "MessageQueue",
47
+ "MessageSender",
48
+ "MessageStateStore",
49
+ "NotificationRunner",
50
+ "RequestRunner",
51
+ "SenderFactory",
52
+ "TaskSupervisor",
53
+ ]