tunacode-cli 0.0.76.9__py3-none-any.whl → 0.0.77.2__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/implementations/development.py +4 -4
- tunacode/configuration/key_descriptions.py +2 -9
- tunacode/constants.py +2 -2
- tunacode/context.py +5 -5
- tunacode/core/agents/agent_components/__init__.py +2 -0
- tunacode/core/agents/agent_components/agent_config.py +41 -38
- tunacode/core/agents/agent_components/agent_helpers.py +27 -0
- tunacode/core/agents/main.py +6 -65
- tunacode/core/setup/__init__.py +0 -2
- tunacode/prompts/{system.md → system.xml} +10 -7
- tunacode/setup.py +0 -2
- tunacode/tools/grep.py +3 -16
- tunacode/ui/console.py +61 -11
- tunacode/ui/output.py +35 -19
- tunacode/ui/panels.py +69 -32
- tunacode/utils/models_registry.py +3 -3
- {tunacode_cli-0.0.76.9.dist-info → tunacode_cli-0.0.77.2.dist-info}/METADATA +2 -2
- {tunacode_cli-0.0.76.9.dist-info → tunacode_cli-0.0.77.2.dist-info}/RECORD +21 -22
- tunacode/core/setup/git_safety_setup.py +0 -186
- {tunacode_cli-0.0.76.9.dist-info → tunacode_cli-0.0.77.2.dist-info}/WHEEL +0 -0
- {tunacode_cli-0.0.76.9.dist-info → tunacode_cli-0.0.77.2.dist-info}/entry_points.txt +0 -0
- {tunacode_cli-0.0.76.9.dist-info → tunacode_cli-0.0.77.2.dist-info}/licenses/LICENSE +0 -0
tunacode/ui/console.py
CHANGED
|
@@ -3,14 +3,12 @@
|
|
|
3
3
|
Provides high-level console functions and coordinates between different UI components.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
from rich.console import Console as RichConsole
|
|
7
|
-
from rich.markdown import Markdown
|
|
8
|
-
|
|
9
6
|
# Import and re-export all functions from specialized modules
|
|
7
|
+
# Lazy loading of Rich components
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
9
|
+
|
|
10
10
|
from .input import formatted_text, input, multiline_input
|
|
11
11
|
from .keybindings import create_key_bindings
|
|
12
|
-
|
|
13
|
-
# Unified UI logger compatibility layer
|
|
14
12
|
from .logging_compat import ui_logger
|
|
15
13
|
from .output import (
|
|
16
14
|
banner,
|
|
@@ -40,6 +38,29 @@ from .panels import (
|
|
|
40
38
|
from .prompt_manager import PromptConfig, PromptManager
|
|
41
39
|
from .validators import ModelValidator
|
|
42
40
|
|
|
41
|
+
if TYPE_CHECKING:
|
|
42
|
+
from rich.console import Console as RichConsole
|
|
43
|
+
|
|
44
|
+
_console: Optional["RichConsole"] = None
|
|
45
|
+
_keybindings: Optional[Any] = None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_console() -> "RichConsole":
|
|
49
|
+
"""Get or create the Rich console instance lazily."""
|
|
50
|
+
global _console
|
|
51
|
+
if _console is None:
|
|
52
|
+
from rich.console import Console as RichConsole
|
|
53
|
+
|
|
54
|
+
_console = RichConsole(force_terminal=True, legacy_windows=False)
|
|
55
|
+
return _console
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def get_markdown() -> type:
|
|
59
|
+
"""Get the Markdown class lazily."""
|
|
60
|
+
from rich.markdown import Markdown
|
|
61
|
+
|
|
62
|
+
return Markdown
|
|
63
|
+
|
|
43
64
|
|
|
44
65
|
# Async wrappers for UI logging
|
|
45
66
|
async def info(message: str) -> None:
|
|
@@ -62,16 +83,45 @@ async def success(message: str) -> None:
|
|
|
62
83
|
await ui_logger.success(message)
|
|
63
84
|
|
|
64
85
|
|
|
65
|
-
# Create console object for backward compatibility
|
|
66
|
-
|
|
86
|
+
# Create lazy console object for backward compatibility
|
|
87
|
+
class _LazyConsole:
|
|
88
|
+
"""Lazy console accessor."""
|
|
89
|
+
|
|
90
|
+
def __str__(self):
|
|
91
|
+
return str(get_console())
|
|
92
|
+
|
|
93
|
+
def __getattr__(self, name):
|
|
94
|
+
return getattr(get_console(), name)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# Create lazy key bindings object for backward compatibility
|
|
98
|
+
class _LazyKeyBindings:
|
|
99
|
+
"""Lazy key bindings accessor."""
|
|
100
|
+
|
|
101
|
+
def __str__(self):
|
|
102
|
+
return str(get_keybindings())
|
|
103
|
+
|
|
104
|
+
def __getattr__(self, name):
|
|
105
|
+
return getattr(get_keybindings(), name)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def get_keybindings() -> Any:
|
|
109
|
+
"""Get key bindings lazily."""
|
|
110
|
+
global _keybindings
|
|
111
|
+
if _keybindings is None:
|
|
112
|
+
_keybindings = create_key_bindings()
|
|
113
|
+
return _keybindings
|
|
114
|
+
|
|
67
115
|
|
|
68
|
-
#
|
|
69
|
-
|
|
116
|
+
# Module-level lazy instances
|
|
117
|
+
console = _LazyConsole()
|
|
118
|
+
kb = _LazyKeyBindings()
|
|
70
119
|
|
|
71
120
|
|
|
72
121
|
# Re-export markdown utility for backward compatibility
|
|
73
|
-
def markdown(text: str) ->
|
|
74
|
-
"""Create a Markdown object."""
|
|
122
|
+
def markdown(text: str) -> Any:
|
|
123
|
+
"""Create a Markdown object lazily."""
|
|
124
|
+
Markdown = get_markdown()
|
|
75
125
|
return Markdown(text)
|
|
76
126
|
|
|
77
127
|
|
tunacode/ui/output.py
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
"""Output and display functions for TunaCode UI."""
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
4
4
|
|
|
5
5
|
from prompt_toolkit.application import run_in_terminal
|
|
6
|
-
from rich.console import Console
|
|
7
6
|
from rich.padding import Padding
|
|
8
7
|
|
|
9
|
-
from tunacode.configuration.settings import ApplicationSettings
|
|
10
8
|
from tunacode.constants import (
|
|
11
9
|
MSG_UPDATE_AVAILABLE,
|
|
12
10
|
MSG_UPDATE_INSTRUCTION,
|
|
@@ -22,27 +20,43 @@ from .constants import SPINNER_TYPE
|
|
|
22
20
|
from .decorators import create_sync_wrapper
|
|
23
21
|
from .logging_compat import ui_logger
|
|
24
22
|
|
|
25
|
-
#
|
|
26
|
-
|
|
23
|
+
# Lazy console initialization
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from rich.console import Console
|
|
26
|
+
|
|
27
|
+
_console: Optional["Console"] = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def get_console() -> "Console":
|
|
31
|
+
"""Get console instance lazily."""
|
|
32
|
+
from rich.console import Console
|
|
33
|
+
|
|
34
|
+
global _console
|
|
35
|
+
if _console is None:
|
|
36
|
+
_console = Console()
|
|
37
|
+
return _console
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class _LazyConsole:
|
|
41
|
+
"""Lightweight proxy that defers Console creation."""
|
|
42
|
+
|
|
43
|
+
def __getattr__(self, name: str) -> Any:
|
|
44
|
+
return getattr(get_console(), name)
|
|
45
|
+
|
|
46
|
+
def __str__(self) -> str:
|
|
47
|
+
return str(get_console())
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
console = _LazyConsole()
|
|
27
51
|
colors = DotDict(UI_COLORS)
|
|
28
52
|
|
|
29
53
|
BANNER = """[bold cyan]
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
██║ ██║ ██║██║╚██╗██║██╔══██║
|
|
34
|
-
██║ ╚██████╔╝██║ ╚████║██║ ██║
|
|
35
|
-
╚═╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝
|
|
36
|
-
|
|
37
|
-
██████╗ ██████╗ ██████╗ ███████╗ dev
|
|
38
|
-
██╔════╝██╔═══██╗██╔══██╗██╔════╝
|
|
39
|
-
██║ ██║ ██║██║ ██║█████╗
|
|
40
|
-
██║ ██║ ██║██║ ██║██╔══╝
|
|
41
|
-
╚██████╗╚██████╔╝██████╔╝███████╗
|
|
42
|
-
╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝
|
|
54
|
+
><>
|
|
55
|
+
><(((°>
|
|
56
|
+
><> TunaCode <>
|
|
43
57
|
[/bold cyan]
|
|
44
58
|
|
|
45
|
-
|
|
59
|
+
"""
|
|
46
60
|
|
|
47
61
|
|
|
48
62
|
@create_sync_wrapper
|
|
@@ -83,6 +97,8 @@ async def usage(usage: str) -> None:
|
|
|
83
97
|
|
|
84
98
|
async def version() -> None:
|
|
85
99
|
"""Print version information."""
|
|
100
|
+
from tunacode.configuration.settings import ApplicationSettings
|
|
101
|
+
|
|
86
102
|
app_settings = ApplicationSettings()
|
|
87
103
|
await info(MSG_VERSION_DISPLAY.format(version=app_settings.version))
|
|
88
104
|
|
tunacode/ui/panels.py
CHANGED
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import time
|
|
5
|
-
from typing import Any, Optional, Union
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Mapping, Optional, Union
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
from rich.
|
|
9
|
-
from rich.
|
|
10
|
-
from rich.
|
|
11
|
-
from rich.
|
|
12
|
-
from rich.
|
|
13
|
-
from rich.table import Table
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from rich.markdown import Markdown
|
|
9
|
+
from rich.padding import Padding
|
|
10
|
+
from rich.pretty import Pretty
|
|
11
|
+
from rich.table import Table
|
|
12
|
+
from rich.text import Text
|
|
14
13
|
|
|
15
14
|
from tunacode.configuration.models import ModelRegistry
|
|
16
15
|
from tunacode.constants import (
|
|
@@ -45,11 +44,44 @@ from .output import print
|
|
|
45
44
|
|
|
46
45
|
colors = DotDict(UI_COLORS)
|
|
47
46
|
|
|
47
|
+
RenderableContent = Union["Text", "Markdown"]
|
|
48
|
+
|
|
49
|
+
_rich_components: Optional[Mapping[str, Any]] = None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def get_rich_components() -> Mapping[str, Any]:
|
|
53
|
+
"""Get Rich components lazily with caching."""
|
|
54
|
+
|
|
55
|
+
global _rich_components
|
|
56
|
+
if _rich_components is not None:
|
|
57
|
+
return _rich_components
|
|
58
|
+
|
|
59
|
+
from rich.box import ROUNDED
|
|
60
|
+
from rich.live import Live
|
|
61
|
+
from rich.markdown import Markdown
|
|
62
|
+
from rich.padding import Padding
|
|
63
|
+
from rich.panel import Panel
|
|
64
|
+
from rich.pretty import Pretty
|
|
65
|
+
from rich.table import Table
|
|
66
|
+
from rich.text import Text
|
|
67
|
+
|
|
68
|
+
_rich_components = {
|
|
69
|
+
"ROUNDED": ROUNDED,
|
|
70
|
+
"Live": Live,
|
|
71
|
+
"Markdown": Markdown,
|
|
72
|
+
"Padding": Padding,
|
|
73
|
+
"Panel": Panel,
|
|
74
|
+
"Pretty": Pretty,
|
|
75
|
+
"Table": Table,
|
|
76
|
+
"Text": Text,
|
|
77
|
+
}
|
|
78
|
+
return _rich_components
|
|
79
|
+
|
|
48
80
|
|
|
49
81
|
@create_sync_wrapper
|
|
50
82
|
async def panel(
|
|
51
83
|
title: str,
|
|
52
|
-
text: Union[str, Markdown, Pretty, Table],
|
|
84
|
+
text: Union[str, "Markdown", "Pretty", "Table"],
|
|
53
85
|
top: int = DEFAULT_PANEL_PADDING["top"],
|
|
54
86
|
right: int = DEFAULT_PANEL_PADDING["right"],
|
|
55
87
|
bottom: int = DEFAULT_PANEL_PADDING["bottom"],
|
|
@@ -58,26 +90,28 @@ async def panel(
|
|
|
58
90
|
**kwargs: Any,
|
|
59
91
|
) -> None:
|
|
60
92
|
"""Display a rich panel with modern styling."""
|
|
93
|
+
rich = get_rich_components()
|
|
61
94
|
border_style = border_style or kwargs.get("style") or colors.border
|
|
62
95
|
|
|
63
|
-
panel_obj = Panel(
|
|
64
|
-
Padding(text, (0, 1, 0, 1)),
|
|
96
|
+
panel_obj = rich["Panel"](
|
|
97
|
+
rich["Padding"](text, (0, 1, 0, 1)),
|
|
65
98
|
title=f"[bold]{title}[/bold]",
|
|
66
99
|
title_align="left",
|
|
67
100
|
border_style=border_style,
|
|
68
101
|
padding=(0, 1),
|
|
69
|
-
box=ROUNDED, # Use ROUNDED box style
|
|
102
|
+
box=rich["ROUNDED"], # Use ROUNDED box style
|
|
70
103
|
)
|
|
71
104
|
|
|
72
|
-
final_padding = Padding(panel_obj, (top, right, bottom, left))
|
|
105
|
+
final_padding = rich["Padding"](panel_obj, (top, right, bottom, left))
|
|
73
106
|
|
|
74
107
|
await print(final_padding, **kwargs)
|
|
75
108
|
|
|
76
109
|
|
|
77
110
|
async def agent(text: str, bottom: int = 1) -> None:
|
|
78
111
|
"""Display an agent panel with modern styling."""
|
|
112
|
+
rich = get_rich_components()
|
|
79
113
|
title = f"[bold {colors.primary}]●[/bold {colors.primary}] {APP_NAME}"
|
|
80
|
-
await panel(title, Markdown(text), bottom=bottom, border_style=colors.primary)
|
|
114
|
+
await panel(title, rich["Markdown"](text), bottom=bottom, border_style=colors.primary)
|
|
81
115
|
|
|
82
116
|
|
|
83
117
|
class StreamingAgentPanel:
|
|
@@ -86,7 +120,7 @@ class StreamingAgentPanel:
|
|
|
86
120
|
bottom: int
|
|
87
121
|
title: str
|
|
88
122
|
content: str
|
|
89
|
-
live: Optional[
|
|
123
|
+
live: Optional[Any]
|
|
90
124
|
_last_update_time: float
|
|
91
125
|
_dots_task: Optional[asyncio.Task]
|
|
92
126
|
_dots_count: int
|
|
@@ -120,13 +154,12 @@ class StreamingAgentPanel:
|
|
|
120
154
|
line = f"[ui] {label} ts_ns={ts}{(' ' + payload) if payload else ''}"
|
|
121
155
|
self._debug_events.append(line)
|
|
122
156
|
|
|
123
|
-
def _create_panel(self) -> Padding:
|
|
157
|
+
def _create_panel(self) -> "Padding":
|
|
124
158
|
"""Create a Rich panel with current content."""
|
|
125
|
-
# Use the UI_THINKING_MESSAGE constant instead of hardcoded text
|
|
126
|
-
from rich.text import Text
|
|
127
|
-
|
|
128
159
|
from tunacode.constants import UI_THINKING_MESSAGE
|
|
129
160
|
|
|
161
|
+
rich = get_rich_components()
|
|
162
|
+
|
|
130
163
|
# Show "Thinking..." only when no content has arrived yet
|
|
131
164
|
if not self.content:
|
|
132
165
|
# Apply dots animation to "Thinking..." message too
|
|
@@ -137,7 +170,7 @@ class StreamingAgentPanel:
|
|
|
137
170
|
dots_patterns = ["", ".", "..", "..."]
|
|
138
171
|
dots = dots_patterns[self._dots_count % len(dots_patterns)]
|
|
139
172
|
thinking_msg = base_msg + dots
|
|
140
|
-
content_renderable:
|
|
173
|
+
content_renderable: RenderableContent = rich["Text"].from_markup(thinking_msg)
|
|
141
174
|
else:
|
|
142
175
|
# Once we have content, show it with optional dots animation
|
|
143
176
|
display_content = self.content
|
|
@@ -147,16 +180,16 @@ class StreamingAgentPanel:
|
|
|
147
180
|
dots_patterns = ["", ".", "..", "..."]
|
|
148
181
|
dots = dots_patterns[self._dots_count % len(dots_patterns)]
|
|
149
182
|
display_content = self.content.rstrip() + dots
|
|
150
|
-
content_renderable = Markdown(display_content)
|
|
151
|
-
panel_obj = Panel(
|
|
152
|
-
Padding(content_renderable, (0, 1, 0, 1)),
|
|
183
|
+
content_renderable = rich["Markdown"](display_content)
|
|
184
|
+
panel_obj = rich["Panel"](
|
|
185
|
+
rich["Padding"](content_renderable, (0, 1, 0, 1)),
|
|
153
186
|
title=f"[bold]{self.title}[/bold]",
|
|
154
187
|
title_align="left",
|
|
155
188
|
border_style=colors.primary,
|
|
156
189
|
padding=(0, 1),
|
|
157
|
-
box=ROUNDED,
|
|
190
|
+
box=rich["ROUNDED"],
|
|
158
191
|
)
|
|
159
|
-
return Padding(
|
|
192
|
+
return rich["Padding"](
|
|
160
193
|
panel_obj,
|
|
161
194
|
(
|
|
162
195
|
DEFAULT_PANEL_PADDING["top"],
|
|
@@ -195,9 +228,11 @@ class StreamingAgentPanel:
|
|
|
195
228
|
|
|
196
229
|
async def start(self):
|
|
197
230
|
"""Start the live streaming display."""
|
|
198
|
-
from .output import
|
|
231
|
+
from .output import get_console
|
|
232
|
+
|
|
233
|
+
rich = get_rich_components()
|
|
199
234
|
|
|
200
|
-
self.live = Live(self._create_panel(), console=
|
|
235
|
+
self.live = rich["Live"](self._create_panel(), console=get_console(), refresh_per_second=4)
|
|
201
236
|
self.live.start()
|
|
202
237
|
self._log_debug("start")
|
|
203
238
|
# For "Thinking...", set time in past to trigger dots immediately
|
|
@@ -373,14 +408,15 @@ async def error(text: str) -> None:
|
|
|
373
408
|
|
|
374
409
|
async def dump_messages(messages_list=None, state_manager: StateManager = None) -> None:
|
|
375
410
|
"""Display message history panel."""
|
|
411
|
+
rich = get_rich_components()
|
|
376
412
|
if messages_list is None and state_manager:
|
|
377
413
|
# Get messages from state manager
|
|
378
|
-
messages = Pretty(state_manager.session.messages)
|
|
414
|
+
messages = rich["Pretty"](state_manager.session.messages)
|
|
379
415
|
elif messages_list is not None:
|
|
380
|
-
messages = Pretty(messages_list)
|
|
416
|
+
messages = rich["Pretty"](messages_list)
|
|
381
417
|
else:
|
|
382
418
|
# No messages available
|
|
383
|
-
messages = Pretty([])
|
|
419
|
+
messages = rich["Pretty"]([])
|
|
384
420
|
await panel(PANEL_MESSAGE_HISTORY, messages, style=colors.muted)
|
|
385
421
|
|
|
386
422
|
|
|
@@ -396,7 +432,8 @@ async def models(state_manager: StateManager = None) -> None:
|
|
|
396
432
|
|
|
397
433
|
async def help(command_registry=None) -> None:
|
|
398
434
|
"""Display the available commands organized by category."""
|
|
399
|
-
|
|
435
|
+
rich = get_rich_components()
|
|
436
|
+
table = rich["Table"](show_header=False, box=None, padding=(0, 2, 0, 0))
|
|
400
437
|
table.add_column("Command", style=f"bold {colors.primary}", justify="right", min_width=18)
|
|
401
438
|
table.add_column("Description", style=colors.muted)
|
|
402
439
|
|
|
@@ -456,7 +493,7 @@ async def help(command_registry=None) -> None:
|
|
|
456
493
|
|
|
457
494
|
@create_sync_wrapper
|
|
458
495
|
async def tool_confirm(
|
|
459
|
-
title: str, content: Union[str, Markdown], filepath: Optional[str] = None
|
|
496
|
+
title: str, content: Union[str, "Markdown"], filepath: Optional[str] = None
|
|
460
497
|
) -> None:
|
|
461
498
|
"""Display a tool confirmation panel."""
|
|
462
499
|
bottom_padding = 0 if filepath else 1
|
|
@@ -62,9 +62,9 @@ class ModelLimits(BaseModel):
|
|
|
62
62
|
if v is None:
|
|
63
63
|
return v
|
|
64
64
|
iv = int(v)
|
|
65
|
-
if iv
|
|
66
|
-
raise ValueError("limits must be
|
|
67
|
-
return iv
|
|
65
|
+
if iv < 0:
|
|
66
|
+
raise ValueError("limits must be non-negative integers")
|
|
67
|
+
return iv if iv > 0 else None
|
|
68
68
|
|
|
69
69
|
def format_limits(self) -> str:
|
|
70
70
|
"""Format limits as a readable string."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tunacode-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.77.2
|
|
4
4
|
Summary: Your agentic CLI developer.
|
|
5
5
|
Project-URL: Homepage, https://tunacode.xyz/
|
|
6
6
|
Project-URL: Repository, https://github.com/alchemiststudiosDOTai/tunacode
|
|
@@ -23,7 +23,7 @@ Requires-Python: <3.14,>=3.10
|
|
|
23
23
|
Requires-Dist: click<8.2.0,>=8.0.0
|
|
24
24
|
Requires-Dist: defusedxml
|
|
25
25
|
Requires-Dist: prompt-toolkit==3.0.51
|
|
26
|
-
Requires-Dist: pydantic-ai
|
|
26
|
+
Requires-Dist: pydantic-ai==0.2.6
|
|
27
27
|
Requires-Dist: pygments==2.19.1
|
|
28
28
|
Requires-Dist: rich==14.0.0
|
|
29
29
|
Requires-Dist: tiktoken>=0.5.2
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
tunacode/__init__.py,sha256=yUul8igNYMfUrHnYfioIGAqvrH8b5BKiO_pt1wVnmd0,119
|
|
2
|
-
tunacode/constants.py,sha256=
|
|
3
|
-
tunacode/context.py,sha256=
|
|
2
|
+
tunacode/constants.py,sha256=uOp0kTgQk6GFZXnx1gpSusnIlg72TxI11G-i5iMzmv0,6168
|
|
3
|
+
tunacode/context.py,sha256=4xMzqhSBqtTLuXnPBkJzn0SA61G5kAQytFvVY8TDnYY,2395
|
|
4
4
|
tunacode/exceptions.py,sha256=m80njR-LqBXhFAEOPqCE7N2QPU4Fkjlf_f6CWKO0_Is,8479
|
|
5
5
|
tunacode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
tunacode/setup.py,sha256=
|
|
6
|
+
tunacode/setup.py,sha256=1GXwD1cNDkGcmylZbytdlGnnHzpsGIwnGpnN0OFp1F0,2022
|
|
7
7
|
tunacode/types.py,sha256=xNpDRjIRYg4qGNbl3EG8B13CWAWBoob9ekVm8_6dvnc,10496
|
|
8
8
|
tunacode/cli/__init__.py,sha256=zgs0UbAck8hfvhYsWhWOfBe5oK09ug2De1r4RuQZREA,55
|
|
9
9
|
tunacode/cli/main.py,sha256=MAKPFA4kGSFciqMdxnyp2r9XzVp8TfxvK6ztt7dvjwM,3445
|
|
@@ -16,7 +16,7 @@ tunacode/cli/commands/implementations/__init__.py,sha256=dFczjIqCJTPrsSycD6PZYnp
|
|
|
16
16
|
tunacode/cli/commands/implementations/command_reload.py,sha256=GyjeKvJbgE4VYkaasGajspdk9wffumZMNLzfCUeNazM,1555
|
|
17
17
|
tunacode/cli/commands/implementations/conversation.py,sha256=ZijCNaRi1p5v1Q-IaVHtU2_BripSW3JCVKTtqFkOUjg,4676
|
|
18
18
|
tunacode/cli/commands/implementations/debug.py,sha256=w2fUgqFB4ipBCmNotbvaOOVW4OiCwJM6MXNWlyKyoqs,6754
|
|
19
|
-
tunacode/cli/commands/implementations/development.py,sha256=
|
|
19
|
+
tunacode/cli/commands/implementations/development.py,sha256=Imm8LiDtE69CtLwdtIdOzhCE4FAFEBZJqQimnNtlPY0,2836
|
|
20
20
|
tunacode/cli/commands/implementations/model.py,sha256=dFRmMlcN78TdGMFX-B2OPyoWqOVQL72XC8ayPyUQmpA,16166
|
|
21
21
|
tunacode/cli/commands/implementations/plan.py,sha256=iZtvdGPqvGqMr8_lYil8_8NOL1iyc54Bxtb0gb9VOnw,1825
|
|
22
22
|
tunacode/cli/commands/implementations/quickstart.py,sha256=53H7ubYMGMgmCeYCs6o_F91Q4pd3Ky008lCU4GPuRP8,1363
|
|
@@ -36,7 +36,7 @@ tunacode/cli/repl_components/output_display.py,sha256=uzse2bhxSyCWnJD0Ni5lwnp0Bm
|
|
|
36
36
|
tunacode/cli/repl_components/tool_executor.py,sha256=IBzlyyJrVJwlmmIetBRli9aIPIJqB4xKfAtGZlvdOgY,3762
|
|
37
37
|
tunacode/configuration/__init__.py,sha256=MbVXy8bGu0yKehzgdgZ_mfWlYGvIdb1dY2Ly75nfuPE,17
|
|
38
38
|
tunacode/configuration/defaults.py,sha256=eFUDD73tTWa3HM320BEn0VWM-XuDKW7d6m32qTK2eRI,1313
|
|
39
|
-
tunacode/configuration/key_descriptions.py,sha256=
|
|
39
|
+
tunacode/configuration/key_descriptions.py,sha256=4sD2Up5URtq7ZIcCnt-tZmXrfinMET77MTKEAiEC7x4,11095
|
|
40
40
|
tunacode/configuration/models.py,sha256=buH8ZquvcYI3OQBDIZeJ08cu00rSCeNABtUwl3VQS0E,4103
|
|
41
41
|
tunacode/configuration/settings.py,sha256=9wtIWBlLhW_ZBlLx-GA4XDfVZyGj2Gs6Zk49vk-nHq0,1047
|
|
42
42
|
tunacode/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -44,11 +44,11 @@ tunacode/core/code_index.py,sha256=2qxEn2eTIegV4F_gLeZO5lAOv8mkf4Y_t21whZ9F2Fk,1
|
|
|
44
44
|
tunacode/core/state.py,sha256=4SzI_OPiL2VIDywtUavtE6jZnIJS7K2IVgj8AYcawW0,8706
|
|
45
45
|
tunacode/core/tool_handler.py,sha256=42yUfnq5jgk-0LK93JoJgtsXfVDTf-7hNXyKEfH2FM0,3626
|
|
46
46
|
tunacode/core/agents/__init__.py,sha256=ZOSvWhqBWX3ADzTUZ7ILY92xZ7VMXanjPQ_Sf37WYmU,1005
|
|
47
|
-
tunacode/core/agents/main.py,sha256=
|
|
47
|
+
tunacode/core/agents/main.py,sha256=IFKuGy-3t9XJDAs4rO0oTPZ1xGkZAXxoK1efdgIN15Q,23251
|
|
48
48
|
tunacode/core/agents/utils.py,sha256=cQJbpXzMcixJ1TKdLsEcpJHMMMXiH6_qcT3wbnSQ9gc,9411
|
|
49
|
-
tunacode/core/agents/agent_components/__init__.py,sha256=
|
|
50
|
-
tunacode/core/agents/agent_components/agent_config.py,sha256=
|
|
51
|
-
tunacode/core/agents/agent_components/agent_helpers.py,sha256=
|
|
49
|
+
tunacode/core/agents/agent_components/__init__.py,sha256=65V5ijSKen0F0zLvUO3AkZJmCrocSW3lEbqNPrHqxoc,1706
|
|
50
|
+
tunacode/core/agents/agent_components/agent_config.py,sha256=X4S5PCsndoHBd7EHHuNlwrXRN7Q2WuWtmEoC8w-2LKc,12921
|
|
51
|
+
tunacode/core/agents/agent_components/agent_helpers.py,sha256=m0sB0_ztHhRJYFnG2tmQyNmyZk_WnZExBE5jKIHN5lA,9121
|
|
52
52
|
tunacode/core/agents/agent_components/json_tool_parser.py,sha256=HuyNT0rs-ppx_gLAI2e0XMVGbR_F0WXZfP3sx38VoMg,3447
|
|
53
53
|
tunacode/core/agents/agent_components/message_handler.py,sha256=KJGOtb9VhumgZpxxwO45HrKLhU9_MwuoWRsSQwJviNU,3704
|
|
54
54
|
tunacode/core/agents/agent_components/node_processor.py,sha256=oOi3Yuccpdmnlza6vZRr_wB2_OczV0OLcqvs0a3BJcA,24734
|
|
@@ -68,20 +68,19 @@ tunacode/core/logging/config.py,sha256=bhJ6KYrEliKC5BehXKXZHHPBJUBX0g5O3uxbr8qUK
|
|
|
68
68
|
tunacode/core/logging/formatters.py,sha256=uWx-M0jSvsAVo5JVdCK1VIVawXNONjJ2CvMwPuuUTg8,1236
|
|
69
69
|
tunacode/core/logging/handlers.py,sha256=lkLczpcI6kSammSdjrCccosGMrRdcAA_3UmuTOiPnxg,3788
|
|
70
70
|
tunacode/core/logging/logger.py,sha256=9RjRuX0GoUojRJ8WnJGQPFdXiluiJMCoFmvc8xEioB8,142
|
|
71
|
-
tunacode/core/setup/__init__.py,sha256=
|
|
71
|
+
tunacode/core/setup/__init__.py,sha256=edzZ5tdWPdokPaOuFgYGEUGY_Fcn6bcWSiDOhGGZTBc,372
|
|
72
72
|
tunacode/core/setup/agent_setup.py,sha256=tpOIW85C6o1m8pwAZQBIMKxKIyBUOpHHn4JJmDBFH3Q,1403
|
|
73
73
|
tunacode/core/setup/base.py,sha256=FMjBQQS_q3KOxHqfg7NJGmKq-1nxC40htiPZprzTu7I,970
|
|
74
74
|
tunacode/core/setup/config_setup.py,sha256=j04mf4DAi_WLJid3h-ylomqQIybWbCMoPd_70JOEfEs,19158
|
|
75
75
|
tunacode/core/setup/config_wizard.py,sha256=nYlgq1Q645h8hsrD9VdhG933lPdxbDUNREAWYfozfaA,9361
|
|
76
76
|
tunacode/core/setup/coordinator.py,sha256=5ZhD4rHUrW0RIdGnjmoK4wCvqlNGcXal4Qwev4s039U,2393
|
|
77
77
|
tunacode/core/setup/environment_setup.py,sha256=n3IrObKEynHZSwtUJ1FddMg2C4sHz7ca42awemImV8s,2225
|
|
78
|
-
tunacode/core/setup/git_safety_setup.py,sha256=Htt8A4BAn7F4DbjhNu_SO01zjwaRQ3wMv-vZujE1-JA,7328
|
|
79
78
|
tunacode/core/setup/template_setup.py,sha256=0lDGhNVCvGN7ykqHnl3pj4CONH3I2PvMzkmIZibfSoc,2640
|
|
80
79
|
tunacode/core/token_usage/api_response_parser.py,sha256=plLltHg4zGVzxjv3MFj45bbd-NOJeT_v3P0Ki4zlvn4,1831
|
|
81
80
|
tunacode/core/token_usage/cost_calculator.py,sha256=RjO-O0JENBuGOrWP7QgBZlZxeXC-PAIr8tj_9p_BxOU,2058
|
|
82
81
|
tunacode/core/token_usage/usage_tracker.py,sha256=YUCnF-712nLrbtEvFrsC-VZuYjKUCz3hf-_do6GKSDA,6016
|
|
83
|
-
tunacode/prompts/system.md,sha256=Q9QhUzeHISdxHJNkufo5QNJH5P0b-b8qwhgrMuTc3Zk,13345
|
|
84
82
|
tunacode/prompts/system.md.bak,sha256=q0gbk_-pvQlNtZBonRo4gNILkKStqNxgDN0ZEwzC3E4,17541
|
|
83
|
+
tunacode/prompts/system.xml,sha256=IKGelP8ukqP3x-bNPCH_MJ7VcdMjrQjo_Mik89ZBKYM,13405
|
|
85
84
|
tunacode/services/__init__.py,sha256=w_E8QK6RnvKSvU866eDe8BCRV26rAm4d3R-Yg06OWCU,19
|
|
86
85
|
tunacode/services/mcp.py,sha256=quO13skECUGt-4QE2NkWk6_8qhmZ5qjgibvw8tUOt-4,3761
|
|
87
86
|
tunacode/templates/__init__.py,sha256=ssEOPrPjyCywtKI-QFcoqcWhMjlfI5TbI8Ip0_wyqGM,241
|
|
@@ -91,7 +90,7 @@ tunacode/tools/base.py,sha256=jQz_rz2rNZrKo2vZtyArwiHCMdAaqRYJGYtSZ27nxcU,10711
|
|
|
91
90
|
tunacode/tools/bash.py,sha256=fEjI5Vm7yqQiOzc83kFzu1n4zAPiWLQNHZYY-ORNV4Q,12437
|
|
92
91
|
tunacode/tools/exit_plan_mode.py,sha256=DOl_8CsY7h9N-SuCg2YgMjp8eEMuO5I8Tv8XjoJcTJ0,10597
|
|
93
92
|
tunacode/tools/glob.py,sha256=_uAMV5cloRP0AQMbm7h_bKeqfhe7KFoBx9gfYls5ZzE,22956
|
|
94
|
-
tunacode/tools/grep.py,sha256=
|
|
93
|
+
tunacode/tools/grep.py,sha256=5539a4VHNUhfyKBd51mRYIckOMpL1N82otHoTwu9w0Y,21545
|
|
95
94
|
tunacode/tools/list_dir.py,sha256=aJ2FdAUU-HxOmAwBk188KYIYB94thESIrSBflzoUlYs,12402
|
|
96
95
|
tunacode/tools/present_plan.py,sha256=PjpZ7Ll9T6Ij-oBNPK9iysvGJZpvKr1-lqBpURNXiLM,10856
|
|
97
96
|
tunacode/tools/react.py,sha256=qEXhtxFM3skoz__L9R0Rabt1bmKdNkRyFMyAgNB_TFo,5602
|
|
@@ -126,7 +125,7 @@ tunacode/tutorial/steps.py,sha256=l2bbRVJuYlC186A-U1TIoMPBtLl4j053h4Wlzo1VO8c,43
|
|
|
126
125
|
tunacode/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4BolYU,13
|
|
127
126
|
tunacode/ui/completers.py,sha256=2VLVu5Nsl9LT34KcZ6zsKiEfZkgzVNcbt4vx6jw8MpQ,19548
|
|
128
127
|
tunacode/ui/config_dashboard.py,sha256=FhfWwEzPTNjvornTb0njxv_o2SavoEW4EXqyOCrbqk0,21657
|
|
129
|
-
tunacode/ui/console.py,sha256=
|
|
128
|
+
tunacode/ui/console.py,sha256=XiM1km8-vPEXoAp70Qx2dRxu4mrIitm9UqdI97vKANY,3777
|
|
130
129
|
tunacode/ui/constants.py,sha256=A76B_KpM8jCuBYRg4cPmhi8_j6LLyWttO7_jjv47r3w,421
|
|
131
130
|
tunacode/ui/decorators.py,sha256=jJDNztO8MyX_IG1nqXAL8-sQUFjaAzBnc5BsM3ioX24,1955
|
|
132
131
|
tunacode/ui/input.py,sha256=8C8xPcM_RccEbpw5tgcjlKSYDbS3dlA0ngTPrUKIonk,3554
|
|
@@ -134,8 +133,8 @@ tunacode/ui/keybindings.py,sha256=8j58NN432XyawffssFNe86leXaPur12qBX3O7hOOGsc,23
|
|
|
134
133
|
tunacode/ui/lexers.py,sha256=tmg4ic1enyTRLzanN5QPP7D_0n12YjX_8ZhsffzhXA4,1340
|
|
135
134
|
tunacode/ui/logging_compat.py,sha256=5v6lcjVaG1CxdY1Zm9FAGr9H7Sy-tP6ihGfhP-5YvAY,1406
|
|
136
135
|
tunacode/ui/model_selector.py,sha256=07kV9v0VWFgDapiXTz1_BjzHF1AliRq24I9lDq-hmHc,13426
|
|
137
|
-
tunacode/ui/output.py,sha256=
|
|
138
|
-
tunacode/ui/panels.py,sha256=
|
|
136
|
+
tunacode/ui/output.py,sha256=iOQRPfgfgMICPrACe940AGAdxiYGkIYVlidU5j2iEZg,6131
|
|
137
|
+
tunacode/ui/panels.py,sha256=DQETEuP2LnliXGWSXKIqtmA3qUD5uJD4hB05XMPikFQ,18319
|
|
139
138
|
tunacode/ui/path_heuristics.py,sha256=SkhGaM8WCRuK86vLwypbfhtI81PrXtOsWoz-P0CTsmQ,2221
|
|
140
139
|
tunacode/ui/prompt_manager.py,sha256=HUL6443pFPb41uDAnAKD-sZsrWd_VhWYRGwvrFH_9SI,5618
|
|
141
140
|
tunacode/ui/tool_descriptions.py,sha256=vk61JPIXy7gHNfJ--77maXgK6WwNwxqY47QYsw_a2uw,4126
|
|
@@ -151,7 +150,7 @@ tunacode/utils/file_utils.py,sha256=84g-MQRzmBI2aG_CuXsDl2OhvvWoSL7YdL5Kz_UKSwk,
|
|
|
151
150
|
tunacode/utils/import_cache.py,sha256=q_xjJbtju05YbFopLDSkIo1hOtCx3DOTl3GQE5FFDgs,295
|
|
152
151
|
tunacode/utils/json_utils.py,sha256=cMVctSwwV9Z1c-rZdj6UuOlZwsUPSTF5oUruP6uPix0,6470
|
|
153
152
|
tunacode/utils/message_utils.py,sha256=V4MrZZPmwO22_MVGupMqtE5ltQEBwaSIqGD5LEb_bLw,1050
|
|
154
|
-
tunacode/utils/models_registry.py,sha256=
|
|
153
|
+
tunacode/utils/models_registry.py,sha256=Tn2ByGFV1yJsWumFYy6JuT0eVpuPeZ1Zxj6JYsRRy1g,21277
|
|
155
154
|
tunacode/utils/retry.py,sha256=AHdUzY6m-mwlT4OPXdtWWMAafL_NeS7JAMORGyM8c5k,4931
|
|
156
155
|
tunacode/utils/ripgrep.py,sha256=VdGWYPQ1zCwUidw2QicuVmG5OiAgqI93jAsjS3y3ksE,11001
|
|
157
156
|
tunacode/utils/security.py,sha256=i3eGKg4o-qY2S_ObTlEaHO93q14iBfiPXR5O7srHn58,6579
|
|
@@ -159,8 +158,8 @@ tunacode/utils/system.py,sha256=J8KqJ4ZqQrNSnM5rrJxPeMk9z2xQQp6dWtI1SKBY1-0,1112
|
|
|
159
158
|
tunacode/utils/text_utils.py,sha256=HAwlT4QMy41hr53cDbbNeNo05MI461TpI9b_xdIv8EY,7288
|
|
160
159
|
tunacode/utils/token_counter.py,sha256=dmFuqVz4ywGFdLfAi5Mg9bAGf8v87Ek-mHU-R3fsYjI,2711
|
|
161
160
|
tunacode/utils/user_configuration.py,sha256=OA-L0BgWNbf9sWpc8lyivgLscwJdpdI8TAYbe0wRs1s,4836
|
|
162
|
-
tunacode_cli-0.0.
|
|
163
|
-
tunacode_cli-0.0.
|
|
164
|
-
tunacode_cli-0.0.
|
|
165
|
-
tunacode_cli-0.0.
|
|
166
|
-
tunacode_cli-0.0.
|
|
161
|
+
tunacode_cli-0.0.77.2.dist-info/METADATA,sha256=45BWpB2EYn2kWKFd3av6YyPnPsbGrEK4P4MLuO1w0Pg,8904
|
|
162
|
+
tunacode_cli-0.0.77.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
163
|
+
tunacode_cli-0.0.77.2.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
|
|
164
|
+
tunacode_cli-0.0.77.2.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
|
|
165
|
+
tunacode_cli-0.0.77.2.dist-info/RECORD,,
|