aline-ai 0.6.5__py3-none-any.whl → 0.6.7__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.
Files changed (42) hide show
  1. {aline_ai-0.6.5.dist-info → aline_ai-0.6.7.dist-info}/METADATA +1 -1
  2. {aline_ai-0.6.5.dist-info → aline_ai-0.6.7.dist-info}/RECORD +41 -34
  3. realign/__init__.py +1 -1
  4. realign/agent_names.py +79 -0
  5. realign/claude_hooks/stop_hook.py +3 -0
  6. realign/claude_hooks/terminal_state.py +43 -1
  7. realign/claude_hooks/user_prompt_submit_hook.py +3 -0
  8. realign/cli.py +62 -0
  9. realign/codex_detector.py +18 -3
  10. realign/codex_home.py +65 -16
  11. realign/codex_terminal_linker.py +18 -7
  12. realign/commands/agent.py +109 -0
  13. realign/commands/doctor.py +74 -1
  14. realign/commands/export_shares.py +448 -0
  15. realign/commands/import_shares.py +203 -1
  16. realign/commands/search.py +58 -29
  17. realign/commands/sync_agent.py +347 -0
  18. realign/dashboard/app.py +9 -9
  19. realign/dashboard/clipboard.py +54 -0
  20. realign/dashboard/screens/__init__.py +4 -0
  21. realign/dashboard/screens/agent_detail.py +333 -0
  22. realign/dashboard/screens/create_agent_info.py +244 -0
  23. realign/dashboard/screens/event_detail.py +6 -27
  24. realign/dashboard/styles/dashboard.tcss +22 -28
  25. realign/dashboard/tmux_manager.py +36 -10
  26. realign/dashboard/widgets/__init__.py +2 -2
  27. realign/dashboard/widgets/agents_panel.py +1248 -0
  28. realign/dashboard/widgets/events_table.py +4 -27
  29. realign/dashboard/widgets/sessions_table.py +4 -27
  30. realign/db/base.py +69 -0
  31. realign/db/locks.py +4 -0
  32. realign/db/schema.py +111 -2
  33. realign/db/sqlite_db.py +360 -2
  34. realign/events/agent_summarizer.py +157 -0
  35. realign/events/session_summarizer.py +25 -0
  36. realign/watcher_core.py +193 -5
  37. realign/worker_core.py +59 -1
  38. realign/dashboard/widgets/terminal_panel.py +0 -1653
  39. {aline_ai-0.6.5.dist-info → aline_ai-0.6.7.dist-info}/WHEEL +0 -0
  40. {aline_ai-0.6.5.dist-info → aline_ai-0.6.7.dist-info}/entry_points.txt +0 -0
  41. {aline_ai-0.6.5.dist-info → aline_ai-0.6.7.dist-info}/licenses/LICENSE +0 -0
  42. {aline_ai-0.6.5.dist-info → aline_ai-0.6.7.dist-info}/top_level.txt +0 -0
@@ -156,75 +156,69 @@ Tab:hover {
156
156
  background: $surface-lighten-1;
157
157
  }
158
158
 
