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,331 @@
1
+ """Condition models for hook filtering."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Annotated, Any, Literal
6
+
7
+ from pydantic import ConfigDict, Field
8
+ from schemez import Schema
9
+
10
+
11
+ class BaseHookCondition(Schema):
12
+ """Base class for hook conditions."""
13
+
14
+ type: str = Field(init=False, title="Condition type")
15
+ """Discriminator for condition types."""
16
+
17
+ model_config = ConfigDict(frozen=True)
18
+
19
+
20
+ # === Tool Hook Conditions ===
21
+
22
+
23
+ class ToolNameCondition(BaseHookCondition):
24
+ """Match tool by name pattern."""
25
+
26
+ model_config = ConfigDict(json_schema_extra={"title": "Tool Name Condition"})
27
+
28
+ type: Literal["tool_name"] = Field("tool_name", init=False)
29
+ """Tool name pattern condition."""
30
+
31
+ pattern: str = Field(
32
+ examples=["Bash", "Write|Edit", "mcp__.*", ".*"],
33
+ title="Name pattern",
34
+ )
35
+ """Regex pattern to match tool names."""
36
+
37
+
38
+ class ArgumentCondition(BaseHookCondition):
39
+ """Check tool argument values."""
40
+
41
+ model_config = ConfigDict(json_schema_extra={"title": "Argument Condition"})
42
+
43
+ type: Literal["argument"] = Field("argument", init=False)
44
+ """Argument value condition."""
45
+
46
+ key: str = Field(
47
+ examples=["command", "file_path", "options.force"],
48
+ title="Argument key",
49
+ )
50
+ """Argument name to check. Supports dot notation for nested access."""
51
+
52
+ pattern: str | None = Field(
53
+ default=None,
54
+ examples=["rm\\s+-rf", "^/tmp/.*", ".*\\.py$"],
55
+ title="Regex pattern",
56
+ )
57
+ """Regex pattern to match argument value."""
58
+
59
+ contains: str | None = Field(
60
+ default=None,
61
+ examples=["sudo", "DROP TABLE", "../"],
62
+ title="Substring match",
63
+ )
64
+ """Substring that must be present in argument value."""
65
+
66
+ equals: Any | None = Field(
67
+ default=None,
68
+ examples=[True, "/etc/passwd", 0],
69
+ title="Exact value",
70
+ )
71
+ """Exact value the argument must equal."""
72
+
73
+ case_sensitive: bool = Field(default=True, title="Case sensitive")
74
+ """Whether string matching is case-sensitive."""
75
+
76
+
77
+ class ArgumentExistsCondition(BaseHookCondition):
78
+ """Check if an argument is present."""
79
+
80
+ model_config = ConfigDict(json_schema_extra={"title": "Argument Exists Condition"})
81
+
82
+ type: Literal["argument_exists"] = Field("argument_exists", init=False)
83
+ """Argument existence condition."""
84
+
85
+ key: str = Field(
86
+ examples=["force", "recursive", "timeout"],
87
+ title="Argument key",
88
+ )
89
+ """Argument name that must exist (or not exist)."""
90
+
91
+ exists: bool = Field(default=True, title="Must exist")
92
+ """If True, argument must exist. If False, argument must not exist."""
93
+
94
+
95
+ class Jinja2HookCondition(BaseHookCondition):
96
+ """Flexible Jinja2 template condition for hooks."""
97
+
98
+ model_config = ConfigDict(json_schema_extra={"title": "Jinja2 Hook Condition"})
99
+
100
+ type: Literal["jinja2"] = Field("jinja2", init=False)
101
+ """Jinja2 template condition."""
102
+
103
+ template: str = Field(
104
+ examples=[
105
+ "{{ tool_name == 'Bash' and 'sudo' in tool_input.get('command', '') }}",
106
+ "{{ tool_input.get('path', '').startswith('/tmp') }}",
107
+ "{{ 'password' in tool_input | string | lower }}",
108
+ ],
109
+ title="Jinja2 template",
110
+ )
111
+ """Jinja2 template that evaluates to true/false.
112
+
113
+ Available variables depend on hook event:
114
+ - tool_name: Name of the tool (tool hooks)
115
+ - tool_input: Tool arguments dict (tool hooks)
116
+ - tool_output: Tool result (post_tool_use only)
117
+ - duration_ms: Execution time in ms (post_tool_use only)
118
+ - prompt: User prompt (run hooks)
119
+ - result: Run result (post_run only)
120
+ - agent_name: Name of the agent
121
+ - event: Hook event name
122
+ """
123
+
124
+
125
+ class DurationCondition(BaseHookCondition):
126
+ """Check tool execution duration (post_tool_use only)."""
127
+
128
+ model_config = ConfigDict(json_schema_extra={"title": "Duration Condition"})
129
+
130
+ type: Literal["duration"] = Field("duration", init=False)
131
+ """Duration threshold condition."""
132
+
133
+ min_ms: float | None = Field(
134
+ default=None,
135
+ ge=0,
136
+ examples=[1000, 5000],
137
+ title="Minimum duration (ms)",
138
+ )
139
+ """Minimum duration in milliseconds. Triggers if duration >= min_ms."""
140
+
141
+ max_ms: float | None = Field(
142
+ default=None,
143
+ ge=0,
144
+ examples=[100, 500],
145
+ title="Maximum duration (ms)",
146
+ )
147
+ """Maximum duration in milliseconds. Triggers if duration <= max_ms."""
148
+
149
+
150
+ class OutputCondition(BaseHookCondition):
151
+ """Check tool output content (post_tool_use only)."""
152
+
153
+ model_config = ConfigDict(json_schema_extra={"title": "Output Condition"})
154
+
155
+ type: Literal["output"] = Field("output", init=False)
156
+ """Output content condition."""
157
+
158
+ pattern: str | None = Field(
159
+ default=None,
160
+ examples=["error", "Exception", "failed"],
161
+ title="Regex pattern",
162
+ )
163
+ """Regex pattern to match in output."""
164
+
165
+ contains: str | None = Field(
166
+ default=None,
167
+ examples=["success", "error", "warning"],
168
+ title="Substring match",
169
+ )
170
+ """Substring that must be present in output."""
171
+
172
+ case_sensitive: bool = Field(default=False, title="Case sensitive")
173
+ """Whether string matching is case-sensitive."""
174
+
175
+
176
+ class OutputSizeCondition(BaseHookCondition):
177
+ """Check tool output size (post_tool_use only)."""
178
+
179
+ model_config = ConfigDict(json_schema_extra={"title": "Output Size Condition"})
180
+
181
+ type: Literal["output_size"] = Field("output_size", init=False)
182
+ """Output size condition."""
183
+
184
+ min_chars: int | None = Field(
185
+ default=None,
186
+ ge=0,
187
+ examples=[1000, 10000],
188
+ title="Minimum size",
189
+ )
190
+ """Minimum output length in characters."""
191
+
192
+ max_chars: int | None = Field(
193
+ default=None,
194
+ ge=0,
195
+ examples=[100, 500],
196
+ title="Maximum size",
197
+ )
198
+ """Maximum output length in characters."""
199
+
200
+
201
+ # === Run Hook Conditions ===
202
+
203
+
204
+ class PromptCondition(BaseHookCondition):
205
+ """Check prompt content (pre_run/post_run)."""
206
+
207
+ model_config = ConfigDict(json_schema_extra={"title": "Prompt Condition"})
208
+
209
+ type: Literal["prompt"] = Field("prompt", init=False)
210
+ """Prompt content condition."""
211
+
212
+ pattern: str | None = Field(
213
+ default=None,
214
+ examples=["^(help|\\?)$", ".*password.*"],
215
+ title="Regex pattern",
216
+ )
217
+ """Regex pattern to match in prompt."""
218
+
219
+ contains: str | None = Field(
220
+ default=None,
221
+ examples=["delete", "remove all"],
222
+ title="Substring match",
223
+ )
224
+ """Substring that must be present in prompt."""
225
+
226
+ case_sensitive: bool = Field(default=False, title="Case sensitive")
227
+ """Whether string matching is case-sensitive."""
228
+
229
+
230
+ # === Combinators ===
231
+
232
+
233
+ class AndHookCondition(BaseHookCondition):
234
+ """Require all conditions to be met."""
235
+
236
+ model_config = ConfigDict(json_schema_extra={"title": "AND Hook Condition"})
237
+
238
+ type: Literal["and"] = Field("and", init=False)
239
+ """AND combinator for conditions."""
240
+
241
+ conditions: list[HookCondition] = Field(
242
+ min_length=1,
243
+ title="Conditions",
244
+ )
245
+ """All conditions must be true."""
246
+
247
+
248
+ class OrHookCondition(BaseHookCondition):
249
+ """Require any condition to be met."""
250
+
251
+ model_config = ConfigDict(json_schema_extra={"title": "OR Hook Condition"})
252
+
253
+ type: Literal["or"] = Field("or", init=False)
254
+ """OR combinator for conditions."""
255
+
256
+ conditions: list[HookCondition] = Field(
257
+ min_length=1,
258
+ title="Conditions",
259
+ )
260
+ """At least one condition must be true."""
261
+
262
+
263
+ class NotHookCondition(BaseHookCondition):
264
+ """Negate a condition."""
265
+
266
+ model_config = ConfigDict(json_schema_extra={"title": "NOT Hook Condition"})
267
+
268
+ type: Literal["not"] = Field("not", init=False)
269
+ """NOT combinator for conditions."""
270
+
271
+ condition: HookCondition = Field(title="Condition")
272
+ """Condition to negate."""
273
+
274
+
275
+ # === Union Types ===
276
+
277
+
278
+ # Conditions valid for pre_tool_use
279
+ PreToolCondition = Annotated[
280
+ ToolNameCondition
281
+ | ArgumentCondition
282
+ | ArgumentExistsCondition
283
+ | Jinja2HookCondition
284
+ | AndHookCondition
285
+ | OrHookCondition
286
+ | NotHookCondition,
287
+ Field(discriminator="type"),
288
+ ]
289
+
290
+ # Conditions valid for post_tool_use (includes duration/output checks)
291
+ PostToolCondition = Annotated[
292
+ ToolNameCondition
293
+ | ArgumentCondition
294
+ | ArgumentExistsCondition
295
+ | Jinja2HookCondition
296
+ | DurationCondition
297
+ | OutputCondition
298
+ | OutputSizeCondition
299
+ | AndHookCondition
300
+ | OrHookCondition
301
+ | NotHookCondition,
302
+ Field(discriminator="type"),
303
+ ]
304
+
305
+ # Conditions valid for pre_run/post_run
306
+ RunCondition = Annotated[
307
+ PromptCondition | Jinja2HookCondition | AndHookCondition | OrHookCondition | NotHookCondition,
308
+ Field(discriminator="type"),
309
+ ]
310
+
311
+ # General hook condition (all types)
312
+ HookCondition = Annotated[
313
+ ToolNameCondition
314
+ | ArgumentCondition
315
+ | ArgumentExistsCondition
316
+ | Jinja2HookCondition
317
+ | DurationCondition
318
+ | OutputCondition
319
+ | OutputSizeCondition
320
+ | PromptCondition
321
+ | AndHookCondition
322
+ | OrHookCondition
323
+ | NotHookCondition,
324
+ Field(discriminator="type"),
325
+ ]
326
+
327
+
328
+ # Update forward references for recursive types
329
+ AndHookCondition.model_rebuild()
330
+ OrHookCondition.model_rebuild()
331
+ NotHookCondition.model_rebuild()
@@ -0,0 +1,241 @@
1
+ """Hook configuration models for agent lifecycle events."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Annotated, Any, Literal
6
+
7
+ from pydantic import ConfigDict, Field
8
+ from schemez import Schema
9
+
10
+
11
+ if TYPE_CHECKING:
12
+ from agentpool.hooks.base import Hook, HookEvent
13
+
14
+
15
+ class BaseHookConfig(Schema):
16
+ """Base configuration for hooks."""
17
+
18
+ type: str = Field(init=False, title="Hook type")
19
+ """Hook type discriminator."""
20
+
21
+ matcher: str | None = Field(
22
+ default=None,
23
+ examples=["Write|Edit", "Bash.*", "*"],
24
+ title="Pattern matcher",
25
+ )
26
+ """Regex pattern to match tool names. None or '*' matches all."""
27
+
28
+ timeout: float = Field(
29
+ default=60.0,
30
+ gt=0,
31
+ examples=[30.0, 60.0, 120.0],
32
+ title="Timeout seconds",
33
+ )
34
+ """Maximum execution time in seconds."""
35
+
36
+ enabled: bool = Field(default=True, title="Hook enabled")
37
+ """Whether this hook is active."""
38
+
39
+ def get_hook(self, event: HookEvent) -> Hook:
40
+ """Create runtime hook from this config.
41
+
42
+ Args:
43
+ event: The lifecycle event this hook handles.
44
+
45
+ Returns:
46
+ Runtime hook instance.
47
+ """
48
+ raise NotImplementedError
49
+
50
+
51
+ class CommandHookConfig(BaseHookConfig):
52
+ """Hook that executes a shell command.
53
+
54
+ The command receives hook input as JSON via stdin and should return
55
+ JSON output via stdout. Exit code 0 = success, exit code 2 = block.
56
+ """
57
+
58
+ model_config = ConfigDict(json_schema_extra={"x-doc-title": "Command Hook"})
59
+
60
+ type: Literal["command"] = Field("command", init=False)
61
+ """Command hook type."""
62
+
63
+ command: str = Field(
64
+ examples=[
65
+ "/path/to/script.sh",
66
+ "$PROJECT_DIR/hooks/validate.py",
67
+ "python -m myproject.hooks.check",
68
+ ],
69
+ title="Shell command",
70
+ )
71
+ """Shell command to execute. Supports $PROJECT_DIR variable."""
72
+
73
+ env: dict[str, str] | None = Field(
74
+ default=None,
75
+ examples=[{"DEBUG": "1", "LOG_LEVEL": "info"}],
76
+ title="Environment variables",
77
+ )
78
+ """Additional environment variables for the command."""
79
+
80
+ def get_hook(self, event: HookEvent) -> Hook:
81
+ """Create runtime command hook."""
82
+ from agentpool.hooks import CommandHook
83
+
84
+ return CommandHook(
85
+ event=event,
86
+ command=self.command,
87
+ matcher=self.matcher,
88
+ timeout=self.timeout,
89
+ enabled=self.enabled,
90
+ env=self.env,
91
+ )
92
+
93
+
94
+ class CallableHookConfig(BaseHookConfig):
95
+ """Hook that executes a Python callable.
96
+
97
+ The callable receives hook input as a dictionary and should return
98
+ a HookResult dictionary or None.
99
+ """
100
+
101
+ model_config = ConfigDict(json_schema_extra={"x-doc-title": "Callable Hook"})
102
+
103
+ type: Literal["callable"] = Field("callable", init=False)
104
+ """Callable hook type."""
105
+
106
+ import_path: str = Field(
107
+ examples=[
108
+ "myproject.hooks.validate_tool",
109
+ "myapp.security.audit_command",
110
+ ],
111
+ title="Import path",
112
+ )
113
+ """Dotted import path to the callable."""
114
+
115
+ arguments: dict[str, Any] = Field(
116
+ default_factory=dict,
117
+ examples=[{"strict": True, "allowed_paths": ["/tmp"]}],
118
+ title="Arguments",
119
+ )
120
+ """Additional keyword arguments passed to the callable."""
121
+
122
+ def get_hook(self, event: HookEvent) -> Hook:
123
+ """Create runtime callable hook."""
124
+ from agentpool.hooks import CallableHook
125
+
126
+ return CallableHook(
127
+ event=event,
128
+ fn=self.import_path,
129
+ matcher=self.matcher,
130
+ timeout=self.timeout,
131
+ enabled=self.enabled,
132
+ arguments=self.arguments,
133
+ )
134
+
135
+
136
+ class PromptHookConfig(BaseHookConfig):
137
+ """Hook that uses an LLM to evaluate the action.
138
+
139
+ The prompt is sent to a fast LLM which returns a structured decision.
140
+ Use $TOOL_NAME, $TOOL_INPUT, $INPUT placeholders in the prompt.
141
+ """
142
+
143
+ model_config = ConfigDict(json_schema_extra={"x-doc-title": "Prompt Hook"})
144
+
145
+ type: Literal["prompt"] = Field("prompt", init=False)
146
+ """Prompt-based hook type."""
147
+
148
+ prompt: str = Field(
149
+ examples=[
150
+ "Evaluate if this tool call is safe: $INPUT",
151
+ "Check if $TOOL_NAME with input $TOOL_INPUT follows security policies.",
152
+ ],
153
+ title="Evaluation prompt",
154
+ )
155
+ """Prompt template for LLM evaluation. Supports placeholders."""
156
+
157
+ model: str | None = Field(
158
+ default=None,
159
+ examples=["openai:gpt-4o-mini", "google-gla:gemini-2.0-flash"],
160
+ title="Model",
161
+ )
162
+ """Model to use for evaluation. Defaults to a fast model if not specified."""
163
+
164
+ def get_hook(self, event: HookEvent) -> Hook:
165
+ """Create runtime prompt hook."""
166
+ from agentpool.hooks import PromptHook
167
+
168
+ return PromptHook(
169
+ event=event,
170
+ prompt=self.prompt,
171
+ matcher=self.matcher,
172
+ timeout=self.timeout,
173
+ enabled=self.enabled,
174
+ model=self.model,
175
+ )
176
+
177
+
178
+ HookConfig = Annotated[
179
+ CommandHookConfig | CallableHookConfig | PromptHookConfig,
180
+ Field(discriminator="type"),
181
+ ]
182
+ """Union of all hook configuration types."""
183
+
184
+
185
+ class HooksConfig(Schema):
186
+ """Configuration for agent lifecycle hooks.
187
+
188
+ Hooks allow intercepting and customizing agent behavior at key points
189
+ in the execution lifecycle. They can add context, block operations,
190
+ modify inputs, or trigger side effects.
191
+
192
+ Currently supported events:
193
+ - pre_run / post_run: Before/after agent.run() processes a prompt
194
+ - pre_tool_use / post_tool_use: Before/after a tool is called
195
+ """
196
+
197
+ # Message flow events
198
+ pre_run: list[HookConfig] = Field(
199
+ default_factory=list,
200
+ title="Pre-run hooks",
201
+ )
202
+ """Hooks executed before agent.run() processes a prompt."""
203
+
204
+ post_run: list[HookConfig] = Field(
205
+ default_factory=list,
206
+ title="Post-run hooks",
207
+ )
208
+ """Hooks executed after agent.run() completes."""
209
+
210
+ # Tool execution events
211
+ pre_tool_use: list[HookConfig] = Field(
212
+ default_factory=list,
213
+ title="Pre-tool-use hooks",
214
+ )
215
+ """Hooks executed before a tool is called. Can block or modify the call."""
216
+
217
+ post_tool_use: list[HookConfig] = Field(
218
+ default_factory=list,
219
+ title="Post-tool-use hooks",
220
+ )
221
+ """Hooks executed after a tool completes."""
222
+
223
+ def get_agent_hooks(self) -> AgentHooks:
224
+ """Create runtime AgentHooks from this configuration.
225
+
226
+ Returns:
227
+ AgentHooks instance with all hooks instantiated.
228
+ """
229
+ from agentpool.hooks import AgentHooks
230
+
231
+ return AgentHooks(
232
+ pre_run=[cfg.get_hook("pre_run") for cfg in self.pre_run],
233
+ post_run=[cfg.get_hook("post_run") for cfg in self.post_run],
234
+ pre_tool_use=[cfg.get_hook("pre_tool_use") for cfg in self.pre_tool_use],
235
+ post_tool_use=[cfg.get_hook("post_tool_use") for cfg in self.post_tool_use],
236
+ )
237
+
238
+
239
+ # Import for type checking only - avoid circular imports
240
+ if TYPE_CHECKING:
241
+ from agentpool.hooks import AgentHooks