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,256 @@
1
+ """
2
+ Safety warning system for SuperQode QE sessions.
3
+
4
+ Provides prominent warnings about destructive actions, token consumption,
5
+ and sandbox environment requirements.
6
+ """
7
+
8
+ import os
9
+ import json
10
+ from enum import Enum
11
+ from pathlib import Path
12
+ from typing import List, Dict, Any, Optional
13
+ from dataclasses import dataclass
14
+
15
+ from rich.console import Console
16
+ from rich.panel import Panel
17
+ from rich.text import Text
18
+ from rich.prompt import Confirm, Prompt
19
+
20
+ _console = Console()
21
+
22
+
23
+ class WarningType(Enum):
24
+ """Types of safety warnings."""
25
+
26
+ SANDBOX_ENVIRONMENT = "sandbox"
27
+ DESTRUCTIVE_ACTIONS = "destructive"
28
+ TOKEN_CONSUMPTION = "tokens"
29
+ PRODUCTION_CODE = "production"
30
+
31
+
32
+ class WarningSeverity(Enum):
33
+ """Severity levels for warnings."""
34
+
35
+ INFO = "info"
36
+ WARNING = "warning"
37
+ CRITICAL = "critical"
38
+
39
+
40
+ @dataclass
41
+ class SafetyWarning:
42
+ """A safety warning with content and metadata."""
43
+
44
+ type: WarningType
45
+ severity: WarningSeverity
46
+ title: str
47
+ message: str
48
+ recommendations: List[str]
49
+ requires_acknowledgment: bool = True
50
+ skippable_after_first: bool = True
51
+
52
+
53
+ # Predefined safety warnings
54
+ SANDBOX_WARNING = SafetyWarning(
55
+ type=WarningType.SANDBOX_ENVIRONMENT,
56
+ severity=WarningSeverity.CRITICAL,
57
+ title="⚠️ Use Sandbox Environment",
58
+ message="QE agents can modify/delete code files and execute shell commands. Use isolated environments, never run on production code.",
59
+ recommendations=[
60
+ "Use git worktrees or Docker containers for isolation",
61
+ "Backup important files first",
62
+ ],
63
+ requires_acknowledgment=True,
64
+ skippable_after_first=True,
65
+ )
66
+
67
+ DESTRUCTIVE_WARNING = SafetyWarning(
68
+ type=WarningType.DESTRUCTIVE_ACTIONS,
69
+ severity=WarningSeverity.WARNING,
70
+ title="⚠️ QE May Break Code",
71
+ message="QE agents intentionally break and test code aggressively. Changes are temporary but can introduce bugs or delete files.",
72
+ recommendations=[
73
+ "Use version control - all changes will be reverted",
74
+ "Monitor system resources during testing",
75
+ ],
76
+ requires_acknowledgment=True,
77
+ skippable_after_first=True,
78
+ )
79
+
80
+ TOKEN_WARNING = SafetyWarning(
81
+ type=WarningType.TOKEN_CONSUMPTION,
82
+ severity=WarningSeverity.INFO,
83
+ title="ℹ️ API Token Usage",
84
+ message="QE sessions consume API tokens. Monitor your usage and set spending limits if needed.",
85
+ recommendations=[
86
+ "Check your API provider dashboard for usage",
87
+ "Set spending limits on your accounts",
88
+ ],
89
+ requires_acknowledgment=False,
90
+ skippable_after_first=True,
91
+ )
92
+
93
+ PRODUCTION_WARNING = SafetyWarning(
94
+ type=WarningType.PRODUCTION_CODE,
95
+ severity=WarningSeverity.CRITICAL,
96
+ title="🚨 Production Code Detected",
97
+ message="Running QE on production code is dangerous. QE agents will break and test code aggressively. Stop and use a sandbox environment.",
98
+ recommendations=[
99
+ "Create a sandbox environment first",
100
+ "Use git worktrees or Docker for isolation",
101
+ ],
102
+ requires_acknowledgment=True,
103
+ skippable_after_first=False, # Never skip production warnings
104
+ )
105
+
106
+
107
+ def get_safety_warnings() -> List[SafetyWarning]:
108
+ """Get the standard set of safety warnings."""
109
+ return [
110
+ SANDBOX_WARNING,
111
+ DESTRUCTIVE_WARNING,
112
+ TOKEN_WARNING,
113
+ ]
114
+
115
+
116
+ def get_production_warnings() -> List[SafetyWarning]:
117
+ """Get warnings for production-like environments."""
118
+ return [
119
+ PRODUCTION_WARNING,
120
+ SANDBOX_WARNING,
121
+ DESTRUCTIVE_WARNING,
122
+ TOKEN_WARNING,
123
+ ]
124
+
125
+
126
+ def show_safety_warnings(
127
+ warnings: List[SafetyWarning], force_display: bool = False, console: Optional[Console] = None
128
+ ) -> None:
129
+ """Display safety warnings to the user."""
130
+ if console is None:
131
+ console = _console
132
+
133
+ for warning in warnings:
134
+ if not force_display and should_skip_warnings(warning):
135
+ continue
136
+
137
+ # Create warning panel
138
+ warning_text = Text()
139
+ warning_text.append(f"{warning.title}\n\n", style="bold red")
140
+ warning_text.append(warning.message, style="white")
141
+ warning_text.append("\n\nRecommendations:\n", style="bold yellow")
142
+
143
+ for i, rec in enumerate(warning.recommendations, 1):
144
+ warning_text.append(f"{i}. {rec}\n", style="dim cyan")
145
+
146
+ # Choose border color based on severity
147
+ border_color = {
148
+ WarningSeverity.INFO: "blue",
149
+ WarningSeverity.WARNING: "yellow",
150
+ WarningSeverity.CRITICAL: "red",
151
+ }[warning.severity]
152
+
153
+ panel = Panel(
154
+ warning_text, title=f"⚠️ Safety Warning", border_style=border_color, padding=(1, 2)
155
+ )
156
+
157
+ console.print(panel)
158
+ console.print() # Add spacing
159
+
160
+
161
+ def get_warning_acknowledgment(
162
+ warnings: List[SafetyWarning], console: Optional[Console] = None
163
+ ) -> bool:
164
+ """Get user acknowledgment for warnings that require it."""
165
+ if console is None:
166
+ console = _console
167
+
168
+ requires_ack = [w for w in warnings if w.requires_acknowledgment]
169
+
170
+ if not requires_ack:
171
+ return True # No acknowledgment required
172
+
173
+ # Show acknowledgment prompt
174
+ ack_text = Text()
175
+ ack_text.append("The above warnings require your acknowledgment.\n\n", style="yellow")
176
+ ack_text.append("Do you understand these risks and want to continue? ", style="white")
177
+ ack_text.append("(yes/no): ", style="bold cyan")
178
+
179
+ console.print(ack_text)
180
+
181
+ try:
182
+ response = Prompt.ask("", choices=["yes", "no"], default="no")
183
+ acknowledged = response.lower() == "yes"
184
+
185
+ if acknowledged:
186
+ # Mark warnings as acknowledged for future skipping
187
+ for warning in requires_ack:
188
+ if warning.skippable_after_first:
189
+ mark_warnings_acknowledged(warning)
190
+
191
+ return acknowledged
192
+
193
+ except KeyboardInterrupt:
194
+ console.print("\nOperation cancelled.", style="yellow")
195
+ return False
196
+
197
+
198
+ def should_skip_warnings(warning: SafetyWarning) -> bool:
199
+ """Check if a warning should be skipped (already acknowledged)."""
200
+ if not warning.skippable_after_first:
201
+ return False # Never skip critical warnings
202
+
203
+ # Check acknowledgment file
204
+ ack_file = _get_acknowledgment_file()
205
+ if not ack_file.exists():
206
+ return False
207
+
208
+ try:
209
+ with open(ack_file, "r") as f:
210
+ data = json.load(f)
211
+
212
+ acknowledged = data.get("acknowledged_warnings", [])
213
+ return warning.type.value in acknowledged
214
+
215
+ except (json.JSONDecodeError, KeyError):
216
+ return False
217
+
218
+
219
+ def mark_warnings_acknowledged(warning: SafetyWarning) -> None:
220
+ """Mark a warning as acknowledged for future skipping."""
221
+ ack_file = _get_acknowledgment_file()
222
+ ack_file.parent.mkdir(parents=True, exist_ok=True)
223
+
224
+ # Load existing data
225
+ data = {}
226
+ if ack_file.exists():
227
+ try:
228
+ with open(ack_file, "r") as f:
229
+ data = json.load(f)
230
+ except json.JSONDecodeError:
231
+ pass
232
+
233
+ # Update acknowledged warnings
234
+ if "acknowledged_warnings" not in data:
235
+ data["acknowledged_warnings"] = []
236
+
237
+ warning_key = warning.type.value
238
+ if warning_key not in data["acknowledged_warnings"]:
239
+ data["acknowledged_warnings"].append(warning_key)
240
+
241
+ # Save updated data
242
+ with open(ack_file, "w") as f:
243
+ json.dump(data, f, indent=2)
244
+
245
+
246
+ def _get_acknowledgment_file() -> Path:
247
+ """Get the path to the warning acknowledgment file."""
248
+ config_dir = Path.home() / ".superqode"
249
+ return config_dir / "safety_acknowledgments.json"
250
+
251
+
252
+ def clear_warning_acknowledgments() -> None:
253
+ """Clear all warning acknowledgments (for testing/debugging)."""
254
+ ack_file = _get_acknowledgment_file()
255
+ if ack_file.exists():
256
+ ack_file.unlink()
@@ -0,0 +1,33 @@
1
+ """
2
+ SuperQode Servers.
3
+
4
+ - Web Server: Run SuperQode TUI in a web browser using textual-serve
5
+ - LSP Server: Language Server Protocol for IDE integration
6
+ """
7
+
8
+ from .web import (
9
+ WebServer,
10
+ WebServerConfig,
11
+ start_server,
12
+ )
13
+
14
+ from .lsp_server import (
15
+ SuperQodeLSPServer,
16
+ start_lsp_server,
17
+ LSPDiagnostic,
18
+ DiagnosticSeverity,
19
+ CodeAction,
20
+ )
21
+
22
+ __all__ = [
23
+ # Web server
24
+ "WebServer",
25
+ "WebServerConfig",
26
+ "start_server",
27
+ # LSP server
28
+ "SuperQodeLSPServer",
29
+ "start_lsp_server",
30
+ "LSPDiagnostic",
31
+ "DiagnosticSeverity",
32
+ "CodeAction",
33
+ ]