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,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
|
+
]
|