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.
- superqode/__init__.py +33 -0
- superqode/acp/__init__.py +23 -0
- superqode/acp/client.py +913 -0
- superqode/acp/permission_screen.py +457 -0
- superqode/acp/types.py +480 -0
- superqode/acp_discovery.py +856 -0
- superqode/agent/__init__.py +22 -0
- superqode/agent/edit_strategies.py +334 -0
- superqode/agent/loop.py +892 -0
- superqode/agent/qe_report_templates.py +39 -0
- superqode/agent/system_prompts.py +353 -0
- superqode/agent_output.py +721 -0
- superqode/agent_stream.py +953 -0
- superqode/agents/__init__.py +59 -0
- superqode/agents/acp_registry.py +305 -0
- superqode/agents/client.py +249 -0
- superqode/agents/data/augmentcode.com.toml +51 -0
- superqode/agents/data/cagent.dev.toml +51 -0
- superqode/agents/data/claude.com.toml +60 -0
- superqode/agents/data/codeassistant.dev.toml +51 -0
- superqode/agents/data/codex.openai.com.toml +57 -0
- superqode/agents/data/fastagent.ai.toml +66 -0
- superqode/agents/data/geminicli.com.toml +77 -0
- superqode/agents/data/goose.block.xyz.toml +54 -0
- superqode/agents/data/junie.jetbrains.com.toml +56 -0
- superqode/agents/data/kimi.moonshot.cn.toml +57 -0
- superqode/agents/data/llmlingagent.dev.toml +51 -0
- superqode/agents/data/molt.bot.toml +49 -0
- superqode/agents/data/opencode.ai.toml +60 -0
- superqode/agents/data/stakpak.dev.toml +51 -0
- superqode/agents/data/vtcode.dev.toml +51 -0
- superqode/agents/discovery.py +266 -0
- superqode/agents/messaging.py +160 -0
- superqode/agents/persona.py +166 -0
- superqode/agents/registry.py +421 -0
- superqode/agents/schema.py +72 -0
- superqode/agents/unified.py +367 -0
- superqode/app/__init__.py +111 -0
- superqode/app/constants.py +314 -0
- superqode/app/css.py +366 -0
- superqode/app/models.py +118 -0
- superqode/app/suggester.py +125 -0
- superqode/app/widgets.py +1591 -0
- superqode/app_enhanced.py +399 -0
- superqode/app_main.py +17187 -0
- superqode/approval.py +312 -0
- superqode/atomic.py +296 -0
- superqode/commands/__init__.py +1 -0
- superqode/commands/acp.py +965 -0
- superqode/commands/agents.py +180 -0
- superqode/commands/auth.py +278 -0
- superqode/commands/config.py +374 -0
- superqode/commands/init.py +826 -0
- superqode/commands/providers.py +819 -0
- superqode/commands/qe.py +1145 -0
- superqode/commands/roles.py +380 -0
- superqode/commands/serve.py +172 -0
- superqode/commands/suggestions.py +127 -0
- superqode/commands/superqe.py +460 -0
- superqode/config/__init__.py +51 -0
- superqode/config/loader.py +812 -0
- superqode/config/schema.py +498 -0
- superqode/core/__init__.py +111 -0
- superqode/core/roles.py +281 -0
- superqode/danger.py +386 -0
- superqode/data/superqode-template.yaml +1522 -0
- superqode/design_system.py +1080 -0
- superqode/dialogs/__init__.py +6 -0
- superqode/dialogs/base.py +39 -0
- superqode/dialogs/model.py +130 -0
- superqode/dialogs/provider.py +870 -0
- superqode/diff_view.py +919 -0
- superqode/enterprise.py +21 -0
- superqode/evaluation/__init__.py +25 -0
- superqode/evaluation/adapters.py +93 -0
- superqode/evaluation/behaviors.py +89 -0
- superqode/evaluation/engine.py +209 -0
- superqode/evaluation/scenarios.py +96 -0
- superqode/execution/__init__.py +36 -0
- superqode/execution/linter.py +538 -0
- superqode/execution/modes.py +347 -0
- superqode/execution/resolver.py +283 -0
- superqode/execution/runner.py +642 -0
- superqode/file_explorer.py +811 -0
- superqode/file_viewer.py +471 -0
- superqode/flash.py +183 -0
- superqode/guidance/__init__.py +58 -0
- superqode/guidance/config.py +203 -0
- superqode/guidance/prompts.py +71 -0
- superqode/harness/__init__.py +54 -0
- superqode/harness/accelerator.py +291 -0
- superqode/harness/config.py +319 -0
- superqode/harness/validator.py +147 -0
- superqode/history.py +279 -0
- superqode/integrations/superopt_runner.py +124 -0
- superqode/logging/__init__.py +49 -0
- superqode/logging/adapters.py +219 -0
- superqode/logging/formatter.py +923 -0
- superqode/logging/integration.py +341 -0
- superqode/logging/sinks.py +170 -0
- superqode/logging/unified_log.py +417 -0
- superqode/lsp/__init__.py +26 -0
- superqode/lsp/client.py +544 -0
- superqode/main.py +1069 -0
- superqode/mcp/__init__.py +89 -0
- superqode/mcp/auth_storage.py +380 -0
- superqode/mcp/client.py +1236 -0
- superqode/mcp/config.py +319 -0
- superqode/mcp/integration.py +337 -0
- superqode/mcp/oauth.py +436 -0
- superqode/mcp/oauth_callback.py +385 -0
- superqode/mcp/types.py +290 -0
- superqode/memory/__init__.py +31 -0
- superqode/memory/feedback.py +342 -0
- superqode/memory/store.py +522 -0
- superqode/notifications.py +369 -0
- superqode/optimization/__init__.py +5 -0
- superqode/optimization/config.py +33 -0
- superqode/permissions/__init__.py +25 -0
- superqode/permissions/rules.py +488 -0
- superqode/plan.py +323 -0
- superqode/providers/__init__.py +33 -0
- superqode/providers/gateway/__init__.py +165 -0
- superqode/providers/gateway/base.py +228 -0
- superqode/providers/gateway/litellm_gateway.py +1170 -0
- superqode/providers/gateway/openresponses_gateway.py +436 -0
- superqode/providers/health.py +297 -0
- superqode/providers/huggingface/__init__.py +74 -0
- superqode/providers/huggingface/downloader.py +472 -0
- superqode/providers/huggingface/endpoints.py +442 -0
- superqode/providers/huggingface/hub.py +531 -0
- superqode/providers/huggingface/inference.py +394 -0
- superqode/providers/huggingface/transformers_runner.py +516 -0
- superqode/providers/local/__init__.py +100 -0
- superqode/providers/local/base.py +438 -0
- superqode/providers/local/discovery.py +418 -0
- superqode/providers/local/lmstudio.py +256 -0
- superqode/providers/local/mlx.py +457 -0
- superqode/providers/local/ollama.py +486 -0
- superqode/providers/local/sglang.py +268 -0
- superqode/providers/local/tgi.py +260 -0
- superqode/providers/local/tool_support.py +477 -0
- superqode/providers/local/vllm.py +258 -0
- superqode/providers/manager.py +1338 -0
- superqode/providers/models.py +1016 -0
- superqode/providers/models_dev.py +578 -0
- superqode/providers/openresponses/__init__.py +87 -0
- superqode/providers/openresponses/converters/__init__.py +17 -0
- superqode/providers/openresponses/converters/messages.py +343 -0
- superqode/providers/openresponses/converters/tools.py +268 -0
- superqode/providers/openresponses/schema/__init__.py +56 -0
- superqode/providers/openresponses/schema/models.py +585 -0
- superqode/providers/openresponses/streaming/__init__.py +5 -0
- superqode/providers/openresponses/streaming/parser.py +338 -0
- superqode/providers/openresponses/tools/__init__.py +21 -0
- superqode/providers/openresponses/tools/apply_patch.py +352 -0
- superqode/providers/openresponses/tools/code_interpreter.py +290 -0
- superqode/providers/openresponses/tools/file_search.py +333 -0
- superqode/providers/openresponses/tools/mcp_adapter.py +252 -0
- superqode/providers/registry.py +716 -0
- superqode/providers/usage.py +332 -0
- superqode/pure_mode.py +384 -0
- superqode/qr/__init__.py +23 -0
- superqode/qr/dashboard.py +781 -0
- superqode/qr/generator.py +1018 -0
- superqode/qr/templates.py +135 -0
- superqode/safety/__init__.py +41 -0
- superqode/safety/sandbox.py +413 -0
- superqode/safety/warnings.py +256 -0
- superqode/server/__init__.py +33 -0
- superqode/server/lsp_server.py +775 -0
- superqode/server/web.py +250 -0
- superqode/session/__init__.py +25 -0
- superqode/session/persistence.py +580 -0
- superqode/session/sharing.py +477 -0
- superqode/session.py +475 -0
- superqode/sidebar.py +2991 -0
- superqode/stream_view.py +648 -0
- superqode/styles/__init__.py +3 -0
- superqode/superqe/__init__.py +184 -0
- superqode/superqe/acp_runner.py +1064 -0
- superqode/superqe/constitution/__init__.py +62 -0
- superqode/superqe/constitution/evaluator.py +308 -0
- superqode/superqe/constitution/loader.py +432 -0
- superqode/superqe/constitution/schema.py +250 -0
- superqode/superqe/events.py +591 -0
- superqode/superqe/frameworks/__init__.py +65 -0
- superqode/superqe/frameworks/base.py +234 -0
- superqode/superqe/frameworks/e2e.py +263 -0
- superqode/superqe/frameworks/executor.py +237 -0
- superqode/superqe/frameworks/javascript.py +409 -0
- superqode/superqe/frameworks/python.py +373 -0
- superqode/superqe/frameworks/registry.py +92 -0
- superqode/superqe/mcp_tools/__init__.py +47 -0
- superqode/superqe/mcp_tools/core_tools.py +418 -0
- superqode/superqe/mcp_tools/registry.py +230 -0
- superqode/superqe/mcp_tools/testing_tools.py +167 -0
- superqode/superqe/noise.py +89 -0
- superqode/superqe/orchestrator.py +778 -0
- superqode/superqe/roles.py +609 -0
- superqode/superqe/session.py +713 -0
- superqode/superqe/skills/__init__.py +57 -0
- superqode/superqe/skills/base.py +106 -0
- superqode/superqe/skills/core_skills.py +899 -0
- superqode/superqe/skills/registry.py +90 -0
- superqode/superqe/verifier.py +101 -0
- superqode/superqe_cli.py +76 -0
- superqode/tool_call.py +358 -0
- superqode/tools/__init__.py +93 -0
- superqode/tools/agent_tools.py +496 -0
- superqode/tools/base.py +324 -0
- superqode/tools/batch_tool.py +133 -0
- superqode/tools/diagnostics.py +311 -0
- superqode/tools/edit_tools.py +653 -0
- superqode/tools/enhanced_base.py +515 -0
- superqode/tools/file_tools.py +269 -0
- superqode/tools/file_tracking.py +45 -0
- superqode/tools/lsp_tools.py +610 -0
- superqode/tools/network_tools.py +350 -0
- superqode/tools/permissions.py +400 -0
- superqode/tools/question_tool.py +324 -0
- superqode/tools/search_tools.py +598 -0
- superqode/tools/shell_tools.py +259 -0
- superqode/tools/todo_tools.py +121 -0
- superqode/tools/validation.py +80 -0
- superqode/tools/web_tools.py +639 -0
- superqode/tui.py +1152 -0
- superqode/tui_integration.py +875 -0
- superqode/tui_widgets/__init__.py +27 -0
- superqode/tui_widgets/widgets/__init__.py +18 -0
- superqode/tui_widgets/widgets/progress.py +185 -0
- superqode/tui_widgets/widgets/tool_display.py +188 -0
- superqode/undo_manager.py +574 -0
- superqode/utils/__init__.py +5 -0
- superqode/utils/error_handling.py +323 -0
- superqode/utils/fuzzy.py +257 -0
- superqode/widgets/__init__.py +477 -0
- superqode/widgets/agent_collab.py +390 -0
- superqode/widgets/agent_store.py +936 -0
- superqode/widgets/agent_switcher.py +395 -0
- superqode/widgets/animation_manager.py +284 -0
- superqode/widgets/code_context.py +356 -0
- superqode/widgets/command_palette.py +412 -0
- superqode/widgets/connection_status.py +537 -0
- superqode/widgets/conversation_history.py +470 -0
- superqode/widgets/diff_indicator.py +155 -0
- superqode/widgets/enhanced_status_bar.py +385 -0
- superqode/widgets/enhanced_toast.py +476 -0
- superqode/widgets/file_browser.py +809 -0
- superqode/widgets/file_reference.py +585 -0
- superqode/widgets/issue_timeline.py +340 -0
- superqode/widgets/leader_key.py +264 -0
- superqode/widgets/mode_switcher.py +445 -0
- superqode/widgets/model_picker.py +234 -0
- superqode/widgets/permission_preview.py +1205 -0
- superqode/widgets/prompt.py +358 -0
- superqode/widgets/provider_connect.py +725 -0
- superqode/widgets/pty_shell.py +587 -0
- superqode/widgets/qe_dashboard.py +321 -0
- superqode/widgets/resizable_sidebar.py +377 -0
- superqode/widgets/response_changes.py +218 -0
- superqode/widgets/response_display.py +528 -0
- superqode/widgets/rich_tool_display.py +613 -0
- superqode/widgets/sidebar_panels.py +1180 -0
- superqode/widgets/slash_complete.py +356 -0
- superqode/widgets/split_view.py +612 -0
- superqode/widgets/status_bar.py +273 -0
- superqode/widgets/superqode_display.py +786 -0
- superqode/widgets/thinking_display.py +815 -0
- superqode/widgets/throbber.py +87 -0
- superqode/widgets/toast.py +206 -0
- superqode/widgets/unified_output.py +1073 -0
- superqode/workspace/__init__.py +75 -0
- superqode/workspace/artifacts.py +472 -0
- superqode/workspace/coordinator.py +353 -0
- superqode/workspace/diff_tracker.py +429 -0
- superqode/workspace/git_guard.py +373 -0
- superqode/workspace/git_snapshot.py +526 -0
- superqode/workspace/manager.py +750 -0
- superqode/workspace/snapshot.py +357 -0
- superqode/workspace/watcher.py +535 -0
- superqode/workspace/worktree.py +440 -0
- superqode-0.1.5.dist-info/METADATA +204 -0
- superqode-0.1.5.dist-info/RECORD +288 -0
- superqode-0.1.5.dist-info/WHEEL +5 -0
- superqode-0.1.5.dist-info/entry_points.txt +3 -0
- superqode-0.1.5.dist-info/licenses/LICENSE +648 -0
- 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."""
|