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,180 @@
1
+ """Built-in commands for AgentPool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from agentpool_commands.base import NodeCommand
6
+ from agentpool_commands.agents import (
7
+ CreateAgentCommand,
8
+ ListAgentsCommand,
9
+ ShowAgentCommand,
10
+ # SwitchAgentCommand,
11
+ )
12
+ from agentpool_commands.connections import (
13
+ ConnectCommand,
14
+ DisconnectCommand,
15
+ ListConnectionsCommand,
16
+ DisconnectAllCommand,
17
+ )
18
+ from agentpool_commands.models import SetModelCommand
19
+ from agentpool_commands.prompts import ListPromptsCommand, ShowPromptCommand
20
+ from agentpool_commands.resources import (
21
+ ListResourcesCommand,
22
+ ShowResourceCommand,
23
+ AddResourceCommand,
24
+ )
25
+ from agentpool_commands.session import ClearCommand, ResetCommand
26
+ from agentpool_commands.read import ReadCommand
27
+ from agentpool_commands.tools import (
28
+ DisableToolCommand,
29
+ EnableToolCommand,
30
+ ListToolsCommand,
31
+ RegisterToolCommand,
32
+ ShowToolCommand,
33
+ )
34
+ from agentpool_commands.workers import (
35
+ AddWorkerCommand,
36
+ RemoveWorkerCommand,
37
+ ListWorkersCommand,
38
+ )
39
+ from agentpool_commands.utils import (
40
+ CopyClipboardCommand,
41
+ EditAgentFileCommand,
42
+ ShareHistoryCommand,
43
+ )
44
+ from typing import TYPE_CHECKING, Any
45
+
46
+ if TYPE_CHECKING:
47
+ from collections.abc import Sequence
48
+
49
+ from slashed import BaseCommand, SlashedCommand
50
+
51
+ from agentpool.messaging import MessageNode
52
+
53
+
54
+ def get_agent_commands(**kwargs: Any) -> Sequence[BaseCommand | type[SlashedCommand]]:
55
+ """Get commands that operate primarily on a single agent."""
56
+ command_map = {
57
+ "enable_clear": ClearCommand,
58
+ "enable_reset": ResetCommand,
59
+ "enable_copy_clipboard": CopyClipboardCommand,
60
+ "enable_share_history": ShareHistoryCommand,
61
+ "enable_set_model": SetModelCommand,
62
+ "enable_list_tools": ListToolsCommand,
63
+ "enable_show_tool": ShowToolCommand,
64
+ "enable_enable_tool": EnableToolCommand,
65
+ "enable_disable_tool": DisableToolCommand,
66
+ "enable_register_tool": RegisterToolCommand,
67
+ "enable_list_resources": ListResourcesCommand,
68
+ "enable_show_resource": ShowResourceCommand,
69
+ "enable_add_resource": AddResourceCommand,
70
+ "enable_list_prompts": ListPromptsCommand,
71
+ "enable_show_prompt": ShowPromptCommand,
72
+ "enable_add_worker": AddWorkerCommand,
73
+ "enable_remove_worker": RemoveWorkerCommand,
74
+ "enable_list_workers": ListWorkersCommand,
75
+ "enable_connect": ConnectCommand,
76
+ "enable_disconnect": DisconnectCommand,
77
+ "enable_list_connections": ListConnectionsCommand,
78
+ "enable_disconnect_all": DisconnectAllCommand,
79
+ "enable_read": ReadCommand,
80
+ }
81
+ return [command for flag, command in command_map.items() if kwargs.get(flag, True)]
82
+
83
+
84
+ def get_pool_commands(**kwargs: Any) -> Sequence[BaseCommand | type[SlashedCommand]]:
85
+ """Get commands that operate on multiple agents or the pool itself."""
86
+ command_map = {
87
+ "enable_create_agent": CreateAgentCommand,
88
+ "enable_list_agents": ListAgentsCommand,
89
+ "enable_show_agent": ShowAgentCommand,
90
+ "enable_edit_agent_file": EditAgentFileCommand,
91
+ }
92
+ return [command for flag, command in command_map.items() if kwargs.get(flag, True)]
93
+
94
+
95
+ def filter_commands_for_node(
96
+ commands: Sequence[BaseCommand | type[SlashedCommand]],
97
+ node: MessageNode[Any, Any],
98
+ ) -> list[BaseCommand | type[SlashedCommand]]:
99
+ """Filter commands to those supporting the given node type.
100
+
101
+ Args:
102
+ commands: Commands to filter
103
+ node: The node to check compatibility with
104
+ """
105
+ result: list[BaseCommand | type[SlashedCommand]] = []
106
+ for cmd in commands:
107
+ cmd_cls = cmd if isinstance(cmd, type) else type(cmd)
108
+ if issubclass(cmd_cls, NodeCommand) and not cmd_cls.supports_node(node):
109
+ continue
110
+ result.append(cmd)
111
+ return result
112
+
113
+
114
+ def get_commands(
115
+ *,
116
+ enable_clear: bool = True,
117
+ enable_reset: bool = True,
118
+ enable_copy_clipboard: bool = True,
119
+ enable_share_history: bool = True,
120
+ enable_set_model: bool = True,
121
+ enable_list_tools: bool = True,
122
+ enable_show_tool: bool = True,
123
+ enable_enable_tool: bool = True,
124
+ enable_disable_tool: bool = True,
125
+ enable_register_tool: bool = True,
126
+ enable_list_resources: bool = True,
127
+ enable_show_resource: bool = True,
128
+ enable_add_resource: bool = True,
129
+ enable_list_prompts: bool = True,
130
+ enable_show_prompt: bool = True,
131
+ enable_add_worker: bool = True,
132
+ enable_remove_worker: bool = True,
133
+ enable_list_workers: bool = True,
134
+ enable_connect: bool = True,
135
+ enable_disconnect: bool = True,
136
+ enable_list_connections: bool = True,
137
+ enable_disconnect_all: bool = True,
138
+ enable_read: bool = True,
139
+ enable_create_agent: bool = True,
140
+ enable_list_agents: bool = True,
141
+ enable_show_agent: bool = True,
142
+ enable_edit_agent_file: bool = True,
143
+ ) -> list[BaseCommand | type[SlashedCommand]]:
144
+ """Get all built-in commands."""
145
+ agent_kwargs = {
146
+ "enable_clear": enable_clear,
147
+ "enable_reset": enable_reset,
148
+ "enable_copy_clipboard": enable_copy_clipboard,
149
+ "enable_share_history": enable_share_history,
150
+ "enable_set_model": enable_set_model,
151
+ "enable_list_tools": enable_list_tools,
152
+ "enable_show_tool": enable_show_tool,
153
+ "enable_enable_tool": enable_enable_tool,
154
+ "enable_disable_tool": enable_disable_tool,
155
+ "enable_register_tool": enable_register_tool,
156
+ "enable_list_resources": enable_list_resources,
157
+ "enable_show_resource": enable_show_resource,
158
+ "enable_add_resource": enable_add_resource,
159
+ "enable_list_prompts": enable_list_prompts,
160
+ "enable_show_prompt": enable_show_prompt,
161
+ "enable_add_worker": enable_add_worker,
162
+ "enable_remove_worker": enable_remove_worker,
163
+ "enable_list_workers": enable_list_workers,
164
+ "enable_connect": enable_connect,
165
+ "enable_disconnect": enable_disconnect,
166
+ "enable_list_connections": enable_list_connections,
167
+ "enable_disconnect_all": enable_disconnect_all,
168
+ "enable_read": enable_read,
169
+ }
170
+ pool_kwargs = {
171
+ "enable_create_agent": enable_create_agent,
172
+ "enable_list_agents": enable_list_agents,
173
+ "enable_show_agent": enable_show_agent,
174
+ "enable_edit_agent_file": enable_edit_agent_file,
175
+ }
176
+
177
+ return [
178
+ *get_agent_commands(**agent_kwargs),
179
+ *get_pool_commands(**pool_kwargs),
180
+ ]
@@ -0,0 +1,199 @@
1
+ """Agent management commands."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from slashed import CommandContext, CommandError # noqa: TC002
6
+ from slashed.completers import CallbackCompleter
7
+
8
+ from agentpool.messaging.context import NodeContext # noqa: TC001
9
+ from agentpool_commands.base import NodeCommand
10
+ from agentpool_commands.completers import get_available_agents
11
+ from agentpool_commands.markdown_utils import format_table
12
+
13
+
14
+ class CreateAgentCommand(NodeCommand):
15
+ """Create a new agent in the current session.
16
+
17
+ Creates a temporary agent that inherits the current agent's model.
18
+ The new agent will exist only for this session.
19
+
20
+ Options:
21
+ --system-prompt "prompt" System instructions for the agent (required)
22
+ --model model_name Override model (default: same as current agent)
23
+ --role role_name Agent role (assistant/specialist/overseer)
24
+ --description "text" Optional description of the agent
25
+ --tools "import_path1|import_path2" Optional list tools (by import path)
26
+
27
+ Examples:
28
+ # Create poet using same model as current agent
29
+ /create-agent poet --system-prompt "Create poems from any text"
30
+
31
+ # Create analyzer with different model
32
+ /create-agent analyzer --system-prompt "Analyze in detail" --model gpt-5
33
+
34
+ # Create specialized helper
35
+ /create-agent helper --system-prompt "Debug code" --role specialist
36
+ """
37
+
38
+ name = "create-agent"
39
+ category = "agents"
40
+
41
+ async def execute_command(
42
+ self,
43
+ ctx: CommandContext[NodeContext],
44
+ agent_name: str,
45
+ system_prompt: str = "",
46
+ *,
47
+ model: str | None = None,
48
+ role: str | None = None,
49
+ description: str | None = None,
50
+ tools: str | None = None,
51
+ ) -> None:
52
+ """Create a new agent in the current session.
53
+
54
+ Args:
55
+ ctx: Command context
56
+ agent_name: Name for the new agent
57
+ system_prompt: System instructions for the agent
58
+ model: Override model (default: same as current agent)
59
+ role: Agent role (assistant/specialist/overseer)
60
+ description: Optional description of the agent
61
+ tools: Optional pipe-separated list of tools (by import path)
62
+ """
63
+ try:
64
+ if not ctx.context.pool:
65
+ msg = "No agent pool available"
66
+ raise CommandError(msg)
67
+
68
+ # Get model from args or current agent
69
+ current_agent = ctx.context.agent
70
+ tool_list = [t.strip() for t in tools.split("|")] if tools else None
71
+ # Create and register the new agent
72
+ await ctx.context.pool.add_agent(
73
+ name=agent_name,
74
+ model=model or current_agent.model_name,
75
+ system_prompt=system_prompt or (),
76
+ description=description,
77
+ tools=tool_list,
78
+ )
79
+
80
+ msg = f"✅ **Created agent** `{agent_name}`"
81
+ if tool_list:
82
+ msg += f" with tools: `{', '.join(tool_list)}`"
83
+ await ctx.print(f"{msg}\n\n💡 Use `/connect {agent_name}` to forward messages")
84
+
85
+ except ValueError as e:
86
+ msg = f"Failed to create agent: {e}"
87
+ raise CommandError(msg) from e
88
+
89
+
90
+ class ShowAgentCommand(NodeCommand):
91
+ """Display the complete configuration of the current agent as YAML.
92
+
93
+ Shows:
94
+ - Basic agent settings
95
+ - Model configuration (with override indicators)
96
+ - Environment settings (including inline environments)
97
+ - System prompts
98
+ - Response type configuration
99
+ - Other settings
100
+
101
+ Fields that have been overridden at runtime are marked with comments.
102
+ """
103
+
104
+ name = "show-agent"
105
+ category = "agents"
106
+
107
+ async def execute_command(self, ctx: CommandContext[NodeContext]) -> None:
108
+ """Show current agent's configuration.
109
+
110
+ Args:
111
+ ctx: Command context
112
+ """
113
+ import yamling
114
+
115
+ node_ctx = ctx.context.node.get_context()
116
+ config = node_ctx.config
117
+ config_dict = config.model_dump(exclude_none=True) # Get base config as dict
118
+ # Format as annotated YAML
119
+ yaml_config = yamling.dump_yaml(
120
+ config_dict,
121
+ sort_keys=False,
122
+ indent=2,
123
+ default_flow_style=False,
124
+ allow_unicode=True,
125
+ )
126
+ # Add header and format for display
127
+ sections = ["\n**Current Node Configuration:**", "```yaml", yaml_config, "```"]
128
+ await ctx.print("\n".join(sections))
129
+
130
+
131
+ class ListAgentsCommand(NodeCommand):
132
+ """Show all agents defined in the current configuration.
133
+
134
+ Displays:
135
+ - Agent name
136
+ - Model used (if specified)
137
+ - Description (if available)
138
+ """
139
+
140
+ name = "list-agents"
141
+ category = "agents"
142
+
143
+ async def execute_command(self, ctx: CommandContext[NodeContext]) -> None:
144
+ """List all available agents.
145
+
146
+ Args:
147
+ ctx: Command context
148
+ """
149
+ if not ctx.context.pool:
150
+ msg = "No agent pool available"
151
+ raise CommandError(msg)
152
+
153
+ rows = []
154
+ for name, agent in ctx.context.pool.agents.items():
155
+ typ = "dynamic" if name not in ctx.context.definition.agents else "static"
156
+ rows.append({
157
+ "Name": name,
158
+ "Model": str(agent.model_name or ""),
159
+ "Type": f"agent ({typ})",
160
+ "Description": agent.description or "",
161
+ })
162
+
163
+ for name, acp_agent in ctx.context.pool.acp_agents.items():
164
+ rows.append({
165
+ "Name": name,
166
+ "Model": str(acp_agent.model_name or ""),
167
+ "Type": "acp_agent",
168
+ "Description": acp_agent.description or "",
169
+ })
170
+
171
+ headers = ["Name", "Model", "Type", "Description"]
172
+ table = format_table(headers, rows)
173
+ await ctx.print(f"## 🤖 Available Agents\n\n{table}")
174
+
175
+
176
+ class SwitchAgentCommand(NodeCommand):
177
+ """Switch the current chat session to a different agent.
178
+
179
+ Use /list-agents to see available agents.
180
+
181
+ Example: /switch-agent url_opener
182
+ """
183
+
184
+ name = "switch-agent"
185
+ category = "agents"
186
+
187
+ async def execute_command(self, ctx: CommandContext[NodeContext], agent_name: str) -> None:
188
+ """Switch to a different agent.
189
+
190
+ Args:
191
+ ctx: Command context
192
+ agent_name: Name of the agent to switch to
193
+ """
194
+ msg = "Temporarily disabled"
195
+ raise RuntimeError(msg)
196
+
197
+ def get_completer(self) -> CallbackCompleter:
198
+ """Get completer for agent names."""
199
+ return CallbackCompleter(get_available_agents)
@@ -0,0 +1,45 @@
1
+ """Base command class with node-type filtering support."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import ABC
6
+ from typing import TYPE_CHECKING, Any
7
+
8
+ from slashed import SlashedCommand
9
+
10
+
11
+ if TYPE_CHECKING:
12
+ from agentpool.messaging import MessageNode
13
+
14
+
15
+ class NodeCommand(SlashedCommand, ABC):
16
+ """Base class for commands with node-type filtering.
17
+
18
+ Commands inheriting from this can override `supports_node` to restrict
19
+ which node types they're available for.
20
+ """
21
+
22
+ name: str = "" # Placeholder, must be overridden by concrete subclasses
23
+
24
+ @classmethod
25
+ def supports_node(cls, node: MessageNode[Any, Any]) -> bool:
26
+ """Check if this command supports the given node type.
27
+
28
+ Override in subclasses to restrict to specific node types.
29
+ Default implementation returns True (supports all nodes).
30
+
31
+ Args:
32
+ node: The node to check compatibility with
33
+ """
34
+ return True
35
+
36
+
37
+ class AgentCommand(NodeCommand):
38
+ """Base class for commands that only work with Agent nodes."""
39
+
40
+ @classmethod
41
+ def supports_node(cls, node: MessageNode[Any, Any]) -> bool:
42
+ """Check if node is an Agent."""
43
+ from agentpool import Agent
44
+
45
+ return isinstance(node, Agent)
@@ -0,0 +1,58 @@
1
+ """Slashed command to list nodes."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from slashed import CommandContext # noqa: TC002
6
+
7
+ from agentpool.log import get_logger
8
+ from agentpool.messaging.context import NodeContext # noqa: TC001
9
+ from agentpool_commands.base import NodeCommand
10
+ from agentpool_commands.markdown_utils import format_table
11
+
12
+
13
+ logger = get_logger(__name__)
14
+
15
+
16
+ class ListNodesCommand(NodeCommand):
17
+ """List all nodes in the pool with their status."""
18
+
19
+ name = "list-nodes"
20
+ category = "pool"
21
+
22
+ async def execute_command(
23
+ self,
24
+ ctx: CommandContext[NodeContext],
25
+ show_connections: bool = False,
26
+ ) -> None:
27
+ """List all nodes and their current status.
28
+
29
+ Args:
30
+ ctx: Command context with node
31
+ show_connections: Whether to show node connections
32
+ """
33
+ node = ctx.get_data()
34
+ assert node.pool
35
+
36
+ rows = []
37
+ for name, node_ in node.pool.nodes.items():
38
+ # Status check
39
+ status = "🔄 busy" if node_.task_manager.is_busy() else "⏳ idle"
40
+
41
+ # Add connections if requested
42
+ connections = []
43
+ if show_connections and node_.connections.get_targets():
44
+ connections = [a.name for a in node_.connections.get_targets()]
45
+ conn_str = f"→ {', '.join(connections)}"
46
+ else:
47
+ conn_str = ""
48
+
49
+ rows.append({
50
+ "Node": name,
51
+ "Status": status,
52
+ "Connections": conn_str,
53
+ "Description": node_.description or "",
54
+ })
55
+
56
+ headers = ["Node", "Status", "Connections", "Description"]
57
+ table = format_table(headers, rows)
58
+ await ctx.print(f"## 🔗 Available Nodes\n\n{table}")
@@ -0,0 +1,110 @@
1
+ """Command completion providers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING, Any, Literal, get_args
6
+
7
+ from slashed import CompletionItem, CompletionProvider
8
+
9
+ from agentpool.agents.context import AgentContext # noqa: TC001
10
+ from agentpool.messaging.context import NodeContext # noqa: TC001
11
+
12
+
13
+ if TYPE_CHECKING:
14
+ from collections.abc import AsyncIterator
15
+
16
+ from slashed import CompletionContext
17
+
18
+
19
+ def get_available_agents(
20
+ ctx: CompletionContext[AgentContext[Any]],
21
+ agent_type: Literal["all", "regular", "acp"] = "all",
22
+ ) -> list[str]:
23
+ """Get available agent names.
24
+
25
+ Args:
26
+ ctx: Completion context
27
+ agent_type: Filter by agent type ("all", "regular", or "acp")
28
+ """
29
+ if not ctx.command_context.context.pool:
30
+ return []
31
+ pool = ctx.command_context.context.pool
32
+ match agent_type:
33
+ case "all":
34
+ return list(pool.all_agents.keys())
35
+ case "regular":
36
+ return list(pool.agents.keys())
37
+ case "acp":
38
+ return list(pool.acp_agents.keys())
39
+
40
+
41
+ def get_available_nodes(ctx: CompletionContext[NodeContext[Any]]) -> list[str]:
42
+ """Get available node names."""
43
+ if not ctx.command_context.context.pool:
44
+ return []
45
+ return list(ctx.command_context.context.pool.nodes.keys())
46
+
47
+
48
+ def get_model_names(ctx: CompletionContext[AgentContext[Any]]) -> list[str]:
49
+ """Get available model names from pydantic-ai and current configuration.
50
+
51
+ Returns:
52
+ - All models from KnownModelName literal type
53
+ - Plus any additional models from current configuration
54
+ """
55
+ # Get models directly from the Literal type
56
+ from llmling_models import AllModels
57
+ from tokonomics.model_names import ModelId
58
+
59
+ known_models = list(get_args(ModelId)) + list(get_args(AllModels))
60
+
61
+ agent = ctx.command_context.context.agent
62
+ agent_ctx = agent.get_context()
63
+ if not agent_ctx.definition:
64
+ return known_models
65
+
66
+ # Add any additional models from the current configuration (only native agents have model)
67
+ agents = agent_ctx.definition.native_agents
68
+ config_models = {str(a.model) for a in agents.values() if a.model is not None}
69
+
70
+ # Combine both sources, keeping order (known models first)
71
+ all_models = known_models[:]
72
+ all_models.extend(model for model in config_models if model not in all_models)
73
+ return all_models
74
+
75
+
76
+ class PromptCompleter(CompletionProvider):
77
+ """Completer for prompts."""
78
+
79
+ async def get_completions(
80
+ self, ctx: CompletionContext[AgentContext[Any]]
81
+ ) -> AsyncIterator[CompletionItem]:
82
+ """Complete prompt references."""
83
+ current = ctx.current_word
84
+ manifest = ctx.command_context.context.definition
85
+
86
+ # If no : yet, suggest providers
87
+ if ":" not in current:
88
+ # Always suggest builtin prompts without prefix
89
+ for name in manifest.prompts.system_prompts:
90
+ if not name.startswith(current):
91
+ continue
92
+ yield CompletionItem(name, metadata="Builtin prompt", kind="choice")
93
+
94
+ # Suggest provider prefixes
95
+ for provider in manifest.prompts.providers or []:
96
+ prefix = f"{provider.type}:"
97
+ if not prefix.startswith(current):
98
+ continue
99
+ yield CompletionItem(prefix, metadata="Prompt provider", kind="choice")
100
+ return
101
+
102
+ # If after provider:, get prompts from that provider
103
+ provider_, partial = current.split(":", 1)
104
+ if provider_ == "builtin" or not provider_:
105
+ # Complete from system prompts
106
+ for name in manifest.prompts.system_prompts:
107
+ if not name.startswith(partial):
108
+ continue
109
+ text = f"{provider_}:{name}" if provider_ else name
110
+ yield CompletionItem(text=text, metadata="Builtin prompt", kind="choice")