overcode 0.1.3__py3-none-any.whl → 0.1.4__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 (41) hide show
  1. overcode/__init__.py +1 -1
  2. overcode/cli.py +7 -2
  3. overcode/implementations.py +74 -8
  4. overcode/monitor_daemon.py +60 -65
  5. overcode/monitor_daemon_core.py +261 -0
  6. overcode/monitor_daemon_state.py +7 -0
  7. overcode/session_manager.py +1 -0
  8. overcode/settings.py +22 -0
  9. overcode/supervisor_daemon.py +48 -47
  10. overcode/supervisor_daemon_core.py +210 -0
  11. overcode/testing/__init__.py +6 -0
  12. overcode/testing/renderer.py +268 -0
  13. overcode/testing/tmux_driver.py +223 -0
  14. overcode/testing/tui_eye.py +185 -0
  15. overcode/testing/tui_eye_skill.md +187 -0
  16. overcode/tmux_manager.py +17 -3
  17. overcode/tui.py +196 -2462
  18. overcode/tui_actions/__init__.py +20 -0
  19. overcode/tui_actions/daemon.py +201 -0
  20. overcode/tui_actions/input.py +128 -0
  21. overcode/tui_actions/navigation.py +117 -0
  22. overcode/tui_actions/session.py +428 -0
  23. overcode/tui_actions/view.py +357 -0
  24. overcode/tui_helpers.py +41 -9
  25. overcode/tui_logic.py +347 -0
  26. overcode/tui_render.py +414 -0
  27. overcode/tui_widgets/__init__.py +24 -0
  28. overcode/tui_widgets/command_bar.py +399 -0
  29. overcode/tui_widgets/daemon_panel.py +153 -0
  30. overcode/tui_widgets/daemon_status_bar.py +245 -0
  31. overcode/tui_widgets/help_overlay.py +71 -0
  32. overcode/tui_widgets/preview_pane.py +69 -0
  33. overcode/tui_widgets/session_summary.py +514 -0
  34. overcode/tui_widgets/status_timeline.py +253 -0
  35. {overcode-0.1.3.dist-info → overcode-0.1.4.dist-info}/METADATA +3 -1
  36. overcode-0.1.4.dist-info/RECORD +68 -0
  37. {overcode-0.1.3.dist-info → overcode-0.1.4.dist-info}/entry_points.txt +1 -0
  38. overcode-0.1.3.dist-info/RECORD +0 -45
  39. {overcode-0.1.3.dist-info → overcode-0.1.4.dist-info}/WHEEL +0 -0
  40. {overcode-0.1.3.dist-info → overcode-0.1.4.dist-info}/licenses/LICENSE +0 -0
  41. {overcode-0.1.3.dist-info → overcode-0.1.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,253 @@
1
+ """
2
+ Status timeline widget for TUI.
3
+
4
+ Shows historical status timelines for user presence and agents.
5
+ """
6
+
7
+ from datetime import datetime, timedelta
8
+
9
+ from textual.widgets import Static
10
+ from rich.text import Text
11
+
12
+ from ..presence_logger import read_presence_history, MACOS_APIS_AVAILABLE
13
+ from ..settings import get_agent_history_path
14
+ from ..status_history import read_agent_status_history
15
+ from ..config import get_timeline_config
16
+ from ..tui_helpers import (
17
+ presence_state_to_char,
18
+ get_presence_color,
19
+ agent_status_to_char,
20
+ get_agent_timeline_color,
21
+ truncate_name,
22
+ build_timeline_slots,
23
+ )
24
+
25
+
26
+ class StatusTimeline(Static):
27
+ """Widget displaying historical status timelines for user presence and agents.
28
+
29
+ Shows the last N hours with each character representing a time slice.
30
+ - User presence: green=active, yellow=inactive, red/gray=locked/away
31
+ - Agent status: green=running, red=waiting, grey=terminated
32
+
33
+ Timeline hours configurable via ~/.overcode/config.yaml (timeline.hours).
34
+ """
35
+
36
+ TIMELINE_HOURS = 3.0 # Default hours
37
+ MIN_NAME_WIDTH = 6 # Minimum width for agent names
38
+ MAX_NAME_WIDTH = 30 # Maximum width for agent names
39
+ MIN_TIMELINE = 20 # Minimum timeline width
40
+ DEFAULT_TIMELINE = 60 # Fallback if can't detect width
41
+
42
+ def __init__(self, sessions: list, tmux_session: str = "agents", *args, **kwargs):
43
+ super().__init__(*args, **kwargs)
44
+ self.sessions = sessions
45
+ self.tmux_session = tmux_session
46
+ self._presence_history = []
47
+ self._agent_histories = {}
48
+ # Get timeline hours from config (config file > env var > default)
49
+ timeline_config = get_timeline_config()
50
+ self.timeline_hours = timeline_config["hours"]
51
+
52
+ @property
53
+ def label_width(self) -> int:
54
+ """Calculate label width based on longest agent name (#75)."""
55
+ if not self.sessions:
56
+ return self.MIN_NAME_WIDTH
57
+ longest = max(len(s.name) for s in self.sessions)
58
+ # Clamp to min/max and add padding for " " prefix and " " suffix
59
+ return min(self.MAX_NAME_WIDTH, max(self.MIN_NAME_WIDTH, longest))
60
+
61
+ @property
62
+ def timeline_width(self) -> int:
63
+ """Calculate timeline width based on available space after labels (#75)."""
64
+ import shutil
65
+ try:
66
+ # Try to get terminal size directly - most reliable
67
+ term_width = shutil.get_terminal_size().columns
68
+ # Subtract:
69
+ # - label_width (agent name)
70
+ # - 3 for " " prefix and " " suffix around label
71
+ # - 5 for percentage display " XXX%"
72
+ # - 2 for CSS padding (padding: 0 1 = 1 char each side)
73
+ available = term_width - self.label_width - 3 - 5 - 2
74
+ return max(self.MIN_TIMELINE, min(available, 200))
75
+ except (OSError, ValueError):
76
+ # No terminal available or invalid size
77
+ return self.DEFAULT_TIMELINE
78
+
79
+ def update_history(self, sessions: list) -> None:
80
+ """Refresh history data from log files."""
81
+ self.sessions = sessions
82
+ self._presence_history = read_presence_history(hours=self.timeline_hours)
83
+ self._agent_histories = {}
84
+
85
+ # Get agent names from sessions
86
+ agent_names = [s.name for s in sessions]
87
+
88
+ # Read agent history from session-specific file and group by agent
89
+ history_path = get_agent_history_path(self.tmux_session)
90
+ all_history = read_agent_status_history(hours=self.timeline_hours, history_file=history_path)
91
+ for ts, agent, status, activity in all_history:
92
+ if agent not in self._agent_histories:
93
+ self._agent_histories[agent] = []
94
+ self._agent_histories[agent].append((ts, status))
95
+
96
+ # Force layout refresh when content changes (agent count may have changed)
97
+ self.refresh(layout=True)
98
+
99
+ def _build_timeline(self, history: list, state_to_char: callable) -> str:
100
+ """Build a timeline string from history data.
101
+
102
+ Args:
103
+ history: List of (timestamp, state) tuples
104
+ state_to_char: Function to convert state to display character
105
+
106
+ Returns:
107
+ String of timeline_width characters representing the timeline
108
+ """
109
+ width = self.timeline_width
110
+ if not history:
111
+ return "─" * width
112
+
113
+ now = datetime.now()
114
+ start_time = now - timedelta(hours=self.timeline_hours)
115
+ slot_duration = timedelta(hours=self.timeline_hours) / width
116
+
117
+ # Initialize timeline with empty slots
118
+ timeline = ["─"] * width
119
+
120
+ # Fill in slots based on history
121
+ for ts, state in history:
122
+ if ts < start_time:
123
+ continue
124
+ # Calculate which slot this belongs to
125
+ elapsed = ts - start_time
126
+ slot_idx = int(elapsed / slot_duration)
127
+ if 0 <= slot_idx < width:
128
+ timeline[slot_idx] = state_to_char(state)
129
+
130
+ return "".join(timeline)
131
+
132
+ def render(self) -> Text:
133
+ """Render the timeline visualization."""
134
+ content = Text()
135
+ now = datetime.now()
136
+ width = self.timeline_width
137
+
138
+ # Calculate baseline slot position if baseline > 0
139
+ try:
140
+ baseline_minutes = getattr(self.app, 'baseline_minutes', 0)
141
+ except Exception:
142
+ baseline_minutes = 0 # No app context (e.g., in tests)
143
+ baseline_slot = None
144
+ if baseline_minutes > 0:
145
+ baseline_hours = baseline_minutes / 60.0
146
+ if baseline_hours <= self.timeline_hours:
147
+ # Position from right (now = width-1, -3h = 0)
148
+ baseline_slot = width - 1 - int((baseline_hours / self.timeline_hours) * (width - 1))
149
+
150
+ # Time scale header
151
+ label_w = self.label_width
152
+ content.append("Timeline: ", style="bold")
153
+ content.append(f"-{self.timeline_hours:.0f}h", style="dim")
154
+ header_padding = max(0, width - 10)
155
+ content.append(" " * header_padding, style="dim")
156
+ content.append("now", style="dim")
157
+ content.append("\n")
158
+
159
+ # User presence timeline - group by time slots like agent timelines
160
+ # Align with agent names using dynamic label width (#75)
161
+ content.append(f" {'User:':<{label_w}} ", style="cyan")
162
+ if self._presence_history:
163
+ slot_states = build_timeline_slots(
164
+ self._presence_history, width, self.timeline_hours, now
165
+ )
166
+ # Render timeline with colors, including baseline marker
167
+ for i in range(width):
168
+ if i == baseline_slot:
169
+ content.append("|", style="bold cyan")
170
+ elif i in slot_states:
171
+ state = slot_states[i]
172
+ char = presence_state_to_char(state)
173
+ color = get_presence_color(state)
174
+ content.append(char, style=color)
175
+ else:
176
+ content.append("─", style="dim")
177
+ elif not MACOS_APIS_AVAILABLE:
178
+ # Show install instructions when presence deps not installed (macOS only)
179
+ msg = "macOS only - pip install overcode[presence]"
180
+ content.append(msg[:width], style="dim italic")
181
+ else:
182
+ # Empty timeline but still show baseline marker
183
+ for i in range(width):
184
+ if i == baseline_slot:
185
+ content.append("|", style="bold cyan")
186
+ else:
187
+ content.append("─", style="dim")
188
+ content.append("\n")
189
+
190
+ # Agent timelines
191
+ for session in self.sessions:
192
+ agent_name = session.name
193
+ history = self._agent_histories.get(agent_name, [])
194
+
195
+ # Use dynamic label width (#75)
196
+ display_name = truncate_name(agent_name, max_len=label_w)
197
+ content.append(f" {display_name} ", style="cyan")
198
+
199
+ green_slots = 0
200
+ total_slots = 0
201
+ if history:
202
+ slot_states = build_timeline_slots(history, width, self.timeline_hours, now)
203
+ # Render timeline with colors, including baseline marker
204
+ for i in range(width):
205
+ if i == baseline_slot:
206
+ content.append("|", style="bold cyan")
207
+ # Still count the underlying slot for percentage
208
+ if i in slot_states:
209
+ total_slots += 1
210
+ if slot_states[i] == "running":
211
+ green_slots += 1
212
+ elif i in slot_states:
213
+ status = slot_states[i]
214
+ char = agent_status_to_char(status)
215
+ color = get_agent_timeline_color(status)
216
+ content.append(char, style=color)
217
+ total_slots += 1
218
+ if status == "running":
219
+ green_slots += 1
220
+ else:
221
+ content.append("─", style="dim")
222
+ else:
223
+ # Empty timeline but still show baseline marker
224
+ for i in range(width):
225
+ if i == baseline_slot:
226
+ content.append("|", style="bold cyan")
227
+ else:
228
+ content.append("─", style="dim")
229
+
230
+ # Show percentage green in last 3 hours
231
+ if total_slots > 0:
232
+ pct = green_slots / total_slots * 100
233
+ pct_style = "bold green" if pct >= 50 else "bold red"
234
+ content.append(f" {pct:>3.0f}%", style=pct_style)
235
+ else:
236
+ content.append(" - ", style="dim")
237
+
238
+ content.append("\n")
239
+
240
+ # Legend (combined on one line to save space)
241
+ content.append(f" {'Legend:':<14} ", style="dim")
242
+ content.append("█", style="green")
243
+ content.append("active/running ", style="dim")
244
+ content.append("▒", style="yellow")
245
+ content.append("inactive ", style="dim")
246
+ content.append("░", style="red")
247
+ content.append("waiting/away ", style="dim")
248
+ content.append("░", style="dim")
249
+ content.append("asleep ", style="dim")
250
+ content.append("×", style="dim")
251
+ content.append("terminated", style="dim")
252
+
253
+ return content
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: overcode
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: A supervisor for managing multiple Claude Code instances in tmux
5
5
  Author: Mike Bond
6
6
  Project-URL: Homepage, https://github.com/mkb23/overcode
@@ -31,6 +31,8 @@ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
31
31
  Requires-Dist: pytest-timeout>=2.1.0; extra == "dev"
32
32
  Requires-Dist: black>=23.0.0; extra == "dev"
33
33
  Requires-Dist: mypy>=1.0.0; extra == "dev"
34
+ Requires-Dist: pyte>=0.8.0; extra == "dev"
35
+ Requires-Dist: pillow>=10.0.0; extra == "dev"
34
36
  Provides-Extra: presence
35
37
  Requires-Dist: pyobjc-framework-Quartz>=10.0; extra == "presence"
36
38
  Requires-Dist: pyobjc-framework-ApplicationServices>=10.0; extra == "presence"
@@ -0,0 +1,68 @@
1
+ overcode/__init__.py,sha256=mUexAIqSlO8Thp0tUhOzfVJw8gG8yG_ojjftYNvVjfU,100
2
+ overcode/cli.py,sha256=ehihJoGYsIDqCTvmCOGu9CL8ukiCXb7zKGALQ1awwm4,32736
3
+ overcode/config.py,sha256=BoGxnDpiD1IYLS1gaw7NQyXrV_qoKBTKOio2Az46xUU,5416
4
+ overcode/daemon_claude_skill.md,sha256=kc3qTzQNvmJoaNfRqmAWN_iMSwkWnfYKzgN0DnexOeE,5614
5
+ overcode/daemon_logging.py,sha256=kfx52LpMhNl1C_Qg62cvQNRIEDisTOpp0-uCRkg-1_s,5275
6
+ overcode/daemon_utils.py,sha256=FoxxOcfbiG5YgkYiyJBOG8PNb0X-2NqHcXWQ_dv0cBs,2405
7
+ overcode/data_export.py,sha256=ZnPXZVh6WI1lzLz51dZIK6fYMXy9CyJsVAglmUQMNKo,8220
8
+ overcode/dependency_check.py,sha256=dAAtKigrAJTnED9_nyZGP39wR56wNJ6bD84iKrQkIMQ,6162
9
+ overcode/exceptions.py,sha256=_H-GtmDRuZQ1Fucbq6_T-4tmC9C706F18poqDs6q1Kw,4795
10
+ overcode/history_reader.py,sha256=gUWlGUk_2IfXWy0zYHve-7TFPaWDrn7y4-m-fYFuGPs,17398
11
+ overcode/implementations.py,sha256=SRkQ-APkyX5WDKeQiK1xZ2Eo8fA6WMotJE0-_oYW0pc,11077
12
+ overcode/interfaces.py,sha256=txVkMHHhQl7dpsBS2jx7sR-BHwKiqlAj-YRw7pFkZdg,1101
13
+ overcode/launcher.py,sha256=OUR3OZc0ZA9sbk1wZ_NzQ7aokI1M3j_oKtNaws1QskM,16127
14
+ overcode/logging_config.py,sha256=BuioELKEdfx_amx35sVIdR1tyf2nbhfmOPLp5778lcs,5755
15
+ overcode/mocks.py,sha256=7eAAdI3yPkModUbpaOp3Ul2nO7pJ6Tlz1L1qQH7nG_0,5289
16
+ overcode/monitor_daemon.py,sha256=PaVvsTkDbYx4T93rsbRmenGp7D_r3yNg5fVeVuCCHts,26664
17
+ overcode/monitor_daemon_core.py,sha256=UZWUML3pXdk5HNP3HawRdtVzB-xcWxuhUHBaObex2v4,7908
18
+ overcode/monitor_daemon_state.py,sha256=NG6rbXjdzULA5kbFqXw0dW9BBNc_IJtifrCUJD2z6TU,15501
19
+ overcode/pid_utils.py,sha256=3sg0DkNXWJpKnGuGqwJAiA1lNB78grDILSDObXgTul0,7570
20
+ overcode/presence_logger.py,sha256=0jIUPrhbeU0CDL9W2J7CbDPbAc-WPD4n4LFJJbLZ7Tc,13338
21
+ overcode/protocols.py,sha256=NfSrm9F4h608eEFvs438KxFBg5r8E0Ni5etBWsS9IeY,4268
22
+ overcode/session_manager.py,sha256=de9ApuZUpsChNT0HnC4RLmjPoucHU937h0q0sSsSJ68,25303
23
+ overcode/settings.py,sha256=IxG_pcTzZD3rTP3nN1f8_94NHxGn6STIdDWCfNVeuW8,15849
24
+ overcode/standing_instructions.py,sha256=F9zYuGY0A7V90-SL2e-kLySfJACJvVjlsDZpq3BEI9k,10034
25
+ overcode/status_constants.py,sha256=ejXJjWCtW7LSjlS0W2gKBPhFjhz3pIHZ_5XitEgnCqw,6317
26
+ overcode/status_detector.py,sha256=-hQgLuHAKVrWYMKKHNv629kmhMJMaY5he6ERsv4S3_U,16592
27
+ overcode/status_history.py,sha256=NzhVuTqHkSqgTTdwNfQ8wudCggYjhelZWxpZh6AmzCM,4778
28
+ overcode/status_patterns.py,sha256=qoXpwJ7Kz_1SLyKpim5dDYNIZWqKfgr-QoyYNK_0IzQ,9279
29
+ overcode/summarizer_client.py,sha256=KTC4Bos4BlMeEmf98ZgNg7LZ_gEl8rMj9Z0LyCtsn0Q,5586
30
+ overcode/summarizer_component.py,sha256=pBvlxxA2WnZ-DdmE_g_L9EMFToFCF3qGMguAiHxIa1o,9828
31
+ overcode/supervisor_daemon.py,sha256=KpAXR9mR3RaTEJqLLQ-jZ3Hg3TobIkuMuJTU1q5aydk,32890
32
+ overcode/supervisor_daemon_core.py,sha256=5kcDLeUfxsuFHr1pWgXkWWAbOybRrMjZ5Q2DnpZWez0,6545
33
+ overcode/supervisor_layout.sh,sha256=s0Fm4Fj7adv5IOsMx1JuA6OAXCoQx9OUnS1CmV0FOwI,1652
34
+ overcode/tmux_manager.py,sha256=l3iplAiDO3MyqXaU05OpL9Stj7f8g4iZIviCV4nhXR0,8444
35
+ overcode/tui.py,sha256=TO36qepTJFeRh2Jkc4uOgxHjrs5w9JNLKxkp4P9mamI,55001
36
+ overcode/tui_helpers.py,sha256=ZHAQOh9tvsWpNT31AmGYs0002saNT5OFihmChr1UrW0,16137
37
+ overcode/tui_logic.py,sha256=chQcTPT3vRF7UZXr7HKZOxb-lsdYf28rWHfYoC89Ul4,9953
38
+ overcode/tui_render.py,sha256=MGyn2m5lrsVwMTBBzgH9N-x9AdOOC4qdVHa3lMIcdio,14381
39
+ overcode/web_api.py,sha256=L4shmXWpnPZA6DCeYFiVeLobxqFCSYlqbFG8fGupwqI,25815
40
+ overcode/web_chartjs.py,sha256=8wxfa9K0dXrcBOcPF7UkQFsCybNHDXEj9pEtnCDe-6g,205608
41
+ overcode/web_server.py,sha256=YFifXCx2MIJ6ca2c6bi5zKDlTjVgQmNBpkZ9o87kpp0,16674
42
+ overcode/web_server_runner.py,sha256=cRGeLAzsAF8B89SnK8MeFZ7vZCufjAcAiWhRjAtJ63A,3333
43
+ overcode/web_templates.py,sha256=GNqEyabj5-mqlNvw4lVHcNh18ofBLsKwxCUYS4JaKao,58882
44
+ overcode/testing/__init__.py,sha256=WPS_frY5-305D0MGibWmKnCJDEgy0yocYVJkmiSCkY0,192
45
+ overcode/testing/renderer.py,sha256=Y0sBwo5W18RYvGdDQrXwqAtQIUftDLIrDtY4LBcV8ZM,8292
46
+ overcode/testing/tmux_driver.py,sha256=Ijy3q9VmylRqqCX7IivBb-VHWeMhs29xdbjx98scLco,6634
47
+ overcode/testing/tui_eye.py,sha256=9Ddo2RCGGgqOFu5KURkywUSPkfoX-XDShguCCKnvhCY,5149
48
+ overcode/testing/tui_eye_skill.md,sha256=9OaLwZ9FVK30zJfvk-xUa0h_ap1MBJADpkY5jBu6EEw,4548
49
+ overcode/tui_actions/__init__.py,sha256=qmu1azHGO4f_HoodUsR75gczRLj_IUfYooZdorp8wbc,513
50
+ overcode/tui_actions/daemon.py,sha256=jIAK__nhYT5Ine3z6xDQv4eRCdXbUrRksrUlhTBHnzY,8040
51
+ overcode/tui_actions/input.py,sha256=WEveXStjHcNP40JZo4YhSgWsap-FtJIyqkz9dHP2GWM,4763
52
+ overcode/tui_actions/navigation.py,sha256=eEbM608SmI_pY_jyAQ_t-g4QbX-pIrRi2w5nT1weRSI,4718
53
+ overcode/tui_actions/session.py,sha256=xwiVB5NRDYfHn2xz7SWOGsayskRSE0CsM4wXL3o8e3w,16894
54
+ overcode/tui_actions/view.py,sha256=L1YBmNg8cQ0gxnjNaUlI9y_cPZ1hKkn0K2fL4ReIKso,13333
55
+ overcode/tui_widgets/__init__.py,sha256=lQ6B62acttwHY-OZeOxMiSICF-6e_DPXcqIX_ofwkQA,606
56
+ overcode/tui_widgets/command_bar.py,sha256=MaDyo6CzT-YPbvZaIcy9W8zh8FvSvFgk43o9Pq4JmIU,16552
57
+ overcode/tui_widgets/daemon_panel.py,sha256=7IY3C7dlgxfnkzspyoeu3MkAisnPSlLgC625XcEpNrU,5827
58
+ overcode/tui_widgets/daemon_status_bar.py,sha256=_2R_oH72WWLzTcafKOLTr9OjIKvnhqrCestjfgfNS2s,11286
59
+ overcode/tui_widgets/help_overlay.py,sha256=aZaWr-uZ_TAuv5WzNeVTI8JVmVQNQ0Clh_wQin_H2l0,6410
60
+ overcode/tui_widgets/preview_pane.py,sha256=evLlDGtHEl_yNdXNJtf6G-lkhs17Iz11BbIDZzGvtEU,2873
61
+ overcode/tui_widgets/session_summary.py,sha256=7uHlNfJ-xSoFMIrs6WK337uKTfALQLdQgvYfrfsDmlw,25566
62
+ overcode/tui_widgets/status_timeline.py,sha256=OTF5C0_R2pRPKcA37OZb4CG-XcHhqO3VekSvjo8W8hs,10368
63
+ overcode-0.1.4.dist-info/licenses/LICENSE,sha256=6C9I9dhq8QTa4P6LckWXugYJ3xm2ufZKrLymqOqRZFs,1066
64
+ overcode-0.1.4.dist-info/METADATA,sha256=HfPsGT_jJ3k8gZ0Xdsgf-0WDCU5E3UpnmKyrAaIEhLw,3432
65
+ overcode-0.1.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
66
+ overcode-0.1.4.dist-info/entry_points.txt,sha256=cMXnVDRHx7_a9kpEMFCtRmFnW9NsgoiASo2u-U9p8og,87
67
+ overcode-0.1.4.dist-info/top_level.txt,sha256=5cfXcNbSNvigE7coZgIRPCl_NDWHu_5UIBmWi9Xiupo,9
68
+ overcode-0.1.4.dist-info/RECORD,,
@@ -1,2 +1,3 @@
1
1
  [console_scripts]
2
2
  overcode = overcode.cli:main
3
+ tui-eye = overcode.testing.tui_eye:main
@@ -1,45 +0,0 @@
1
- overcode/__init__.py,sha256=k0UgFgXpc9IwrwwfYT1PMjPQhInprB1wGe-eqq2OeFo,100
2
- overcode/cli.py,sha256=tQJuc_LF1zPm33n4OJGZP82OMmGUg6x_QAeFCYv0Lbg,32494
3
- overcode/config.py,sha256=BoGxnDpiD1IYLS1gaw7NQyXrV_qoKBTKOio2Az46xUU,5416
4
- overcode/daemon_claude_skill.md,sha256=kc3qTzQNvmJoaNfRqmAWN_iMSwkWnfYKzgN0DnexOeE,5614
5
- overcode/daemon_logging.py,sha256=kfx52LpMhNl1C_Qg62cvQNRIEDisTOpp0-uCRkg-1_s,5275
6
- overcode/daemon_utils.py,sha256=FoxxOcfbiG5YgkYiyJBOG8PNb0X-2NqHcXWQ_dv0cBs,2405
7
- overcode/data_export.py,sha256=ZnPXZVh6WI1lzLz51dZIK6fYMXy9CyJsVAglmUQMNKo,8220
8
- overcode/dependency_check.py,sha256=dAAtKigrAJTnED9_nyZGP39wR56wNJ6bD84iKrQkIMQ,6162
9
- overcode/exceptions.py,sha256=_H-GtmDRuZQ1Fucbq6_T-4tmC9C706F18poqDs6q1Kw,4795
10
- overcode/history_reader.py,sha256=gUWlGUk_2IfXWy0zYHve-7TFPaWDrn7y4-m-fYFuGPs,17398
11
- overcode/implementations.py,sha256=CmT5M0U5y1YIa0omeqJ-J7Kbfw4xtfE6Olrk5Uzkirw,8315
12
- overcode/interfaces.py,sha256=txVkMHHhQl7dpsBS2jx7sR-BHwKiqlAj-YRw7pFkZdg,1101
13
- overcode/launcher.py,sha256=OUR3OZc0ZA9sbk1wZ_NzQ7aokI1M3j_oKtNaws1QskM,16127
14
- overcode/logging_config.py,sha256=BuioELKEdfx_amx35sVIdR1tyf2nbhfmOPLp5778lcs,5755
15
- overcode/mocks.py,sha256=7eAAdI3yPkModUbpaOp3Ul2nO7pJ6Tlz1L1qQH7nG_0,5289
16
- overcode/monitor_daemon.py,sha256=roG2jzw4Osem4LqW84471E0P_RWUtuVRbwTMZPdXvGk,26946
17
- overcode/monitor_daemon_state.py,sha256=aRSdT8rl47_LqmA0cxTd9PHzjXN9gG8Vn13mNz1K08E,15104
18
- overcode/pid_utils.py,sha256=3sg0DkNXWJpKnGuGqwJAiA1lNB78grDILSDObXgTul0,7570
19
- overcode/presence_logger.py,sha256=0jIUPrhbeU0CDL9W2J7CbDPbAc-WPD4n4LFJJbLZ7Tc,13338
20
- overcode/protocols.py,sha256=NfSrm9F4h608eEFvs438KxFBg5r8E0Ni5etBWsS9IeY,4268
21
- overcode/session_manager.py,sha256=PqdlcwVua6ktkn-soHNMTP5O8u5wRzf-Hf_dnVpnzVM,25235
22
- overcode/settings.py,sha256=OvSrQr2DdozvI5SSgScAAYDLfjKJECk1CSQk6lOozbQ,14550
23
- overcode/standing_instructions.py,sha256=F9zYuGY0A7V90-SL2e-kLySfJACJvVjlsDZpq3BEI9k,10034
24
- overcode/status_constants.py,sha256=ejXJjWCtW7LSjlS0W2gKBPhFjhz3pIHZ_5XitEgnCqw,6317
25
- overcode/status_detector.py,sha256=-hQgLuHAKVrWYMKKHNv629kmhMJMaY5he6ERsv4S3_U,16592
26
- overcode/status_history.py,sha256=NzhVuTqHkSqgTTdwNfQ8wudCggYjhelZWxpZh6AmzCM,4778
27
- overcode/status_patterns.py,sha256=qoXpwJ7Kz_1SLyKpim5dDYNIZWqKfgr-QoyYNK_0IzQ,9279
28
- overcode/summarizer_client.py,sha256=KTC4Bos4BlMeEmf98ZgNg7LZ_gEl8rMj9Z0LyCtsn0Q,5586
29
- overcode/summarizer_component.py,sha256=pBvlxxA2WnZ-DdmE_g_L9EMFToFCF3qGMguAiHxIa1o,9828
30
- overcode/supervisor_daemon.py,sha256=1HITlgKDidtp9Z3FD6ncJTYDFWmhMZovQ1IVM5w2aWo,33325
31
- overcode/supervisor_layout.sh,sha256=s0Fm4Fj7adv5IOsMx1JuA6OAXCoQx9OUnS1CmV0FOwI,1652
32
- overcode/tmux_manager.py,sha256=U9MKXCm6-maHotcEeeK4M8LE69md5KZmUB3Tj_QSD20,7742
33
- overcode/tui.py,sha256=O5k2O4rMnQ0HBACInFHrGuBV7VHBOLO7d4Ixm1-UHO0,151886
34
- overcode/tui_helpers.py,sha256=9BuYG9bR5MHnoLHM5eair_DX7APV9KCMLrnnQongi_8,14873
35
- overcode/web_api.py,sha256=L4shmXWpnPZA6DCeYFiVeLobxqFCSYlqbFG8fGupwqI,25815
36
- overcode/web_chartjs.py,sha256=8wxfa9K0dXrcBOcPF7UkQFsCybNHDXEj9pEtnCDe-6g,205608
37
- overcode/web_server.py,sha256=YFifXCx2MIJ6ca2c6bi5zKDlTjVgQmNBpkZ9o87kpp0,16674
38
- overcode/web_server_runner.py,sha256=cRGeLAzsAF8B89SnK8MeFZ7vZCufjAcAiWhRjAtJ63A,3333
39
- overcode/web_templates.py,sha256=GNqEyabj5-mqlNvw4lVHcNh18ofBLsKwxCUYS4JaKao,58882
40
- overcode-0.1.3.dist-info/licenses/LICENSE,sha256=6C9I9dhq8QTa4P6LckWXugYJ3xm2ufZKrLymqOqRZFs,1066
41
- overcode-0.1.3.dist-info/METADATA,sha256=UEhhgQSEAXR1HRRzX0ekruV4SaW92O4xsdsf2pP4_yc,3343
42
- overcode-0.1.3.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
43
- overcode-0.1.3.dist-info/entry_points.txt,sha256=EveN-QDOji1HFbJAsIH-djI_s0E4KQC6N144arLeRb0,47
44
- overcode-0.1.3.dist-info/top_level.txt,sha256=5cfXcNbSNvigE7coZgIRPCl_NDWHu_5UIBmWi9Xiupo,9
45
- overcode-0.1.3.dist-info/RECORD,,