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.

Files changed (87) hide show
  1. tunacode/cli/commands/base.py +2 -2
  2. tunacode/cli/commands/implementations/__init__.py +7 -1
  3. tunacode/cli/commands/implementations/conversation.py +1 -1
  4. tunacode/cli/commands/implementations/debug.py +1 -1
  5. tunacode/cli/commands/implementations/development.py +4 -1
  6. tunacode/cli/commands/implementations/template.py +132 -0
  7. tunacode/cli/commands/registry.py +28 -1
  8. tunacode/cli/commands/template_shortcut.py +93 -0
  9. tunacode/cli/main.py +6 -0
  10. tunacode/cli/repl.py +29 -174
  11. tunacode/cli/repl_components/__init__.py +10 -0
  12. tunacode/cli/repl_components/command_parser.py +34 -0
  13. tunacode/cli/repl_components/error_recovery.py +88 -0
  14. tunacode/cli/repl_components/output_display.py +33 -0
  15. tunacode/cli/repl_components/tool_executor.py +84 -0
  16. tunacode/configuration/defaults.py +2 -2
  17. tunacode/configuration/settings.py +11 -14
  18. tunacode/constants.py +57 -23
  19. tunacode/context.py +0 -14
  20. tunacode/core/agents/agent_components/__init__.py +27 -0
  21. tunacode/core/agents/agent_components/agent_config.py +109 -0
  22. tunacode/core/agents/agent_components/json_tool_parser.py +109 -0
  23. tunacode/core/agents/agent_components/message_handler.py +100 -0
  24. tunacode/core/agents/agent_components/node_processor.py +480 -0
  25. tunacode/core/agents/agent_components/response_state.py +13 -0
  26. tunacode/core/agents/agent_components/result_wrapper.py +50 -0
  27. tunacode/core/agents/agent_components/task_completion.py +28 -0
  28. tunacode/core/agents/agent_components/tool_buffer.py +24 -0
  29. tunacode/core/agents/agent_components/tool_executor.py +49 -0
  30. tunacode/core/agents/main.py +421 -778
  31. tunacode/core/agents/utils.py +42 -2
  32. tunacode/core/background/manager.py +3 -3
  33. tunacode/core/logging/__init__.py +4 -3
  34. tunacode/core/logging/config.py +29 -16
  35. tunacode/core/logging/formatters.py +1 -1
  36. tunacode/core/logging/handlers.py +41 -7
  37. tunacode/core/setup/__init__.py +2 -0
  38. tunacode/core/setup/agent_setup.py +2 -2
  39. tunacode/core/setup/base.py +2 -2
  40. tunacode/core/setup/config_setup.py +10 -6
  41. tunacode/core/setup/git_safety_setup.py +13 -2
  42. tunacode/core/setup/template_setup.py +75 -0
  43. tunacode/core/state.py +13 -2
  44. tunacode/core/token_usage/api_response_parser.py +6 -2
  45. tunacode/core/token_usage/usage_tracker.py +37 -7
  46. tunacode/core/tool_handler.py +24 -1
  47. tunacode/prompts/system.md +289 -4
  48. tunacode/setup.py +2 -0
  49. tunacode/templates/__init__.py +9 -0
  50. tunacode/templates/loader.py +210 -0
  51. tunacode/tools/glob.py +3 -3
  52. tunacode/tools/grep.py +26 -276
  53. tunacode/tools/grep_components/__init__.py +9 -0
  54. tunacode/tools/grep_components/file_filter.py +93 -0
  55. tunacode/tools/grep_components/pattern_matcher.py +152 -0
  56. tunacode/tools/grep_components/result_formatter.py +45 -0
  57. tunacode/tools/grep_components/search_result.py +35 -0
  58. tunacode/tools/todo.py +27 -21
  59. tunacode/types.py +19 -4
  60. tunacode/ui/completers.py +6 -1
  61. tunacode/ui/decorators.py +2 -2
  62. tunacode/ui/keybindings.py +1 -1
  63. tunacode/ui/panels.py +13 -5
  64. tunacode/ui/prompt_manager.py +1 -1
  65. tunacode/ui/tool_ui.py +8 -2
  66. tunacode/utils/bm25.py +4 -4
  67. tunacode/utils/file_utils.py +2 -2
  68. tunacode/utils/message_utils.py +3 -1
  69. tunacode/utils/system.py +0 -4
  70. tunacode/utils/text_utils.py +1 -1
  71. tunacode/utils/token_counter.py +2 -2
  72. {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/METADATA +146 -1
  73. tunacode_cli-0.0.53.dist-info/RECORD +123 -0
  74. {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/top_level.txt +0 -1
  75. api/auth.py +0 -13
  76. api/users.py +0 -8
  77. tunacode/core/recursive/__init__.py +0 -18
  78. tunacode/core/recursive/aggregator.py +0 -467
  79. tunacode/core/recursive/budget.py +0 -414
  80. tunacode/core/recursive/decomposer.py +0 -398
  81. tunacode/core/recursive/executor.py +0 -470
  82. tunacode/core/recursive/hierarchy.py +0 -488
  83. tunacode/ui/recursive_progress.py +0 -380
  84. tunacode_cli-0.0.50.dist-info/RECORD +0 -107
  85. {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/WHEEL +0 -0
  86. {tunacode_cli-0.0.50.dist-info → tunacode_cli-0.0.53.dist-info}/entry_points.txt +0 -0
  87. {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,,