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,250 @@
1
+ """
2
+ Web Server Mode - Run TUI in Browser.
3
+
4
+ Uses textual-serve to run the SuperQode TUI in a web browser.
5
+ Enables remote access and collaborative sessions.
6
+
7
+ Features:
8
+ - Browser-based terminal UI
9
+ - Authentication
10
+ - Multiple concurrent sessions
11
+ - Session sharing
12
+
13
+ Note: Requires textual-serve to be installed.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import asyncio
19
+ import os
20
+ import secrets
21
+ import sys
22
+ from dataclasses import dataclass, field
23
+ from datetime import datetime
24
+ from pathlib import Path
25
+ from typing import Any, Callable, Dict, List, Optional
26
+ import json
27
+
28
+ try:
29
+ from textual_serve.server import Server
30
+
31
+ TEXTUAL_SERVE_AVAILABLE = True
32
+ except ImportError:
33
+ Server = None
34
+ TEXTUAL_SERVE_AVAILABLE = False
35
+
36
+
37
+ @dataclass
38
+ class WebServerConfig:
39
+ """Configuration for the web server."""
40
+
41
+ host: str = "127.0.0.1"
42
+ port: int = 8080
43
+
44
+ # Authentication
45
+ require_auth: bool = True
46
+ auth_token: Optional[str] = None # Generated if not provided
47
+
48
+ # Sessions
49
+ max_sessions: int = 10
50
+ session_timeout: int = 3600 # 1 hour
51
+
52
+ # TLS
53
+ ssl_cert: Optional[str] = None
54
+ ssl_key: Optional[str] = None
55
+
56
+ # Project
57
+ project_path: Optional[Path] = None
58
+
59
+ def __post_init__(self):
60
+ if self.require_auth and not self.auth_token:
61
+ self.auth_token = secrets.token_urlsafe(32)
62
+
63
+
64
+ @dataclass
65
+ class WebSession:
66
+ """A web session."""
67
+
68
+ id: str
69
+ created_at: datetime = field(default_factory=datetime.now)
70
+ last_active: datetime = field(default_factory=datetime.now)
71
+ user_agent: str = ""
72
+ remote_addr: str = ""
73
+ project_path: str = ""
74
+
75
+
76
+ class WebServer:
77
+ """
78
+ Web server for running SuperQode TUI in browser.
79
+
80
+ Wraps textual-serve to provide browser-based access
81
+ to the SuperQode TUI.
82
+
83
+ Usage:
84
+ config = WebServerConfig(host="0.0.0.0", port=8080)
85
+ server = WebServer(config)
86
+
87
+ print(f"Access token: {server.config.auth_token}")
88
+ print(f"Open: http://{config.host}:{config.port}")
89
+
90
+ await server.start()
91
+ """
92
+
93
+ def __init__(self, config: Optional[WebServerConfig] = None):
94
+ if not TEXTUAL_SERVE_AVAILABLE:
95
+ raise ImportError(
96
+ "textual-serve is required for web server mode. "
97
+ "Install with: pip install textual-serve"
98
+ )
99
+
100
+ self.config = config or WebServerConfig()
101
+ self._server: Optional[Server] = None
102
+ self._sessions: Dict[str, WebSession] = {}
103
+ self._running = False
104
+
105
+ @property
106
+ def is_running(self) -> bool:
107
+ """Check if server is running."""
108
+ return self._running
109
+
110
+ @property
111
+ def url(self) -> str:
112
+ """Get the server URL."""
113
+ protocol = "https" if self.config.ssl_cert else "http"
114
+ return f"{protocol}://{self.config.host}:{self.config.port}"
115
+
116
+ @property
117
+ def authenticated_url(self) -> str:
118
+ """Get URL with authentication token."""
119
+ if self.config.require_auth and self.config.auth_token:
120
+ return f"{self.url}?token={self.config.auth_token}"
121
+ return self.url
122
+
123
+ def _create_app_factory(self):
124
+ """Create the Textual app factory for serving."""
125
+ project_path = self.config.project_path
126
+
127
+ def factory():
128
+ # Import here to avoid circular imports
129
+ from superqode.app_main import SuperQodeApp
130
+
131
+ app = SuperQodeApp()
132
+
133
+ # Set project path if configured
134
+ if project_path:
135
+ os.chdir(project_path)
136
+
137
+ return app
138
+
139
+ return factory
140
+
141
+ async def start(self) -> None:
142
+ """Start the web server."""
143
+ if self._running:
144
+ return
145
+
146
+ # Create server
147
+ self._server = Server(
148
+ self._create_app_factory(),
149
+ host=self.config.host,
150
+ port=self.config.port,
151
+ )
152
+
153
+ # Configure SSL if provided
154
+ if self.config.ssl_cert and self.config.ssl_key:
155
+ self._server.ssl_certfile = self.config.ssl_cert
156
+ self._server.ssl_keyfile = self.config.ssl_key
157
+
158
+ self._running = True
159
+
160
+ print(f"🌐 SuperQode Web Server starting...")
161
+ print(f" URL: {self.url}")
162
+
163
+ if self.config.require_auth:
164
+ print(f" Token: {self.config.auth_token}")
165
+ print(f" Full URL: {self.authenticated_url}")
166
+
167
+ # Start serving
168
+ await self._server.serve()
169
+
170
+ def start_sync(self) -> None:
171
+ """Start server synchronously."""
172
+ asyncio.run(self.start())
173
+
174
+ async def stop(self) -> None:
175
+ """Stop the web server."""
176
+ if not self._running:
177
+ return
178
+
179
+ self._running = False
180
+
181
+ if self._server:
182
+ # textual-serve doesn't have a clean shutdown method
183
+ # so we just mark it as stopped
184
+ self._server = None
185
+
186
+ self._sessions.clear()
187
+
188
+ def get_sessions(self) -> List[WebSession]:
189
+ """Get all active sessions."""
190
+ return list(self._sessions.values())
191
+
192
+
193
+ def start_server(
194
+ host: str = "127.0.0.1",
195
+ port: int = 8080,
196
+ project_path: Optional[Path] = None,
197
+ require_auth: bool = True,
198
+ ) -> None:
199
+ """
200
+ Convenience function to start the web server.
201
+
202
+ Usage:
203
+ from superqode.server import start_server
204
+ start_server(host="0.0.0.0", port=8080)
205
+ """
206
+ config = WebServerConfig(
207
+ host=host,
208
+ port=port,
209
+ project_path=project_path,
210
+ require_auth=require_auth,
211
+ )
212
+
213
+ server = WebServer(config)
214
+ server.start_sync()
215
+
216
+
217
+ def add_server_command():
218
+ """Add server command to CLI.
219
+
220
+ Call this during CLI setup to add the 'serve' command.
221
+ """
222
+ import click
223
+
224
+ @click.command("serve")
225
+ @click.option("--host", default="127.0.0.1", help="Host to bind to")
226
+ @click.option("--port", default=8080, type=int, help="Port to listen on")
227
+ @click.option("--no-auth", is_flag=True, help="Disable authentication")
228
+ @click.option("--token", default=None, help="Authentication token")
229
+ @click.option("--project", default=None, help="Project directory")
230
+ def serve_command(host, port, no_auth, token, project):
231
+ """Start SuperQode in web server mode."""
232
+ config = WebServerConfig(
233
+ host=host,
234
+ port=port,
235
+ require_auth=not no_auth,
236
+ auth_token=token,
237
+ project_path=Path(project) if project else None,
238
+ )
239
+
240
+ if not TEXTUAL_SERVE_AVAILABLE:
241
+ click.echo(
242
+ "Error: textual-serve is required for web server mode.\n"
243
+ "Install with: pip install textual-serve"
244
+ )
245
+ sys.exit(1)
246
+
247
+ server = WebServer(config)
248
+ server.start_sync()
249
+
250
+ return serve_command
@@ -0,0 +1,25 @@
1
+ """
2
+ SuperQode Session Management.
3
+
4
+ Provides session persistence, conversation history, and state management.
5
+ """
6
+
7
+ from .persistence import (
8
+ MessageRole,
9
+ Message,
10
+ ToolExecution,
11
+ SessionSnapshot,
12
+ Session,
13
+ SessionStore,
14
+ create_session,
15
+ )
16
+
17
+ __all__ = [
18
+ "MessageRole",
19
+ "Message",
20
+ "ToolExecution",
21
+ "SessionSnapshot",
22
+ "Session",
23
+ "SessionStore",
24
+ "create_session",
25
+ ]