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
superqode/server/web.py
ADDED
|
@@ -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
|
+
]
|