@anastops/cli 2.0.1 → 2.1.1
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.
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +220 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +92 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +26 -5
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
- package/ranger-tui/ranger_tui/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/__pycache__/app.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/actions/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/actions/__pycache__/agent_actions.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/actions/__pycache__/session_actions.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/actions/__pycache__/task_actions.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/app.py +113 -22
- package/ranger-tui/ranger_tui/data/__init__.py +2 -1
- package/ranger-tui/ranger_tui/data/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/data/__pycache__/client.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/data/client.py +38 -10
- package/ranger-tui/ranger_tui/screens/__init__.py +2 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/__init__.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/command_palette.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/dashboard.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/help.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/loading.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/session.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/__pycache__/task.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/screens/dashboard.py +18 -4
- package/ranger-tui/ranger_tui/screens/loading.py +214 -0
- package/ranger-tui/ranger_tui/screens/session.py +19 -5
- package/ranger-tui/ranger_tui/screens/task.py +18 -4
- package/ranger-tui/ranger_tui/widgets/__pycache__/agents_table.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/header.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/metrics_panel.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/sessions_table.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/tasks_table.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/__pycache__/topbar.cpython-314.pyc +0 -0
- package/ranger-tui/ranger_tui/widgets/topbar.py +14 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,+BAA+B;AAC/B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAC1E,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,eAAe,EAAE,8BAA8B,CAAC;KACvD,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;KACtE,MAAM,CAAC,cAAc,EAAE,8DAA8D,CAAC;KACtF,MAAM,CAAC,aAAa,EAAE,wDAAwD,CAAC;KAC/E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,+BAA+B,CAAC;KACxC,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,SAAS,EAAE,oDAAoD,CAAC;KACvE,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,GAAG,CAAC;KAC3D,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,2DAA2D,CAAC;KAC7E,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,+BAA+B;AAC/B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uEAAuE,CAAC;KACpF,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAC1E,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC;KACpD,MAAM,CAAC,eAAe,EAAE,8BAA8B,CAAC;KACvD,MAAM,CAAC,cAAc,EAAE,8CAA8C,CAAC;KACtE,MAAM,CAAC,cAAc,EAAE,8DAA8D,CAAC;KACtF,MAAM,CAAC,aAAa,EAAE,wDAAwD,CAAC;KAC/E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,+BAA+B,CAAC;KACxC,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,SAAS,EAAE,oDAAoD,CAAC;KACvE,MAAM,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,GAAG,CAAC;KAC3D,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,2DAA2D,CAAC;KAC7E,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CACV,yFAAyF,CAC1F;KACA,MAAM,CAAC,SAAS,EAAE,oEAAoE,CAAC;KACvF,MAAM,CAAC,aAAa,EAAE,oDAAoD,CAAC;KAC3E,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;KAClE,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anastops/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "Infrastructure CLI for Anastops MCP Server setup and diagnostics",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -18,6 +18,8 @@
|
|
|
18
18
|
"prebuild": "node scripts/copy-ranger.js",
|
|
19
19
|
"build": "tsc",
|
|
20
20
|
"dev": "tsc --watch",
|
|
21
|
+
"dev:tsx": "tsx src/index.ts",
|
|
22
|
+
"dev:tsx:watch": "tsx watch src/index.ts",
|
|
21
23
|
"start": "node dist/index.js",
|
|
22
24
|
"test": "vitest run",
|
|
23
25
|
"test:watch": "vitest",
|
|
@@ -28,8 +30,8 @@
|
|
|
28
30
|
},
|
|
29
31
|
"dependencies": {
|
|
30
32
|
"@anastops/core": "1.1.0",
|
|
31
|
-
"@anastops/adapters": "1.1.
|
|
32
|
-
"@anastops/mcp-server": "1.1.
|
|
33
|
+
"@anastops/adapters": "1.1.2",
|
|
34
|
+
"@anastops/mcp-server": "1.1.2",
|
|
33
35
|
"commander": "^14.0.2",
|
|
34
36
|
"enquirer": "^2.4.1",
|
|
35
37
|
"chalk": "^5.6.2",
|
|
@@ -38,6 +40,7 @@
|
|
|
38
40
|
},
|
|
39
41
|
"devDependencies": {
|
|
40
42
|
"@types/node": "^25.0.9",
|
|
43
|
+
"tsx": "^4.19.0",
|
|
41
44
|
"typescript": "^5.9.3",
|
|
42
45
|
"vitest": "^4.0.17"
|
|
43
46
|
},
|
|
Binary file
|
|
Binary file
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Main Ranger TUI Application.
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
+
import asyncio
|
|
6
|
+
import time
|
|
7
|
+
|
|
5
8
|
from textual.app import App
|
|
6
9
|
from textual.binding import Binding
|
|
7
10
|
from textual.reactive import reactive
|
|
@@ -9,84 +12,172 @@ from textual.reactive import reactive
|
|
|
9
12
|
from ranger_tui.config import config
|
|
10
13
|
from ranger_tui.data import DataClient, get_client, Session
|
|
11
14
|
from ranger_tui.theme import RANGER_THEME
|
|
12
|
-
from ranger_tui.screens import DashboardScreen
|
|
15
|
+
from ranger_tui.screens import DashboardScreen, LoadingScreen
|
|
13
16
|
|
|
14
17
|
|
|
15
18
|
class RangerApp(App):
|
|
16
19
|
"""
|
|
17
20
|
Anastops Ranger TUI - Terminal dashboard for orchestration management.
|
|
18
|
-
|
|
21
|
+
|
|
19
22
|
Navigation:
|
|
20
23
|
- Arrow keys to move
|
|
21
24
|
- Enter to select/open
|
|
22
25
|
- Escape to go back
|
|
23
26
|
- q to quit
|
|
24
27
|
"""
|
|
25
|
-
|
|
28
|
+
|
|
26
29
|
TITLE = "Ranger"
|
|
27
30
|
CSS_PATH = "styles/ranger.tcss"
|
|
28
|
-
|
|
31
|
+
|
|
29
32
|
BINDINGS = [
|
|
30
33
|
Binding("q", "quit", "Quit", show=True, priority=True),
|
|
31
34
|
Binding("escape", "back", "Back", show=True),
|
|
32
35
|
Binding("r", "refresh", "Refresh", show=True),
|
|
33
36
|
]
|
|
34
|
-
|
|
37
|
+
|
|
35
38
|
# Reactive state
|
|
36
39
|
sessions: reactive[list[Session]] = reactive(list, init=False)
|
|
37
40
|
mongo_connected: reactive[bool] = reactive(False)
|
|
38
41
|
redis_connected: reactive[bool] = reactive(False)
|
|
39
|
-
|
|
42
|
+
|
|
40
43
|
def __init__(self):
|
|
41
44
|
super().__init__()
|
|
42
45
|
self.client: DataClient = get_client()
|
|
43
|
-
|
|
46
|
+
# Connection task tracking for non-blocking connection
|
|
47
|
+
self._connection_task: asyncio.Task | None = None
|
|
48
|
+
self._connection_start_time: float = 0.0
|
|
49
|
+
self._connection_timeout: float = 10.0 # seconds
|
|
50
|
+
|
|
44
51
|
async def on_mount(self) -> None:
|
|
45
52
|
"""Called when app is mounted."""
|
|
46
53
|
# Register and apply custom theme
|
|
47
54
|
self.register_theme(RANGER_THEME)
|
|
48
55
|
self.theme = "ranger"
|
|
49
|
-
|
|
50
|
-
#
|
|
51
|
-
await self.
|
|
52
|
-
|
|
56
|
+
|
|
57
|
+
# Show loading screen immediately
|
|
58
|
+
await self.push_screen(LoadingScreen())
|
|
59
|
+
|
|
60
|
+
# Defer connection to allow loading screen to render
|
|
61
|
+
self.call_after_refresh(self._initialize_app)
|
|
62
|
+
|
|
63
|
+
async def _initialize_app(self) -> None:
|
|
64
|
+
"""Initialize app after loading screen is rendered.
|
|
65
|
+
|
|
66
|
+
Uses non-blocking background task pattern to allow LoadingScreen
|
|
67
|
+
animation to run immediately while connection attempt proceeds.
|
|
68
|
+
"""
|
|
69
|
+
# Get the loading screen instance
|
|
70
|
+
loading_screen = self.screen_stack[-1]
|
|
71
|
+
|
|
72
|
+
if isinstance(loading_screen, LoadingScreen):
|
|
73
|
+
loading_screen.set_status("Connecting to MongoDB...")
|
|
74
|
+
|
|
75
|
+
# Start connection in background WITHOUT awaiting it
|
|
76
|
+
# This allows the LoadingScreen animation to run immediately
|
|
77
|
+
self._connection_task = asyncio.create_task(self._connect())
|
|
78
|
+
self._connection_start_time = time.time()
|
|
79
|
+
|
|
80
|
+
# Schedule first check in 500ms - animation runs in parallel
|
|
81
|
+
self.set_timer(0.5, lambda: self._check_connection())
|
|
82
|
+
|
|
83
|
+
def _check_connection(self) -> None:
|
|
84
|
+
"""Check connection status periodically (non-blocking).
|
|
85
|
+
|
|
86
|
+
Called by Textual's timer system, allowing animations to continue.
|
|
87
|
+
"""
|
|
88
|
+
if self._connection_task is None:
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
loading_screen = self.screen_stack[-1] if self.screen_stack else None
|
|
92
|
+
elapsed = time.time() - self._connection_start_time
|
|
93
|
+
|
|
94
|
+
if self._connection_task.done():
|
|
95
|
+
# Connection completed - handle result asynchronously
|
|
96
|
+
asyncio.create_task(self._handle_connection_complete())
|
|
97
|
+
elif elapsed > self._connection_timeout:
|
|
98
|
+
# Timeout after configured seconds
|
|
99
|
+
self._connection_task.cancel()
|
|
100
|
+
if isinstance(loading_screen, LoadingScreen):
|
|
101
|
+
# Hide the spinner when connection fails
|
|
102
|
+
loading_screen.hide_spinner()
|
|
103
|
+
loading_screen.set_error(
|
|
104
|
+
"⚠ Connection timeout. Please start Docker with 'anastops init' and press 'q' to quit"
|
|
105
|
+
)
|
|
106
|
+
else:
|
|
107
|
+
# Not done yet, check again in 500ms
|
|
108
|
+
# This allows animation to continue running
|
|
109
|
+
self.set_timer(0.5, lambda: self._check_connection())
|
|
110
|
+
|
|
111
|
+
async def _handle_connection_complete(self) -> None:
|
|
112
|
+
"""Handle completed connection task."""
|
|
113
|
+
loading_screen = self.screen_stack[-1] if self.screen_stack else None
|
|
114
|
+
|
|
115
|
+
# Get result and check for exceptions
|
|
116
|
+
if self._connection_task is not None:
|
|
117
|
+
try:
|
|
118
|
+
await self._connection_task
|
|
119
|
+
except asyncio.CancelledError:
|
|
120
|
+
return
|
|
121
|
+
except Exception as e:
|
|
122
|
+
if isinstance(loading_screen, LoadingScreen):
|
|
123
|
+
loading_screen.hide_spinner()
|
|
124
|
+
loading_screen.set_error(f"⚠ Connection error: {str(e)}")
|
|
125
|
+
return
|
|
126
|
+
|
|
127
|
+
# Check if connections succeeded
|
|
128
|
+
if not self.mongo_connected and not self.redis_connected:
|
|
129
|
+
if isinstance(loading_screen, LoadingScreen):
|
|
130
|
+
loading_screen.hide_spinner()
|
|
131
|
+
loading_screen.set_error(
|
|
132
|
+
"⚠ Connection failed. Please start Docker with 'anastops init' and press 'q' to quit"
|
|
133
|
+
)
|
|
134
|
+
return
|
|
135
|
+
|
|
136
|
+
# Success! Update status
|
|
137
|
+
if isinstance(loading_screen, LoadingScreen):
|
|
138
|
+
loading_screen.set_status("Connection established!")
|
|
139
|
+
|
|
140
|
+
# Small delay to show success message
|
|
141
|
+
await asyncio.sleep(0.5)
|
|
142
|
+
|
|
53
143
|
# Start periodic refresh
|
|
54
144
|
self.set_interval(config.refresh_interval, self._refresh_data)
|
|
55
145
|
await self._refresh_data()
|
|
56
|
-
|
|
57
|
-
#
|
|
146
|
+
|
|
147
|
+
# Transition to dashboard
|
|
148
|
+
self.pop_screen()
|
|
58
149
|
await self.push_screen(DashboardScreen())
|
|
59
|
-
|
|
150
|
+
|
|
60
151
|
async def _connect(self) -> None:
|
|
61
152
|
"""Connect to MongoDB and Redis."""
|
|
62
153
|
await self.client.connect()
|
|
63
154
|
health = await self.client.health_check()
|
|
64
155
|
self.mongo_connected = health.get("mongodb", False)
|
|
65
156
|
self.redis_connected = health.get("redis", False)
|
|
66
|
-
|
|
157
|
+
|
|
67
158
|
async def _refresh_data(self) -> None:
|
|
68
159
|
"""Refresh data from databases."""
|
|
69
160
|
if not self.client.is_connected:
|
|
70
161
|
await self._connect()
|
|
71
|
-
|
|
162
|
+
|
|
72
163
|
if self.client.is_connected:
|
|
73
164
|
self.sessions = await self.client.get_sessions()
|
|
74
|
-
|
|
165
|
+
|
|
75
166
|
# Update connection status
|
|
76
167
|
health = await self.client.health_check()
|
|
77
168
|
self.mongo_connected = health.get("mongodb", False)
|
|
78
169
|
self.redis_connected = health.get("redis", False)
|
|
79
|
-
|
|
80
|
-
def action_quit(self) -> None:
|
|
170
|
+
|
|
171
|
+
async def action_quit(self) -> None:
|
|
81
172
|
"""Quit the application."""
|
|
82
173
|
self.exit()
|
|
83
|
-
|
|
174
|
+
|
|
84
175
|
async def action_refresh(self) -> None:
|
|
85
176
|
"""Manually refresh data."""
|
|
86
177
|
await self._refresh_data()
|
|
87
178
|
self.notify("Refreshed")
|
|
88
|
-
|
|
89
|
-
def action_back(self) -> None:
|
|
179
|
+
|
|
180
|
+
async def action_back(self) -> None:
|
|
90
181
|
"""Go back to previous screen (but not from dashboard)."""
|
|
91
182
|
# Don't pop if we're on the dashboard (root screen)
|
|
92
183
|
if len(self.screen_stack) > 2:
|
|
@@ -3,7 +3,7 @@ Data layer for Ranger TUI.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from .client import DataClient, get_client
|
|
6
|
-
from .models import Session, Task, Agent, Artifact, SessionReport
|
|
6
|
+
from .models import Session, Task, Agent, Artifact, SessionReport, SessionMetadata
|
|
7
7
|
|
|
8
8
|
__all__ = [
|
|
9
9
|
"DataClient",
|
|
@@ -13,4 +13,5 @@ __all__ = [
|
|
|
13
13
|
"Agent",
|
|
14
14
|
"Artifact",
|
|
15
15
|
"SessionReport",
|
|
16
|
+
"SessionMetadata",
|
|
16
17
|
]
|
|
Binary file
|
|
Binary file
|
|
@@ -124,16 +124,17 @@ class DataClient:
|
|
|
124
124
|
|
|
125
125
|
cursor = self._db.sessions.find(query).sort("updated_at", -1).limit(limit)
|
|
126
126
|
sessions = []
|
|
127
|
-
|
|
127
|
+
|
|
128
128
|
async for doc in cursor:
|
|
129
129
|
sessions.append(self._doc_to_session(doc))
|
|
130
|
-
|
|
130
|
+
|
|
131
131
|
# Fetch task counts for all sessions in one aggregation
|
|
132
132
|
if sessions:
|
|
133
133
|
session_ids = [s.id for s in sessions]
|
|
134
134
|
task_counts = await self._get_task_counts_by_session(session_ids)
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
task_metrics = await self._get_task_metrics_by_session(session_ids)
|
|
136
|
+
|
|
137
|
+
# Update session metadata with task counts and metrics
|
|
137
138
|
for session in sessions:
|
|
138
139
|
counts = task_counts.get(session.id, {})
|
|
139
140
|
session.metadata.tasks_total = counts.get("total", 0)
|
|
@@ -142,7 +143,11 @@ class DataClient:
|
|
|
142
143
|
session.metadata.tasks_running = counts.get("running", 0)
|
|
143
144
|
session.metadata.tasks_pending = counts.get("pending", 0)
|
|
144
145
|
session.metadata.tasks_queued = counts.get("queued", 0)
|
|
145
|
-
|
|
146
|
+
|
|
147
|
+
metrics = task_metrics.get(session.id, {"total_tokens": 0, "total_cost": 0.0})
|
|
148
|
+
session.metadata.total_tokens = metrics["total_tokens"]
|
|
149
|
+
session.metadata.total_cost = metrics["total_cost"]
|
|
150
|
+
|
|
146
151
|
return sessions
|
|
147
152
|
|
|
148
153
|
async def _get_task_counts_by_session(
|
|
@@ -152,7 +157,7 @@ class DataClient:
|
|
|
152
157
|
"""Get task counts grouped by session and status."""
|
|
153
158
|
if self._db is None:
|
|
154
159
|
return {}
|
|
155
|
-
|
|
160
|
+
|
|
156
161
|
pipeline = [
|
|
157
162
|
{"$match": {"session_id": {"$in": session_ids}}},
|
|
158
163
|
{"$group": {
|
|
@@ -160,20 +165,43 @@ class DataClient:
|
|
|
160
165
|
"count": {"$sum": 1}
|
|
161
166
|
}},
|
|
162
167
|
]
|
|
163
|
-
|
|
168
|
+
|
|
164
169
|
result: dict[str, dict[str, int]] = {}
|
|
165
170
|
async for doc in self._db.tasks.aggregate(pipeline):
|
|
166
171
|
session_id = doc["_id"]["session_id"]
|
|
167
172
|
status = doc["_id"]["status"]
|
|
168
173
|
count = doc["count"]
|
|
169
|
-
|
|
174
|
+
|
|
170
175
|
if session_id not in result:
|
|
171
176
|
result[session_id] = {"total": 0, "completed": 0, "failed": 0, "running": 0, "pending": 0, "queued": 0}
|
|
172
|
-
|
|
177
|
+
|
|
173
178
|
result[session_id][status] = count
|
|
174
179
|
result[session_id]["total"] += count
|
|
175
|
-
|
|
180
|
+
|
|
176
181
|
return result
|
|
182
|
+
|
|
183
|
+
async def _get_task_metrics_by_session(self, session_ids: list[str]) -> dict[str, dict]:
|
|
184
|
+
"""Calculate total tokens and cost from tasks for each session."""
|
|
185
|
+
if self._db is None:
|
|
186
|
+
return {}
|
|
187
|
+
|
|
188
|
+
pipeline = [
|
|
189
|
+
{"$match": {"session_id": {"$in": session_ids}}},
|
|
190
|
+
{"$group": {
|
|
191
|
+
"_id": "$session_id",
|
|
192
|
+
"total_tokens": {"$sum": "$token_usage.total_tokens"},
|
|
193
|
+
"total_cost": {"$sum": "$token_usage.cost"}
|
|
194
|
+
}},
|
|
195
|
+
]
|
|
196
|
+
|
|
197
|
+
cursor = self._db.tasks.aggregate(pipeline)
|
|
198
|
+
results = {}
|
|
199
|
+
async for doc in cursor:
|
|
200
|
+
results[doc["_id"]] = {
|
|
201
|
+
"total_tokens": doc["total_tokens"],
|
|
202
|
+
"total_cost": doc["total_cost"]
|
|
203
|
+
}
|
|
204
|
+
return results
|
|
177
205
|
|
|
178
206
|
async def get_session(self, session_id: str) -> Optional[Session]:
|
|
179
207
|
"""Get a single session by ID."""
|
|
@@ -6,6 +6,7 @@ from .dashboard import DashboardScreen
|
|
|
6
6
|
from .session import SessionScreen
|
|
7
7
|
from .task import TaskScreen
|
|
8
8
|
from .modals import NewSessionModal, NewTaskModal
|
|
9
|
+
from .loading import LoadingScreen
|
|
9
10
|
|
|
10
11
|
__all__ = [
|
|
11
12
|
"DashboardScreen",
|
|
@@ -13,4 +14,5 @@ __all__ = [
|
|
|
13
14
|
"TaskScreen",
|
|
14
15
|
"NewSessionModal",
|
|
15
16
|
"NewTaskModal",
|
|
17
|
+
"LoadingScreen",
|
|
16
18
|
]
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -6,8 +6,8 @@ from datetime import datetime, UTC
|
|
|
6
6
|
from textual.app import ComposeResult
|
|
7
7
|
from textual.screen import Screen
|
|
8
8
|
from textual.binding import Binding
|
|
9
|
-
from textual.containers import Horizontal
|
|
10
|
-
from textual.widgets import DataTable, Footer
|
|
9
|
+
from textual.containers import Horizontal, Vertical
|
|
10
|
+
from textual.widgets import DataTable, Footer, Static
|
|
11
11
|
|
|
12
12
|
from ranger_tui.widgets import TopBar, Sidebar
|
|
13
13
|
from ranger_tui.theme import format_status
|
|
@@ -15,16 +15,30 @@ from ranger_tui.theme import format_status
|
|
|
15
15
|
|
|
16
16
|
class DashboardScreen(Screen):
|
|
17
17
|
"""Main dashboard screen showing all sessions."""
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
DEFAULT_CSS = """
|
|
20
|
+
.view-title {
|
|
21
|
+
height: 4;
|
|
22
|
+
content-align: center middle;
|
|
23
|
+
text-style: bold;
|
|
24
|
+
background: $surface;
|
|
25
|
+
border: tall $primary;
|
|
26
|
+
color: $primary;
|
|
27
|
+
text-align: center;
|
|
28
|
+
padding: 0 2;
|
|
29
|
+
}
|
|
30
|
+
"""
|
|
31
|
+
|
|
19
32
|
BINDINGS = [
|
|
20
33
|
Binding("enter", "open_session", "Open", show=True),
|
|
21
34
|
Binding("n", "new_session", "New", show=True),
|
|
22
35
|
Binding("escape", "noop", show=False), # Disable escape on dashboard
|
|
23
36
|
]
|
|
24
|
-
|
|
37
|
+
|
|
25
38
|
def compose(self) -> ComposeResult:
|
|
26
39
|
"""Compose the dashboard layout."""
|
|
27
40
|
yield TopBar()
|
|
41
|
+
yield Static("[bold]S E S S I O N S[/]", classes="view-title", markup=True)
|
|
28
42
|
with Horizontal(id="main"):
|
|
29
43
|
yield DataTable(id="sessions-table", cursor_type="row")
|
|
30
44
|
yield Sidebar(title="Summary")
|