superqode 0.1.5__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.
Files changed (288) hide show
  1. superqode/__init__.py +33 -0
  2. superqode/acp/__init__.py +23 -0
  3. superqode/acp/client.py +913 -0
  4. superqode/acp/permission_screen.py +457 -0
  5. superqode/acp/types.py +480 -0
  6. superqode/acp_discovery.py +856 -0
  7. superqode/agent/__init__.py +22 -0
  8. superqode/agent/edit_strategies.py +334 -0
  9. superqode/agent/loop.py +892 -0
  10. superqode/agent/qe_report_templates.py +39 -0
  11. superqode/agent/system_prompts.py +353 -0
  12. superqode/agent_output.py +721 -0
  13. superqode/agent_stream.py +953 -0
  14. superqode/agents/__init__.py +59 -0
  15. superqode/agents/acp_registry.py +305 -0
  16. superqode/agents/client.py +249 -0
  17. superqode/agents/data/augmentcode.com.toml +51 -0
  18. superqode/agents/data/cagent.dev.toml +51 -0
  19. superqode/agents/data/claude.com.toml +60 -0
  20. superqode/agents/data/codeassistant.dev.toml +51 -0
  21. superqode/agents/data/codex.openai.com.toml +57 -0
  22. superqode/agents/data/fastagent.ai.toml +66 -0
  23. superqode/agents/data/geminicli.com.toml +77 -0
  24. superqode/agents/data/goose.block.xyz.toml +54 -0
  25. superqode/agents/data/junie.jetbrains.com.toml +56 -0
  26. superqode/agents/data/kimi.moonshot.cn.toml +57 -0
  27. superqode/agents/data/llmlingagent.dev.toml +51 -0
  28. superqode/agents/data/molt.bot.toml +49 -0
  29. superqode/agents/data/opencode.ai.toml +60 -0
  30. superqode/agents/data/stakpak.dev.toml +51 -0
  31. superqode/agents/data/vtcode.dev.toml +51 -0
  32. superqode/agents/discovery.py +266 -0
  33. superqode/agents/messaging.py +160 -0
  34. superqode/agents/persona.py +166 -0
  35. superqode/agents/registry.py +421 -0
  36. superqode/agents/schema.py +72 -0
  37. superqode/agents/unified.py +367 -0
  38. superqode/app/__init__.py +111 -0
  39. superqode/app/constants.py +314 -0
  40. superqode/app/css.py +366 -0
  41. superqode/app/models.py +118 -0
  42. superqode/app/suggester.py +125 -0
  43. superqode/app/widgets.py +1591 -0
  44. superqode/app_enhanced.py +399 -0
  45. superqode/app_main.py +17187 -0
  46. superqode/approval.py +312 -0
  47. superqode/atomic.py +296 -0
  48. superqode/commands/__init__.py +1 -0
  49. superqode/commands/acp.py +965 -0
  50. superqode/commands/agents.py +180 -0
  51. superqode/commands/auth.py +278 -0
  52. superqode/commands/config.py +374 -0
  53. superqode/commands/init.py +826 -0
  54. superqode/commands/providers.py +819 -0
  55. superqode/commands/qe.py +1145 -0
  56. superqode/commands/roles.py +380 -0
  57. superqode/commands/serve.py +172 -0
  58. superqode/commands/suggestions.py +127 -0
  59. superqode/commands/superqe.py +460 -0
  60. superqode/config/__init__.py +51 -0
  61. superqode/config/loader.py +812 -0
  62. superqode/config/schema.py +498 -0
  63. superqode/core/__init__.py +111 -0
  64. superqode/core/roles.py +281 -0
  65. superqode/danger.py +386 -0
  66. superqode/data/superqode-template.yaml +1522 -0
  67. superqode/design_system.py +1080 -0
  68. superqode/dialogs/__init__.py +6 -0
  69. superqode/dialogs/base.py +39 -0
  70. superqode/dialogs/model.py +130 -0
  71. superqode/dialogs/provider.py +870 -0
  72. superqode/diff_view.py +919 -0
  73. superqode/enterprise.py +21 -0
  74. superqode/evaluation/__init__.py +25 -0
  75. superqode/evaluation/adapters.py +93 -0
  76. superqode/evaluation/behaviors.py +89 -0
  77. superqode/evaluation/engine.py +209 -0
  78. superqode/evaluation/scenarios.py +96 -0
  79. superqode/execution/__init__.py +36 -0
  80. superqode/execution/linter.py +538 -0
  81. superqode/execution/modes.py +347 -0
  82. superqode/execution/resolver.py +283 -0
  83. superqode/execution/runner.py +642 -0
  84. superqode/file_explorer.py +811 -0
  85. superqode/file_viewer.py +471 -0
  86. superqode/flash.py +183 -0
  87. superqode/guidance/__init__.py +58 -0
  88. superqode/guidance/config.py +203 -0
  89. superqode/guidance/prompts.py +71 -0
  90. superqode/harness/__init__.py +54 -0
  91. superqode/harness/accelerator.py +291 -0
  92. superqode/harness/config.py +319 -0
  93. superqode/harness/validator.py +147 -0
  94. superqode/history.py +279 -0
  95. superqode/integrations/superopt_runner.py +124 -0
  96. superqode/logging/__init__.py +49 -0
  97. superqode/logging/adapters.py +219 -0
  98. superqode/logging/formatter.py +923 -0
  99. superqode/logging/integration.py +341 -0
  100. superqode/logging/sinks.py +170 -0
  101. superqode/logging/unified_log.py +417 -0
  102. superqode/lsp/__init__.py +26 -0
  103. superqode/lsp/client.py +544 -0
  104. superqode/main.py +1069 -0
  105. superqode/mcp/__init__.py +89 -0
  106. superqode/mcp/auth_storage.py +380 -0
  107. superqode/mcp/client.py +1236 -0
  108. superqode/mcp/config.py +319 -0
  109. superqode/mcp/integration.py +337 -0
  110. superqode/mcp/oauth.py +436 -0
  111. superqode/mcp/oauth_callback.py +385 -0
  112. superqode/mcp/types.py +290 -0
  113. superqode/memory/__init__.py +31 -0
  114. superqode/memory/feedback.py +342 -0
  115. superqode/memory/store.py +522 -0
  116. superqode/notifications.py +369 -0
  117. superqode/optimization/__init__.py +5 -0
  118. superqode/optimization/config.py +33 -0
  119. superqode/permissions/__init__.py +25 -0
  120. superqode/permissions/rules.py +488 -0
  121. superqode/plan.py +323 -0
  122. superqode/providers/__init__.py +33 -0
  123. superqode/providers/gateway/__init__.py +165 -0
  124. superqode/providers/gateway/base.py +228 -0
  125. superqode/providers/gateway/litellm_gateway.py +1170 -0
  126. superqode/providers/gateway/openresponses_gateway.py +436 -0
  127. superqode/providers/health.py +297 -0
  128. superqode/providers/huggingface/__init__.py +74 -0
  129. superqode/providers/huggingface/downloader.py +472 -0
  130. superqode/providers/huggingface/endpoints.py +442 -0
  131. superqode/providers/huggingface/hub.py +531 -0
  132. superqode/providers/huggingface/inference.py +394 -0
  133. superqode/providers/huggingface/transformers_runner.py +516 -0
  134. superqode/providers/local/__init__.py +100 -0
  135. superqode/providers/local/base.py +438 -0
  136. superqode/providers/local/discovery.py +418 -0
  137. superqode/providers/local/lmstudio.py +256 -0
  138. superqode/providers/local/mlx.py +457 -0
  139. superqode/providers/local/ollama.py +486 -0
  140. superqode/providers/local/sglang.py +268 -0
  141. superqode/providers/local/tgi.py +260 -0
  142. superqode/providers/local/tool_support.py +477 -0
  143. superqode/providers/local/vllm.py +258 -0
  144. superqode/providers/manager.py +1338 -0
  145. superqode/providers/models.py +1016 -0
  146. superqode/providers/models_dev.py +578 -0
  147. superqode/providers/openresponses/__init__.py +87 -0
  148. superqode/providers/openresponses/converters/__init__.py +17 -0
  149. superqode/providers/openresponses/converters/messages.py +343 -0
  150. superqode/providers/openresponses/converters/tools.py +268 -0
  151. superqode/providers/openresponses/schema/__init__.py +56 -0
  152. superqode/providers/openresponses/schema/models.py +585 -0
  153. superqode/providers/openresponses/streaming/__init__.py +5 -0
  154. superqode/providers/openresponses/streaming/parser.py +338 -0
  155. superqode/providers/openresponses/tools/__init__.py +21 -0
  156. superqode/providers/openresponses/tools/apply_patch.py +352 -0
  157. superqode/providers/openresponses/tools/code_interpreter.py +290 -0
  158. superqode/providers/openresponses/tools/file_search.py +333 -0
  159. superqode/providers/openresponses/tools/mcp_adapter.py +252 -0
  160. superqode/providers/registry.py +716 -0
  161. superqode/providers/usage.py +332 -0
  162. superqode/pure_mode.py +384 -0
  163. superqode/qr/__init__.py +23 -0
  164. superqode/qr/dashboard.py +781 -0
  165. superqode/qr/generator.py +1018 -0
  166. superqode/qr/templates.py +135 -0
  167. superqode/safety/__init__.py +41 -0
  168. superqode/safety/sandbox.py +413 -0
  169. superqode/safety/warnings.py +256 -0
  170. superqode/server/__init__.py +33 -0
  171. superqode/server/lsp_server.py +775 -0
  172. superqode/server/web.py +250 -0
  173. superqode/session/__init__.py +25 -0
  174. superqode/session/persistence.py +580 -0
  175. superqode/session/sharing.py +477 -0
  176. superqode/session.py +475 -0
  177. superqode/sidebar.py +2991 -0
  178. superqode/stream_view.py +648 -0
  179. superqode/styles/__init__.py +3 -0
  180. superqode/superqe/__init__.py +184 -0
  181. superqode/superqe/acp_runner.py +1064 -0
  182. superqode/superqe/constitution/__init__.py +62 -0
  183. superqode/superqe/constitution/evaluator.py +308 -0
  184. superqode/superqe/constitution/loader.py +432 -0
  185. superqode/superqe/constitution/schema.py +250 -0
  186. superqode/superqe/events.py +591 -0
  187. superqode/superqe/frameworks/__init__.py +65 -0
  188. superqode/superqe/frameworks/base.py +234 -0
  189. superqode/superqe/frameworks/e2e.py +263 -0
  190. superqode/superqe/frameworks/executor.py +237 -0
  191. superqode/superqe/frameworks/javascript.py +409 -0
  192. superqode/superqe/frameworks/python.py +373 -0
  193. superqode/superqe/frameworks/registry.py +92 -0
  194. superqode/superqe/mcp_tools/__init__.py +47 -0
  195. superqode/superqe/mcp_tools/core_tools.py +418 -0
  196. superqode/superqe/mcp_tools/registry.py +230 -0
  197. superqode/superqe/mcp_tools/testing_tools.py +167 -0
  198. superqode/superqe/noise.py +89 -0
  199. superqode/superqe/orchestrator.py +778 -0
  200. superqode/superqe/roles.py +609 -0
  201. superqode/superqe/session.py +713 -0
  202. superqode/superqe/skills/__init__.py +57 -0
  203. superqode/superqe/skills/base.py +106 -0
  204. superqode/superqe/skills/core_skills.py +899 -0
  205. superqode/superqe/skills/registry.py +90 -0
  206. superqode/superqe/verifier.py +101 -0
  207. superqode/superqe_cli.py +76 -0
  208. superqode/tool_call.py +358 -0
  209. superqode/tools/__init__.py +93 -0
  210. superqode/tools/agent_tools.py +496 -0
  211. superqode/tools/base.py +324 -0
  212. superqode/tools/batch_tool.py +133 -0
  213. superqode/tools/diagnostics.py +311 -0
  214. superqode/tools/edit_tools.py +653 -0
  215. superqode/tools/enhanced_base.py +515 -0
  216. superqode/tools/file_tools.py +269 -0
  217. superqode/tools/file_tracking.py +45 -0
  218. superqode/tools/lsp_tools.py +610 -0
  219. superqode/tools/network_tools.py +350 -0
  220. superqode/tools/permissions.py +400 -0
  221. superqode/tools/question_tool.py +324 -0
  222. superqode/tools/search_tools.py +598 -0
  223. superqode/tools/shell_tools.py +259 -0
  224. superqode/tools/todo_tools.py +121 -0
  225. superqode/tools/validation.py +80 -0
  226. superqode/tools/web_tools.py +639 -0
  227. superqode/tui.py +1152 -0
  228. superqode/tui_integration.py +875 -0
  229. superqode/tui_widgets/__init__.py +27 -0
  230. superqode/tui_widgets/widgets/__init__.py +18 -0
  231. superqode/tui_widgets/widgets/progress.py +185 -0
  232. superqode/tui_widgets/widgets/tool_display.py +188 -0
  233. superqode/undo_manager.py +574 -0
  234. superqode/utils/__init__.py +5 -0
  235. superqode/utils/error_handling.py +323 -0
  236. superqode/utils/fuzzy.py +257 -0
  237. superqode/widgets/__init__.py +477 -0
  238. superqode/widgets/agent_collab.py +390 -0
  239. superqode/widgets/agent_store.py +936 -0
  240. superqode/widgets/agent_switcher.py +395 -0
  241. superqode/widgets/animation_manager.py +284 -0
  242. superqode/widgets/code_context.py +356 -0
  243. superqode/widgets/command_palette.py +412 -0
  244. superqode/widgets/connection_status.py +537 -0
  245. superqode/widgets/conversation_history.py +470 -0
  246. superqode/widgets/diff_indicator.py +155 -0
  247. superqode/widgets/enhanced_status_bar.py +385 -0
  248. superqode/widgets/enhanced_toast.py +476 -0
  249. superqode/widgets/file_browser.py +809 -0
  250. superqode/widgets/file_reference.py +585 -0
  251. superqode/widgets/issue_timeline.py +340 -0
  252. superqode/widgets/leader_key.py +264 -0
  253. superqode/widgets/mode_switcher.py +445 -0
  254. superqode/widgets/model_picker.py +234 -0
  255. superqode/widgets/permission_preview.py +1205 -0
  256. superqode/widgets/prompt.py +358 -0
  257. superqode/widgets/provider_connect.py +725 -0
  258. superqode/widgets/pty_shell.py +587 -0
  259. superqode/widgets/qe_dashboard.py +321 -0
  260. superqode/widgets/resizable_sidebar.py +377 -0
  261. superqode/widgets/response_changes.py +218 -0
  262. superqode/widgets/response_display.py +528 -0
  263. superqode/widgets/rich_tool_display.py +613 -0
  264. superqode/widgets/sidebar_panels.py +1180 -0
  265. superqode/widgets/slash_complete.py +356 -0
  266. superqode/widgets/split_view.py +612 -0
  267. superqode/widgets/status_bar.py +273 -0
  268. superqode/widgets/superqode_display.py +786 -0
  269. superqode/widgets/thinking_display.py +815 -0
  270. superqode/widgets/throbber.py +87 -0
  271. superqode/widgets/toast.py +206 -0
  272. superqode/widgets/unified_output.py +1073 -0
  273. superqode/workspace/__init__.py +75 -0
  274. superqode/workspace/artifacts.py +472 -0
  275. superqode/workspace/coordinator.py +353 -0
  276. superqode/workspace/diff_tracker.py +429 -0
  277. superqode/workspace/git_guard.py +373 -0
  278. superqode/workspace/git_snapshot.py +526 -0
  279. superqode/workspace/manager.py +750 -0
  280. superqode/workspace/snapshot.py +357 -0
  281. superqode/workspace/watcher.py +535 -0
  282. superqode/workspace/worktree.py +440 -0
  283. superqode-0.1.5.dist-info/METADATA +204 -0
  284. superqode-0.1.5.dist-info/RECORD +288 -0
  285. superqode-0.1.5.dist-info/WHEEL +5 -0
  286. superqode-0.1.5.dist-info/entry_points.txt +3 -0
  287. superqode-0.1.5.dist-info/licenses/LICENSE +648 -0
  288. superqode-0.1.5.dist-info/top_level.txt +1 -0
