overcode 0.1.2__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.
- overcode/__init__.py +1 -1
- overcode/cli.py +154 -51
- overcode/config.py +66 -0
- overcode/daemon_claude_skill.md +36 -33
- overcode/history_reader.py +69 -8
- overcode/implementations.py +178 -87
- overcode/monitor_daemon.py +87 -97
- overcode/monitor_daemon_core.py +261 -0
- overcode/monitor_daemon_state.py +24 -15
- overcode/pid_utils.py +17 -3
- overcode/session_manager.py +54 -0
- overcode/settings.py +34 -0
- overcode/status_constants.py +1 -1
- overcode/status_detector.py +8 -2
- overcode/status_patterns.py +19 -0
- overcode/summarizer_client.py +72 -27
- overcode/summarizer_component.py +87 -107
- overcode/supervisor_daemon.py +55 -38
- overcode/supervisor_daemon_core.py +210 -0
- overcode/testing/__init__.py +6 -0
- overcode/testing/renderer.py +268 -0
- overcode/testing/tmux_driver.py +223 -0
- overcode/testing/tui_eye.py +185 -0
- overcode/testing/tui_eye_skill.md +187 -0
- overcode/tmux_manager.py +117 -93
- overcode/tui.py +399 -1969
- overcode/tui_actions/__init__.py +20 -0
- overcode/tui_actions/daemon.py +201 -0
- overcode/tui_actions/input.py +128 -0
- overcode/tui_actions/navigation.py +117 -0
- overcode/tui_actions/session.py +428 -0
- overcode/tui_actions/view.py +357 -0
- overcode/tui_helpers.py +42 -9
- overcode/tui_logic.py +347 -0
- overcode/tui_render.py +414 -0
- overcode/tui_widgets/__init__.py +24 -0
- overcode/tui_widgets/command_bar.py +399 -0
- overcode/tui_widgets/daemon_panel.py +153 -0
- overcode/tui_widgets/daemon_status_bar.py +245 -0
- overcode/tui_widgets/help_overlay.py +71 -0
- overcode/tui_widgets/preview_pane.py +69 -0
- overcode/tui_widgets/session_summary.py +514 -0
- overcode/tui_widgets/status_timeline.py +253 -0
- {overcode-0.1.2.dist-info → overcode-0.1.4.dist-info}/METADATA +4 -1
- overcode-0.1.4.dist-info/RECORD +68 -0
- {overcode-0.1.2.dist-info → overcode-0.1.4.dist-info}/WHEEL +1 -1
- {overcode-0.1.2.dist-info → overcode-0.1.4.dist-info}/entry_points.txt +1 -0
- overcode-0.1.2.dist-info/RECORD +0 -45
- {overcode-0.1.2.dist-info → overcode-0.1.4.dist-info}/licenses/LICENSE +0 -0
- {overcode-0.1.2.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
|
+
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
|
|
@@ -23,6 +23,7 @@ Requires-Dist: textual>=0.40.0
|
|
|
23
23
|
Requires-Dist: rich>=13.0.0
|
|
24
24
|
Requires-Dist: typer>=0.9.0
|
|
25
25
|
Requires-Dist: pyyaml>=6.0
|
|
26
|
+
Requires-Dist: libtmux>=0.37.0
|
|
26
27
|
Provides-Extra: dev
|
|
27
28
|
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
28
29
|
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
@@ -30,6 +31,8 @@ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
|
30
31
|
Requires-Dist: pytest-timeout>=2.1.0; extra == "dev"
|
|
31
32
|
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
32
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"
|
|
33
36
|
Provides-Extra: presence
|
|
34
37
|
Requires-Dist: pyobjc-framework-Quartz>=10.0; extra == "presence"
|
|
35
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,,
|
overcode-0.1.2.dist-info/RECORD
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
overcode/__init__.py,sha256=ZruEjk2uKTCuffSqw8aToEfRa2SKr7VA37PhYVQZNRo,100
|
|
2
|
-
overcode/cli.py,sha256=w3GZrhGqLaUM_zR71rG8g3D1D0oD0JgPeZeKDcg9C5Q,29922
|
|
3
|
-
overcode/config.py,sha256=LiuG4HyOZB5GnkYfQmqkEIsIzNeIyUi0PIZc0dctds0,3447
|
|
4
|
-
overcode/daemon_claude_skill.md,sha256=74OoUARhconOTmfWQaHaDbWEPc7wZeywVNb6fIIuELE,5177
|
|
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=fI6lobFne_cM0y6BKMgxluWD3w2SVQ34souH7cUx6qE,14901
|
|
11
|
-
overcode/implementations.py,sha256=QpvNW7auQBVvK6VCi_B77kwNf-tz4XwILY_YCNsF1GQ,7931
|
|
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=tFeelz-fSI8g4z0uud6j6Hnj6Shqw8XqBlMGvxCLfEM,26965
|
|
17
|
-
overcode/monitor_daemon_state.py,sha256=wD7f2BuS6d7BUS66BtGBevhv_IU3fp9x_4omhV78arE,14856
|
|
18
|
-
overcode/pid_utils.py,sha256=CYgG1RBa_0E8DJGzAWYapzpMflEc6MQ0LM4-ttt9YBE,6867
|
|
19
|
-
overcode/presence_logger.py,sha256=0jIUPrhbeU0CDL9W2J7CbDPbAc-WPD4n4LFJJbLZ7Tc,13338
|
|
20
|
-
overcode/protocols.py,sha256=NfSrm9F4h608eEFvs438KxFBg5r8E0Ni5etBWsS9IeY,4268
|
|
21
|
-
overcode/session_manager.py,sha256=Bgp-eiPtyR2GF6i9OoIPsowC_5iGPggwvQYLnOBPEvo,23145
|
|
22
|
-
overcode/settings.py,sha256=NUCv1xkFxYvzck2KXQEWn0a98QEEtIG7HuSfPsW10N0,13710
|
|
23
|
-
overcode/standing_instructions.py,sha256=F9zYuGY0A7V90-SL2e-kLySfJACJvVjlsDZpq3BEI9k,10034
|
|
24
|
-
overcode/status_constants.py,sha256=iBV1ZJABwAam1Rn0a4nRA1iRSE3MOx5MBONmkzAgwqo,6294
|
|
25
|
-
overcode/status_detector.py,sha256=1E3qAu_ALIJq2vwvBls0b19kswWKRNaw64gLlz1V0Ig,16306
|
|
26
|
-
overcode/status_history.py,sha256=NzhVuTqHkSqgTTdwNfQ8wudCggYjhelZWxpZh6AmzCM,4778
|
|
27
|
-
overcode/status_patterns.py,sha256=6OA8mladX-CHtwr0N7c6qJC_ylGQxqjIz36wnAMcS1A,8722
|
|
28
|
-
overcode/summarizer_client.py,sha256=RBRx6FCaKzLGfnLb3fKOK1XxmYlqclHvt6O8pSSQFv0,4322
|
|
29
|
-
overcode/summarizer_component.py,sha256=IVLM-l2eOfiTAFQ_MX5jDm5lKBbe0nAVGkb0gMlxqhU,9797
|
|
30
|
-
overcode/supervisor_daemon.py,sha256=5uDpSsNb8Xv_H99A5hcwnZuH-absdlBzJYcOAEo6i8I,32746
|
|
31
|
-
overcode/supervisor_layout.sh,sha256=s0Fm4Fj7adv5IOsMx1JuA6OAXCoQx9OUnS1CmV0FOwI,1652
|
|
32
|
-
overcode/tmux_manager.py,sha256=SNqgQN-MLCIlpg1u4Zf0k6OX2uYryKpIZ3PPnF4Jwb0,7624
|
|
33
|
-
overcode/tui.py,sha256=M4UBZEKdw-pfU1sMpRJnBAFn117KwGTbQN5sy256VVA,123634
|
|
34
|
-
overcode/tui_helpers.py,sha256=U_Po2DEpvBt-4keZgiIld8WMcKWqSeaa-a8-hjP47ec,14812
|
|
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.2.dist-info/licenses/LICENSE,sha256=6C9I9dhq8QTa4P6LckWXugYJ3xm2ufZKrLymqOqRZFs,1066
|
|
41
|
-
overcode-0.1.2.dist-info/METADATA,sha256=EjDJkG0qvN-wLl1dUeslsvAOK-OBdmAUwRB7-wBvKSs,3312
|
|
42
|
-
overcode-0.1.2.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
43
|
-
overcode-0.1.2.dist-info/entry_points.txt,sha256=EveN-QDOji1HFbJAsIH-djI_s0E4KQC6N144arLeRb0,47
|
|
44
|
-
overcode-0.1.2.dist-info/top_level.txt,sha256=5cfXcNbSNvigE7coZgIRPCl_NDWHu_5UIBmWi9Xiupo,9
|
|
45
|
-
overcode-0.1.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|