aline-ai 0.5.8__py3-none-any.whl → 0.5.9__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.
- {aline_ai-0.5.8.dist-info → aline_ai-0.5.9.dist-info}/METADATA +1 -1
- {aline_ai-0.5.8.dist-info → aline_ai-0.5.9.dist-info}/RECORD +11 -11
- realign/__init__.py +1 -1
- realign/dashboard/styles/dashboard.tcss +4 -4
- realign/dashboard/tmux_manager.py +11 -1
- realign/dashboard/widgets/events_table.py +45 -29
- realign/dashboard/widgets/terminal_panel.py +4 -4
- {aline_ai-0.5.8.dist-info → aline_ai-0.5.9.dist-info}/WHEEL +0 -0
- {aline_ai-0.5.8.dist-info → aline_ai-0.5.9.dist-info}/entry_points.txt +0 -0
- {aline_ai-0.5.8.dist-info → aline_ai-0.5.9.dist-info}/licenses/LICENSE +0 -0
- {aline_ai-0.5.8.dist-info → aline_ai-0.5.9.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
aline_ai-0.5.
|
|
2
|
-
realign/__init__.py,sha256=
|
|
1
|
+
aline_ai-0.5.9.dist-info/licenses/LICENSE,sha256=H8wTqV5IF1oHw_HbBtS1PSDU8G_q81yblEIL_JfV8Vo,1077
|
|
2
|
+
realign/__init__.py,sha256=OLwYTOwCSddSWbQNVsKd5oap0zIeASs5UyR2ZpBXeP0,1623
|
|
3
3
|
realign/claude_detector.py,sha256=ZLSJacMo6zzQclXByABKA70UNpstxqIv3fPGqdpA934,2792
|
|
4
4
|
realign/cli.py,sha256=9VS3WbysZ78NRK5EvkJVg8s6Uh2TQjsGX1E9Pl81pHc,31234
|
|
5
5
|
realign/codex_detector.py,sha256=N9ulgMgvTzDfXE4s4vLd6OoS0hT7R6h2bDFFXWa-2hE,4183
|
|
@@ -45,7 +45,7 @@ realign/commands/watcher.py,sha256=fWL3kaRkqE03-NtFLaXlx93hJAQrAuNPSoYhOyQZfq8,1
|
|
|
45
45
|
realign/commands/worker.py,sha256=K1DG1uZ--ebKwklHCyIFdN_axoLjL9Onx8Naq-DOZBs,23078
|
|
46
46
|
realign/dashboard/__init__.py,sha256=QZkHTsGityH8UkF8rmvA3xW7dMXNe0swEWr443qfgCM,128
|
|
47
47
|
realign/dashboard/app.py,sha256=jyW6mqmItTy253CPSqInxctkWzkrGEikdy-ikuShQ14,13299
|
|
48
|
-
realign/dashboard/tmux_manager.py,sha256=
|
|
48
|
+
realign/dashboard/tmux_manager.py,sha256=EfhmB5FF9MH1rtM-ICM0BFJ25kBg6mlMbmA4t4tcVRA,24409
|
|
49
49
|
realign/dashboard/screens/__init__.py,sha256=US6sAmQs5VVkH2tFkH_z0WDT4H8cVhLL-JckfSR1yQY,446
|
|
50
50
|
realign/dashboard/screens/create_agent.py,sha256=ugEs3IHrT7FsbuMEwyrqY3eoylp_pbftw42_Fu07tF4,7419
|
|
51
51
|
realign/dashboard/screens/create_event.py,sha256=oiQY1zKpUYnQU-5fQLeuZH9BV5NClE5B5XZIVBYG5A8,5506
|
|
@@ -53,15 +53,15 @@ realign/dashboard/screens/event_detail.py,sha256=OLaL3-FgAohDdzVlfuUw5yh2SR49IHI
|
|
|
53
53
|
realign/dashboard/screens/help_screen.py,sha256=Icrcvbgyz49R2tBiu8vBZ4CLm6iYclv_-FTa2pCFRRQ,3398
|
|
54
54
|
realign/dashboard/screens/session_detail.py,sha256=gfpUIhMO00ecMlMyzpkxDdvGb9zhESEvxwrJvqLuHOI,9603
|
|
55
55
|
realign/dashboard/screens/share_import.py,sha256=hl2x0yGVycsoUI76AmdZTAV-br3Q6191g5xHHrZ8hOA,6318
|
|
56
|
-
realign/dashboard/styles/dashboard.tcss,sha256=
|
|
56
|
+
realign/dashboard/styles/dashboard.tcss,sha256=ewonevBGLN-dfSsgxUk4VBCPchtxY4rx_vj1u6Ox2Fw,3454
|
|
57
57
|
realign/dashboard/widgets/__init__.py,sha256=3Pf2_K9obrertgv_psfxradgkI9RXlmjoXYQH7oBKm0,583
|
|
58
58
|
realign/dashboard/widgets/config_panel.py,sha256=Afezfd6nvHo0Q44IS2UZTPJsYmHbqzjx7bi5jWrCDPA,11182
|
|
59
|
-
realign/dashboard/widgets/events_table.py,sha256=
|
|
59
|
+
realign/dashboard/widgets/events_table.py,sha256=dXN_aD94YJ1fDSV2B_5m7YMvMU3bNUhGFCMIRWvvLMg,31141
|
|
60
60
|
realign/dashboard/widgets/header.py,sha256=0HHCFXX7F3C6HII-WDwOJwWkJrajmKPWmdoMWyOkn9E,1587
|
|
61
61
|
realign/dashboard/widgets/openable_table.py,sha256=GeJPDEYp0kRHShqvmPMzAePpYXRZHUNqcWNnxqsqxjA,1963
|
|
62
62
|
realign/dashboard/widgets/search_panel.py,sha256=ZNJDfwDSxUFnCeltYQYsQsPJ6t4HDeNWpENoTOoBdVM,8951
|
|
63
63
|
realign/dashboard/widgets/sessions_table.py,sha256=PohOkg-ESLBa-Sq0PdLPhV-YzVXOGpUo5ETs0MYO4u8,33415
|
|
64
|
-
realign/dashboard/widgets/terminal_panel.py,sha256=
|
|
64
|
+
realign/dashboard/widgets/terminal_panel.py,sha256=YreJ9EiU3OA1qAfcWZ9XuptvCJe8-REKcr03sm7dY-Q,28751
|
|
65
65
|
realign/dashboard/widgets/watcher_panel.py,sha256=O_mdDacgc87xA-5KEfta53Ik_Xsk_B2OfwenMOTtGw8,19722
|
|
66
66
|
realign/dashboard/widgets/worker_panel.py,sha256=F_jKWABuCNmjQgeeuCr4KnFRKdY4CLTNcEXMYwsNaSk,18691
|
|
67
67
|
realign/db/__init__.py,sha256=-1d-Zc4IOUVokbdTXi3R-bIwlkFEPAz_qTHAdcsdp6g,1870
|
|
@@ -88,8 +88,8 @@ realign/triggers/next_turn_trigger.py,sha256=BpP0PWn4mU1MZd6mv89jWcjs8Jtv0zEWapW
|
|
|
88
88
|
realign/triggers/registry.py,sha256=cb-AVLbYB2pqwfWL3q1DQxLv4kOw7g7m-GshTdfFESc,3827
|
|
89
89
|
realign/triggers/turn_status.py,sha256=wAZEhXDAmDoX5F-ohWfSnZZ0eA6DAJ9svSPiSv_f6sg,6041
|
|
90
90
|
realign/triggers/turn_summary.py,sha256=f3hEUshgv9skJ9AbfWpoYs417lsv_HK2A_vpPjgryO4,4467
|
|
91
|
-
aline_ai-0.5.
|
|
92
|
-
aline_ai-0.5.
|
|
93
|
-
aline_ai-0.5.
|
|
94
|
-
aline_ai-0.5.
|
|
95
|
-
aline_ai-0.5.
|
|
91
|
+
aline_ai-0.5.9.dist-info/METADATA,sha256=sh6dCwAskyh891skkjvCNomqfJ2RoYTLWPzccHRpUt8,1597
|
|
92
|
+
aline_ai-0.5.9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
93
|
+
aline_ai-0.5.9.dist-info/entry_points.txt,sha256=TvYELpMoWsUTcQdMV8tBHxCbEf_LbK4sESqK3r8PM6Y,78
|
|
94
|
+
aline_ai-0.5.9.dist-info/top_level.txt,sha256=yIL3s2xv9nf1GwD5n71Aq_JEIV4AfzCIDNKBzewuRm4,8
|
|
95
|
+
aline_ai-0.5.9.dist-info/RECORD,,
|
realign/__init__.py
CHANGED
|
@@ -202,14 +202,14 @@ TerminalPanel .terminal-row Button.terminal-switch {
|
|
|
202
202
|
|
|
203
203
|
TerminalPanel .terminal-row Button.terminal-close {
|
|
204
204
|
padding: 0;
|
|
205
|
-
width:
|
|
206
|
-
min-width:
|
|
205
|
+
width: 3;
|
|
206
|
+
min-width: 3;
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
TerminalPanel .terminal-row Button.terminal-toggle {
|
|
210
210
|
padding: 0;
|
|
211
|
-
width:
|
|
212
|
-
min-width:
|
|
211
|
+
width: 3;
|
|
212
|
+
min-width: 3;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
TerminalPanel .context-sessions {
|
|
@@ -15,11 +15,15 @@ import stat
|
|
|
15
15
|
import subprocess
|
|
16
16
|
import sys
|
|
17
17
|
import time
|
|
18
|
+
import traceback
|
|
18
19
|
import uuid
|
|
19
20
|
from dataclasses import dataclass
|
|
20
21
|
from pathlib import Path
|
|
21
22
|
from typing import Iterable, Sequence
|
|
22
23
|
|
|
24
|
+
from ..logging_config import setup_logger
|
|
25
|
+
|
|
26
|
+
logger = setup_logger("realign.dashboard.tmux", "dashboard.log")
|
|
23
27
|
|
|
24
28
|
OUTER_SESSION = "aline"
|
|
25
29
|
OUTER_WINDOW = "dashboard"
|
|
@@ -364,11 +368,17 @@ def bootstrap_dashboard_into_tmux() -> None:
|
|
|
364
368
|
|
|
365
369
|
This is intended to be called when *not* already inside tmux.
|
|
366
370
|
"""
|
|
367
|
-
|
|
371
|
+
logger.debug("bootstrap_dashboard_into_tmux() started")
|
|
372
|
+
if in_tmux():
|
|
373
|
+
logger.debug("Already in tmux, skipping bootstrap")
|
|
374
|
+
return
|
|
375
|
+
if not tmux_available():
|
|
376
|
+
logger.debug("tmux not available, skipping bootstrap")
|
|
368
377
|
return
|
|
369
378
|
|
|
370
379
|
# Maximize terminal window before attaching to tmux
|
|
371
380
|
_maximize_terminal_window()
|
|
381
|
+
logger.debug("Terminal window maximized")
|
|
372
382
|
|
|
373
383
|
# Ensure session exists.
|
|
374
384
|
has = _run_outer_tmux(["has-session", "-t", OUTER_SESSION], capture=True)
|
|
@@ -6,6 +6,7 @@ import json
|
|
|
6
6
|
import os
|
|
7
7
|
import shutil
|
|
8
8
|
import subprocess
|
|
9
|
+
import traceback
|
|
9
10
|
from datetime import datetime
|
|
10
11
|
from typing import Optional, Set
|
|
11
12
|
from urllib.parse import urlparse
|
|
@@ -18,8 +19,11 @@ from textual.reactive import reactive
|
|
|
18
19
|
from textual.worker import Worker, WorkerState
|
|
19
20
|
from textual.widgets import Button, DataTable, Static
|
|
20
21
|
|
|
22
|
+
from ...logging_config import setup_logger
|
|
21
23
|
from .openable_table import OpenableDataTable
|
|
22
24
|
|
|
25
|
+
logger = setup_logger("realign.dashboard.events", "dashboard.log")
|
|
26
|
+
|
|
23
27
|
|
|
24
28
|
class EventsListTable(OpenableDataTable):
|
|
25
29
|
"""Events list table with multi-select behavior."""
|
|
@@ -123,38 +127,50 @@ class EventsTable(Container):
|
|
|
123
127
|
|
|
124
128
|
def compose(self) -> ComposeResult:
|
|
125
129
|
"""Compose the events table layout."""
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
yield
|
|
147
|
-
|
|
148
|
-
|
|
130
|
+
logger.debug("EventsTable.compose() started")
|
|
131
|
+
try:
|
|
132
|
+
with Vertical(classes="action-section"):
|
|
133
|
+
yield Button(
|
|
134
|
+
"Load selected context to current agent",
|
|
135
|
+
id="load-context-btn",
|
|
136
|
+
variant="primary",
|
|
137
|
+
disabled=True,
|
|
138
|
+
)
|
|
139
|
+
yield Button(
|
|
140
|
+
"Share selected events to others",
|
|
141
|
+
id="share-event-btn",
|
|
142
|
+
variant="primary",
|
|
143
|
+
disabled=True,
|
|
144
|
+
)
|
|
145
|
+
yield Button(
|
|
146
|
+
"Import context from others",
|
|
147
|
+
id="share-import-btn",
|
|
148
|
+
variant="primary",
|
|
149
|
+
)
|
|
150
|
+
yield Static(id="section-header", classes="section-header")
|
|
151
|
+
with Container(classes="table-container"):
|
|
152
|
+
yield EventsListTable(id="events-table")
|
|
153
|
+
yield Static(id="pagination-info", classes="pagination-info")
|
|
154
|
+
yield Static(id="stats-info", classes="stats-info")
|
|
155
|
+
logger.debug("EventsTable.compose() completed")
|
|
156
|
+
except Exception as e:
|
|
157
|
+
logger.error(f"EventsTable.compose() failed: {e}\n{traceback.format_exc()}")
|
|
158
|
+
raise
|
|
149
159
|
|
|
150
160
|
def on_mount(self) -> None:
|
|
151
161
|
"""Set up the table on mount."""
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
162
|
+
logger.debug("EventsTable.on_mount() started")
|
|
163
|
+
try:
|
|
164
|
+
table = self.query_one("#events-table", EventsListTable)
|
|
165
|
+
table.owner = self
|
|
166
|
+
self._setup_table_columns(table)
|
|
167
|
+
|
|
168
|
+
# Calculate initial rows per page
|
|
169
|
+
self._calculate_rows_per_page()
|
|
170
|
+
logger.debug("EventsTable.on_mount() completed")
|
|
171
|
+
except Exception as e:
|
|
172
|
+
logger.error(f"EventsTable.on_mount() failed: {e}\n{traceback.format_exc()}")
|
|
173
|
+
raise
|
|
158
174
|
|
|
159
175
|
def on_resize(self) -> None:
|
|
160
176
|
"""Handle window resize to adjust rows per page."""
|
|
@@ -203,8 +203,8 @@ class TerminalPanel(Container, can_focus=True):
|
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
TerminalPanel .terminal-row Button.terminal-close {
|
|
206
|
-
width:
|
|
207
|
-
min-width:
|
|
206
|
+
width: 3;
|
|
207
|
+
min-width: 3;
|
|
208
208
|
height: 2;
|
|
209
209
|
margin-left: 1;
|
|
210
210
|
padding: 0;
|
|
@@ -221,8 +221,8 @@ class TerminalPanel(Container, can_focus=True):
|
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
TerminalPanel .terminal-row Button.terminal-toggle {
|
|
224
|
-
width:
|
|
225
|
-
min-width:
|
|
224
|
+
width: 3;
|
|
225
|
+
min-width: 3;
|
|
226
226
|
height: 2;
|
|
227
227
|
margin-left: 1;
|
|
228
228
|
padding: 0;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|