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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aline-ai
3
- Version: 0.5.8
3
+ Version: 0.5.9
4
4
  Summary: Shared AI memory; everyone knows everything in teams
5
5
  Author: Sharemind
6
6
  License: MIT
@@ -1,5 +1,5 @@
1
- aline_ai-0.5.8.dist-info/licenses/LICENSE,sha256=H8wTqV5IF1oHw_HbBtS1PSDU8G_q81yblEIL_JfV8Vo,1077
2
- realign/__init__.py,sha256=r_zeipazrpik0MPgEERMIzrPFCcbvLypS_erc6wytjc,1623
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=DdCiumQ7YQZnje5VfOQ60585C0X6Va_AhBQi_zmhE0Y,24035
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=9sSIs3r4V8eeTwCK56s7fnYxjMEuASP8EcmK1fhpUmA,3454
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=OG9RjwU4c50-RUMmdhXzmIMnYrt6_mCP1GNQWDAX95s,30368
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=S4UUMlFaBWDKZB_MR0jhBNvdwdGvPuRNHNxweFGDfks,28751
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.8.dist-info/METADATA,sha256=S2cnGF2C84A28xQzAGz7nszWbBKErn4LazeX6KhAiBA,1597
92
- aline_ai-0.5.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
93
- aline_ai-0.5.8.dist-info/entry_points.txt,sha256=TvYELpMoWsUTcQdMV8tBHxCbEf_LbK4sESqK3r8PM6Y,78
94
- aline_ai-0.5.8.dist-info/top_level.txt,sha256=yIL3s2xv9nf1GwD5n71Aq_JEIV4AfzCIDNKBzewuRm4,8
95
- aline_ai-0.5.8.dist-info/RECORD,,
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
@@ -3,7 +3,7 @@
3
3
  import hashlib
4
4
  from pathlib import Path
5
5
 
6
- __version__ = "0.5.8"
6
+ __version__ = "0.5.9"
7
7
 
8
8
 
9
9
  def get_realign_dir(project_root: Path) -> Path:
@@ -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: 2;
206
- min-width: 2;
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: 2;
212
- min-width: 2;
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
- if in_tmux() or not tmux_available():
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
- with Vertical(classes="action-section"):
127
- yield Button(
128
- "Load selected context to current agent",
129
- id="load-context-btn",
130
- variant="primary",
131
- disabled=True,
132
- )
133
- yield Button(
134
- "Share selected events to others",
135
- id="share-event-btn",
136
- variant="primary",
137
- disabled=True,
138
- )
139
- yield Button(
140
- "Import context from others",
141
- id="share-import-btn",
142
- variant="primary",
143
- )
144
- yield Static(id="section-header", classes="section-header")
145
- with Container(classes="table-container"):
146
- yield EventsListTable(id="events-table")
147
- yield Static(id="pagination-info", classes="pagination-info")
148
- yield Static(id="stats-info", classes="stats-info")
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
- table = self.query_one("#events-table", EventsListTable)
153
- table.owner = self
154
- self._setup_table_columns(table)
155
-
156
- # Calculate initial rows per page
157
- self._calculate_rows_per_page()
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: 2;
207
- min-width: 2;
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: 2;
225
- min-width: 2;
224
+ width: 3;
225
+ min-width: 3;
226
226
  height: 2;
227
227
  margin-left: 1;
228
228
  padding: 0;