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,273 @@
|
|
|
1
|
+
"""Status bar widget showing current state, connection, and shortcuts - High contrast design."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import TYPE_CHECKING, Optional
|
|
7
|
+
|
|
8
|
+
from textual.app import ComposeResult
|
|
9
|
+
from textual.containers import Horizontal
|
|
10
|
+
from textual.reactive import reactive
|
|
11
|
+
from textual.widget import Widget
|
|
12
|
+
from textual.widgets import Static
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from superqode.app_main import SuperQodeApp
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class StatusBar(Widget):
|
|
19
|
+
"""
|
|
20
|
+
Bottom status bar showing:
|
|
21
|
+
- Current mode/role (HOME, DEV.FULLSTACK, QE.QUICK, etc.)
|
|
22
|
+
- Connected agent and status
|
|
23
|
+
- QE workspace status (ephemeral mode indicator)
|
|
24
|
+
- Current project directory
|
|
25
|
+
- Keyboard shortcut hints
|
|
26
|
+
|
|
27
|
+
High contrast, accessible design.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
DEFAULT_CSS = """
|
|
31
|
+
StatusBar {
|
|
32
|
+
dock: bottom;
|
|
33
|
+
height: 2;
|
|
34
|
+
background: #001a33;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
StatusBar > Horizontal {
|
|
38
|
+
width: 100%;
|
|
39
|
+
height: 2;
|
|
40
|
+
background: #001a33;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
StatusBar .status-section {
|
|
44
|
+
height: 2;
|
|
45
|
+
padding: 0 2;
|
|
46
|
+
background: #001a33;
|
|
47
|
+
content-align: center middle;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
StatusBar #mode-indicator {
|
|
51
|
+
color: #00ffff;
|
|
52
|
+
text-style: bold;
|
|
53
|
+
background: #003366;
|
|
54
|
+
min-width: 20;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
StatusBar #mode-indicator.qe-mode {
|
|
58
|
+
color: #ff00ff;
|
|
59
|
+
background: #330033;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
StatusBar #agent-indicator {
|
|
63
|
+
color: #00ff00;
|
|
64
|
+
text-style: bold;
|
|
65
|
+
min-width: 25;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
StatusBar #agent-indicator.disconnected {
|
|
69
|
+
color: #ffaa00;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
StatusBar #qe-indicator {
|
|
73
|
+
color: #ff00ff;
|
|
74
|
+
text-style: bold;
|
|
75
|
+
min-width: 18;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
StatusBar #qe-indicator.active {
|
|
79
|
+
color: #00ff00;
|
|
80
|
+
background: #003300;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
StatusBar #qe-indicator.inactive {
|
|
84
|
+
color: #666666;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
StatusBar #project-indicator {
|
|
88
|
+
color: #ffffff;
|
|
89
|
+
min-width: 20;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
StatusBar #shortcuts-indicator {
|
|
93
|
+
dock: right;
|
|
94
|
+
color: #00ff00;
|
|
95
|
+
text-style: bold;
|
|
96
|
+
}
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
# Reactive properties
|
|
100
|
+
mode: reactive[str] = reactive("HOME")
|
|
101
|
+
agent_name: reactive[str] = reactive("")
|
|
102
|
+
agent_connected: reactive[bool] = reactive(False)
|
|
103
|
+
project_path: reactive[str] = reactive("")
|
|
104
|
+
task_count: reactive[int] = reactive(0)
|
|
105
|
+
qe_active: reactive[bool] = reactive(False)
|
|
106
|
+
qe_mode: reactive[str] = reactive("") # "quick" or "deep"
|
|
107
|
+
|
|
108
|
+
def __init__(
|
|
109
|
+
self,
|
|
110
|
+
mode: str = "HOME",
|
|
111
|
+
agent_name: str = "",
|
|
112
|
+
agent_connected: bool = False,
|
|
113
|
+
project_path: str | None = None,
|
|
114
|
+
qe_active: bool = False,
|
|
115
|
+
qe_mode: str = "",
|
|
116
|
+
**kwargs,
|
|
117
|
+
) -> None:
|
|
118
|
+
super().__init__(**kwargs)
|
|
119
|
+
self.mode = mode
|
|
120
|
+
self.agent_name = agent_name
|
|
121
|
+
self.agent_connected = agent_connected
|
|
122
|
+
self.project_path = project_path or Path.cwd().name
|
|
123
|
+
self.qe_active = qe_active
|
|
124
|
+
self.qe_mode = qe_mode
|
|
125
|
+
|
|
126
|
+
def compose(self) -> ComposeResult:
|
|
127
|
+
"""Compose the status bar layout."""
|
|
128
|
+
with Horizontal():
|
|
129
|
+
yield Static(self._get_mode_text(), id="mode-indicator", classes="status-section")
|
|
130
|
+
yield Static(self._get_agent_text(), id="agent-indicator", classes="status-section")
|
|
131
|
+
yield Static(self._get_qe_text(), id="qe-indicator", classes="status-section")
|
|
132
|
+
yield Static(self._get_project_text(), id="project-indicator", classes="status-section")
|
|
133
|
+
yield Static(
|
|
134
|
+
self._get_shortcuts_text(), id="shortcuts-indicator", classes="status-section"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
def _get_mode_text(self) -> str:
|
|
138
|
+
"""Get the mode indicator text."""
|
|
139
|
+
mode_icons = {
|
|
140
|
+
"HOME": "๐ ",
|
|
141
|
+
"DEV": "๐ป",
|
|
142
|
+
"QA": "๐งช",
|
|
143
|
+
"QE": "๐ฌ",
|
|
144
|
+
"DEVOPS": "โ๏ธ",
|
|
145
|
+
}
|
|
146
|
+
# Extract base mode for icon
|
|
147
|
+
base_mode = self.mode.split(".")[0].upper() if "." in self.mode else self.mode.upper()
|
|
148
|
+
icon = mode_icons.get(base_mode, "๐ง")
|
|
149
|
+
return f"{icon} {self.mode}"
|
|
150
|
+
|
|
151
|
+
def _get_qe_text(self) -> str:
|
|
152
|
+
"""Get the QE status indicator text."""
|
|
153
|
+
if self.qe_active:
|
|
154
|
+
mode_emoji = "โก" if self.qe_mode == "quick" else "๐ฌ"
|
|
155
|
+
mode_name = "QUICK" if self.qe_mode == "quick" else "DEEP"
|
|
156
|
+
return f"{mode_emoji} QE:{mode_name}"
|
|
157
|
+
else:
|
|
158
|
+
return "๐ก๏ธ QE:READY"
|
|
159
|
+
|
|
160
|
+
def _get_agent_text(self) -> str:
|
|
161
|
+
"""Get the agent indicator text."""
|
|
162
|
+
if self.agent_connected and self.agent_name:
|
|
163
|
+
return f"๐ข {self.agent_name} CONNECTED"
|
|
164
|
+
elif self.agent_name:
|
|
165
|
+
return f"โช {self.agent_name} READY"
|
|
166
|
+
else:
|
|
167
|
+
return "๐ No Agent"
|
|
168
|
+
|
|
169
|
+
def _get_project_text(self) -> str:
|
|
170
|
+
"""Get the project indicator text."""
|
|
171
|
+
if self.task_count > 0:
|
|
172
|
+
return f"๐ {self.project_path} โ โฑ {self.task_count} tasks"
|
|
173
|
+
return f"๐ {self.project_path}"
|
|
174
|
+
|
|
175
|
+
def _get_shortcuts_text(self) -> str:
|
|
176
|
+
"""Get the keyboard shortcuts hint text."""
|
|
177
|
+
return "Ctrl+K commands โ Ctrl+A agents โ / slash โ ? help"
|
|
178
|
+
|
|
179
|
+
def watch_mode(self, mode: str) -> None:
|
|
180
|
+
"""React to mode changes."""
|
|
181
|
+
if not self.is_mounted:
|
|
182
|
+
return
|
|
183
|
+
try:
|
|
184
|
+
mode_widget = self.query_one("#mode-indicator", Static)
|
|
185
|
+
mode_widget.update(self._get_mode_text())
|
|
186
|
+
except Exception:
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
def watch_agent_name(self, agent_name: str) -> None:
|
|
190
|
+
"""React to agent name changes."""
|
|
191
|
+
if not self.is_mounted:
|
|
192
|
+
return
|
|
193
|
+
self._update_agent_indicator()
|
|
194
|
+
|
|
195
|
+
def watch_agent_connected(self, connected: bool) -> None:
|
|
196
|
+
"""React to connection state changes."""
|
|
197
|
+
if not self.is_mounted:
|
|
198
|
+
return
|
|
199
|
+
self._update_agent_indicator()
|
|
200
|
+
|
|
201
|
+
def _update_agent_indicator(self) -> None:
|
|
202
|
+
"""Update the agent indicator widget."""
|
|
203
|
+
try:
|
|
204
|
+
agent_widget = self.query_one("#agent-indicator", Static)
|
|
205
|
+
agent_widget.update(self._get_agent_text())
|
|
206
|
+
agent_widget.set_class(not self.agent_connected, "disconnected")
|
|
207
|
+
except Exception:
|
|
208
|
+
pass
|
|
209
|
+
|
|
210
|
+
def watch_project_path(self, path: str) -> None:
|
|
211
|
+
"""React to project path changes."""
|
|
212
|
+
if not self.is_mounted:
|
|
213
|
+
return
|
|
214
|
+
try:
|
|
215
|
+
project_widget = self.query_one("#project-indicator", Static)
|
|
216
|
+
project_widget.update(self._get_project_text())
|
|
217
|
+
except Exception:
|
|
218
|
+
pass
|
|
219
|
+
|
|
220
|
+
def watch_task_count(self, count: int) -> None:
|
|
221
|
+
"""React to task count changes."""
|
|
222
|
+
if not self.is_mounted:
|
|
223
|
+
return
|
|
224
|
+
try:
|
|
225
|
+
project_widget = self.query_one("#project-indicator", Static)
|
|
226
|
+
project_widget.update(self._get_project_text())
|
|
227
|
+
except Exception:
|
|
228
|
+
pass
|
|
229
|
+
|
|
230
|
+
def watch_qe_active(self, active: bool) -> None:
|
|
231
|
+
"""React to QE active state changes."""
|
|
232
|
+
if not self.is_mounted:
|
|
233
|
+
return
|
|
234
|
+
self._update_qe_indicator()
|
|
235
|
+
|
|
236
|
+
def watch_qe_mode(self, mode: str) -> None:
|
|
237
|
+
"""React to QE mode changes."""
|
|
238
|
+
if not self.is_mounted:
|
|
239
|
+
return
|
|
240
|
+
self._update_qe_indicator()
|
|
241
|
+
|
|
242
|
+
def _update_qe_indicator(self) -> None:
|
|
243
|
+
"""Update the QE indicator widget."""
|
|
244
|
+
try:
|
|
245
|
+
qe_widget = self.query_one("#qe-indicator", Static)
|
|
246
|
+
qe_widget.update(self._get_qe_text())
|
|
247
|
+
qe_widget.set_class(self.qe_active, "active")
|
|
248
|
+
qe_widget.set_class(not self.qe_active, "inactive")
|
|
249
|
+
|
|
250
|
+
# Also update mode indicator class for QE mode
|
|
251
|
+
mode_widget = self.query_one("#mode-indicator", Static)
|
|
252
|
+
is_qe = self.mode.upper().startswith("QE")
|
|
253
|
+
mode_widget.set_class(is_qe, "qe-mode")
|
|
254
|
+
except Exception:
|
|
255
|
+
pass
|
|
256
|
+
|
|
257
|
+
def set_connected(self, agent_name: str, connected: bool = True) -> None:
|
|
258
|
+
"""Set the connection state."""
|
|
259
|
+
self.agent_name = agent_name
|
|
260
|
+
self.agent_connected = connected
|
|
261
|
+
|
|
262
|
+
def set_mode(self, mode: str) -> None:
|
|
263
|
+
"""Set the current mode."""
|
|
264
|
+
self.mode = mode
|
|
265
|
+
|
|
266
|
+
def set_tasks(self, count: int) -> None:
|
|
267
|
+
"""Set the task count."""
|
|
268
|
+
self.task_count = count
|
|
269
|
+
|
|
270
|
+
def set_qe_status(self, active: bool, mode: str = "") -> None:
|
|
271
|
+
"""Set the QE workspace status."""
|
|
272
|
+
self.qe_active = active
|
|
273
|
+
self.qe_mode = mode
|