@@ -0,0 +1,421 @@
1
+ """
2
+ Agent Registry for SuperQode.
3
+
4
+ This module defines all supported coding agents with their configuration,
5
+ connection methods, and capabilities. Agents are organized by protocol
6
+ (ACP vs External).
7
+
8
+ SECURITY PRINCIPLE: SuperQode NEVER stores agent credentials.
9
+ Each agent manages its own authentication.
10
+ """
11
+
12
+ from dataclasses import dataclass, field
13
+ from enum import Enum
14
+ from typing import Dict, List, Optional, TYPE_CHECKING
15
+
16
+ if TYPE_CHECKING:
17
+ from .schema import Agent
18
+
19
+ from .acp_registry import (
20
+ get_all_registry_agents,
21
+ get_registry_agent,
22
+ get_registry_agent_by_short_name,
23
+ AgentMetadata,
24
+ )
25
+
26
+
27
+ class AgentProtocol(Enum):
28
+ """Agent communication protocol."""
29
+
30
+ ACP = "acp" # Agent Client Protocol (standard)
31
+ EXTERNAL = "external" # Non-ACP agents via adapters (future)
32
+
33
+
34
+ class AgentStatus(Enum):
35
+ """Agent support status."""
36
+
37
+ SUPPORTED = "supported"
38
+ COMING_SOON = "coming_soon"
39
+ EXPERIMENTAL = "experimental"
40
+
41
+
42
+ @dataclass
43
+ class AgentDef:
44
+ """Definition of a coding agent."""
45
+
46
+ id: str
47
+ name: str
48
+ protocol: AgentProtocol
49
+ status: AgentStatus
50
+ description: str
51
+ auth_info: str
52
+ setup_command: str
53
+ docs_url: str
54
+ capabilities: List[str] = field(default_factory=list)
55
+ connection_type: str = "stdio" # "stdio" | "http" | "cli"
56
+ command: Optional[str] = None # CLI command to start agent
57
+ default_port: Optional[int] = None # For HTTP connections
58
+
59
+
60
+ # =============================================================================
61
+ # AGENT REGISTRY
62
+ # =============================================================================
63
+
64
+ AGENTS: Dict[str, AgentDef] = {
65
+ # =========================================================================
66
+ # 14 OFFICIAL ACP AGENTS (Agent Client Protocol)
67
+ # =========================================================================
68
+ "opencode": AgentDef(
69
+ id="opencode",
70
+ name="OpenCode",
71
+ protocol=AgentProtocol.ACP,
72
+ status=AgentStatus.SUPPORTED,
73
+ description="Open-source AI coding agent built for the terminal",
74
+ auth_info="Managed by opencode via /connect",
75
+ setup_command="npm install -g opencode-ai",
76
+ docs_url="https://opencode.ai/docs",
77
+ capabilities=["File editing", "Shell commands", "MCP tools", "75+ providers"],
78
+ connection_type="stdio",
79
+ command="opencode acp",
80
+ ),
81
+ "gemini": AgentDef(
82
+ id="gemini",
83
+ name="Gemini CLI",
84
+ protocol=AgentProtocol.ACP,
85
+ status=AgentStatus.SUPPORTED,
86
+ description="Google's reference ACP implementation",
87
+ auth_info="GEMINI_API_KEY or GOOGLE_API_KEY",
88
+ setup_command="npm install -g @anthropic-ai/gemini-cli",
89
+ docs_url="https://github.com/google-gemini/gemini-cli",
90
+ capabilities=["Large codebases", "Multimodal input", "2M context"],
91
+ connection_type="stdio",
92
+ command="gemini --experimental-acp",
93
+ ),
94
+ "claude": AgentDef(
95
+ id="claude",
96
+ name="Claude Code",
97
+ protocol=AgentProtocol.ACP,
98
+ status=AgentStatus.SUPPORTED,
99
+ description="Anthropic's official CLI coding agent",
100
+ auth_info="ANTHROPIC_API_KEY",
101
+ setup_command="npm install -g @anthropic-ai/claude-code",
102
+ docs_url="https://claude.ai/code",
103
+ capabilities=["File editing", "Shell commands", "Extended thinking"],
104
+ connection_type="stdio",
105
+ command="claude --acp",
106
+ ),
107
+ "codex": AgentDef(
108
+ id="codex",
109
+ name="Codex",
110
+ protocol=AgentProtocol.ACP,
111
+ status=AgentStatus.SUPPORTED,
112
+ description="OpenAI's code generation agent",
113
+ auth_info="OPENAI_API_KEY",
114
+ setup_command="npm install -g @openai/codex",
115
+ docs_url="https://github.com/openai/codex",
116
+ capabilities=["Code generation", "File editing", "Shell commands"],
117
+ connection_type="stdio",
118
+ command="codex --acp",
119
+ ),
120
+ "junie": AgentDef(
121
+ id="junie",
122
+ name="JetBrains Junie",
123
+ protocol=AgentProtocol.ACP,
124
+ status=AgentStatus.SUPPORTED,
125
+ description="JetBrains' AI agent for IDE ecosystem",
126
+ auth_info="JetBrains account (optional)",
127
+ setup_command="npm install -g @jetbrains/junie",
128
+ docs_url="https://www.jetbrains.com/junie/",
129
+ capabilities=["IDE integration", "Code analysis", "Refactoring"],
130
+ connection_type="stdio",
131
+ command="junie --acp",
132
+ ),
133
+ "goose": AgentDef(
134
+ id="goose",
135
+ name="Goose",
136
+ protocol=AgentProtocol.ACP,
137
+ status=AgentStatus.SUPPORTED,
138
+ description="Block's developer agent with MCP support",
139
+ auth_info="Configure via goose configure",
140
+ setup_command="pipx install goose-ai",
141
+ docs_url="https://github.com/block/goose",
142
+ capabilities=["Task automation", "MCP tools", "Multi-provider"],
143
+ connection_type="stdio",
144
+ command="goose mcp",
145
+ ),
146
+ "kimi": AgentDef(
147
+ id="kimi",
148
+ name="Kimi CLI",
149
+ protocol=AgentProtocol.ACP,
150
+ status=AgentStatus.SUPPORTED,
151
+ description="Moonshot AI's CLI agent",
152
+ auth_info="MOONSHOT_API_KEY",
153
+ setup_command="npm install -g kimi-cli",
154
+ docs_url="https://moonshot.cn/",
155
+ capabilities=["Development workflows", "Long context"],
156
+ connection_type="stdio",
157
+ command="kimi --acp",
158
+ ),
159
+ "stakpak": AgentDef(
160
+ id="stakpak",
161
+ name="Stakpak",
162
+ protocol=AgentProtocol.ACP,
163
+ status=AgentStatus.SUPPORTED,
164
+ description="ACP-compatible code assistance agent",
165
+ auth_info="API key via config",
166
+ setup_command="pip install stakpak",
167
+ docs_url="https://stakpak.dev",
168
+ capabilities=["Code assistance", "Collaboration"],
169
+ connection_type="stdio",
170
+ command="stakpak --acp",
171
+ ),
172
+ "vtcode": AgentDef(
173
+ id="vtcode",
174
+ name="VT Code",
175
+ protocol=AgentProtocol.ACP,
176
+ status=AgentStatus.SUPPORTED,
177
+ description="Versatile coding agent",
178
+ auth_info="API key via config",
179
+ setup_command="npm install -g vtcode",
180
+ docs_url="https://vtcode.dev",
181
+ capabilities=["Code editing", "Multi-environment"],
182
+ connection_type="stdio",
183
+ command="vtcode --acp",
184
+ ),
185
+ "auggie": AgentDef(
186
+ id="auggie",
187
+ name="Augment Code",
188
+ protocol=AgentProtocol.ACP,
189
+ status=AgentStatus.SUPPORTED,
190
+ description="AI-powered coding with deep codebase understanding",
191
+ auth_info="AUGMENT_API_KEY",
192
+ setup_command="npm install -g @anthropic-ai/auggie",
193
+ docs_url="https://augmentcode.com/",
194
+ capabilities=["Code analysis", "Modifications", "Tool execution"],
195
+ connection_type="stdio",
196
+ command="auggie --acp",
197
+ ),
198
+ "code-assistant": AgentDef(
199
+ id="code-assistant",
200
+ name="Code Assistant",
201
+ protocol=AgentProtocol.ACP,
202
+ status=AgentStatus.SUPPORTED,
203
+ description="AI coding assistant built in Rust",
204
+ auth_info="API key via config",
205
+ setup_command="cargo install code-assistant",
206
+ docs_url="https://codeassistant.dev",
207
+ capabilities=["Code analysis", "Autonomous modifications"],
208
+ connection_type="stdio",
209
+ command="code-assistant --acp",
210
+ ),
211
+ "cagent": AgentDef(
212
+ id="cagent",
213
+ name="cagent",
214
+ protocol=AgentProtocol.ACP,
215
+ status=AgentStatus.SUPPORTED,
216
+ description="Multi-agent runtime orchestration",
217
+ auth_info="API key via config",
218
+ setup_command="pip install cagent",
219
+ docs_url="https://cagent.dev",
220
+ capabilities=["Multi-agent", "Orchestration", "Customizable"],
221
+ connection_type="stdio",
222
+ command="cagent --acp",
223
+ ),
224
+ "fast-agent": AgentDef(
225
+ id="fast-agent",
226
+ name="fast-agent",
227
+ protocol=AgentProtocol.ACP,
228
+ status=AgentStatus.SUPPORTED,
229
+ description="Sophisticated agent workflows in minutes",
230
+ auth_info="API key via config",
231
+ setup_command="uv tool install fast-agent-mcp",
232
+ docs_url="https://github.com/evalstate/fast-agent",
233
+ capabilities=["Workflows", "MCP native", "Fast setup"],
234
+ connection_type="stdio",
235
+ command="fast-agent --acp",
236
+ ),
237
+ "llmling-agent": AgentDef(
238
+ id="llmling-agent",
239
+ name="LLMling-Agent",
240
+ protocol=AgentProtocol.ACP,
241
+ status=AgentStatus.SUPPORTED,
242
+ description="LLM-powered agent framework",
243
+ auth_info="API key via config",
244
+ setup_command="pip install llmling-agent",
245
+ docs_url="https://github.com/phil65/llmling-agent",
246
+ capabilities=["Structured interactions", "Framework"],
247
+ connection_type="stdio",
248
+ command="llmling-agent --acp",
249
+ ),
250
+ }
251
+
252
+
253
+ # =============================================================================
254
+ # HELPER FUNCTIONS
255
+ # =============================================================================
256
+
257
+
258
+ def get_agent(agent_id: str) -> Optional[AgentDef]:
259
+ """Get an agent definition by ID."""
260
+ return AGENTS.get(agent_id)
261
+
262
+
263
+ def get_supported_agents() -> Dict[str, AgentDef]:
264
+ """Get all supported agents."""
265
+ return {k: v for k, v in AGENTS.items() if v.status == AgentStatus.SUPPORTED}
266
+
267
+
268
+ def get_acp_agents() -> Dict[str, AgentDef]:
269
+ """Get all ACP protocol agents."""
270
+ return {k: v for k, v in AGENTS.items() if v.protocol == AgentProtocol.ACP}
271
+
272
+
273
+ def get_external_agents() -> Dict[str, AgentDef]:
274
+ """Get all external (non-ACP) agents."""
275
+ return {k: v for k, v in AGENTS.items() if v.protocol == AgentProtocol.EXTERNAL}
276
+
277
+
278
+ def get_all_agent_ids() -> List[str]:
279
+ """Get all agent IDs."""
280
+ return list(AGENTS.keys())
281
+
282
+
283
+ def is_agent_available(agent_id: str) -> bool:
284
+ """Check if an agent is available (supported status)."""
285
+ agent = AGENTS.get(agent_id)
286
+ return agent is not None and agent.status == AgentStatus.SUPPORTED
287
+
288
+
289
+ # =============================================================================
290
+ # NEW: ACP Agent Discovery Functions (for TOML-based agents)
291
+ # =============================================================================
292
+
293
+
294
+ async def get_all_acp_agents() -> dict[str, "Agent"]:
295
+ """Get all ACP agents, merging local TOML files with registry.
296
+
297
+ Returns:
298
+ Dictionary mapping agent identity to Agent dict.
299
+ Local agents take precedence over registry agents.
300
+ """
301
+ from .discovery import read_agents
302
+
303
+ # Get local agents first (without registry to avoid circular import)
304
+ local_agents = await read_agents(include_registry=False)
305
+
306
+ # Get registry agents
307
+ registry_agents = get_all_registry_agents()
308
+
309
+ # Convert registry agents to Agent format and merge
310
+ for identity, metadata in registry_agents.items():
311
+ # Skip if already in local agents
312
+ if identity in local_agents:
313
+ continue
314
+
315
+ # Convert registry metadata to Agent format
316
+ agent: "Agent" = {
317
+ "identity": metadata["identity"],
318
+ "name": metadata["name"],
319
+ "short_name": metadata["short_name"],
320
+ "url": metadata["url"],
321
+ "protocol": "acp",
322
+ "author_name": metadata["author_name"],
323
+ "author_url": metadata["author_url"],
324
+ "publisher_name": "SuperQode Team",
325
+ "publisher_url": "https://github.com/SuperagenticAI/superqode",
326
+ "type": "coding",
327
+ "description": metadata["description"],
328
+ "tags": [],
329
+ "help": f"# {metadata['name']}\n\n{metadata['description']}\n\n## Installation\n\n{metadata['installation_instructions']}\n\nRun: `{metadata['installation_command']}`",
330
+ "run_command": {"*": metadata["run_command"]},
331
+ "actions": {
332
+ "*": {
333
+ "install": {
334
+ "command": metadata["installation_command"],
335
+ "description": f"Install {metadata['name']}",
336
+ }
337
+ }
338
+ },
339
+ }
340
+
341
+ local_agents[identity] = agent
342
+
343
+ return local_agents
344
+
345
+
346
+ async def get_agent_metadata(agent_id: str) -> "Agent | None":
347
+ """Get agent metadata by identity or short name.
348
+
349
+ Args:
350
+ agent_id: Agent identity or short name.
351
+
352
+ Returns:
353
+ Agent dict if found, None otherwise.
354
+ """
355
+ all_agents = await get_all_acp_agents()
356
+
357
+ # Try by identity first
358
+ if agent_id in all_agents:
359
+ return all_agents[agent_id]
360
+
361
+ # Try by short name
362
+ for agent in all_agents.values():
363
+ if agent.get("short_name", "").lower() == agent_id.lower():
364
+ return agent
365
+
366
+ return None
367
+
368
+
369
+ def get_agent_installation_info(agent: "Agent") -> dict[str, str]:
370
+ """Get installation information for an agent.
371
+
372
+ Args:
373
+ agent: Agent dict.
374
+
375
+ Returns:
376
+ Dictionary with installation command and instructions.
377
+ """
378
+ # Check if agent has actions
379
+ actions = agent.get("actions", {})
380
+ install_action = None
381
+
382
+ # Try to get install action
383
+ for os_actions in actions.values():
384
+ if isinstance(os_actions, dict) and "install" in os_actions:
385
+ install_action = os_actions["install"]
386
+ break
387
+
388
+ if install_action:
389
+ return {
390
+ "command": install_action.get("command", ""),
391
+ "description": install_action.get("description", "Install agent"),
392
+ "instructions": agent.get("help", "").split("## Installation")[-1].strip()
393
+ if "## Installation" in agent.get("help", "")
394
+ else "",
395
+ }
396
+
397
+ # Fallback to registry if available
398
+ registry_agent = get_registry_agent(agent["identity"])
399
+ if registry_agent:
400
+ return {
401
+ "command": registry_agent["installation_command"],
402
+ "description": f"Install {registry_agent['name']}",
403
+ "instructions": registry_agent["installation_instructions"],
404
+ }
405
+
406
+ return {
407
+ "command": "",
408
+ "description": "Installation not available",
409
+ "instructions": "No installation instructions available for this agent.",
410
+ }
411
+
412
+
413
+ async def sync_agents_from_zed() -> dict[str, "Agent"]:
414
+ """Attempt to sync agents from zed.dev/acp (currently uses registry as fallback).
415
+
416
+ Returns:
417
+ Dictionary of agents from registry.
418
+ """
419
+ # For now, return registry agents
420
+ # In the future, this could fetch from an API or scrape the website
421
+ return await get_all_acp_agents()
@@ -0,0 +1,72 @@
1
+ """Agent schema definitions for SuperQode ACP integration."""
2
+
3
+ from typing import TypedDict, Literal, NotRequired
4
+
5
+ type Tag = str
6
+ """A tag used for categorizing the agent. For example: 'open-source', 'reasoning'."""
7
+ type OS = Literal["macos", "linux", "windows", "*"]
8
+ """An operating system identifier, or a '*" wildcard, if it is the same for all OSes."""
9
+ type Action = str
10
+ """An action which the agent supports."""
11
+ type AgentType = Literal["coding", "chat"]
12
+ """The type of agent. Currently "coding" or "chat". More types TBD."""
13
+ type AgentProtocol = Literal["acp"]
14
+ """The protocol used to communicate with the agent. Currently only "acp" is supported."""
15
+
16
+
17
+ class Command(TypedDict):
18
+ """Used to perform an action associate with an Agent."""
19
+
20
+ description: str
21
+ """Describes what the script will do. For example: 'Install Claude Code'."""
22
+ command: str
23
+ """Command to run."""
24
+ bootstrap_uv: NotRequired[bool]
25
+ """Bootstrap UV installer (set to `true` if the command users `uv`)."""
26
+
27
+
28
+ class Agent(TypedDict):
29
+ """Describes an agent which SuperQode can connect to. Currently only Agent Client Protocol is supported.
30
+
31
+ This information is stored within TOML files, where the filename is the "identity" key plus the extension ".toml"
32
+
33
+ """
34
+
35
+ active: NotRequired[bool]
36
+ """If `True` (default), the agent will be shown in the UI. If `False` the agent will be removed from the UI."""
37
+ recommended: NotRequired[bool]
38
+ """Agent is in recommended set. Set to `True` in main branch only if previously agreed."""
39
+ identity: str
40
+ """A unique identifier for this agent. Should be a domain the agent developer owns,
41
+ although it doesn't have to resolve to anything. Must be useable in a filename on all platforms.
42
+ For example: 'claude.anthropic.ai'"""
43
+ name: str
44
+ """The name of the agent. For example: 'Claude Code'."""
45
+ short_name: str
46
+ """A short name, usable on the command line. Try to make it unique. For example: 'claude'."""
47
+ url: str
48
+ """A URL for the agent."""
49
+ protocol: AgentProtocol
50
+ """The protocol used by the agent. Currently only 'acp' is supported."""
51
+ type: AgentType
52
+ """The type of the agent. Currently "coding" or "chat". More types TBD."""
53
+ author_name: str
54
+ """The author of the agent. For example 'Anthropic'."""
55
+ author_url: str
56
+ """The authors homepage. For example 'https://www.anthropic.com/'."""
57
+ publisher_name: str
58
+ """The publisher's name (individual or organization that wrote this data)."""
59
+ publisher_url: str
60
+ """The publisher's url."""
61
+ description: str
62
+ """A description of the agent. A few sentences max. May contain content markup if used subtly."""
63
+ tags: list[Tag]
64
+ """Tags which identify the agent. Should be empty for now."""
65
+ help: str
66
+ """A Markdown document with additional details regarding the agent."""
67
+ welcome: NotRequired[str]
68
+ """A Markdown document shown to the user when the conversation starts. Should contain a welcome message and any advice on getting started."""
69
+ run_command: dict[OS, str]
70
+ """Command to run the agent, by OS or wildcard."""
71
+ actions: dict[OS, dict[Action, Command]]
72
+ """Scripts to perform actions, typically at least to install the agent."""