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/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
- console = RichConsole(force_terminal=True, legacy_windows=False)
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
- # Create key bindings object for backward compatibility
69
- kb = create_key_bindings()
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) -> Markdown:
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
- # Create console with explicit settings to ensure ANSI codes work properly
26
- console = Console()
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
- ● Caution: This tool can modify your codebase - always use git branches"""
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
- from rich.box import ROUNDED
8
- from rich.live import Live
9
- from rich.markdown import Markdown
10
- from rich.padding import Padding
11
- from rich.panel import Panel
12
- from rich.pretty import Pretty
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[Live]
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: Union[Text, Markdown] = Text.from_markup(thinking_msg)
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 console
231
+ from .output import get_console
232
+
233
+ rich = get_rich_components()
199
234
 
200
- self.live = Live(self._create_panel(), console=console, refresh_per_second=4)
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
- table = Table(show_header=False, box=None, padding=(0, 2, 0, 0))
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 <= 0:
66
- raise ValueError("limits must be positive integers")
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.76.9
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[logfire]==0.2.6
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=8Fd-GBPcVI2qDgNHlCI1klhROmwAg2dOSYhjaCcwSPQ,6170
3
- tunacode/context.py,sha256=YtfRjUiqsSkk2k9Nn_pjb_m-AXyh6XcOBOJWtFI0wVw,2405
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=F1E4zHVnbByu_Uo6AhCJ-W-lIGF_gV6kB84HLAGLmVY,2103
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=I8jHgYY3VgjTU8its0D0ysruuVqKbNTBur0JjPIUIZA,2844
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=tzJOeoIVQryS9HQFoGMyjUk9Wf-YgSMLNc7-mmle_Zk,11412
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=wJx07AQrZJGYNtlLSAZKIdwzDug5TRcJchxA-7o1Vyc,25233
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=ES2drzZ2dNlTcriM9LgqpSq3pbw97uJY4nqMuvkD5Rs,1650
50
- tunacode/core/agents/agent_components/agent_config.py,sha256=rVoFxmtu8Ly6-UAqTzvyv1NgPYTG5ZuYzJf5Qgo4384,13096
51
- tunacode/core/agents/agent_components/agent_helpers.py,sha256=FFX-zXDhNoXpzMVe2iznBpNzNtk7OJ2lHf44cfZhTk8,8268
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=seoWYpRonptxNyApapS-yGz4o3jTj8vLsRPCTUO4siM,439
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=nKKpJjr2uupErB2KAUgTog3ZqC8oKiho5qkKeFvpY70,22178
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=HfE30vUy8ebXCobP7psFNJc17-dvH6APChg2tbi7aTw,2632
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=ybVVutiilOQcULtA1zjjs_tTu5okwxHFp2MHtNz3s2E,6767
138
- tunacode/ui/panels.py,sha256=6XGOeax4m-yQvwP1iML67GK10AKlDLD46dB522gcNPU,17236
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=zNbujehYZ5FQLU8ywY9cSOcQDRh1ToLoGLGekEfOtbg,21254
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.76.9.dist-info/METADATA,sha256=oZtCGyxk4S-zEvwH2U3F3BXwKMFl1ewpQxI2T8byzi0,8913
163
- tunacode_cli-0.0.76.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
164
- tunacode_cli-0.0.76.9.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
165
- tunacode_cli-0.0.76.9.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
166
- tunacode_cli-0.0.76.9.dist-info/RECORD,,
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,,