tunacode-cli 0.0.50__py3-none-any.whl → 0.0.53__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.
Potentially problematic release.
This version of tunacode-cli might be problematic. Click here for more details.
- tunacode/cli/commands/base.py +2 -2
- tunacode/cli/commands/implementations/__init__.py +7 -1
- tunacode/cli/commands/implementations/conversation.py +1 -1
- tunacode/cli/commands/implementations/debug.py +1 -1
- tunacode/cli/commands/implementations/development.py +4 -1
- tunacode/cli/commands/implementations/template.py +132 -0
- tunacode/cli/commands/registry.py +28 -1
- tunacode/cli/commands/template_shortcut.py +93 -0
- tunacode/cli/main.py +6 -0
- tunacode/cli/repl.py +29 -174
- tunacode/cli/repl_components/__init__.py +10 -0
- tunacode/cli/repl_components/command_parser.py +34 -0
- tunacode/cli/repl_components/error_recovery.py +88 -0
- tunacode/cli/repl_components/output_display.py +33 -0
- tunacode/cli/repl_components/tool_executor.py +84 -0
- tunacode/configuration/defaults.py +2 -2
- tunacode/configuration/settings.py +11 -14
- tunacode/constants.py +57 -23
- tunacode/context.py +0 -14
- tunacode/core/agents/agent_components/__init__.py +27 -0
- tunacode/core/agents/agent_components/agent_config.py +109 -0
- tunacode/core/agents/agent_components/json_tool_parser.py +109 -0
- tunacode/core/agents/agent_components/message_handler.py +100 -0
- tunacode/core/agents/agent_components/node_processor.py +480 -0
- tunacode/core/agents/agent_components/response_state.py +13 -0
- tunacode/core/agents/agent_components/result_wrapper.py +50 -0
- tunacode/core/agents/agent_components/task_completion.py +28 -0
- tunacode/core/agents/agent_components/tool_buffer.py +24 -0
- tunacode/core/agents/agent_components/tool_executor.py +49 -0
- tunacode/core/agents/main.py +421 -778
- tunacode/core/agents/utils.py +42 -2
- tunacode/core/background/manager.py +3 -3
- tunacode/core/logging/__init__.py +4 -3
- tunacode/core/logging/config.py +29 -16
- tunacode/core/logging/formatters.py +1 -1
- tunacode/core/logging/handlers.py +41 -7
- tunacode/core/setup/__init__.py +2 -0
- tunacode/core/setup/agent_setup.py +2 -2
- tunacode/core/setup/base.py +2 -2
- tunacode/core/setup/config_setup.py +10 -6
- tunacode/core/setup/git_safety_setup.py +13 -2
- tunacode/core/setup/template_setup.py +75 -0
- tunacode/core/state.py +13 -2
- tunacode/core/token_usage/api_response_parser.py +6 -2
- tunacode/core/token_usage/usage_tracker.py +37 -7
- tunacode/core/tool_handler.py +24 -1
- tunacode/prompts/system.md +289 -4
- tunacode/setup.py +2 -0
- tunacode/templates/__init__.py +9 -0
- tunacode/templates/loader.py +210 -0
- tunacode/tools/glob.py +3 -3
- tunacode/tools/grep.py +26 -276
- tunacode/tools/grep_components/__init__.py +9 -0
- tunacode/tools/grep_components/file_filter.py +93 -0
- tunacode/tools/grep_components/pattern_matcher.py +152 -0
- tunacode/tools/grep_components/result_formatter.py +45 -0
- tunacode/tools/grep_components/search_result.py +35 -0
- tunacode/tools/todo.py +27 -21
- tunacode/types.py +19 -4
- tunacode/ui/completers.py +6 -1
- tunacode/ui/decorators.py +2 -2
- tunacode/ui/keybindings.py +1 -1
- tunacode/ui/panels.py +13 -5
- tunacode/ui/prompt_manager.py +1 -1
- tunacode/ui/tool_ui.py +8 -2
- tunacode/utils/bm25.py +4 -4
- tunacode/utils/file_utils.py +2 -2
- tunacode/utils/message_utils.py +3 -1
- tunacode/utils/system.py +0 -4
- tunacode/utils/text_utils.py +1 -1
- tunacode/utils/token_counter.py +2 -2
- {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/METADATA +146 -1
- tunacode_cli-0.0.53.dist-info/RECORD +123 -0
- {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/top_level.txt +0 -1
- api/auth.py +0 -13
- api/users.py +0 -8
- tunacode/core/recursive/__init__.py +0 -18
- tunacode/core/recursive/aggregator.py +0 -467
- tunacode/core/recursive/budget.py +0 -414
- tunacode/core/recursive/decomposer.py +0 -398
- tunacode/core/recursive/executor.py +0 -470
- tunacode/core/recursive/hierarchy.py +0 -488
- tunacode/ui/recursive_progress.py +0 -380
- tunacode_cli-0.0.50.dist-info/RECORD +0 -107
- {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/WHEEL +0 -0
- {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/entry_points.txt +0 -0
- {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,380 +0,0 @@
|
|
|
1
|
-
"""Module: tunacode.ui.recursive_progress
|
|
2
|
-
|
|
3
|
-
Visual feedback and progress tracking UI for recursive task execution.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from datetime import datetime
|
|
7
|
-
from typing import Dict, List, Optional
|
|
8
|
-
|
|
9
|
-
from rich.columns import Columns
|
|
10
|
-
from rich.console import Console
|
|
11
|
-
from rich.live import Live
|
|
12
|
-
from rich.panel import Panel
|
|
13
|
-
from rich.progress import (
|
|
14
|
-
BarColumn,
|
|
15
|
-
Progress,
|
|
16
|
-
SpinnerColumn,
|
|
17
|
-
TaskID,
|
|
18
|
-
TextColumn,
|
|
19
|
-
TimeElapsedColumn,
|
|
20
|
-
TimeRemainingColumn,
|
|
21
|
-
)
|
|
22
|
-
from rich.table import Table
|
|
23
|
-
from rich.tree import Tree
|
|
24
|
-
|
|
25
|
-
from tunacode.core.recursive.budget import BudgetManager
|
|
26
|
-
from tunacode.core.recursive.executor import TaskNode
|
|
27
|
-
from tunacode.core.recursive.hierarchy import TaskHierarchy
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class RecursiveProgressUI:
|
|
31
|
-
"""UI components for visualizing recursive execution progress."""
|
|
32
|
-
|
|
33
|
-
def __init__(self, console: Optional[Console] = None):
|
|
34
|
-
"""Initialize the progress UI.
|
|
35
|
-
|
|
36
|
-
Args:
|
|
37
|
-
console: Rich console instance (creates new if not provided)
|
|
38
|
-
"""
|
|
39
|
-
self.console = console or Console()
|
|
40
|
-
self.progress = Progress(
|
|
41
|
-
SpinnerColumn(),
|
|
42
|
-
TextColumn("[progress.description]{task.description}"),
|
|
43
|
-
BarColumn(),
|
|
44
|
-
TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
|
|
45
|
-
TimeElapsedColumn(),
|
|
46
|
-
TimeRemainingColumn(),
|
|
47
|
-
console=self.console,
|
|
48
|
-
)
|
|
49
|
-
self._task_progress_map: Dict[str, TaskID] = {}
|
|
50
|
-
self._live: Optional[Live] = None
|
|
51
|
-
|
|
52
|
-
def start_live_display(self) -> None:
|
|
53
|
-
"""Start live display for real-time updates."""
|
|
54
|
-
if not self._live:
|
|
55
|
-
self._live = Live(
|
|
56
|
-
self.get_dashboard(),
|
|
57
|
-
console=self.console,
|
|
58
|
-
refresh_per_second=2,
|
|
59
|
-
vertical_overflow="visible",
|
|
60
|
-
)
|
|
61
|
-
self._live.start()
|
|
62
|
-
|
|
63
|
-
def stop_live_display(self) -> None:
|
|
64
|
-
"""Stop the live display."""
|
|
65
|
-
if self._live:
|
|
66
|
-
self._live.stop()
|
|
67
|
-
self._live = None
|
|
68
|
-
|
|
69
|
-
def update_task_progress(
|
|
70
|
-
self, task_id: str, description: str, completed: int, total: int
|
|
71
|
-
) -> None:
|
|
72
|
-
"""Update progress for a specific task.
|
|
73
|
-
|
|
74
|
-
Args:
|
|
75
|
-
task_id: Task identifier
|
|
76
|
-
description: Task description
|
|
77
|
-
completed: Number of completed iterations
|
|
78
|
-
total: Total iterations
|
|
79
|
-
"""
|
|
80
|
-
if task_id not in self._task_progress_map:
|
|
81
|
-
# Create new progress task
|
|
82
|
-
progress_id = self.progress.add_task(description, total=total, completed=completed)
|
|
83
|
-
self._task_progress_map[task_id] = progress_id
|
|
84
|
-
else:
|
|
85
|
-
# Update existing task
|
|
86
|
-
progress_id = self._task_progress_map[task_id]
|
|
87
|
-
self.progress.update(
|
|
88
|
-
progress_id, description=description, completed=completed, total=total
|
|
89
|
-
)
|
|
90
|
-
|
|
91
|
-
def display_task_hierarchy(self, hierarchy: TaskHierarchy) -> Tree:
|
|
92
|
-
"""Create a tree visualization of task hierarchy.
|
|
93
|
-
|
|
94
|
-
Args:
|
|
95
|
-
hierarchy: TaskHierarchy instance
|
|
96
|
-
|
|
97
|
-
Returns:
|
|
98
|
-
Rich Tree object
|
|
99
|
-
"""
|
|
100
|
-
tree = Tree("🎯 Task Hierarchy", guide_style="blue")
|
|
101
|
-
|
|
102
|
-
# Find root tasks
|
|
103
|
-
all_tasks = hierarchy._tasks
|
|
104
|
-
root_tasks = [task_id for task_id in all_tasks if hierarchy.get_parent(task_id) is None]
|
|
105
|
-
|
|
106
|
-
def build_tree_node(parent_node: Tree, task_id: str, depth: int = 0):
|
|
107
|
-
"""Recursively build tree nodes."""
|
|
108
|
-
task = hierarchy.get_task(task_id)
|
|
109
|
-
if not task:
|
|
110
|
-
return
|
|
111
|
-
|
|
112
|
-
# Determine status icon
|
|
113
|
-
status = task.get("status", "pending")
|
|
114
|
-
icon = {"completed": "✅", "failed": "❌", "in_progress": "🔄", "pending": "⏳"}.get(
|
|
115
|
-
status, "❓"
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
# Create node label
|
|
119
|
-
title = task.get("title", "Untitled")[:50]
|
|
120
|
-
label = f"{icon} [{task_id}] {title}"
|
|
121
|
-
|
|
122
|
-
# Add progress if in progress
|
|
123
|
-
if status == "in_progress":
|
|
124
|
-
label += " [yellow](running)[/yellow]"
|
|
125
|
-
|
|
126
|
-
# Add node to tree
|
|
127
|
-
node = parent_node.add(label)
|
|
128
|
-
|
|
129
|
-
# Add children
|
|
130
|
-
children = hierarchy.get_children(task_id)
|
|
131
|
-
for child_id in children:
|
|
132
|
-
build_tree_node(node, child_id, depth + 1)
|
|
133
|
-
|
|
134
|
-
# Build tree from roots
|
|
135
|
-
for root_id in root_tasks:
|
|
136
|
-
build_tree_node(tree, root_id)
|
|
137
|
-
|
|
138
|
-
return tree
|
|
139
|
-
|
|
140
|
-
def display_budget_status(self, budget_manager: BudgetManager) -> Table:
|
|
141
|
-
"""Create a table showing budget allocation and usage.
|
|
142
|
-
|
|
143
|
-
Args:
|
|
144
|
-
budget_manager: BudgetManager instance
|
|
145
|
-
|
|
146
|
-
Returns:
|
|
147
|
-
Rich Table object
|
|
148
|
-
"""
|
|
149
|
-
table = Table(title="💰 Budget Status", show_header=True, header_style="bold cyan")
|
|
150
|
-
table.add_column("Task ID", style="dim", width=12)
|
|
151
|
-
table.add_column("Allocated", justify="right")
|
|
152
|
-
table.add_column("Used", justify="right")
|
|
153
|
-
table.add_column("Remaining", justify="right")
|
|
154
|
-
table.add_column("Utilization", justify="right")
|
|
155
|
-
table.add_column("Status", justify="center")
|
|
156
|
-
|
|
157
|
-
summary = budget_manager.get_budget_summary()
|
|
158
|
-
|
|
159
|
-
for task_id, details in summary["task_details"].items():
|
|
160
|
-
utilization = details["utilization"]
|
|
161
|
-
|
|
162
|
-
# Color code utilization
|
|
163
|
-
if utilization > 0.9:
|
|
164
|
-
util_color = "red"
|
|
165
|
-
status = "⚠️ High"
|
|
166
|
-
elif utilization > 0.7:
|
|
167
|
-
util_color = "yellow"
|
|
168
|
-
status = "📊 Normal"
|
|
169
|
-
else:
|
|
170
|
-
util_color = "green"
|
|
171
|
-
status = "✅ Good"
|
|
172
|
-
|
|
173
|
-
table.add_row(
|
|
174
|
-
task_id[:8] + "...",
|
|
175
|
-
str(details["allocated"]),
|
|
176
|
-
str(details["consumed"]),
|
|
177
|
-
str(details["remaining"]),
|
|
178
|
-
f"[{util_color}]{utilization:.1%}[/{util_color}]",
|
|
179
|
-
status,
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
# Add summary row
|
|
183
|
-
table.add_section()
|
|
184
|
-
table.add_row(
|
|
185
|
-
"TOTAL",
|
|
186
|
-
str(summary["allocated_budget"]),
|
|
187
|
-
str(summary["consumed_budget"]),
|
|
188
|
-
str(summary["available_budget"]),
|
|
189
|
-
f"{summary['utilization_rate']:.1%}",
|
|
190
|
-
"📈",
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
return table
|
|
194
|
-
|
|
195
|
-
def display_execution_stack(self, stack: List[str]) -> Panel:
|
|
196
|
-
"""Display current execution stack.
|
|
197
|
-
|
|
198
|
-
Args:
|
|
199
|
-
stack: List of task IDs in execution order
|
|
200
|
-
|
|
201
|
-
Returns:
|
|
202
|
-
Rich Panel object
|
|
203
|
-
"""
|
|
204
|
-
if not stack:
|
|
205
|
-
content = "[dim]No tasks in execution[/dim]"
|
|
206
|
-
else:
|
|
207
|
-
# Show stack with depth indicators
|
|
208
|
-
lines = []
|
|
209
|
-
for i, task_id in enumerate(stack):
|
|
210
|
-
indent = " " * i
|
|
211
|
-
arrow = "└─" if i == len(stack) - 1 else "├─"
|
|
212
|
-
lines.append(f"{indent}{arrow} {task_id}")
|
|
213
|
-
content = "\n".join(lines)
|
|
214
|
-
|
|
215
|
-
return Panel(content, title="📚 Execution Stack", border_style="green")
|
|
216
|
-
|
|
217
|
-
def display_task_details(self, task_node: TaskNode) -> Panel:
|
|
218
|
-
"""Display detailed information about a task.
|
|
219
|
-
|
|
220
|
-
Args:
|
|
221
|
-
task_node: TaskNode instance
|
|
222
|
-
|
|
223
|
-
Returns:
|
|
224
|
-
Rich Panel object
|
|
225
|
-
"""
|
|
226
|
-
details = Table(show_header=False, box=None, padding=0)
|
|
227
|
-
details.add_column("Property", style="bold cyan")
|
|
228
|
-
details.add_column("Value")
|
|
229
|
-
|
|
230
|
-
details.add_row("Title", task_node.title or "Untitled")
|
|
231
|
-
details.add_row("Status", f"[yellow]{task_node.status}[/yellow]")
|
|
232
|
-
details.add_row("Complexity", f"{task_node.complexity_score:.2f}")
|
|
233
|
-
details.add_row("Depth", str(task_node.depth))
|
|
234
|
-
details.add_row("Budget", f"{task_node.iteration_budget} iterations")
|
|
235
|
-
|
|
236
|
-
if task_node.subtasks:
|
|
237
|
-
details.add_row("Subtasks", f"{len(task_node.subtasks)} tasks")
|
|
238
|
-
|
|
239
|
-
if task_node.error:
|
|
240
|
-
details.add_row("Error", f"[red]{task_node.error}[/red]")
|
|
241
|
-
|
|
242
|
-
return Panel(details, title=f"🔍 Task Details: {task_node.id[:8]}...", border_style="blue")
|
|
243
|
-
|
|
244
|
-
def get_dashboard(
|
|
245
|
-
self,
|
|
246
|
-
hierarchy: Optional[TaskHierarchy] = None,
|
|
247
|
-
budget_manager: Optional[BudgetManager] = None,
|
|
248
|
-
current_task: Optional[TaskNode] = None,
|
|
249
|
-
execution_stack: Optional[List[str]] = None,
|
|
250
|
-
) -> Panel:
|
|
251
|
-
"""Create a comprehensive dashboard view.
|
|
252
|
-
|
|
253
|
-
Args:
|
|
254
|
-
hierarchy: Optional TaskHierarchy instance
|
|
255
|
-
budget_manager: Optional BudgetManager instance
|
|
256
|
-
current_task: Optional current TaskNode
|
|
257
|
-
execution_stack: Optional execution stack
|
|
258
|
-
|
|
259
|
-
Returns:
|
|
260
|
-
Rich Panel containing the dashboard
|
|
261
|
-
"""
|
|
262
|
-
components = []
|
|
263
|
-
|
|
264
|
-
# Add progress bars
|
|
265
|
-
components.append(Panel(self.progress, title="⏳ Task Progress", border_style="green"))
|
|
266
|
-
|
|
267
|
-
# Add hierarchy tree if available
|
|
268
|
-
if hierarchy:
|
|
269
|
-
components.append(self.display_task_hierarchy(hierarchy))
|
|
270
|
-
|
|
271
|
-
# Add budget status if available
|
|
272
|
-
if budget_manager:
|
|
273
|
-
components.append(self.display_budget_status(budget_manager))
|
|
274
|
-
|
|
275
|
-
# Add execution stack if available
|
|
276
|
-
if execution_stack is not None:
|
|
277
|
-
components.append(self.display_execution_stack(execution_stack))
|
|
278
|
-
|
|
279
|
-
# Add current task details if available
|
|
280
|
-
if current_task:
|
|
281
|
-
components.append(self.display_task_details(current_task))
|
|
282
|
-
|
|
283
|
-
# Arrange components in columns
|
|
284
|
-
if len(components) > 2:
|
|
285
|
-
# Use columns for better layout
|
|
286
|
-
left_col = components[: len(components) // 2]
|
|
287
|
-
right_col = components[len(components) // 2 :]
|
|
288
|
-
|
|
289
|
-
content = Columns(
|
|
290
|
-
["\n\n".join(str(c) for c in left_col), "\n\n".join(str(c) for c in right_col)],
|
|
291
|
-
equal=True,
|
|
292
|
-
expand=True,
|
|
293
|
-
)
|
|
294
|
-
else:
|
|
295
|
-
content = "\n\n".join(str(c) for c in components)
|
|
296
|
-
|
|
297
|
-
return Panel(
|
|
298
|
-
content,
|
|
299
|
-
title="🔄 Recursive Execution Dashboard",
|
|
300
|
-
subtitle=f"Updated: {datetime.now().strftime('%H:%M:%S')}",
|
|
301
|
-
border_style="bold blue",
|
|
302
|
-
)
|
|
303
|
-
|
|
304
|
-
async def show_completion_summary(
|
|
305
|
-
self,
|
|
306
|
-
total_tasks: int,
|
|
307
|
-
completed_tasks: int,
|
|
308
|
-
failed_tasks: int,
|
|
309
|
-
total_time: float,
|
|
310
|
-
total_iterations: int,
|
|
311
|
-
) -> None:
|
|
312
|
-
"""Display a summary when execution completes.
|
|
313
|
-
|
|
314
|
-
Args:
|
|
315
|
-
total_tasks: Total number of tasks
|
|
316
|
-
completed_tasks: Number of completed tasks
|
|
317
|
-
failed_tasks: Number of failed tasks
|
|
318
|
-
total_time: Total execution time in seconds
|
|
319
|
-
total_iterations: Total iterations used
|
|
320
|
-
"""
|
|
321
|
-
summary = Table(title="📊 Execution Summary", show_header=True, header_style="bold green")
|
|
322
|
-
summary.add_column("Metric", style="cyan")
|
|
323
|
-
summary.add_column("Value", justify="right")
|
|
324
|
-
|
|
325
|
-
summary.add_row("Total Tasks", str(total_tasks))
|
|
326
|
-
summary.add_row("Completed", f"[green]{completed_tasks}[/green]")
|
|
327
|
-
summary.add_row("Failed", f"[red]{failed_tasks}[/red]")
|
|
328
|
-
summary.add_row("Success Rate", f"{(completed_tasks / total_tasks) * 100:.1f}%")
|
|
329
|
-
summary.add_row("Total Time", f"{total_time:.2f}s")
|
|
330
|
-
summary.add_row("Total Iterations", str(total_iterations))
|
|
331
|
-
summary.add_row("Avg Time/Task", f"{total_time / total_tasks:.2f}s")
|
|
332
|
-
|
|
333
|
-
self.console.print("\n")
|
|
334
|
-
self.console.print(summary)
|
|
335
|
-
self.console.print("\n")
|
|
336
|
-
|
|
337
|
-
# Show completion message
|
|
338
|
-
if failed_tasks == 0:
|
|
339
|
-
self.console.print("[bold green]✅ All tasks completed successfully![/bold green]")
|
|
340
|
-
else:
|
|
341
|
-
self.console.print(
|
|
342
|
-
f"[bold yellow]⚠️ Completed with {failed_tasks} failures[/bold yellow]"
|
|
343
|
-
)
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
# Convenience functions for integration
|
|
347
|
-
async def show_recursive_progress(
|
|
348
|
-
console: Console, message: str, task_id: Optional[str] = None, depth: int = 0
|
|
349
|
-
) -> None:
|
|
350
|
-
"""Show progress message for recursive execution.
|
|
351
|
-
|
|
352
|
-
Args:
|
|
353
|
-
console: Rich console instance
|
|
354
|
-
message: Progress message
|
|
355
|
-
task_id: Optional task ID
|
|
356
|
-
depth: Recursion depth
|
|
357
|
-
"""
|
|
358
|
-
indent = " " * depth
|
|
359
|
-
prefix = f"[dim][{task_id[:8]}...][/dim]" if task_id else ""
|
|
360
|
-
|
|
361
|
-
console.print(f"{indent}🔄 {prefix} {message}")
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
async def show_task_completion(
|
|
365
|
-
console: Console, task_id: str, success: bool, depth: int = 0
|
|
366
|
-
) -> None:
|
|
367
|
-
"""Show task completion status.
|
|
368
|
-
|
|
369
|
-
Args:
|
|
370
|
-
console: Rich console instance
|
|
371
|
-
task_id: Task ID
|
|
372
|
-
success: Whether task succeeded
|
|
373
|
-
depth: Recursion depth
|
|
374
|
-
"""
|
|
375
|
-
indent = " " * depth
|
|
376
|
-
icon = "✅" if success else "❌"
|
|
377
|
-
status = "completed" if success else "failed"
|
|
378
|
-
color = "green" if success else "red"
|
|
379
|
-
|
|
380
|
-
console.print(f"{indent}{icon} Task [{task_id[:8]}...] [{color}]{status}[/{color}]")
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
api/auth.py,sha256=_ysF1RCXvtJR1S35lbYQZexES1lif4J6VVzEyqNK74Q,303
|
|
2
|
-
api/users.py,sha256=WRcy1Vsr4cEC8CW2qeN3XrA9EMyIk47ufpMyvQ4nLuw,193
|
|
3
|
-
tunacode/__init__.py,sha256=yUul8igNYMfUrHnYfioIGAqvrH8b5BKiO_pt1wVnmd0,119
|
|
4
|
-
tunacode/constants.py,sha256=PTrWcwVZhzd7mx0wzl8yEuBrEzzZx_AEK_eHANL_FsY,5169
|
|
5
|
-
tunacode/context.py,sha256=_gXVCyjU052jlyRAl9tklZSwl5U_zI_EIX8XN87VVWE,2786
|
|
6
|
-
tunacode/exceptions.py,sha256=oDO1SVKOgjcKIylwqdbqh_g5my4roU5mB9Nv4n_Vb0s,3877
|
|
7
|
-
tunacode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
tunacode/setup.py,sha256=XPt4eAK-qcIZQv64jGZ_ryxcImDwps9OmXjJfIS1xcs,1899
|
|
9
|
-
tunacode/types.py,sha256=JqHTPb3fyCh5EC9ZSdoHmBN4DgiLj_2gMK8LbUMqtLk,8257
|
|
10
|
-
tunacode/cli/__init__.py,sha256=zgs0UbAck8hfvhYsWhWOfBe5oK09ug2De1r4RuQZREA,55
|
|
11
|
-
tunacode/cli/main.py,sha256=erP6jNXcxVQOVn8sm6uNaLEAYevniVXl6Sem872mW68,2755
|
|
12
|
-
tunacode/cli/repl.py,sha256=jg2lnr-ZuYUKiSIJBDR9uFsIP7b_gBA6EoxMDgTSwCw,20385
|
|
13
|
-
tunacode/cli/commands/__init__.py,sha256=zmE9JcJ9Qd2xJhgdS4jMDJOoZsrAZmL5MAFxbKkk7F8,1670
|
|
14
|
-
tunacode/cli/commands/base.py,sha256=GxUuDsDSpz0iXryy8MrEw88UM3C3yxL__kDK1QhshoA,2517
|
|
15
|
-
tunacode/cli/commands/registry.py,sha256=XVuLpp5S4Fw7GfIZfLrVZFo4jMLMNmYNpYN7xWgXyOk,8223
|
|
16
|
-
tunacode/cli/commands/implementations/__init__.py,sha256=lMgLZRX9hnw-ftZu4ykqoJoHqkZ5Yu0lBvYuzHylm7Q,986
|
|
17
|
-
tunacode/cli/commands/implementations/conversation.py,sha256=EsnsZB6yyVI_sbNNMvk37tCz3iAj4E85R9ev696qeqg,4683
|
|
18
|
-
tunacode/cli/commands/implementations/debug.py,sha256=hWr9DOIS-kn8z89IJZ6HuRkyN1tOsnFZg5qlB8YPbG8,6763
|
|
19
|
-
tunacode/cli/commands/implementations/development.py,sha256=kZRdVgReVmGU0uijFxtPio2RYkTrYMufOwgI1Aj1_NU,2729
|
|
20
|
-
tunacode/cli/commands/implementations/model.py,sha256=uthx6IX9KwgwywNTDklkJpqCbaTX9h1_p-eVmqL73WQ,2245
|
|
21
|
-
tunacode/cli/commands/implementations/system.py,sha256=2cGw5iCJO3aNhXTFF28CgAIyLgslvHmpfyL2ZHVB6oQ,7903
|
|
22
|
-
tunacode/cli/commands/implementations/todo.py,sha256=Dtz5bgcuK2VXGPWEBBZQgnWUMYkRXNzTGf_qkVPLF2U,8125
|
|
23
|
-
tunacode/configuration/__init__.py,sha256=MbVXy8bGu0yKehzgdgZ_mfWlYGvIdb1dY2Ly75nfuPE,17
|
|
24
|
-
tunacode/configuration/defaults.py,sha256=lK_qf3BexmoQh7lbtxYG_ef0Kq3WyiLGOYmiVDO_amQ,840
|
|
25
|
-
tunacode/configuration/models.py,sha256=buH8ZquvcYI3OQBDIZeJ08cu00rSCeNABtUwl3VQS0E,4103
|
|
26
|
-
tunacode/configuration/settings.py,sha256=KoN0u6GG3Hh_TWt02D_wpRfbACYri3gCDTXHtJfHl2w,994
|
|
27
|
-
tunacode/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
-
tunacode/core/code_index.py,sha256=jgAx3lSWP_DwnyiP5Jkm1YvX4JJyI4teMzlNrJSpEOA,15661
|
|
29
|
-
tunacode/core/state.py,sha256=gYFP6MIwlfYLxT6NFvqkJ3tEHkdxGdexunwXZwmRv0E,5762
|
|
30
|
-
tunacode/core/tool_handler.py,sha256=BPjR013OOO0cLXPdLeL2FDK0ixUwOYu59FfHdcdFhp4,2277
|
|
31
|
-
tunacode/core/agents/__init__.py,sha256=UUJiPYb91arwziSpjd7vIk7XNGA_4HQbsOIbskSqevA,149
|
|
32
|
-
tunacode/core/agents/main.py,sha256=htxekWzljg0nrbY3xf6PApxsBHUMOSQxVaDGxP0GwUs,44968
|
|
33
|
-
tunacode/core/agents/utils.py,sha256=7kJAiUlkyWO3-b4T07XsGgycVrcNhv3NEPLdaktBnP4,12847
|
|
34
|
-
tunacode/core/background/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
-
tunacode/core/background/manager.py,sha256=rJdl3eDLTQwjbT7VhxXcJbZopCNR3M8ZGMbmeVnwwMc,1126
|
|
36
|
-
tunacode/core/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
-
tunacode/core/logging/__init__.py,sha256=pGr3EXxS4Yyz6Gasqg-m9fUENWnnbyaQqMaxR56WW4c,635
|
|
38
|
-
tunacode/core/logging/config.py,sha256=USR7taIzs7YFlhf7hYdKL8jFbcl6TbOUb6tigb98e0U,2122
|
|
39
|
-
tunacode/core/logging/formatters.py,sha256=lDex7P5eFzu-r9VEMshohj1zxWqANWSS581CJoMp-HA,1210
|
|
40
|
-
tunacode/core/logging/handlers.py,sha256=SxmgH7yWc8bbCKcDeBtkbkHJy5saRqbIoDoTQh4jiYQ,2538
|
|
41
|
-
tunacode/core/logging/logger.py,sha256=9RjRuX0GoUojRJ8WnJGQPFdXiluiJMCoFmvc8xEioB8,142
|
|
42
|
-
tunacode/core/recursive/__init__.py,sha256=S9_dN0faJqam3Pnaum9PRC8Hd90bpES8syFgAD8-QbI,446
|
|
43
|
-
tunacode/core/recursive/aggregator.py,sha256=KlWajEyT8OokWeY6ZwQ4EsVu05V4KeH3o2cYUz-Ce1Y,15725
|
|
44
|
-
tunacode/core/recursive/budget.py,sha256=0wY6xSrZKmudUwthwX1mlcF5yat2_y3fNu5shX_IzvA,14131
|
|
45
|
-
tunacode/core/recursive/decomposer.py,sha256=k8rgaPEMMb2mZ9W0m_Yg0oEBqbYpqDnK0zyTkx6eTPs,14550
|
|
46
|
-
tunacode/core/recursive/executor.py,sha256=7taFsjYjSfL8OUQLM1ZVn9Xix7YoputFBAZSo9tDtDM,16646
|
|
47
|
-
tunacode/core/recursive/hierarchy.py,sha256=YKYIt1APsZviVmhjxfQ9p441rVkfEHRcmuh3cFV-vqU,15744
|
|
48
|
-
tunacode/core/setup/__init__.py,sha256=lzdpY6rIGf9DDlDBDGFvQZaSOQeFsNglHbkpq1-GtU8,376
|
|
49
|
-
tunacode/core/setup/agent_setup.py,sha256=trELO8cPnWo36BBnYmXDEnDPdhBg0p-VLnx9A8hSSSQ,1401
|
|
50
|
-
tunacode/core/setup/base.py,sha256=cbyT2-xK2mWgH4EO17VfM_OM2bj0kT895NW2jSXbe3c,968
|
|
51
|
-
tunacode/core/setup/config_setup.py,sha256=ctf9GuN7niqCsRK5rbEzCbzsN0MrAOeWzKtwOnyJJmY,14654
|
|
52
|
-
tunacode/core/setup/coordinator.py,sha256=oVTN2xIeJERXitVJpkIk9tDGLs1D1bxIRmaogJwZJFI,2049
|
|
53
|
-
tunacode/core/setup/environment_setup.py,sha256=n3IrObKEynHZSwtUJ1FddMg2C4sHz7ca42awemImV8s,2225
|
|
54
|
-
tunacode/core/setup/git_safety_setup.py,sha256=CRIqrQt0QUJQRS344njty_iCqTorrDhHlXRuET7w0Tk,6714
|
|
55
|
-
tunacode/core/token_usage/api_response_parser.py,sha256=CTtqGaFaxpkzkW3TEbe00QJzyRULpWN1EQxIYMleseg,1622
|
|
56
|
-
tunacode/core/token_usage/cost_calculator.py,sha256=RjO-O0JENBuGOrWP7QgBZlZxeXC-PAIr8tj_9p_BxOU,2058
|
|
57
|
-
tunacode/core/token_usage/usage_tracker.py,sha256=kuAjUCyQkFykPy5mqsLRbKhZW298pyiCuFGn-ptBpy4,4657
|
|
58
|
-
tunacode/prompts/system.md,sha256=hXpjZ8Yiv2Acr2_6EmC2uOklP8FbmvyYR9oais-1KLk,16290
|
|
59
|
-
tunacode/services/__init__.py,sha256=w_E8QK6RnvKSvU866eDe8BCRV26rAm4d3R-Yg06OWCU,19
|
|
60
|
-
tunacode/services/mcp.py,sha256=R48X73KQjQ9vwhBrtbWHSBl-4K99QXmbIhh5J_1Gezo,3046
|
|
61
|
-
tunacode/tools/__init__.py,sha256=ECBuUWWF1JjHW42CCceaPKgVTQyuljbz3RlhuA2fe2s,314
|
|
62
|
-
tunacode/tools/base.py,sha256=DhlanZZZxU2JJaBOwwyGFKMUcoCWR_CzLuwVeSXC0Go,7297
|
|
63
|
-
tunacode/tools/bash.py,sha256=mgZqugfDFevZ4BETuUv90pzXvtq7qKGUGFiuDxzmytk,8766
|
|
64
|
-
tunacode/tools/glob.py,sha256=TSgVK79ewZgGw8ucYkkiHgVqRgkw-wZrhP8j52nm_gQ,10334
|
|
65
|
-
tunacode/tools/grep.py,sha256=jboEVA2ATv0YI8zg9dF89emZ_HWy2vVtsQ_-hDhlr7g,26337
|
|
66
|
-
tunacode/tools/list_dir.py,sha256=1kNqzYCNlcA5rqXIEVqcjQy6QxlLZLj5AG6YIECfwio,7217
|
|
67
|
-
tunacode/tools/read_file.py,sha256=z2omev9xzj4-0GG9mRssD13rj-Aa1c-pszFi2Z7Hxvk,3268
|
|
68
|
-
tunacode/tools/read_file_async_poc.py,sha256=2v2ckLQlwahgPGWGdE2c5Es37B35Y7zWdseZwT46E1E,6453
|
|
69
|
-
tunacode/tools/run_command.py,sha256=7UvXjFQI1Av4vceXx48MbQCTrsFNj4PlygTAAhNDYIA,4376
|
|
70
|
-
tunacode/tools/todo.py,sha256=bVbohgwKqvvTe8efxXrMZDQU8vdk4E3jF9Cj38dRq7k,12727
|
|
71
|
-
tunacode/tools/update_file.py,sha256=bW1MhTzRjBDjJzqQ6A1yCVEbkr1oIqtEC8uqcg_rfY4,3957
|
|
72
|
-
tunacode/tools/write_file.py,sha256=prL6u8XOi9ZyPU-YNlG9YMLbSLrDJXDRuDX73ncXh-k,2699
|
|
73
|
-
tunacode/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4BolYU,13
|
|
74
|
-
tunacode/ui/completers.py,sha256=40wkF1nqG9HNVmP8MRWEPya0zV6GbyFXAuT-k7uXmxg,4880
|
|
75
|
-
tunacode/ui/console.py,sha256=wLiJ9cVrWHS0zNadqbcXnsg0T2wj4xLACg17YAYLmU4,2574
|
|
76
|
-
tunacode/ui/constants.py,sha256=A76B_KpM8jCuBYRg4cPmhi8_j6LLyWttO7_jjv47r3w,421
|
|
77
|
-
tunacode/ui/decorators.py,sha256=e2KM-_pI5EKHa2M045IjUe4rPkTboxaKHXJT0K3461g,1914
|
|
78
|
-
tunacode/ui/input.py,sha256=NCZlj5qzNPy0gsSeGKeDNdAOMKZVGph8Z-UBXhX-Sbk,3020
|
|
79
|
-
tunacode/ui/keybindings.py,sha256=ACUofGGs3xFvrNWi1cQ_Tkyy0lhIrZAEIOPlK6vZFVY,3014
|
|
80
|
-
tunacode/ui/lexers.py,sha256=tmg4ic1enyTRLzanN5QPP7D_0n12YjX_8ZhsffzhXA4,1340
|
|
81
|
-
tunacode/ui/logging_compat.py,sha256=5v6lcjVaG1CxdY1Zm9FAGr9H7Sy-tP6ihGfhP-5YvAY,1406
|
|
82
|
-
tunacode/ui/output.py,sha256=vXfkPfQWmQzkmfGkY6snAk7auLgN8E7XEGUc-YVjTlM,5604
|
|
83
|
-
tunacode/ui/panels.py,sha256=usGbzBDZdBY2pS2zHdlY0s5NKf9AUw7llOHKWoaNIlU,9307
|
|
84
|
-
tunacode/ui/prompt_manager.py,sha256=U2cntB34vm-YwOj3gzFRUK362zccrz8pigQfpxr5sv8,4650
|
|
85
|
-
tunacode/ui/recursive_progress.py,sha256=V0dGpJWt19TVArOYcQ3Lki8cR3ZepFT6iGwnChSFhFI,12906
|
|
86
|
-
tunacode/ui/tool_ui.py,sha256=qp1aZUpLO5UOdJziY8tw0URC8gjoWoSKdGu5y2wuTUU,7013
|
|
87
|
-
tunacode/ui/utils.py,sha256=yvoCTz8AOdRfV0XIqUX3sgg88g_wntV9yhnQP6WzAVs,114
|
|
88
|
-
tunacode/ui/validators.py,sha256=MMIMT1I2v0l2jIy-gxX_4GSApvUTi8XWIOACr_dmoBA,758
|
|
89
|
-
tunacode/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
90
|
-
tunacode/utils/bm25.py,sha256=yq7KFWP3g_zIsjUV7l2hFPXYCzXyNQUInLU7u4qsc_4,1909
|
|
91
|
-
tunacode/utils/diff_utils.py,sha256=V9QqQ0q4MfabVTnWptF3IXDp3estnfOKcJtDe_Sj14I,2372
|
|
92
|
-
tunacode/utils/file_utils.py,sha256=AXiAJ_idtlmXEi9pMvwtfPy9Ys3yK-F4K7qb_NpwonU,923
|
|
93
|
-
tunacode/utils/import_cache.py,sha256=q_xjJbtju05YbFopLDSkIo1hOtCx3DOTl3GQE5FFDgs,295
|
|
94
|
-
tunacode/utils/message_utils.py,sha256=kM6VSS2Dudjplie009khHgmIRjDoBUzv6tvHcYNDAAE,586
|
|
95
|
-
tunacode/utils/retry.py,sha256=AHdUzY6m-mwlT4OPXdtWWMAafL_NeS7JAMORGyM8c5k,4931
|
|
96
|
-
tunacode/utils/ripgrep.py,sha256=AXUs2FFt0A7KBV996deS8wreIlUzKOlAHJmwrcAr4No,583
|
|
97
|
-
tunacode/utils/security.py,sha256=i3eGKg4o-qY2S_ObTlEaHO93q14iBfiPXR5O7srHn58,6579
|
|
98
|
-
tunacode/utils/system.py,sha256=FSoibTIH0eybs4oNzbYyufIiV6gb77QaeY2yGqW39AY,11381
|
|
99
|
-
tunacode/utils/text_utils.py,sha256=6YBD9QfkDO44-6jxnwRWIpmfIifPG-NqMzy_O2NAouc,7277
|
|
100
|
-
tunacode/utils/token_counter.py,sha256=lLbkrNUraRQn5RMhwnGurqq1RHFDyn4AaFhruONWIxo,2690
|
|
101
|
-
tunacode/utils/user_configuration.py,sha256=Ilz8dpGVJDBE2iLWHAPT0xR8D51VRKV3kIbsAz8Bboc,3275
|
|
102
|
-
tunacode_cli-0.0.50.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
|
|
103
|
-
tunacode_cli-0.0.50.dist-info/METADATA,sha256=OhjsuKawbWFnRFWWhF4Mrxk3Dnth4bWX5k1Lt4RnNwQ,5906
|
|
104
|
-
tunacode_cli-0.0.50.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
105
|
-
tunacode_cli-0.0.50.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
|
|
106
|
-
tunacode_cli-0.0.50.dist-info/top_level.txt,sha256=GuU751acRvOhM5yLKFW0-gBg62JGh5zycDSq4tRFOYE,13
|
|
107
|
-
tunacode_cli-0.0.50.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|