159
- /* Terminal tab: compact layout without "boxed" buttons/panels. */
160
- TerminalPanel {
159
+ /* Agents tab: compact layout matching terminal panel */
160
+ AgentsPanel {
161
161
  padding: 0 1;
162
162
  }
163
163
 
164
- TerminalPanel:focus {
164
+ AgentsPanel:focus {
165
165
  border: none;
166
166
  }
167
167
 
168
- TerminalPanel .summary {
168
+ AgentsPanel .summary {
169
169
  background: transparent;
170
170
  border: none;
171
171
  padding: 0;
172
172
  margin: 0 0 1 0;
173
173
  }
174
174
 
175
- TerminalPanel .list {
175
+ AgentsPanel .list {
176
176
  background: transparent;
177
177
  border: none;
178
178
  padding: 0;
179
179
  }
180
180
 
181
- TerminalPanel Button {
181
+ AgentsPanel Button {
182
182
  min-width: 0;
183
183
  background: transparent;
184
184
  border: none;
185
185
  padding: 0 1;
186
186
  }
187
187
 
188
- TerminalPanel Button:hover {
188
+ AgentsPanel Button:hover {
189
189
  background: $surface-lighten-1;
190
190
  }
191
191
 
192
- TerminalPanel .terminal-row Button.terminal-switch.active {
193
- background: $primary;
194
- color: $text;
195
- text-style: bold;
196
- }
197
-
198
- TerminalPanel .terminal-row Button.terminal-switch {
192
+ AgentsPanel .agent-row Button.agent-name {
199
193
  text-align: left;
200
- content-align: left top;
194
+ content-align: left middle;
201
195
  }
202
196
 
203
- TerminalPanel .terminal-row Button.terminal-close {
204
- padding: 0;
205
- width: 3;
206
- min-width: 3;
197
+ AgentsPanel .agent-row Button.agent-create {
198
+ width: auto;
199
+ min-width: 8;
207
200
  }
208
201
 
209
- TerminalPanel .terminal-row Button.terminal-toggle {
202
+ AgentsPanel .agent-row Button.agent-delete {
210
203
  padding: 0;
211
204
  width: 3;
212
205
  min-width: 3;
213
206
  }
214
207
 
215
- TerminalPanel .context-sessions {
208
+ AgentsPanel .terminal-list {
209
+ background: transparent;
216
210
  border: none;
217
211
  padding: 0;
218
- height: 8;
219
- overflow-y: auto;
212
+ margin: 0 0 1 2;
220
213
  }
221
214
 
222
- TerminalPanel Button.context-session {
215
+ AgentsPanel .terminal-row Button.terminal-switch {
223
216
  text-align: left;
224
- content-align: left middle;
217
+ content-align: left top;
225
218
  }
226
219
 
227
- TerminalPanel .context-sessions Static {
228
- text-align: left;
229
- content-align: left middle;
220
+ AgentsPanel .terminal-row Button.terminal-close {
221
+ padding: 0;
222
+ width: 3;
223
+ min-width: 3;
230
224
  }
@@ -776,16 +776,42 @@ def list_inner_windows() -> list[InnerWindow]:
776
776
 
777
777
  if terminal_id:
778
778
  persisted = state.get(terminal_id) or {}
779
- if not provider:
780
- provider = persisted.get("provider") or provider
781
- if not session_type:
782
- session_type = persisted.get("session_type") or session_type
783
- if not session_id:
784
- session_id = persisted.get("session_id") or session_id
785
- if not transcript_path:
786
- transcript_path = persisted.get("transcript_path") or transcript_path
787
- if not context_id:
788
- context_id = persisted.get("context_id") or context_id
779
+ updates: dict[str, str] = {}
780
+ persisted_provider = (persisted.get("provider") or "").strip()
781
+ if persisted_provider and persisted_provider != (provider or "").strip():
782
+ provider = persisted_provider
783
+ updates[OPT_PROVIDER] = persisted_provider
784
+ if not provider and persisted_provider:
785
+ provider = persisted_provider
786
+ persisted_session_type = (persisted.get("session_type") or "").strip()
787
+ if persisted_session_type and persisted_session_type != (session_type or "").strip():
788
+ session_type = persisted_session_type
789
+ updates[OPT_SESSION_TYPE] = persisted_session_type
790
+ if not session_type and persisted_session_type:
791
+ session_type = persisted_session_type
792
+ persisted_session_id = (persisted.get("session_id") or "").strip()
793
+ if persisted_session_id and persisted_session_id != (session_id or "").strip():
794
+ session_id = persisted_session_id
795
+ updates[OPT_SESSION_ID] = persisted_session_id
796
+ if not session_id and persisted_session_id:
797
+ session_id = persisted_session_id
798
+ persisted_transcript = (persisted.get("transcript_path") or "").strip()
799
+ if persisted_transcript and persisted_transcript != (transcript_path or "").strip():
800
+ transcript_path = persisted_transcript
801
+ updates[OPT_TRANSCRIPT_PATH] = persisted_transcript
802
+ if not transcript_path and persisted_transcript:
803
+ transcript_path = persisted_transcript
804
+ persisted_context = (persisted.get("context_id") or "").strip()
805
+ if persisted_context and persisted_context != (context_id or "").strip():
806
+ context_id = persisted_context
807
+ updates[OPT_CONTEXT_ID] = persisted_context
808
+ if not context_id and persisted_context:
809
+ context_id = persisted_context
810
+ if updates:
811
+ try:
812
+ set_inner_window_options(window_id, updates)
813
+ except Exception:
814
+ pass
789
815
 
790
816
  transcript_session_id = _session_id_from_transcript_path(transcript_path)
791
817
  if transcript_session_id:
@@ -8,7 +8,7 @@ from .events_table import EventsTable
8
8
  from .config_panel import ConfigPanel
9
9
  from .search_panel import SearchPanel
10
10
  from .openable_table import OpenableDataTable
11
- from .terminal_panel import TerminalPanel
11
+ from .agents_panel import AgentsPanel
12
12
 
13
13
  __all__ = [
14
14
  "AlineHeader",
@@ -19,5 +19,5 @@ __all__ = [
19
19
  "ConfigPanel",
20
20
  "SearchPanel",
21
21
  "OpenableDataTable",
22
- "TerminalPanel",
22
+ "AgentsPanel",
23
23
  ]