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,842 @@
1
+ """Configuration models for ACP (Agent Client Protocol) agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Literal
6
+
7
+ from pydantic import ConfigDict, Field
8
+ from tokonomics.model_discovery import ProviderType # noqa: TC002
9
+
10
+ from agentpool.models.acp_agents.base import BaseACPAgentConfig
11
+
12
+
13
+ if TYPE_CHECKING:
14
+ from agentpool.prompts.manager import PromptManager
15
+
16
+
17
+ ClaudeCodeModelName = Literal["default", "sonnet", "opus", "haiku", "sonnet[1m]", "opusplan"]
18
+ ClaudeCodeToolName = Literal[
19
+ "AskUserQuestion",
20
+ "Bash",
21
+ "BashOutput",
22
+ "Edit",
23
+ "ExitPlanMode",
24
+ "Glob",
25
+ "Grep",
26
+ "KillShell",
27
+ "NotebookEdit",
28
+ "Read",
29
+ "Skill",
30
+ "SlashCommand",
31
+ "Task",
32
+ "TodoWrite",
33
+ "WebFetch",
34
+ "WebSearch",
35
+ "Write",
36
+ ]
37
+ ClaudeCodePermissionmode = Literal["default", "acceptEdits", "bypassPermissions", "dontAsk", "plan"]
38
+
39
+
40
+ class CodexACPAgentConfig(BaseACPAgentConfig):
41
+ """Configuration for Zed Codex via ACP.
42
+
43
+ Provides typed settings for the codex-acp server.
44
+
45
+ Example:
46
+ ```yaml
47
+ agents:
48
+ coder:
49
+ type: acp
50
+ provider: codex
51
+ cwd: /path/to/project
52
+ model: o3
53
+ sandbox_permissions:
54
+ - disk-full-read-access
55
+ ```
56
+ """
57
+
58
+ model_config = ConfigDict(json_schema_extra={"title": "Codex ACP Agent Configuration"})
59
+
60
+ provider: Literal["codex"] = Field("codex", init=False)
61
+ """Discriminator for Codex ACP agent."""
62
+
63
+ model: str | None = Field(
64
+ default=None,
65
+ title="Model",
66
+ examples=["o3", "o4-mini"],
67
+ )
68
+ """Model override."""
69
+
70
+ sandbox_permissions: list[str] | None = Field(
71
+ default=None,
72
+ title="Sandbox Permissions",
73
+ examples=[["disk-full-read-access"], ["network-access", "disk-write-access"]],
74
+ )
75
+ """Sandbox permissions."""
76
+
77
+ shell_environment_policy_inherit: Literal["all", "none"] | None = Field(
78
+ default=None,
79
+ title="Shell Environment Policy Inherit",
80
+ examples=["all", "none"],
81
+ )
82
+ """Shell environment inheritance policy."""
83
+
84
+ def get_command(self) -> str:
85
+ """Get the command to spawn the ACP server."""
86
+ return "npx"
87
+
88
+ @property
89
+ def model_providers(self) -> list[ProviderType]:
90
+ """Codex uses OpenAI models."""
91
+ return ["openai"]
92
+
93
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
94
+ """Build command arguments from settings."""
95
+ args: list[str] = ["@zed-industries/codex-acp"]
96
+
97
+ if self.model:
98
+ args.extend(["-c", f'model="{self.model}"'])
99
+ if self.sandbox_permissions:
100
+ # Format as TOML array
101
+ perms = ", ".join(f'"{p}"' for p in self.sandbox_permissions)
102
+ args.extend(["-c", f"sandbox_permissions=[{perms}]"])
103
+ if self.shell_environment_policy_inherit:
104
+ args.extend([
105
+ "-c",
106
+ f"shell_environment_policy.inherit={self.shell_environment_policy_inherit}",
107
+ ])
108
+
109
+ return args
110
+
111
+
112
+ class OpenCodeACPAgentConfig(BaseACPAgentConfig):
113
+ """Configuration for OpenCode via ACP.
114
+
115
+ Provides typed settings for the opencode acp server.
116
+
117
+ Example:
118
+ ```yaml
119
+ agents:
120
+ coder:
121
+ type: acp
122
+ provider: opencode
123
+ cwd: /path/to/project
124
+ log_level: INFO
125
+ ```
126
+ """
127
+
128
+ model_config = ConfigDict(json_schema_extra={"title": "OpenCode ACP Agent Configuration"})
129
+
130
+ provider: Literal["opencode"] = Field("opencode", init=False)
131
+ """Discriminator for OpenCode ACP agent."""
132
+
133
+ def get_command(self) -> str:
134
+ """Get the command to spawn the ACP server."""
135
+ return "opencode"
136
+
137
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
138
+ """Build command arguments from settings."""
139
+ args: list[str] = ["acp"]
140
+
141
+ if self.cwd:
142
+ args.extend(["--cwd", self.cwd])
143
+ return args
144
+
145
+ @property
146
+ def model_providers(self) -> list[ProviderType]:
147
+ """OpenCode supports multiple providers."""
148
+ return ["openai", "anthropic", "gemini", "openrouter"]
149
+
150
+
151
+ class GooseACPAgentConfig(BaseACPAgentConfig):
152
+ """Configuration for Goose via ACP.
153
+
154
+ Block's open-source coding agent.
155
+
156
+ Example:
157
+ ```yaml
158
+ agents:
159
+ coder:
160
+ type: acp
161
+ provider: goose
162
+ cwd: /path/to/project
163
+ ```
164
+ """
165
+
166
+ model_config = ConfigDict(json_schema_extra={"title": "Goose ACP Agent Configuration"})
167
+
168
+ provider: Literal["goose"] = Field("goose", init=False)
169
+ """Discriminator for Goose ACP agent."""
170
+
171
+ def get_command(self) -> str:
172
+ """Get the command to spawn the ACP server."""
173
+ return "goose"
174
+
175
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
176
+ """Build command arguments from settings."""
177
+ return ["acp"]
178
+
179
+ @property
180
+ def model_providers(self) -> list[ProviderType]:
181
+ """Goose supports multiple providers."""
182
+ return ["openai", "anthropic", "gemini", "openrouter"]
183
+
184
+
185
+ class MistralACPAgentConfig(BaseACPAgentConfig):
186
+ """Configuration for Mistral Agent via ACP.
187
+
188
+ Example:
189
+ ```yaml
190
+ agents:
191
+ coder:
192
+ type: acp
193
+ provider: mistral
194
+ cwd: /path/to/project
195
+ ```
196
+ """
197
+
198
+ model_config = ConfigDict(json_schema_extra={"title": "Mistral ACP Agent Configuration"})
199
+
200
+ provider: Literal["mistral"] = Field("mistral", init=False)
201
+ """Discriminator for Mistral ACP agent."""
202
+
203
+ def get_command(self) -> str:
204
+ """Get the command to spawn the ACP server."""
205
+ return "vibe-acp"
206
+
207
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
208
+ """Build command arguments from settings."""
209
+ return []
210
+
211
+ @property
212
+ def model_providers(self) -> list[ProviderType]:
213
+ """Goose supports multiple providers."""
214
+ return ["mistral"]
215
+
216
+
217
+ class OpenHandsACPAgentConfig(BaseACPAgentConfig):
218
+ """Configuration for OpenHands via ACP.
219
+
220
+ Open-source autonomous AI agent (formerly OpenDevin).
221
+
222
+ Example:
223
+ ```yaml
224
+ agents:
225
+ coder:
226
+ type: acp
227
+ provider: openhands
228
+ cwd: /path/to/project
229
+ ```
230
+ """
231
+
232
+ model_config = ConfigDict(json_schema_extra={"title": "OpenHands ACP Agent Configuration"})
233
+
234
+ provider: Literal["openhands"] = Field("openhands", init=False)
235
+ """Discriminator for OpenHands ACP agent."""
236
+
237
+ def get_command(self) -> str:
238
+ """Get the command to spawn the ACP server."""
239
+ return "openhands"
240
+
241
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
242
+ """Build command arguments from settings."""
243
+ return ["acp"]
244
+
245
+ @property
246
+ def model_providers(self) -> list[ProviderType]:
247
+ """OpenHands supports multiple providers."""
248
+ return ["openai", "anthropic", "gemini", "openrouter"]
249
+
250
+
251
+ class AmpACPAgentConfig(BaseACPAgentConfig):
252
+ """Configuration for Amp (AmpCode) via ACP.
253
+
254
+ ACP bridge adapter that spawns the Amp CLI internally. The amp-acp bridge
255
+ itself has no CLI configuration options. It spawns `amp --no-notifications`
256
+ and bridges the communication to ACP protocol.
257
+
258
+ Configuration is done via environment variables:
259
+ - AMP_EXECUTABLE: Path to amp binary (default: 'amp' from PATH)
260
+ - AMP_PREFER_SYSTEM_PATH: Set to '1' to use system amp instead of npx version
261
+ - AMP_API_KEY: API key for Amp service
262
+ - AMP_URL: URL for Amp service (default: https://ampcode.com/)
263
+ - AMP_SETTINGS_FILE: Path to settings file
264
+
265
+ For amp CLI configuration (permissions, MCP servers, etc.), use the amp
266
+ settings file at ~/.config/amp/settings.json
267
+
268
+ Example:
269
+ ```yaml
270
+ agents:
271
+ amp:
272
+ type: acp
273
+ provider: amp
274
+ cwd: /path/to/project
275
+ env:
276
+ AMP_EXECUTABLE: /usr/local/bin/amp
277
+ AMP_PREFER_SYSTEM_PATH: "1"
278
+ AMP_API_KEY: your-api-key
279
+ ```
280
+ """
281
+
282
+ model_config = ConfigDict(json_schema_extra={"title": "Amp ACP Agent Configuration"})
283
+
284
+ provider: Literal["amp"] = Field("amp", init=False)
285
+ """Discriminator for Amp ACP agent."""
286
+
287
+ def get_command(self) -> str:
288
+ """Get the command to spawn the ACP bridge server."""
289
+ return "npx"
290
+
291
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
292
+ """Build command arguments for amp-acp bridge."""
293
+ return ["-y", "amp-acp"]
294
+
295
+ @property
296
+ def model_providers(self) -> list[ProviderType]:
297
+ """Amp supports multiple providers."""
298
+ return ["openai", "anthropic", "gemini"]
299
+
300
+
301
+ class CagentACPAgentConfig(BaseACPAgentConfig):
302
+ """Configuration for Docker cagent via ACP.
303
+
304
+ Agent Builder and Runtime by Docker Engineering.
305
+
306
+ Example:
307
+ ```yaml
308
+ agents:
309
+ cagent:
310
+ type: acp
311
+ provider: cagent
312
+ cwd: /path/to/project
313
+ agent_file: ./agent.yaml
314
+ code_mode_tools: true
315
+ working_dir: /path/to/work
316
+ ```
317
+ """
318
+
319
+ model_config = ConfigDict(json_schema_extra={"title": "Cagent ACP Agent Configuration"})
320
+
321
+ provider: Literal["cagent"] = Field("cagent", init=False)
322
+ """Discriminator for Docker cagent ACP agent."""
323
+
324
+ agent_file: str | None = Field(
325
+ default=None,
326
+ title="Agent File",
327
+ examples=["./agent.yaml", "registry.docker.io/my-agent:latest"],
328
+ )
329
+ """Agent configuration file or registry reference."""
330
+
331
+ code_mode_tools: bool = Field(default=False, title="Code Mode Tools")
332
+ """Provide a single tool to call other tools via Javascript."""
333
+
334
+ env_from_file: list[str] | None = Field(
335
+ default=None,
336
+ title="Env From File",
337
+ examples=[[".env", ".env.production"], ["config/.env.local"]],
338
+ )
339
+ """Set environment variables from file."""
340
+
341
+ models_gateway: str | None = Field(
342
+ default=None,
343
+ title="Models Gateway",
344
+ examples=["http://localhost:8000", "https://api.example.com/models"],
345
+ )
346
+ """Set the models gateway address."""
347
+
348
+ working_dir: str | None = Field(
349
+ default=None,
350
+ title="Working Dir",
351
+ examples=["/path/to/project", "/home/user/workspace"],
352
+ )
353
+ """Set the working directory for the session."""
354
+
355
+ debug: bool = Field(default=False, title="Debug")
356
+ """Enable debug logging."""
357
+
358
+ otel: bool = Field(default=False, title="OTEL")
359
+ """Enable OpenTelemetry tracing."""
360
+
361
+ log_file: str | None = Field(
362
+ default=None,
363
+ title="Log File",
364
+ examples=["/var/log/cagent.log", "./debug.log"],
365
+ )
366
+ """Path to debug log file."""
367
+
368
+ def get_command(self) -> str:
369
+ """Get the command to spawn the ACP server."""
370
+ return "cagent"
371
+
372
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
373
+ """Build command arguments from settings."""
374
+ args = ["acp"]
375
+
376
+ if self.agent_file:
377
+ args.append(self.agent_file)
378
+ if self.code_mode_tools:
379
+ args.append("--code-mode-tools")
380
+ if self.env_from_file:
381
+ for env_file in self.env_from_file:
382
+ args.extend(["--env-from-file", env_file])
383
+ if self.models_gateway:
384
+ args.extend(["--models-gateway", self.models_gateway])
385
+ if self.working_dir:
386
+ args.extend(["--working-dir", self.working_dir])
387
+ if self.debug:
388
+ args.append("--debug")
389
+ if self.otel:
390
+ args.append("--otel")
391
+ if self.log_file:
392
+ args.extend(["--log-file", self.log_file])
393
+
394
+ return args
395
+
396
+ @property
397
+ def model_providers(self) -> list[ProviderType]:
398
+ """Cagent supports multiple providers via MCP."""
399
+ return ["openai", "anthropic", "gemini"]
400
+
401
+
402
+ class StakpakACPAgentConfig(BaseACPAgentConfig):
403
+ """Configuration for Stakpak Agent via ACP.
404
+
405
+ Terminal-native DevOps Agent in Rust with enterprise-grade security.
406
+
407
+ Example:
408
+ ```yaml
409
+ agents:
410
+ stakpak:
411
+ type: acp
412
+ provider: stakpak
413
+ cwd: /path/to/project
414
+ model: smart
415
+ workdir: /path/to/work
416
+ verbose: true
417
+ ```
418
+ """
419
+
420
+ model_config = ConfigDict(json_schema_extra={"title": "Stakpak ACP Agent Configuration"})
421
+
422
+ provider: Literal["stakpak"] = Field("stakpak", init=False)
423
+ """Discriminator for Stakpak ACP agent."""
424
+
425
+ workdir: str | None = Field(
426
+ default=None,
427
+ title="Workdir",
428
+ examples=["/path/to/workdir", "/home/user/projects"],
429
+ )
430
+ """Run the agent in a specific directory."""
431
+
432
+ verbose: bool = Field(default=False, title="Verbose")
433
+ """Enable verbose output."""
434
+
435
+ debug: bool = Field(default=False, title="Debug")
436
+ """Enable debug output."""
437
+
438
+ disable_secret_redaction: bool = Field(default=False, title="Disable Secret Redaction")
439
+ """Disable secret redaction (WARNING: prints secrets to console)."""
440
+
441
+ privacy_mode: bool = Field(default=False, title="Privacy Mode")
442
+ """Enable privacy mode to redact private data."""
443
+
444
+ study_mode: bool = Field(default=False, title="Study Mode")
445
+ """Enable study mode to use the agent as a study assistant."""
446
+
447
+ index_big_project: bool = Field(default=False, title="Index Big Project")
448
+ """Allow indexing of large projects (more than 500 supported files)."""
449
+
450
+ enable_slack_tools: bool = Field(default=False, title="Enable Slack Tools")
451
+ """Enable Slack tools (experimental)."""
452
+
453
+ disable_mcp_mtls: bool = Field(default=False, title="Disable MCP mTLS")
454
+ """Disable mTLS (WARNING: uses unencrypted HTTP communication)."""
455
+
456
+ enable_subagents: bool = Field(default=False, title="Enable Subagents")
457
+ """Enable subagents."""
458
+
459
+ subagent_config: str | None = Field(
460
+ default=None,
461
+ title="Subagent Config",
462
+ examples=["subagents.toml", "/etc/stakpak/subagents.toml"],
463
+ )
464
+ """Subagent configuration file subagents.toml."""
465
+
466
+ allowed_tools: list[str] | None = Field(
467
+ default=None,
468
+ title="Allowed Tools",
469
+ examples=[["bash", "edit", "read"], ["search", "browse"]],
470
+ )
471
+ """Allow only the specified tools in the agent's context."""
472
+
473
+ profile: str | None = Field(
474
+ default=None,
475
+ title="Profile",
476
+ examples=["default", "production", "development"],
477
+ )
478
+ """Configuration profile to use."""
479
+
480
+ model: Literal["smart", "eco"] | None = Field(
481
+ default=None,
482
+ title="Model",
483
+ examples=["smart", "eco"],
484
+ )
485
+ """Choose agent model on startup."""
486
+
487
+ config: str | None = Field(
488
+ default=None,
489
+ title="Config",
490
+ examples=["config.toml", "/etc/stakpak/config.toml"],
491
+ )
492
+ """Custom path to config file."""
493
+
494
+ def get_command(self) -> str:
495
+ """Get the command to spawn the ACP server."""
496
+ return "stakpak"
497
+
498
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
499
+ """Build command arguments from settings."""
500
+ args = ["acp"]
501
+
502
+ # Handle system prompt from base class - Stakpak uses file
503
+ prompt_file = await self.write_system_prompt_file(prompt_manager)
504
+ if prompt_file:
505
+ args.extend(["--system-prompt-file", prompt_file])
506
+
507
+ if self.workdir:
508
+ args.extend(["--workdir", self.workdir])
509
+ if self.verbose:
510
+ args.append("--verbose")
511
+ if self.debug:
512
+ args.append("--debug")
513
+ if self.disable_secret_redaction:
514
+ args.append("--disable-secret-redaction")
515
+ if self.privacy_mode:
516
+ args.append("--privacy-mode")
517
+ if self.study_mode:
518
+ args.append("--study-mode")
519
+ if self.index_big_project:
520
+ args.append("--index-big-project")
521
+ if self.enable_slack_tools:
522
+ args.append("--enable-slack-tools")
523
+ if self.disable_mcp_mtls:
524
+ args.append("--disable-mcp-mtls")
525
+ if self.enable_subagents:
526
+ args.append("--enable-subagents")
527
+ if self.subagent_config:
528
+ args.extend(["--subagent-config", self.subagent_config])
529
+ if self.allowed_tools:
530
+ for tool in self.allowed_tools:
531
+ args.extend(["--tool", tool])
532
+ if self.profile:
533
+ args.extend(["--profile", self.profile])
534
+ if self.model:
535
+ args.extend(["--model", self.model])
536
+ if self.config:
537
+ args.extend(["--config", self.config])
538
+
539
+ return args
540
+
541
+ @property
542
+ def model_providers(self) -> list[ProviderType]:
543
+ """Stakpak supports multiple providers."""
544
+ return ["openai", "anthropic", "gemini"]
545
+
546
+
547
+ class VTCodeACPAgentConfig(BaseACPAgentConfig):
548
+ """Configuration for VT Code via ACP.
549
+
550
+ Rust-based terminal coding agent with semantic code intelligence.
551
+
552
+ Example:
553
+ ```yaml
554
+ agents:
555
+ vtcode:
556
+ type: acp
557
+ provider: vtcode
558
+ cwd: /path/to/project
559
+ model: gemini-2.5-flash-preview-05-20
560
+ model_provider: gemini
561
+ workspace: /path/to/workspace
562
+ ```
563
+ """
564
+
565
+ model_config = ConfigDict(json_schema_extra={"title": "VTCode ACP Agent Configuration"})
566
+
567
+ provider: Literal["vtcode"] = Field("vtcode", init=False)
568
+ """Discriminator for VT Code ACP agent."""
569
+
570
+ model: str | None = Field(
571
+ default=None,
572
+ title="Model",
573
+ examples=["gemini-2.5-flash-preview-05-20", "gpt-4o", "claude-3-5-sonnet"],
574
+ )
575
+ """LLM Model ID."""
576
+
577
+ model_provider: (
578
+ Literal["gemini", "openai", "anthropic", "deepseek", "openrouter", "xai"] | None
579
+ ) = Field(
580
+ default=None,
581
+ title="Model Provider",
582
+ examples=["gemini", "openai"],
583
+ )
584
+ """LLM Provider."""
585
+
586
+ api_key_env: str | None = Field(
587
+ default=None,
588
+ title="API Key Env",
589
+ examples=["GEMINI_API_KEY", "OPENAI_API_KEY"],
590
+ )
591
+ """API key environment variable."""
592
+
593
+ workspace: str | None = Field(
594
+ default=None,
595
+ title="Workspace",
596
+ examples=["/path/to/workspace", "/home/user/projects"],
597
+ )
598
+ """Workspace root directory for file operations."""
599
+
600
+ enable_tree_sitter: bool = Field(default=False, title="Enable Tree-Sitter")
601
+ """Enable tree-sitter code analysis."""
602
+
603
+ performance_monitoring: bool = Field(default=False, title="Performance Monitoring")
604
+ """Enable performance monitoring."""
605
+
606
+ research_preview: bool = Field(default=False, title="Research Preview")
607
+ """Enable research-preview features."""
608
+
609
+ security_level: Literal["strict", "moderate", "permissive"] | None = Field(
610
+ default=None,
611
+ title="Security Level",
612
+ examples=["strict", "moderate"],
613
+ )
614
+ """Security level for tool execution."""
615
+
616
+ show_file_diffs: bool = Field(default=False, title="Show File Diffs")
617
+ """Show diffs for file changes in chat interface."""
618
+
619
+ max_concurrent_ops: int | None = Field(
620
+ default=None,
621
+ title="Max Concurrent Ops",
622
+ examples=[5, 10],
623
+ )
624
+ """Maximum concurrent async operations."""
625
+
626
+ api_rate_limit: int | None = Field(
627
+ default=None,
628
+ title="API Rate Limit",
629
+ examples=[60, 100],
630
+ )
631
+ """Maximum API requests per minute."""
632
+
633
+ max_tool_calls: int | None = Field(
634
+ default=None,
635
+ title="Max Tool Calls",
636
+ examples=[100, 500],
637
+ )
638
+ """Maximum tool calls per session."""
639
+
640
+ config: str | None = Field(
641
+ default=None,
642
+ title="Config",
643
+ examples=["config.toml", "/etc/vtcode/config.toml"],
644
+ )
645
+ """Configuration file path."""
646
+
647
+ skip_confirmations: bool = Field(default=False, title="Skip Confirmations")
648
+ """Skip safety confirmations."""
649
+
650
+ full_auto: bool = Field(default=False, title="Full Auto")
651
+ """Enable full-auto mode (no interaction)."""
652
+
653
+ def get_command(self) -> str:
654
+ """Get the command to spawn the ACP server."""
655
+ return "vtcode"
656
+
657
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
658
+ """Build command arguments from settings."""
659
+ args = ["acp"]
660
+
661
+ if self.model:
662
+ args.extend(["--model", self.model])
663
+ if self.model_provider:
664
+ args.extend(["--provider", self.model_provider])
665
+ if self.api_key_env:
666
+ args.extend(["--api-key-env", self.api_key_env])
667
+ if self.workspace:
668
+ args.extend(["--workspace", self.workspace])
669
+ if self.enable_tree_sitter:
670
+ args.append("--enable-tree-sitter")
671
+ if self.performance_monitoring:
672
+ args.append("--performance-monitoring")
673
+ if self.research_preview:
674
+ args.append("--research-preview")
675
+ if self.security_level:
676
+ args.extend(["--security-level", self.security_level])
677
+ if self.show_file_diffs:
678
+ args.append("--show-file-diffs")
679
+ if self.max_concurrent_ops is not None:
680
+ args.extend(["--max-concurrent-ops", str(self.max_concurrent_ops)])
681
+ if self.api_rate_limit is not None:
682
+ args.extend(["--api-rate-limit", str(self.api_rate_limit)])
683
+ if self.max_tool_calls is not None:
684
+ args.extend(["--max-tool-calls", str(self.max_tool_calls)])
685
+ if self.config:
686
+ args.extend(["--config", self.config])
687
+ if self.skip_confirmations:
688
+ args.append("--skip-confirmations")
689
+ if self.full_auto:
690
+ args.append("--full-auto")
691
+
692
+ return args
693
+
694
+ @property
695
+ def model_providers(self) -> list[ProviderType]:
696
+ """VT Code supports multiple providers."""
697
+ return ["openai", "anthropic", "gemini"]
698
+
699
+
700
+ class CursorACPAgentConfig(BaseACPAgentConfig):
701
+ """Configuration for Cursor via ACP.
702
+
703
+ Cursor CLI agent with filesystem and terminal capabilities.
704
+ See https://github.com/blowmage/cursor-agent-acp-npm
705
+
706
+ Example:
707
+ ```yaml
708
+ agents:
709
+ coder:
710
+ type: acp
711
+ provider: cursor
712
+ cwd: /path/to/project
713
+ session_dir: ~/.cursor-sessions
714
+ timeout: 30000
715
+ ```
716
+ """
717
+
718
+ model_config = ConfigDict(json_schema_extra={"title": "Cursor ACP Agent Configuration"})
719
+
720
+ provider: Literal["cursor"] = Field("cursor", init=False)
721
+ """Discriminator for Cursor ACP agent."""
722
+
723
+ config: str | None = Field(
724
+ default=None,
725
+ title="Config",
726
+ examples=["config.json", "/etc/cursor/config.json"],
727
+ )
728
+ """Path to configuration file."""
729
+
730
+ log_level: Literal["error", "warn", "info", "debug"] | None = Field(
731
+ default=None,
732
+ title="Log Level",
733
+ examples=["info", "debug"],
734
+ )
735
+ """Logging level."""
736
+
737
+ log_file: str | None = Field(
738
+ default=None,
739
+ title="Log File",
740
+ examples=["/var/log/cursor.log", "./cursor-debug.log"],
741
+ )
742
+ """Log file path (logs to stderr by default)."""
743
+
744
+ session_dir: str | None = Field(
745
+ default=None,
746
+ title="Session Dir",
747
+ examples=["~/.cursor-sessions", "/tmp/cursor-sessions"],
748
+ )
749
+ """Session storage directory (default: ~/.cursor-sessions)."""
750
+
751
+ timeout: int | None = Field(
752
+ default=None,
753
+ title="Timeout",
754
+ examples=[30000, 60000],
755
+ )
756
+ """Cursor-agent timeout in milliseconds (default: 30000)."""
757
+
758
+ retries: int | None = Field(
759
+ default=None,
760
+ title="Retries",
761
+ examples=[3, 5],
762
+ )
763
+ """Number of retries for cursor-agent commands (default: 3)."""
764
+
765
+ max_sessions: int | None = Field(
766
+ default=None,
767
+ title="Max Sessions",
768
+ examples=[100, 200],
769
+ )
770
+ """Maximum number of concurrent sessions (default: 100)."""
771
+
772
+ session_timeout: int | None = Field(
773
+ default=None,
774
+ title="Session Timeout",
775
+ examples=[3600000, 7200000],
776
+ )
777
+ """Session timeout in milliseconds (default: 3600000)."""
778
+
779
+ no_filesystem: bool = Field(default=False, title="No Filesystem")
780
+ """Disable filesystem tools."""
781
+
782
+ no_terminal: bool = Field(default=False, title="No Terminal")
783
+ """Disable terminal tools."""
784
+
785
+ max_processes: int | None = Field(
786
+ default=None,
787
+ title="Max Processes",
788
+ examples=[5, 10],
789
+ )
790
+ """Maximum number of terminal processes (default: 5)."""
791
+
792
+ def get_command(self) -> str:
793
+ """Get the command to spawn the ACP server."""
794
+ return "cursor-agent-acp"
795
+
796
+ async def get_args(self, prompt_manager: PromptManager | None = None) -> list[str]:
797
+ """Build command arguments from settings."""
798
+ args: list[str] = []
799
+
800
+ if self.config:
801
+ args.extend(["--config", self.config])
802
+ if self.log_level:
803
+ args.extend(["--log-level", self.log_level])
804
+ if self.log_file:
805
+ args.extend(["--log-file", self.log_file])
806
+ if self.session_dir:
807
+ args.extend(["--session-dir", self.session_dir])
808
+ if self.timeout is not None:
809
+ args.extend(["--timeout", str(self.timeout)])
810
+ if self.retries is not None:
811
+ args.extend(["--retries", str(self.retries)])
812
+ if self.max_sessions is not None:
813
+ args.extend(["--max-sessions", str(self.max_sessions)])
814
+ if self.session_timeout is not None:
815
+ args.extend(["--session-timeout", str(self.session_timeout)])
816
+ if self.no_filesystem:
817
+ args.append("--no-filesystem")
818
+ if self.no_terminal:
819
+ args.append("--no-terminal")
820
+ if self.max_processes is not None:
821
+ args.extend(["--max-processes", str(self.max_processes)])
822
+ return args
823
+
824
+ @property
825
+ def model_providers(self) -> list[ProviderType]:
826
+ """Cursor supports multiple providers."""
827
+ return ["openai", "anthropic", "gemini", "openrouter"]
828
+
829
+
830
+ # Union of all ACP agent config types
831
+ RegularACPAgentConfigTypes = (
832
+ CodexACPAgentConfig
833
+ | OpenCodeACPAgentConfig
834
+ | GooseACPAgentConfig
835
+ | OpenHandsACPAgentConfig
836
+ | AmpACPAgentConfig
837
+ | CagentACPAgentConfig
838
+ | StakpakACPAgentConfig
839
+ | MistralACPAgentConfig
840
+ | VTCodeACPAgentConfig
841
+ | CursorACPAgentConfig
842
+ )