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,376 @@
1
+ """Debug commands for ACP notification replay and testing."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from pathlib import Path
7
+
8
+ import anyenv
9
+ import anyio
10
+ from pydantic import TypeAdapter
11
+ from slashed import CommandContext # noqa: TC002
12
+
13
+ from acp.schema import (
14
+ AgentMessageChunk,
15
+ AgentThoughtChunk,
16
+ ContentToolCallContent,
17
+ SessionNotification,
18
+ SessionUpdate,
19
+ TextContentBlock,
20
+ ToolCallKind, # noqa: TC001
21
+ ToolCallProgress,
22
+ ToolCallStart,
23
+ UserMessageChunk,
24
+ )
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
+ logger = get_logger(__name__)
32
+
33
+ # TypeAdapter for auto-constructing SessionUpdate variants from discriminator
34
+ SessionUpdateAdapter: TypeAdapter[SessionUpdate] = TypeAdapter(SessionUpdate)
35
+
36
+
37
+ class DebugSendTextCommand(NodeCommand):
38
+ """Send a text chunk notification for debugging.
39
+
40
+ Useful for testing client rendering of different message types.
41
+ """
42
+
43
+ name = "debug-send-text"
44
+ category = "debug"
45
+
46
+ async def execute_command(
47
+ self,
48
+ ctx: CommandContext[NodeContext[ACPSession]],
49
+ text: str,
50
+ *,
51
+ chunk_type: str = "agent",
52
+ ) -> None:
53
+ """Send a text chunk notification.
54
+
55
+ Args:
56
+ ctx: Command context
57
+ text: Text content to send
58
+ chunk_type: Type of chunk ('agent', 'user', 'thought')
59
+ """
60
+ session = ctx.context.data
61
+ assert session
62
+ try:
63
+ content = TextContentBlock(text=text)
64
+
65
+ if chunk_type == "agent":
66
+ update: SessionUpdate = AgentMessageChunk(content=content)
67
+ elif chunk_type == "user":
68
+ update = UserMessageChunk(content=content)
69
+ elif chunk_type == "thought":
70
+ update = AgentThoughtChunk(content=content)
71
+ else:
72
+ await ctx.print(f"❌ **Invalid chunk type:** `{chunk_type}`")
73
+ return
74
+
75
+ notification = SessionNotification(session_id=session.session_id, update=update)
76
+ await session.client.session_update(notification) # pyright: ignore[reportArgumentType]
77
+ await ctx.print(f"✅ **Sent {chunk_type} text chunk:** {text[:50]}...")
78
+
79
+ except Exception as e:
80
+ logger.exception("Failed to send debug text chunk")
81
+ await ctx.print(f"❌ **Failed to send text chunk:** {e}")
82
+
83
+
84
+ class DebugSendToolCallCommand(NodeCommand):
85
+ """Send a tool call notification for debugging.
86
+
87
+ Tests the client's tool call visualization and status handling.
88
+ """
89
+
90
+ name = "debug-send-tool-call"
91
+ category = "debug"
92
+
93
+ async def execute_command(
94
+ self,
95
+ ctx: CommandContext[NodeContext[ACPSession]],
96
+ title: str,
97
+ *,
98
+ kind: ToolCallKind = "other",
99
+ ) -> None:
100
+ """Send a tool call notification.
101
+
102
+ Args:
103
+ ctx: Command context
104
+ title: Tool call title/description
105
+ kind: Tool kind ('read', 'edit', 'delete', 'move', 'search',
106
+ 'execute', 'think', 'fetch', 'other')
107
+ """
108
+ session = ctx.context.data
109
+ assert session
110
+ try:
111
+ id_ = f"debug-{hash(title)}"
112
+ await session.notifications.tool_call_start(id_, title=title, kind=kind)
113
+ await ctx.print(f"✅ **Sent tool call:** {title}")
114
+ except Exception as e:
115
+ logger.exception("Failed to send debug tool call")
116
+ await ctx.print(f"❌ **Failed to send tool call:** {e}")
117
+
118
+
119
+ # class DebugUpdateToolCallCommand(SlashedCommand):
120
+ # """Send a tool call update notification for debugging.
121
+
122
+ # Tests tool call progress updates and result display.
123
+ # """
124
+
125
+ # name = "debug-update-tool"
126
+ # category = "debug"
127
+
128
+ # async def execute_command(
129
+ # self,
130
+ # ctx: CommandContext[AgentContext[ACPSession]],
131
+ # tool_call_id: str,
132
+ # *,
133
+ # status: ToolCallStatus = "completed",
134
+ # content: str = "",
135
+ # ):
136
+ # """Send a tool call update notification.
137
+
138
+ # Args:
139
+ # ctx: Command context
140
+ # tool_call_id: ID of tool call to update
141
+ # status: New status
142
+ # content: Content to include in update
143
+ # """
144
+ # session = ctx.context.data
145
+ # assert session
146
+ # try:
147
+ # tool_content = []
148
+ # if content:
149
+ # tool_content = [
150
+ # ContentToolCallContent(content=TextContentBlock(text=content))
151
+ # ]
152
+ # await session.notifications.tool_call_progress(
153
+ # tool_call_id,
154
+ # status,
155
+ # content=tool_content,
156
+ # )
157
+ # await ctx.print(f"✅ **Updated tool call {tool_call_id}:** {status}")
158
+
159
+ # except Exception as e:
160
+ # logger.exception("Failed to update debug tool call")
161
+ # await ctx.print(f"❌ **Failed to update tool call:** {e}")
162
+
163
+
164
+ class DebugReplaySequenceCommand(NodeCommand):
165
+ """Replay a sequence of ACP notifications from a JSON file.
166
+
167
+ Allows testing complex interaction flows by replaying recorded sequences.
168
+ """
169
+
170
+ name = "debug-replay"
171
+ category = "debug"
172
+
173
+ async def execute_command(
174
+ self,
175
+ ctx: CommandContext[NodeContext[ACPSession]],
176
+ file_path: str,
177
+ ) -> None:
178
+ """Replay a sequence of ACP notifications from a JSON file.
179
+
180
+ Args:
181
+ ctx: Command context
182
+ file_path: Path to JSON file containing notification sequence
183
+ """
184
+ session = ctx.context.data
185
+ assert session
186
+ try:
187
+ path = Path(file_path)
188
+ if not path.exists():
189
+ await ctx.print(f"❌ **File not found:** `{file_path}`")
190
+ return
191
+
192
+ with path.open() as f:
193
+ sequence_data = json.load(f)
194
+
195
+ if not isinstance(sequence_data, dict) or "notifications" not in sequence_data:
196
+ await ctx.print("❌ **Invalid replay file.** Expected: `{'notifications': [...]}`")
197
+ return
198
+
199
+ notifications = sequence_data["notifications"]
200
+ count = 0
201
+ delay_ms = sequence_data.get("delay_ms", 0)
202
+
203
+ for notification_data in notifications:
204
+ try:
205
+ # Auto-construct the correct SessionUpdate type via discriminator
206
+ update = SessionUpdateAdapter.validate_python(notification_data)
207
+ notification = SessionNotification(session_id=session.session_id, update=update)
208
+ await session.client.session_update(notification) # pyright: ignore[reportArgumentType]
209
+ count += 1
210
+ if delay_ms:
211
+ await anyio.sleep(delay_ms / 1000)
212
+
213
+ except Exception as e: # noqa: BLE001
214
+ logger.warning("Failed to replay notification", error=e)
215
+ continue
216
+
217
+ await ctx.print(f"✅ **Replayed {count} notifications from** `{file_path}`")
218
+
219
+ except Exception as e:
220
+ logger.exception("Failed to replay debug sequence")
221
+ await ctx.print(f"❌ **Failed to replay sequence:** {e}")
222
+
223
+
224
+ class DebugSessionInfoCommand(NodeCommand):
225
+ """Show current ACP session debugging information.
226
+
227
+ Displays session state, client capabilities, and configuration details.
228
+ """
229
+
230
+ name = "debug-session-info"
231
+ category = "debug"
232
+
233
+ async def execute_command(self, ctx: CommandContext[NodeContext[ACPSession]]) -> None:
234
+ """Show current ACP session debugging information."""
235
+ session = ctx.context.data
236
+ assert session
237
+ try:
238
+ info = {
239
+ "session_id": session.session_id,
240
+ "current_agent": session.current_agent_name,
241
+ "available_agents": list(session.agent_pool.agents.keys()),
242
+ "cwd": session.cwd,
243
+ "client_capabilities": (
244
+ session.client_capabilities.model_dump()
245
+ if session.client_capabilities
246
+ else None
247
+ ),
248
+ }
249
+
250
+ text = anyenv.dump_json(info, indent=True)
251
+ await ctx.print(f"## 🔍 Session Debug Info\n\n```json\n{text}\n```")
252
+
253
+ except Exception as e:
254
+ logger.exception("Failed to get session info")
255
+ await ctx.print(f"❌ **Failed to get session info:** {e}")
256
+
257
+
258
+ class DebugCreateTemplateCommand(NodeCommand):
259
+ """Create a template JSON file for debugging notification sequences.
260
+
261
+ Generates a sample replay file with common notification types.
262
+ """
263
+
264
+ name = "debug-create-template"
265
+ category = "debug"
266
+
267
+ async def execute_command(
268
+ self,
269
+ ctx: CommandContext[NodeContext[ACPSession]],
270
+ *,
271
+ file_path: str = "debug_replay_template.json",
272
+ ) -> None:
273
+ """Create a template JSON file for debugging notification sequences.
274
+
275
+ Args:
276
+ ctx: Command context
277
+ file_path: Path where to create the template file
278
+ """
279
+ try:
280
+ # Create proper BaseModel instances
281
+ message_chunk = AgentMessageChunk.text(text="Hello, this is a debug message!")
282
+
283
+ tool_start = ToolCallStart(
284
+ tool_call_id="debug-tool-1",
285
+ title="Debug Tool Call",
286
+ status="in_progress",
287
+ kind="other",
288
+ content=None,
289
+ locations=None,
290
+ )
291
+
292
+ tool_update = ToolCallProgress(
293
+ tool_call_id="debug-tool-1",
294
+ status="completed",
295
+ content=[
296
+ ContentToolCallContent.text(text="Tool completed successfully!"),
297
+ ],
298
+ title="tool_call_update",
299
+ )
300
+
301
+ # Create notifications using proper SessionNotification models
302
+ notifications = [
303
+ SessionNotification(session_id="template", update=message_chunk),
304
+ SessionNotification(session_id="template", update=tool_start),
305
+ SessionNotification(session_id="template", update=tool_update),
306
+ ]
307
+
308
+ # Convert to JSON-serializable format
309
+ template = {
310
+ "description": "ACP notification replay sequence for debugging",
311
+ "delay_ms": 100,
312
+ "notifications": [notif.model_dump()["update"] for notif in notifications],
313
+ }
314
+
315
+ with Path(file_path).open("w") as f:
316
+ json.dump(template, f, indent=2)
317
+
318
+ await ctx.print(f"✅ **Created replay template:** `{file_path}`")
319
+
320
+ except Exception as e:
321
+ logger.exception("Failed to create replay template")
322
+ await ctx.print(f"❌ **Failed to create template:** {e}")
323
+
324
+
325
+ class DebugSendRawCommand(NodeCommand):
326
+ """Send a raw ACP notification from JSON string.
327
+
328
+ For advanced debugging - send arbitrary notification structures.
329
+ """
330
+
331
+ name = "debug-send-raw"
332
+ category = "debug"
333
+
334
+ async def execute_command(
335
+ self,
336
+ ctx: CommandContext[NodeContext[ACPSession]],
337
+ notification_json: str,
338
+ ) -> None:
339
+ """Send a raw ACP notification from JSON string.
340
+
341
+ Args:
342
+ ctx: Command context
343
+ notification_json: JSON string of the notification to send
344
+ """
345
+ session = ctx.context.data
346
+ assert session
347
+ try:
348
+ data = anyenv.load_json(notification_json, return_type=dict)
349
+
350
+ # Validate it has the expected structure
351
+ if "update" not in data:
352
+ msg = "❌ **Notification JSON must contain 'update' field**"
353
+ await ctx.print(msg)
354
+ return
355
+
356
+ notification = SessionNotification(session_id=session.session_id, **data)
357
+ await session.client.session_update(notification)
358
+ await ctx.print("✅ **Sent raw notification**")
359
+ except json.JSONDecodeError as e:
360
+ await ctx.print(f"❌ **Invalid JSON:** {e}")
361
+ except Exception as e:
362
+ logger.exception("Failed to send raw notification")
363
+ await ctx.print(f"❌ **Failed to send raw notification:** {e}")
364
+
365
+
366
+ def get_debug_commands() -> list[type[NodeCommand]]:
367
+ """Get all ACP debug commands."""
368
+ return [
369
+ DebugSendTextCommand,
370
+ DebugSendToolCallCommand,
371
+ # DebugUpdateToolCallCommand,
372
+ DebugReplaySequenceCommand,
373
+ DebugSessionInfoCommand,
374
+ DebugCreateTemplateCommand,
375
+ DebugSendRawCommand,
376
+ ]
@@ -0,0 +1,39 @@
1
+ """Documentation commands package.
2
+
3
+ This package contains slash commands for documentation-related operations
4
+ in ACP sessions, including source code fetching, git operations, schema
5
+ generation, URL conversion, and repository fetching.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+
11
+ from .fetch_repo import FetchRepoCommand
12
+ from .get_schema import GetSchemaCommand
13
+ from .get_source import GetSourceCommand
14
+ from .git_diff import GitDiffCommand
15
+ from .url_to_markdown import UrlToMarkdownCommand
16
+ from typing import TYPE_CHECKING
17
+
18
+ if TYPE_CHECKING:
19
+ from slashed import SlashedCommand
20
+
21
+ __all__ = [
22
+ "FetchRepoCommand",
23
+ "GetSchemaCommand",
24
+ "GetSourceCommand",
25
+ "GitDiffCommand",
26
+ "UrlToMarkdownCommand",
27
+ "get_docs_commands",
28
+ ]
29
+
30
+
31
+ def get_docs_commands() -> list[type[SlashedCommand]]:
32
+ """Get all documentation-related slash commands."""
33
+ return [
34
+ GetSourceCommand,
35
+ GetSchemaCommand,
36
+ GitDiffCommand,
37
+ FetchRepoCommand,
38
+ UrlToMarkdownCommand,
39
+ ]
@@ -0,0 +1,169 @@
1
+ """Fetch contents from a GitHub repository via UIThub."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import uuid
7
+
8
+ import httpx
9
+ from pydantic_ai import UserPromptPart
10
+ from slashed import CommandContext # noqa: TC002
11
+
12
+ from agentpool.log import get_logger
13
+ from agentpool.messaging.context import NodeContext # noqa: TC001
14
+ from agentpool_commands.base import NodeCommand
15
+ from agentpool_server.acp_server.session import ACPSession # noqa: TC001
16
+
17
+
18
+ logger = get_logger(__name__)
19
+
20
+
21
+ class FetchRepoCommand(NodeCommand):
22
+ """Fetch contents from a GitHub repository via UIThub.
23
+
24
+ Retrieves repository contents with various filtering options
25
+ and displays them in a structured format.
26
+ """
27
+
28
+ name = "fetch-repo"
29
+ category = "docs"
30
+
31
+ async def execute_command( # noqa: PLR0915
32
+ self,
33
+ ctx: CommandContext[NodeContext[ACPSession]],
34
+ repo: str,
35
+ *,
36
+ branch: str | None = None,
37
+ path: str | None = None,
38
+ include_dirs: list[str] | None = None,
39
+ disable_genignore: bool = False,
40
+ exclude_dirs: list[str] | None = None,
41
+ exclude_extensions: list[str] | None = None,
42
+ include_extensions: list[str] | None = None,
43
+ include_line_numbers: bool = True,
44
+ max_file_size: int | None = None,
45
+ max_tokens: int | None = None,
46
+ omit_files: bool = False,
47
+ yaml_string: str | None = None,
48
+ ) -> None:
49
+ """Fetch contents from a GitHub repository.
50
+
51
+ Args:
52
+ ctx: Command context with ACP session
53
+ repo: GitHub path (owner/repo)
54
+ branch: Branch name (defaults to main if not provided)
55
+ path: File or directory path within the repository
56
+ include_dirs: List of directories to include
57
+ disable_genignore: Disable .genignore filtering
58
+ exclude_dirs: List of directories to exclude
59
+ exclude_extensions: List of file extensions to exclude
60
+ include_extensions: List of file extensions to include
61
+ include_line_numbers: Include line numbers in HTML/markdown output
62
+ max_file_size: Maximum file size in bytes
63
+ max_tokens: Maximum number of tokens in response
64
+ omit_files: Only return directory structure without file contents
65
+ yaml_string: URL encoded YAML string of file hierarchy to include
66
+ """
67
+ session = ctx.context.data
68
+ assert session
69
+
70
+ # Generate tool call ID
71
+ tool_call_id = f"fetch-repo-{uuid.uuid4().hex[:8]}"
72
+
73
+ try:
74
+ # Build URL
75
+ base_url = f"https://uithub.com/{repo}"
76
+ if branch:
77
+ base_url += f"/tree/{branch}"
78
+ if path:
79
+ base_url += f"/{path}"
80
+
81
+ # Build parameters
82
+ params = {}
83
+ api_key = os.getenv("UITHUB_API_KEY")
84
+ if api_key:
85
+ params["apiKey"] = api_key
86
+
87
+ if include_dirs:
88
+ params["dir"] = ",".join(include_dirs)
89
+ if disable_genignore:
90
+ params["disableGenignore"] = "true"
91
+ if exclude_dirs:
92
+ params["exclude-dir"] = ",".join(exclude_dirs)
93
+ if exclude_extensions:
94
+ params["exclude-ext"] = ",".join(exclude_extensions)
95
+ if include_extensions:
96
+ params["ext"] = ",".join(include_extensions)
97
+ if not include_line_numbers:
98
+ params["lines"] = "false"
99
+ if max_file_size:
100
+ params["maxFileSize"] = str(max_file_size)
101
+ if max_tokens:
102
+ params["maxTokens"] = str(max_tokens)
103
+ if omit_files:
104
+ params["omitFiles"] = "true"
105
+ if yaml_string:
106
+ params["yamlString"] = yaml_string
107
+
108
+ # Start tool call
109
+ display_path = f"{repo}"
110
+ if branch:
111
+ display_path += f"@{branch}"
112
+ if path:
113
+ display_path += f":{path}"
114
+
115
+ await session.notifications.tool_call_start(
116
+ tool_call_id=tool_call_id,
117
+ title=f"Fetching repository: {display_path}",
118
+ kind="fetch",
119
+ )
120
+
121
+ # Make async HTTP request
122
+ async with httpx.AsyncClient() as client:
123
+ response = await client.get(
124
+ base_url,
125
+ params=params,
126
+ headers={"accept": "text/markdown"},
127
+ timeout=30.0,
128
+ )
129
+ response.raise_for_status()
130
+ content = response.text
131
+
132
+ # Stage the content for use in agent context
133
+ staged_part = UserPromptPart(
134
+ content=f"Repository contents from {display_path}:\n\n{content}"
135
+ )
136
+ session.staged_content.add([staged_part])
137
+
138
+ # Send successful result - wrap in code block for proper display
139
+ staged_count = len(session.staged_content)
140
+ await session.notifications.tool_call_progress(
141
+ tool_call_id=tool_call_id,
142
+ status="completed",
143
+ title=f"Repository {display_path} fetched and staged ({staged_count} total parts)",
144
+ content=[f"```\n{content}\n```"],
145
+ )
146
+
147
+ except httpx.HTTPStatusError as e:
148
+ logger.exception(
149
+ "HTTP error fetching repository", repo=repo, status=e.response.status_code
150
+ )
151
+ await session.notifications.tool_call_progress(
152
+ tool_call_id=tool_call_id,
153
+ status="failed",
154
+ title=f"HTTP {e.response.status_code}: Failed to fetch {repo}",
155
+ )
156
+ except httpx.RequestError as e:
157
+ logger.exception("Request error fetching repository", repo=repo)
158
+ await session.notifications.tool_call_progress(
159
+ tool_call_id=tool_call_id,
160
+ status="failed",
161
+ title=f"Network error: {e}",
162
+ )
163
+ except Exception as e:
164
+ logger.exception("Unexpected error fetching repository", repo=repo)
165
+ await session.notifications.tool_call_progress(
166
+ tool_call_id=tool_call_id,
167
+ status="failed",
168
+ title=f"Error: {e}",
169
+ )