cct-cli 0.7.9.0__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.
- calc_terminal/__init__.py +14 -0
- calc_terminal/__main__.py +14 -0
- calc_terminal/activity.py +1334 -0
- calc_terminal/agent.py +3387 -0
- calc_terminal/agent_runtime.py +519 -0
- calc_terminal/ai_context.py +447 -0
- calc_terminal/ai_modes.py +752 -0
- calc_terminal/ai_personalization.py +286 -0
- calc_terminal/ai_preview_feedback.py +213 -0
- calc_terminal/aicore.py +2572 -0
- calc_terminal/anim.py +367 -0
- calc_terminal/app.py +3685 -0
- calc_terminal/art.py +639 -0
- calc_terminal/atomsim.py +368 -0
- calc_terminal/attachments.py +743 -0
- calc_terminal/benchmark_system.py +414 -0
- calc_terminal/browser/__init__.py +36 -0
- calc_terminal/browser/browser_state.py +346 -0
- calc_terminal/browser/devserver.py +176 -0
- calc_terminal/browser/engine.py +494 -0
- calc_terminal/browser/navigation.py +84 -0
- calc_terminal/browser/preview.py +429 -0
- calc_terminal/browser/preview_entry.py +95 -0
- calc_terminal/browser/project_detector.py +144 -0
- calc_terminal/browser/server.py +449 -0
- calc_terminal/browser/state.py +75 -0
- calc_terminal/browser/watcher.py +99 -0
- calc_terminal/browser_gui/__init__.py +1 -0
- calc_terminal/browser_gui/__main__.py +3 -0
- calc_terminal/browser_gui/launcher.py +173 -0
- calc_terminal/browser_gui/playwright_browser.py +117 -0
- calc_terminal/browser_gui/qt_browser.py +1501 -0
- calc_terminal/browser_gui/webview_browser.py +57 -0
- calc_terminal/capabilities/__init__.py +35 -0
- calc_terminal/capabilities/adapters/__init__.py +33 -0
- calc_terminal/capabilities/adapters/bioinformatics.py +204 -0
- calc_terminal/capabilities/adapters/browser_adapter.py +205 -0
- calc_terminal/capabilities/adapters/filesystem.py +206 -0
- calc_terminal/capabilities/adapters/git_adapter.py +202 -0
- calc_terminal/capabilities/adapters/jupyter_adapter.py +138 -0
- calc_terminal/capabilities/adapters/ml_frameworks.py +158 -0
- calc_terminal/capabilities/adapters/platforms.py +200 -0
- calc_terminal/capabilities/adapters/python_exec.py +93 -0
- calc_terminal/capabilities/adapters/quantum_adapter.py +150 -0
- calc_terminal/capabilities/adapters/scientific_comp.py +123 -0
- calc_terminal/capabilities/adapters/structural_bio.py +161 -0
- calc_terminal/capabilities/adapters/terminal.py +99 -0
- calc_terminal/capabilities/bus.py +178 -0
- calc_terminal/capabilities/discovery.py +207 -0
- calc_terminal/capabilities/schema.py +221 -0
- calc_terminal/cat.ico +0 -0
- calc_terminal/cat_browser.py +2018 -0
- calc_terminal/chat_store.py +703 -0
- calc_terminal/cli.py +1178 -0
- calc_terminal/code_editor.py +640 -0
- calc_terminal/collaboration.py +723 -0
- calc_terminal/commands_data.py +139 -0
- calc_terminal/compatibility_engine.py +352 -0
- calc_terminal/compute/__init__.py +31 -0
- calc_terminal/compute/fabric.py +350 -0
- calc_terminal/config.py +227 -0
- calc_terminal/core/__init__.py +41 -0
- calc_terminal/core/checkpoint.py +156 -0
- calc_terminal/core/input/__init__.py +45 -0
- calc_terminal/core/mode_registry.py +300 -0
- calc_terminal/core/project_graph.py +172 -0
- calc_terminal/core/recovery.py +129 -0
- calc_terminal/core/security_layer.py +112 -0
- calc_terminal/core/task_graph.py +202 -0
- calc_terminal/core/unified_runtime.py +184 -0
- calc_terminal/core/verification.py +257 -0
- calc_terminal/customization.py +1566 -0
- calc_terminal/derivations.py +153 -0
- calc_terminal/device_control.py +263 -0
- calc_terminal/diagnostics/__init__.py +27 -0
- calc_terminal/diagnostics/doctor_engine.py +382 -0
- calc_terminal/diagnostics/self_test.py +247 -0
- calc_terminal/doctor.py +519 -0
- calc_terminal/easter_eggs.py +274 -0
- calc_terminal/editor/__init__.py +1 -0
- calc_terminal/editor/actions.py +263 -0
- calc_terminal/editor/commands.py +160 -0
- calc_terminal/editor/shortcuts.py +226 -0
- calc_terminal/engine.py +259 -0
- calc_terminal/errors.py +120 -0
- calc_terminal/event_stream.py +146 -0
- calc_terminal/eventbus.py +133 -0
- calc_terminal/extensions.py +733 -0
- calc_terminal/fallback_cli.py +1321 -0
- calc_terminal/first_run.py +265 -0
- calc_terminal/fomoji_auth.py +1043 -0
- calc_terminal/formulas.py +82 -0
- calc_terminal/fs_cache.py +121 -0
- calc_terminal/fs_watcher.py +277 -0
- calc_terminal/game.py +193 -0
- calc_terminal/gen1.py +5 -0
- calc_terminal/generators.py +245 -0
- calc_terminal/gestures/__init__.py +42 -0
- calc_terminal/gestures/bindings.py +175 -0
- calc_terminal/gestures/manager.py +477 -0
- calc_terminal/goodbye.py +363 -0
- calc_terminal/gpu3d.py +290 -0
- calc_terminal/graphs.py +358 -0
- calc_terminal/hardware_analyzer.py +440 -0
- calc_terminal/host/__init__.py +30 -0
- calc_terminal/host/browser_manager.py +187 -0
- calc_terminal/host/desktop.py +1386 -0
- calc_terminal/host/launcher.py +395 -0
- calc_terminal/host/terminal.py +279 -0
- calc_terminal/identity.py +216 -0
- calc_terminal/input/__init__.py +54 -0
- calc_terminal/input/capabilities.py +258 -0
- calc_terminal/input/focus.py +87 -0
- calc_terminal/input/gestures.py +64 -0
- calc_terminal/input/pointer.py +114 -0
- calc_terminal/input/touch.py +345 -0
- calc_terminal/keys.py +84 -0
- calc_terminal/live_automation.py +165 -0
- calc_terminal/mathtext.py +433 -0
- calc_terminal/mcp.py +386 -0
- calc_terminal/memory.py +337 -0
- calc_terminal/memory_v2.py +479 -0
- calc_terminal/metrics.py +333 -0
- calc_terminal/mode_detection.py +146 -0
- calc_terminal/model.py +2431 -0
- calc_terminal/model_router.py +665 -0
- calc_terminal/models/__init__.py +0 -0
- calc_terminal/models/active_state.py +187 -0
- calc_terminal/models/dynamic_registry.py +584 -0
- calc_terminal/models/manager.py +781 -0
- calc_terminal/models/model_metadata.json +3526 -0
- calc_terminal/models/profiles.py +194 -0
- calc_terminal/models/registry.py +265 -0
- calc_terminal/models/schema.py +197 -0
- calc_terminal/models/validator.py +287 -0
- calc_terminal/models/verification_engine.py +368 -0
- calc_terminal/native_picker.py +215 -0
- calc_terminal/ollama_catalog.py +279 -0
- calc_terminal/ollama_download.py +233 -0
- calc_terminal/orchestrator.py +304 -0
- calc_terminal/package_research.py +322 -0
- calc_terminal/packages.py +1024 -0
- calc_terminal/pc_specs.py +116 -0
- calc_terminal/permissions.py +334 -0
- calc_terminal/pet.py +106 -0
- calc_terminal/pipeline.py +505 -0
- calc_terminal/platform/__init__.py +491 -0
- calc_terminal/platform/desktop.py +491 -0
- calc_terminal/platform/web.py +781 -0
- calc_terminal/preview/__init__.py +1 -0
- calc_terminal/preview/dev_server.py +303 -0
- calc_terminal/preview/diagnostics.py +131 -0
- calc_terminal/preview/live_reload.py +66 -0
- calc_terminal/preview/manager.py +129 -0
- calc_terminal/project_stats.py +209 -0
- calc_terminal/projects.py +328 -0
- calc_terminal/providers/__init__.py +0 -0
- calc_terminal/providers/adapters/__init__.py +80 -0
- calc_terminal/providers/adapters/anthropic_adapter.py +127 -0
- calc_terminal/providers/adapters/base.py +106 -0
- calc_terminal/providers/adapters/chinese_adapters.py +420 -0
- calc_terminal/providers/adapters/gemini_adapter.py +101 -0
- calc_terminal/providers/adapters/ollama_adapter.py +83 -0
- calc_terminal/providers/adapters/openai_adapter.py +159 -0
- calc_terminal/providers/adapters/other_adapters.py +246 -0
- calc_terminal/providers/anthropic_provider.py +172 -0
- calc_terminal/providers/auto_update.py +416 -0
- calc_terminal/providers/base_provider.py +105 -0
- calc_terminal/providers/discovery_manager.py +207 -0
- calc_terminal/providers/gemini_provider.py +178 -0
- calc_terminal/providers/lifecycle.py +767 -0
- calc_terminal/providers/ollama_adapter.py +707 -0
- calc_terminal/providers/openai_provider.py +254 -0
- calc_terminal/providers/provider_manager.py +1827 -0
- calc_terminal/providers/providers.json +4075 -0
- calc_terminal/reactionsim.py +279 -0
- calc_terminal/registry.py +337 -0
- calc_terminal/report.py +162 -0
- calc_terminal/research/__init__.py +45 -0
- calc_terminal/research/artifact_intel.py +126 -0
- calc_terminal/research/data_lineage.py +123 -0
- calc_terminal/research/experiment_ledger.py +303 -0
- calc_terminal/research/reproducibility.py +131 -0
- calc_terminal/resilience/__init__.py +47 -0
- calc_terminal/resilience/agent_state.py +121 -0
- calc_terminal/resilience/capability_matcher.py +174 -0
- calc_terminal/resilience/circuit_breaker.py +158 -0
- calc_terminal/resilience/failover_engine.py +230 -0
- calc_terminal/resilience/health_monitor.py +192 -0
- calc_terminal/resilience/ollama_adapter.py +125 -0
- calc_terminal/resilience/orchestrator.py +312 -0
- calc_terminal/resilience/types.py +134 -0
- calc_terminal/sandbox.py +98 -0
- calc_terminal/scires.py +558 -0
- calc_terminal/security_scanner.py +126 -0
- calc_terminal/session.py +294 -0
- calc_terminal/sim3d.py +206 -0
- calc_terminal/solver.py +276 -0
- calc_terminal/sound.py +127 -0
- calc_terminal/task_reports.py +287 -0
- calc_terminal/terminal_host.py +201 -0
- calc_terminal/terminal_identity.py +411 -0
- calc_terminal/test_ai_mode_reliability.py +344 -0
- calc_terminal/test_browser.py +368 -0
- calc_terminal/test_code_editor_upgrade.py +485 -0
- calc_terminal/test_customization.py +1148 -0
- calc_terminal/test_customization_ui.py +612 -0
- calc_terminal/test_dynamic_registry.py +304 -0
- calc_terminal/test_extensions.py +436 -0
- calc_terminal/test_overhaul.py +557 -0
- calc_terminal/test_project_detect.py +255 -0
- calc_terminal/test_root_cause_fix.py +527 -0
- calc_terminal/test_stability.py +532 -0
- calc_terminal/test_terminal_identity.py +132 -0
- calc_terminal/test_v079_speed.py +460 -0
- calc_terminal/theme.py +1107 -0
- calc_terminal/timeline.py +139 -0
- calc_terminal/todos.py +246 -0
- calc_terminal/tool_call_normalizer.py +419 -0
- calc_terminal/tui.py +104 -0
- calc_terminal/ui/__init__.py +8 -0
- calc_terminal/ui/activity_panel.py +231 -0
- calc_terminal/ui/activity_stream_panel.py +238 -0
- calc_terminal/ui/animations.py +122 -0
- calc_terminal/ui/app.py +7271 -0
- calc_terminal/ui/attach_panel.py +597 -0
- calc_terminal/ui/attachments.py +424 -0
- calc_terminal/ui/backup_panel.py +810 -0
- calc_terminal/ui/browser_shell.py +887 -0
- calc_terminal/ui/cat_agent.py +357 -0
- calc_terminal/ui/chats_panel.py +899 -0
- calc_terminal/ui/command_palette.py +125 -0
- calc_terminal/ui/command_palette_modal.py +166 -0
- calc_terminal/ui/composer.py +1141 -0
- calc_terminal/ui/context_menu.py +197 -0
- calc_terminal/ui/conversation.py +1435 -0
- calc_terminal/ui/customization_panel.py +1229 -0
- calc_terminal/ui/dashboard.py +404 -0
- calc_terminal/ui/design_system.py +557 -0
- calc_terminal/ui/diff_panel.py +213 -0
- calc_terminal/ui/editor.py +2102 -0
- calc_terminal/ui/empty_state.py +302 -0
- calc_terminal/ui/events.py +487 -0
- calc_terminal/ui/extensions_panel.py +815 -0
- calc_terminal/ui/footer.py +166 -0
- calc_terminal/ui/gestures_panel.py +383 -0
- calc_terminal/ui/goodbye_screen.py +100 -0
- calc_terminal/ui/header.py +1034 -0
- calc_terminal/ui/help_panel.py +254 -0
- calc_terminal/ui/live_activities.py +914 -0
- calc_terminal/ui/mcp_panel.py +570 -0
- calc_terminal/ui/memory_center.py +524 -0
- calc_terminal/ui/mode_colors_panel.py +525 -0
- calc_terminal/ui/nav_screens.py +747 -0
- calc_terminal/ui/ollama_panel.py +536 -0
- calc_terminal/ui/palette.py +221 -0
- calc_terminal/ui/permission_panel.py +269 -0
- calc_terminal/ui/personalization_panel.py +517 -0
- calc_terminal/ui/personalize_center.py +1568 -0
- calc_terminal/ui/preview_panel.py +441 -0
- calc_terminal/ui/resizers.py +402 -0
- calc_terminal/ui/sidebar.py +1285 -0
- calc_terminal/ui/statusbar.py +168 -0
- calc_terminal/ui/theme_css.py +1396 -0
- calc_terminal/ui/thinking.py +226 -0
- calc_terminal/ui/timeline_panel.py +102 -0
- calc_terminal/ui/todo_panel.py +193 -0
- calc_terminal/ui/viewport.py +136 -0
- calc_terminal/ui/vision_panel.py +489 -0
- calc_terminal/ui/welcome_modal.py +343 -0
- calc_terminal/ui/widgets.py +160 -0
- calc_terminal/ui/workspace.py +831 -0
- calc_terminal/viewers/__init__.py +1 -0
- calc_terminal/viewers/document_viewer.py +252 -0
- calc_terminal/viewers/image_viewer.py +241 -0
- calc_terminal/viewers/pdf_viewer.py +203 -0
- calc_terminal/viewers/presentation_viewer.py +164 -0
- calc_terminal/viewers/registry.py +120 -0
- calc_terminal/viewers/spreadsheet_viewer.py +204 -0
- calc_terminal/vision/__init__.py +89 -0
- calc_terminal/vision/analysis.py +194 -0
- calc_terminal/vision/annotations.py +297 -0
- calc_terminal/vision/capture.py +171 -0
- calc_terminal/vision/context.py +231 -0
- calc_terminal/vision/correlation.py +169 -0
- calc_terminal/vision/cursor.py +258 -0
- calc_terminal/vision/events.py +66 -0
- calc_terminal/vision/frame_pipeline.py +259 -0
- calc_terminal/vision/priority.py +218 -0
- calc_terminal/vision/provider.py +180 -0
- calc_terminal/vision/safety.py +149 -0
- calc_terminal/vision/session.py +281 -0
- calc_terminal/vision/verify.py +162 -0
- calc_terminal/vision.py +514 -0
- calc_terminal/vscode_integration.py +113 -0
- calc_terminal/web/__init__.py +8 -0
- calc_terminal/web/cat_runtime.py +710 -0
- calc_terminal/web/server.py +2891 -0
- calc_terminal/web/static/css/app.css +3152 -0
- calc_terminal/web/static/icons/badge-72.png +0 -0
- calc_terminal/web/static/icons/cat.ico +0 -0
- calc_terminal/web/static/icons/icon-128.png +0 -0
- calc_terminal/web/static/icons/icon-144.png +0 -0
- calc_terminal/web/static/icons/icon-152.png +0 -0
- calc_terminal/web/static/icons/icon-192.png +0 -0
- calc_terminal/web/static/icons/icon-384.png +0 -0
- calc_terminal/web/static/icons/icon-512.png +0 -0
- calc_terminal/web/static/icons/icon-72.png +0 -0
- calc_terminal/web/static/icons/icon-96.png +0 -0
- calc_terminal/web/static/icons/icon.svg +34 -0
- calc_terminal/web/static/icons/new-project.png +0 -0
- calc_terminal/web/static/icons/open-project.png +0 -0
- calc_terminal/web/static/index.html +734 -0
- calc_terminal/web/static/js/app.js +2403 -0
- calc_terminal/web/static/manifest.json +88 -0
- calc_terminal/web/static/sw.js +230 -0
- calc_terminal/workflow_engine.py +769 -0
- calc_terminal/workspace.py +593 -0
- calc_terminal/workspace_index.py +385 -0
- cct_cli-0.7.9.0.dist-info/METADATA +210 -0
- cct_cli-0.7.9.0.dist-info/RECORD +325 -0
- cct_cli-0.7.9.0.dist-info/WHEEL +5 -0
- cct_cli-0.7.9.0.dist-info/entry_points.txt +4 -0
- cct_cli-0.7.9.0.dist-info/licenses/LICENSE +21 -0
- cct_cli-0.7.9.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CCT UI — statusbar.py (spec v0.7 project structure list + "Status Bar"
|
|
3
|
+
section: Workspace / Current Model / GPU / Memory / CPU / API / Ollama
|
|
4
|
+
/ Simulation / Version / Time, one compact bottom line).
|
|
5
|
+
|
|
6
|
+
footer.py's `StatusLine` already implements exactly this rendering
|
|
7
|
+
contract (a zero-arg `get_fields()` callable returning
|
|
8
|
+
`[(label, value, tone), ...]`, joined into one dot-separated line, no
|
|
9
|
+
boxes) — see CCTApp._status_fields in ui/app.py. Per the v0.7 brief
|
|
10
|
+
("Do NOT rewrite working modules"), this file does not reimplement
|
|
11
|
+
that renderer a second time; it subclasses it under the spec's
|
|
12
|
+
expected filename and adds the field-gathering logic (memory/CPU via
|
|
13
|
+
the standard library only, Ollama reachability, simulation state,
|
|
14
|
+
version, wall-clock time) that CCTApp's `_status_fields` didn't cover
|
|
15
|
+
yet, so `ui/app.py` can hand this one callable instead of hand-rolling
|
|
16
|
+
those fields itself.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
if __name__ == "__main__":
|
|
20
|
+
print("This is a library file and is not meant to be run directly.")
|
|
21
|
+
import sys
|
|
22
|
+
sys.exit(1)
|
|
23
|
+
|
|
24
|
+
import os
|
|
25
|
+
import platform
|
|
26
|
+
import shutil
|
|
27
|
+
import threading
|
|
28
|
+
import time
|
|
29
|
+
|
|
30
|
+
from .. import permissions as perm
|
|
31
|
+
from .footer import StatusLine as _BaseStatusLine, TEXTUAL_AVAILABLE as _FOOTER_OK
|
|
32
|
+
|
|
33
|
+
TEXTUAL_AVAILABLE = _FOOTER_OK
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _memory_usage_mb():
|
|
37
|
+
"""Best-effort resident memory for *this* process, standard-library
|
|
38
|
+
only (no psutil dependency). Returns None if the platform doesn't
|
|
39
|
+
expose it (e.g. some minimal containers) rather than guessing."""
|
|
40
|
+
try:
|
|
41
|
+
import resource
|
|
42
|
+
kb = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
|
|
43
|
+
# ru_maxrss is KB on Linux, bytes on macOS.
|
|
44
|
+
return kb / 1024 if platform.system() != "Darwin" else kb / (1024 * 1024)
|
|
45
|
+
except Exception:
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _cpu_load_pct():
|
|
50
|
+
"""A cheap, dependency-free CPU signal: 1-minute load average
|
|
51
|
+
divided by core count, as a percentage. Returns None on platforms
|
|
52
|
+
without os.getloadavg() (e.g. Windows) — the caller shows 'n/a'
|
|
53
|
+
rather than a fabricated number."""
|
|
54
|
+
try:
|
|
55
|
+
load1, _, _ = os.getloadavg()
|
|
56
|
+
cores = os.cpu_count() or 1
|
|
57
|
+
return min(100.0, 100.0 * load1 / cores)
|
|
58
|
+
except (OSError, AttributeError):
|
|
59
|
+
return None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _ollama_reachable():
|
|
63
|
+
"""One short-timeout probe of the local Ollama server. Cached by
|
|
64
|
+
the caller's refresh cadence (StatusLine already only redraws on
|
|
65
|
+
its own interval), not on every field access."""
|
|
66
|
+
try:
|
|
67
|
+
import requests
|
|
68
|
+
r = requests.get("http://localhost:11434/api/tags", timeout=0.3)
|
|
69
|
+
return r.status_code == 200
|
|
70
|
+
except Exception:
|
|
71
|
+
return False
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class StatusFields:
|
|
75
|
+
"""Gathers the spec's status-bar fields. Kept as a plain class (not
|
|
76
|
+
a widget) so it's unit-testable without Textual, matching how
|
|
77
|
+
thinking.py stays dependency-free — StatusBar below only renders
|
|
78
|
+
what this computes."""
|
|
79
|
+
|
|
80
|
+
def __init__(self, app_state_getter, version="0.7.9.0"):
|
|
81
|
+
"""`app_state_getter` is a zero-arg callable returning a dict
|
|
82
|
+
with keys this module doesn't otherwise know: 'model_label',
|
|
83
|
+
'workspace', 'notebook_count', 'simulation', 'ollama_checked_at'.
|
|
84
|
+
CCTApp supplies it; this class never reaches into CCTApp itself."""
|
|
85
|
+
self._get_state = app_state_getter
|
|
86
|
+
self._version = version
|
|
87
|
+
self._ollama_ok = None
|
|
88
|
+
self._ollama_last_check = 0.0
|
|
89
|
+
self._ollama_lock = threading.Lock()
|
|
90
|
+
self._ollama_probing = False
|
|
91
|
+
|
|
92
|
+
def _ollama_status(self):
|
|
93
|
+
"""Last-known Ollama reachability — NEVER blocks the UI thread.
|
|
94
|
+
A stale reading kicks one daemon-thread probe (guarded so
|
|
95
|
+
probes can't stack); the fresh value lands on the next repaint.
|
|
96
|
+
Until the first probe lands, None renders as '…' (unknown),
|
|
97
|
+
never a fabricated up/down."""
|
|
98
|
+
now = time.time()
|
|
99
|
+
if now - self._ollama_last_check > 30:
|
|
100
|
+
self._ollama_last_check = now
|
|
101
|
+
self._kick_ollama_probe()
|
|
102
|
+
return self._ollama_ok
|
|
103
|
+
|
|
104
|
+
def _kick_ollama_probe(self):
|
|
105
|
+
try:
|
|
106
|
+
with self._ollama_lock:
|
|
107
|
+
if self._ollama_probing:
|
|
108
|
+
return
|
|
109
|
+
self._ollama_probing = True
|
|
110
|
+
except Exception:
|
|
111
|
+
return
|
|
112
|
+
thread = threading.Thread(
|
|
113
|
+
target=self._probe_ollama_bg, daemon=True)
|
|
114
|
+
thread.start()
|
|
115
|
+
|
|
116
|
+
def _probe_ollama_bg(self):
|
|
117
|
+
try:
|
|
118
|
+
ok = _ollama_reachable()
|
|
119
|
+
except Exception:
|
|
120
|
+
ok = False
|
|
121
|
+
try:
|
|
122
|
+
with self._ollama_lock:
|
|
123
|
+
self._ollama_ok = ok
|
|
124
|
+
self._ollama_probing = False
|
|
125
|
+
except Exception:
|
|
126
|
+
self._ollama_ok = ok
|
|
127
|
+
self._ollama_probing = False
|
|
128
|
+
|
|
129
|
+
def fields(self):
|
|
130
|
+
state = self._get_state() or {}
|
|
131
|
+
gpu_ok = bool(shutil.which("nvidia-smi"))
|
|
132
|
+
net_ok = perm.manager.allowed("internet")
|
|
133
|
+
mem_mb = _memory_usage_mb()
|
|
134
|
+
cpu_pct = _cpu_load_pct()
|
|
135
|
+
ollama_ok = self._ollama_status()
|
|
136
|
+
|
|
137
|
+
out = [
|
|
138
|
+
("Workspace", state.get("workspace") or "none", ""),
|
|
139
|
+
("Model", state.get("model_label") or "none",
|
|
140
|
+
"ready" if state.get("model_label") not in (None, "no model") else "warn"),
|
|
141
|
+
("GPU", "ready" if gpu_ok else "cpu-only", "ready" if gpu_ok else ""),
|
|
142
|
+
("Mem", f"{mem_mb:.0f}MB" if mem_mb is not None else "n/a", ""),
|
|
143
|
+
("CPU", f"{cpu_pct:.0f}%" if cpu_pct is not None else "n/a", ""),
|
|
144
|
+
("API", "allowed" if net_ok else "blocked", "ready" if net_ok else "err"),
|
|
145
|
+
("Ollama", "up" if ollama_ok else ("…" if ollama_ok is None else "down"),
|
|
146
|
+
"ready" if ollama_ok else ""),
|
|
147
|
+
]
|
|
148
|
+
sim = state.get("simulation")
|
|
149
|
+
if sim:
|
|
150
|
+
out.append(("Sim", sim, "ready"))
|
|
151
|
+
out.append(("", f"v{self._version}", ""))
|
|
152
|
+
out.append(("", time.strftime("%H:%M:%S"), ""))
|
|
153
|
+
return out
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
if TEXTUAL_AVAILABLE:
|
|
157
|
+
|
|
158
|
+
class StatusBar(_BaseStatusLine):
|
|
159
|
+
"""Drop-in replacement for footer.StatusLine — identical
|
|
160
|
+
rendering (inherited unchanged), richer field source. CCTApp
|
|
161
|
+
constructs this with a StatusFields instance's `.fields` bound
|
|
162
|
+
method instead of its own ad hoc `_status_fields`."""
|
|
163
|
+
|
|
164
|
+
def __init__(self, status_fields: StatusFields, id="cct-statusline"):
|
|
165
|
+
super().__init__(status_fields.fields, id=id)
|
|
166
|
+
|
|
167
|
+
else:
|
|
168
|
+
StatusBar = None
|