tunacode-cli 0.0.76.1__py3-none-any.whl → 0.0.76.3__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.

@@ -1,7 +1,6 @@
1
1
  """Models.dev integration for model discovery and validation."""
2
2
 
3
3
  import json
4
- from dataclasses import dataclass, field
5
4
  from datetime import datetime, timedelta
6
5
  from difflib import SequenceMatcher
7
6
  from pathlib import Path
@@ -9,11 +8,14 @@ from typing import Any, Dict, List, Optional
9
8
  from urllib.error import URLError
10
9
  from urllib.request import urlopen
11
10
 
11
+ from pydantic import BaseModel, ConfigDict, Field, field_validator
12
12
 
13
- @dataclass
14
- class ModelCapabilities:
13
+
14
+ class ModelCapabilities(BaseModel):
15
15
  """Model capabilities and features."""
16
16
 
17
+ model_config = ConfigDict(extra="ignore")
18
+
17
19
  attachment: bool = False
18
20
  reasoning: bool = False
19
21
  tool_call: bool = False
@@ -21,14 +23,24 @@ class ModelCapabilities:
21
23
  knowledge: Optional[str] = None
22
24
 
23
25
 
24
- @dataclass
25
- class ModelCost:
26
+ class ModelCost(BaseModel):
26
27
  """Model pricing information."""
27
28
 
29
+ model_config = ConfigDict(extra="ignore")
30
+
28
31
  input: Optional[float] = None
29
32
  output: Optional[float] = None
30
33
  cache: Optional[float] = None
31
34
 
35
+ @field_validator("input", "output", "cache")
36
+ @classmethod
37
+ def _non_negative(cls, v: Optional[float]) -> Optional[float]:
38
+ if v is None:
39
+ return v
40
+ if v < 0:
41
+ raise ValueError("cost values must be non-negative")
42
+ return float(v)
43
+
32
44
  def format_cost(self) -> str:
33
45
  """Format cost as a readable string."""
34
46
  if self.input is None or self.output is None:
@@ -36,16 +48,27 @@ class ModelCost:
36
48
  return f"${self.input}/{self.output} per 1M tokens"
37
49
 
38
50
 
39
- @dataclass
40
- class ModelLimits:
51
+ class ModelLimits(BaseModel):
41
52
  """Model context and output limits."""
42
53
 
54
+ model_config = ConfigDict(extra="ignore")
55
+
43
56
  context: Optional[int] = None
44
57
  output: Optional[int] = None
45
58
 
59
+ @field_validator("context", "output")
60
+ @classmethod
61
+ def _positive_int(cls, v: Optional[int]) -> Optional[int]:
62
+ if v is None:
63
+ return v
64
+ iv = int(v)
65
+ if iv <= 0:
66
+ raise ValueError("limits must be positive integers")
67
+ return iv
68
+
46
69
  def format_limits(self) -> str:
47
70
  """Format limits as a readable string."""
48
- parts = []
71
+ parts: List[str] = []
49
72
  if self.context:
50
73
  parts.append(f"{self.context:,} context")
51
74
  if self.output:
@@ -53,20 +76,21 @@ class ModelLimits:
53
76
  return ", ".join(parts) if parts else "Limits not specified"
54
77
 
55
78
 
56
- @dataclass
57
- class ModelInfo:
79
+ class ModelInfo(BaseModel):
58
80
  """Complete model information."""
59
81
 
82
+ model_config = ConfigDict(extra="ignore")
83
+
60
84
  id: str
61
85
  name: str
62
86
  provider: str
63
- capabilities: ModelCapabilities = field(default_factory=ModelCapabilities)
64
- cost: ModelCost = field(default_factory=ModelCost)
65
- limits: ModelLimits = field(default_factory=ModelLimits)
87
+ capabilities: ModelCapabilities = Field(default_factory=ModelCapabilities)
88
+ cost: ModelCost = Field(default_factory=ModelCost)
89
+ limits: ModelLimits = Field(default_factory=ModelLimits)
66
90
  release_date: Optional[str] = None
67
91
  last_updated: Optional[str] = None
68
92
  open_weights: bool = False
69
- modalities: Dict[str, List[str]] = field(default_factory=dict)
93
+ modalities: Dict[str, List[str]] = Field(default_factory=dict)
70
94
 
71
95
  @property
72
96
  def full_id(self) -> str:
@@ -77,7 +101,7 @@ class ModelInfo:
77
101
  """Format model for display."""
78
102
  display = f"{self.full_id} - {self.name}"
79
103
  if include_details:
80
- details = []
104
+ details: List[str] = []
81
105
  if self.cost.input is not None:
82
106
  details.append(self.cost.format_cost())
83
107
  if self.limits.context:
@@ -86,6 +110,7 @@ class ModelInfo:
86
110
  display += f" ({', '.join(details)})"
87
111
  return display
88
112
 
113
+ # we need to make this lighter for future dev, low priority
89
114
  def matches_search(self, query: str) -> float:
90
115
  """Calculate match score for search query (0-1)."""
91
116
  query_lower = query.lower()
@@ -107,13 +132,14 @@ class ModelInfo:
107
132
  return best_ratio
108
133
 
109
134
 
110
- @dataclass
111
- class ProviderInfo:
135
+ class ProviderInfo(BaseModel):
112
136
  """Provider information."""
113
137
 
138
+ model_config = ConfigDict(extra="ignore")
139
+
114
140
  id: str
115
141
  name: str
116
- env: List[str] = field(default_factory=list)
142
+ env: List[str] = Field(default_factory=list)
117
143
  npm: Optional[str] = None
118
144
  doc: Optional[str] = None
119
145
 
@@ -315,26 +341,26 @@ class ModelsRegistry:
315
341
 
316
342
  # Parse capabilities
317
343
  capabilities = ModelCapabilities(
318
- attachment=model_data.get("attachment", False),
319
- reasoning=model_data.get("reasoning", False),
320
- tool_call=model_data.get("tool_call", False),
321
- temperature=model_data.get("temperature", True),
344
+ attachment=bool(model_data.get("attachment", False)),
345
+ reasoning=bool(model_data.get("reasoning", False)),
346
+ tool_call=bool(model_data.get("tool_call", False)),
347
+ temperature=bool(model_data.get("temperature", True)),
322
348
  knowledge=model_data.get("knowledge"),
323
349
  )
324
350
 
325
351
  # Parse cost
326
352
  cost_data = model_data.get("cost", {})
327
353
  cost = ModelCost(
328
- input=cost_data.get("input") if isinstance(cost_data, dict) else None,
329
- output=cost_data.get("output") if isinstance(cost_data, dict) else None,
330
- cache=cost_data.get("cache") if isinstance(cost_data, dict) else None,
354
+ input=(cost_data.get("input") if isinstance(cost_data, dict) else None),
355
+ output=(cost_data.get("output") if isinstance(cost_data, dict) else None),
356
+ cache=(cost_data.get("cache") if isinstance(cost_data, dict) else None),
331
357
  )
332
358
 
333
359
  # Parse limits
334
360
  limit_data = model_data.get("limit", {})
335
361
  limits = ModelLimits(
336
- context=limit_data.get("context") if isinstance(limit_data, dict) else None,
337
- output=limit_data.get("output") if isinstance(limit_data, dict) else None,
362
+ context=(limit_data.get("context") if isinstance(limit_data, dict) else None),
363
+ output=(limit_data.get("output") if isinstance(limit_data, dict) else None),
338
364
  )
339
365
 
340
366
  # Create model info
@@ -347,8 +373,12 @@ class ModelsRegistry:
347
373
  limits=limits,
348
374
  release_date=model_data.get("release_date"),
349
375
  last_updated=model_data.get("last_updated"),
350
- open_weights=model_data.get("open_weights", False),
351
- modalities=model_data.get("modalities", {}),
376
+ open_weights=bool(model_data.get("open_weights", False)),
377
+ modalities=(
378
+ model_data.get("modalities", {})
379
+ if isinstance(model_data.get("modalities", {}), dict)
380
+ else {}
381
+ ),
352
382
  )
353
383
 
354
384
  # Store with full ID as key
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tunacode-cli
3
- Version: 0.0.76.1
3
+ Version: 0.0.76.3
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
@@ -69,7 +69,10 @@ Description-Content-Type: text/markdown
69
69
  # Option 1: One-line install (Linux/macOS)
70
70
  wget -qO- https://raw.githubusercontent.com/alchemiststudiosDOTai/tunacode/master/scripts/install_linux.sh | bash
71
71
 
72
- # Option 2: pip install
72
+ # Option 2: UV install (recommended)
73
+ uv tool install tunacode-cli
74
+
75
+ # Option 3: pip install
73
76
  pip install tunacode-cli
74
77
  ```
75
78
 
@@ -78,8 +81,9 @@ For detailed installation and configuration instructions, see the [**Getting Sta
78
81
  ## Quickstart
79
82
 
80
83
  ```bash
81
- # 1) Install
82
- pip install tunacode-cli
84
+ # 1) Install (choose one)
85
+ uv tool install tunacode-cli # recommended
86
+ # or: pip install tunacode-cli
83
87
 
84
88
  # 2) Launch the CLI
85
89
  tunacode --wizard # guided setup (enter an API key, pick a model)
@@ -105,7 +109,7 @@ For contributors and developers who want to work on TunaCode:
105
109
  git clone https://github.com/alchemiststudiosDOTai/tunacode.git
106
110
  cd tunacode
107
111
 
108
- # Quick setup (recommended)
112
+ # Quick setup (recommended) - uses UV automatically if available
109
113
  ./scripts/setup_dev_env.sh
110
114
 
111
115
  # Or manual setup with UV (recommended)
@@ -113,6 +117,11 @@ uv venv
113
117
  source .venv/bin/activate # On Windows: .venv\Scripts\activate
114
118
  uv pip install -e ".[dev]"
115
119
 
120
+ # Alternative: traditional setup
121
+ python3 -m venv venv
122
+ source venv/bin/activate # On Windows: venv\Scripts\activate
123
+ pip install -e ".[dev]"
124
+
116
125
  # Verify installation
117
126
  tunacode --version
118
127
  ```
@@ -1,26 +1,26 @@
1
1
  tunacode/__init__.py,sha256=yUul8igNYMfUrHnYfioIGAqvrH8b5BKiO_pt1wVnmd0,119
2
- tunacode/constants.py,sha256=qRKfoCng3RHYA0cPH5kYLBlmql31GzFOrq-APXX8zrg,6102
2
+ tunacode/constants.py,sha256=bRNiKjbYi_2hRO7BlYIJ8z8jGPXe-ze4fSoKj5aomh4,6170
3
3
  tunacode/context.py,sha256=YtfRjUiqsSkk2k9Nn_pjb_m-AXyh6XcOBOJWtFI0wVw,2405
4
4
  tunacode/exceptions.py,sha256=m80njR-LqBXhFAEOPqCE7N2QPU4Fkjlf_f6CWKO0_Is,8479
5
5
  tunacode/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  tunacode/setup.py,sha256=F1E4zHVnbByu_Uo6AhCJ-W-lIGF_gV6kB84HLAGLmVY,2103
7
7
  tunacode/types.py,sha256=xNpDRjIRYg4qGNbl3EG8B13CWAWBoob9ekVm8_6dvnc,10496
8
8
  tunacode/cli/__init__.py,sha256=zgs0UbAck8hfvhYsWhWOfBe5oK09ug2De1r4RuQZREA,55
9
- tunacode/cli/main.py,sha256=MAKPFA4kGSFciqMdxnyp2r9XzVp8TfxvK6ztt7dvjwM,3445
10
- tunacode/cli/repl.py,sha256=VcCGK6miHAFHQt-2leSkaLQO6tAfpAh3zH79ObRw6pc,23378
9
+ tunacode/cli/main.py,sha256=ZzFjLnn6YTYRrcgt7DfyqrxIPM220kBF2xV9rwF1BmA,3439
10
+ tunacode/cli/repl.py,sha256=QBw05NNypxuTYoV51FVoTfujJfiOTCIYzAr_1uoi0YA,23515
11
11
  tunacode/cli/commands/__init__.py,sha256=J7MZofTaSgspAKP64OavPukj4l53qvkv_-sCfYEUi10,1794
12
12
  tunacode/cli/commands/base.py,sha256=Ge_lNQA-GDfcb1Ap1oznCH3UrifBiHH3bA9DNL-tCDw,2519
13
- tunacode/cli/commands/registry.py,sha256=oAppbaOb-2blVo7Akthu6dbR9UFvXom6wf8m52qftpU,14962
13
+ tunacode/cli/commands/registry.py,sha256=qey9iqLL-gJF2zWATtY-AjNgE9zfA7197MuJpHVf_C0,15433
14
14
  tunacode/cli/commands/template_shortcut.py,sha256=ApYTPkDVBRaLxa7rWaPrsGcJdkR7eg09k18KyTjYg_E,3447
15
15
  tunacode/cli/commands/implementations/__init__.py,sha256=dFczjIqCJTPrsSycD6PZYnp5_cIEQEGgKr0Y14MRGjs,1088
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
- tunacode/cli/commands/implementations/debug.py,sha256=ornvceGF4GbJd2OJXnnT9i9KpHBAMJUYNs9wNhzViGM,6764
18
+ tunacode/cli/commands/implementations/debug.py,sha256=w2fUgqFB4ipBCmNotbvaOOVW4OiCwJM6MXNWlyKyoqs,6754
19
19
  tunacode/cli/commands/implementations/development.py,sha256=I8jHgYY3VgjTU8its0D0ysruuVqKbNTBur0JjPIUIZA,2844
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
23
- tunacode/cli/commands/implementations/system.py,sha256=2bTbJsiniac11XjGWZU4Cd6Cpug9C2-HtlmLFCgK20I,12009
23
+ tunacode/cli/commands/implementations/system.py,sha256=gWkBK0hw-whMI5bX1sIvH08WAE1bW5jHiSo7jWWT9-g,12004
24
24
  tunacode/cli/commands/implementations/template.py,sha256=YeFOjbKKfPswPCHPvlDUwXvg6J0MesyAyVsujiIgPbU,5482
25
25
  tunacode/cli/commands/implementations/todo.py,sha256=Dtz5bgcuK2VXGPWEBBZQgnWUMYkRXNzTGf_qkVPLF2U,8125
26
26
  tunacode/cli/commands/slash/__init__.py,sha256=O5EiITHZJgzIciKA_nylj5PyOZNvXE9jPmOHioDk3cU,824
@@ -31,9 +31,9 @@ tunacode/cli/commands/slash/types.py,sha256=v52tDX7T5I3nEETakloXLQzJqWXSyxcM1K5F
31
31
  tunacode/cli/commands/slash/validator.py,sha256=NF6u4n_VFoNiBRlErzNRA1iTG11bScizil3PhzpRSb4,13949
32
32
  tunacode/cli/repl_components/__init__.py,sha256=5ZjPJ3yUvZ5x6Vg9EYJ03-tdxfEEdmfradCmwSlVY3E,334
33
33
  tunacode/cli/repl_components/command_parser.py,sha256=BU_3h4aJ4MNQ0UU6_ulvK7NRTlC417soZkGGzMFy6-s,2368
34
- tunacode/cli/repl_components/error_recovery.py,sha256=59DCv8PkWg3ZOjaNPkWmYw0u68JpPMIxUMikMiW4TjY,6176
34
+ tunacode/cli/repl_components/error_recovery.py,sha256=y_hvtSulp1jgIgAZ3mGMhTCllKDxhkYDmwWaESAXY18,6146
35
35
  tunacode/cli/repl_components/output_display.py,sha256=uzse2bhxSyCWnJD0Ni5lwnp0BmYDAr1tZbnlj3-x6ro,1484
36
- tunacode/cli/repl_components/tool_executor.py,sha256=i6KB_qXaFlbdv90_3xj3TwL6alFd_JAbSS0Cdln9zfU,3767
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
39
  tunacode/configuration/key_descriptions.py,sha256=tzJOeoIVQryS9HQFoGMyjUk9Wf-YgSMLNc7-mmle_Zk,11412
@@ -41,12 +41,12 @@ tunacode/configuration/models.py,sha256=buH8ZquvcYI3OQBDIZeJ08cu00rSCeNABtUwl3VQ
41
41
  tunacode/configuration/settings.py,sha256=9wtIWBlLhW_ZBlLx-GA4XDfVZyGj2Gs6Zk49vk-nHq0,1047
42
42
  tunacode/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  tunacode/core/code_index.py,sha256=2qxEn2eTIegV4F_gLeZO5lAOv8mkf4Y_t21whZ9F2Fk,17370
44
- tunacode/core/state.py,sha256=JdfdWXdnNb8_9A9ZTGGYHbYRiUM34iKPHphF0S9xqDQ,8040
44
+ tunacode/core/state.py,sha256=4SzI_OPiL2VIDywtUavtE6jZnIJS7K2IVgj8AYcawW0,8706
45
45
  tunacode/core/tool_handler.py,sha256=42yUfnq5jgk-0LK93JoJgtsXfVDTf-7hNXyKEfH2FM0,3626
46
- tunacode/core/agents/__init__.py,sha256=UUJiPYb91arwziSpjd7vIk7XNGA_4HQbsOIbskSqevA,149
47
- tunacode/core/agents/main.py,sha256=zfIY4hLaFefK0WuiKpg_Z_6IRg8-RPsTRWb7jPV6JXc,18453
48
- tunacode/core/agents/utils.py,sha256=ja6Dwq3AVX6QTddmG2uY5ENxFxr5uzc4TS9OjommXp0,14535
49
- tunacode/core/agents/agent_components/__init__.py,sha256=CL4XH47T6v_iYy7xCPYjyiEFNOFnkcKwbTuKw6IjKTs,1474
46
+ tunacode/core/agents/__init__.py,sha256=ZOSvWhqBWX3ADzTUZ7ILY92xZ7VMXanjPQ_Sf37WYmU,1005
47
+ tunacode/core/agents/main.py,sha256=wJx07AQrZJGYNtlLSAZKIdwzDug5TRcJchxA-7o1Vyc,25233
48
+ tunacode/core/agents/utils.py,sha256=cQJbpXzMcixJ1TKdLsEcpJHMMMXiH6_qcT3wbnSQ9gc,9411
49
+ tunacode/core/agents/agent_components/__init__.py,sha256=ES2drzZ2dNlTcriM9LgqpSq3pbw97uJY4nqMuvkD5Rs,1650
50
50
  tunacode/core/agents/agent_components/agent_config.py,sha256=rVoFxmtu8Ly6-UAqTzvyv1NgPYTG5ZuYzJf5Qgo4384,13096
51
51
  tunacode/core/agents/agent_components/agent_helpers.py,sha256=FFX-zXDhNoXpzMVe2iznBpNzNtk7OJ2lHf44cfZhTk8,8268
52
52
  tunacode/core/agents/agent_components/json_tool_parser.py,sha256=HuyNT0rs-ppx_gLAI2e0XMVGbR_F0WXZfP3sx38VoMg,3447
@@ -56,7 +56,7 @@ tunacode/core/agents/agent_components/response_state.py,sha256=qnjRSQCYZzac04CcV
56
56
  tunacode/core/agents/agent_components/result_wrapper.py,sha256=9CFK0wpsfZx2WT4PBHfkSv22GxL1gAQuUYVMlmYtCJU,1761
57
57
  tunacode/core/agents/agent_components/state_transition.py,sha256=uyvLJriexosBDQIrxbVDLR_luvXAMG6tnDsX10mbZcI,4077
58
58
  tunacode/core/agents/agent_components/streaming.py,sha256=1HRk83SvnQGPlSXQjOX9Bjv-HfqCyLNVjLaKQZUnmp4,14811
59
- tunacode/core/agents/agent_components/task_completion.py,sha256=2mgrnNBTuGHYEPB2MS7ndsG-scqN5Qf1A85mxWZikJE,975
59
+ tunacode/core/agents/agent_components/task_completion.py,sha256=iLzwspVDtkXTJNQFk8YNSbb6wzMWEelmSMwSnzLIzbk,1193
60
60
  tunacode/core/agents/agent_components/tool_buffer.py,sha256=09FNtC6zTjiJOL_2CY0b7KDgwdNayGPV6jbENKH6Unc,766
61
61
  tunacode/core/agents/agent_components/tool_executor.py,sha256=LlzDwgSLLawwPZQqJ4vfLf-16nhwIiuN8zm8iCeBf1Y,1849
62
62
  tunacode/core/agents/agent_components/truncation_checker.py,sha256=XbJ3wwtdC4NhgIMIvFR0z_cfNnYMkiYAZo9zGDBPU8Y,2685
@@ -94,6 +94,7 @@ tunacode/tools/glob.py,sha256=_uAMV5cloRP0AQMbm7h_bKeqfhe7KFoBx9gfYls5ZzE,22956
94
94
  tunacode/tools/grep.py,sha256=nKKpJjr2uupErB2KAUgTog3ZqC8oKiho5qkKeFvpY70,22178
95
95
  tunacode/tools/list_dir.py,sha256=aJ2FdAUU-HxOmAwBk188KYIYB94thESIrSBflzoUlYs,12402
96
96
  tunacode/tools/present_plan.py,sha256=PjpZ7Ll9T6Ij-oBNPK9iysvGJZpvKr1-lqBpURNXiLM,10856
97
+ tunacode/tools/react.py,sha256=qEXhtxFM3skoz__L9R0Rabt1bmKdNkRyFMyAgNB_TFo,5602
97
98
  tunacode/tools/read_file.py,sha256=Xy8vkckjq8kBNNYJMpMhq0pabVi4Kp8b57C3C3picI4,6729
98
99
  tunacode/tools/run_command.py,sha256=VBFEy52y70gSkodGd0wNLrlfImgD_57Hl2h2BRn3GnE,8177
99
100
  tunacode/tools/schema_assembler.py,sha256=sUePWvprfTHz9hau1q7hmWd12ew3rHdbASAGkpjBhuM,5507
@@ -112,6 +113,7 @@ tunacode/tools/prompts/glob_prompt.xml,sha256=Jqkv-LSAYAcYkuMBDAvCKAnjYVhJY-r5mD
112
113
  tunacode/tools/prompts/grep_prompt.xml,sha256=G21-poHTRlkFBwZxEwQJj0llp9LCjTSf_BbYnvmn9G8,4790
113
114
  tunacode/tools/prompts/list_dir_prompt.xml,sha256=omZxbJJwjher0DP2nU_c4AWqoQuZZPzgORVRbLl68pQ,1246
114
115
  tunacode/tools/prompts/present_plan_prompt.xml,sha256=NVJznP7ppKwY7jd7-Ghnhvh5LWoBqrDvQKV7QFZi-Ps,980
116
+ tunacode/tools/prompts/react_prompt.xml,sha256=etF23T96I5XFs8MczeScjF7NH6jeEHaPOOmwGBwnnv0,829
115
117
  tunacode/tools/prompts/read_file_prompt.xml,sha256=oM3NmTv7wTv39LwAEsdXnWATJNI8qFr6WSK_esR09Is,3087
116
118
  tunacode/tools/prompts/run_command_prompt.xml,sha256=JVz0CXdXrI6nthI9QaWN-b1OTTlbIy-TQ7_3MwBs7hI,2332
117
119
  tunacode/tools/prompts/todo_prompt.xml,sha256=_fuPhhJYWwIx4No1G2yAyEt054aoybWGfUuzVY8OHWc,4602
@@ -122,7 +124,7 @@ tunacode/tutorial/content.py,sha256=qaQewFwXtKKEmzLH-4oMECGAa4Z4nd1qh2HfRWLpwyk,
122
124
  tunacode/tutorial/manager.py,sha256=ZgkzSC6ZtYSDq5Ce_TfYk9O9cvgFSL-pXrLZb7_HStM,6309
123
125
  tunacode/tutorial/steps.py,sha256=l2bbRVJuYlC186A-U1TIoMPBtLl4j053h4Wlzo1VO8c,4393
124
126
  tunacode/ui/__init__.py,sha256=aRNE2pS50nFAX6y--rSGMNYwhz905g14gRd6g4BolYU,13
125
- tunacode/ui/completers.py,sha256=ZkbCrBJJse3ZmGC79p_Bvv_DQOQBBOBZd4BF5Qf8-cI,12663
127
+ tunacode/ui/completers.py,sha256=O5wAlo9cufV2VWbFKMWzZeXRqptdS4CwK6wok1DdDak,14786
126
128
  tunacode/ui/config_dashboard.py,sha256=FhfWwEzPTNjvornTb0njxv_o2SavoEW4EXqyOCrbqk0,21657
127
129
  tunacode/ui/console.py,sha256=HfE30vUy8ebXCobP7psFNJc17-dvH6APChg2tbi7aTw,2632
128
130
  tunacode/ui/constants.py,sha256=A76B_KpM8jCuBYRg4cPmhi8_j6LLyWttO7_jjv47r3w,421
@@ -145,10 +147,11 @@ tunacode/utils/bm25.py,sha256=fd59YQXovC8rXwZrdoqIAfFrLn_WCVjzCh0pkU22APE,1966
145
147
  tunacode/utils/config_comparator.py,sha256=iMShhYCKlo0dXycbfpRu5rj3ckT460FoDvkbr5_-yTY,12879
146
148
  tunacode/utils/diff_utils.py,sha256=V9QqQ0q4MfabVTnWptF3IXDp3estnfOKcJtDe_Sj14I,2372
147
149
  tunacode/utils/file_utils.py,sha256=84g-MQRzmBI2aG_CuXsDl2OhvvWoSL7YdL5Kz_UKSwk,979
150
+ tunacode/utils/fuzzy_utils.py,sha256=Dl2C4ksNVfqdhjn-bVur4_JFiPkQXYerCjR-EOmtmRI,1140
148
151
  tunacode/utils/import_cache.py,sha256=q_xjJbtju05YbFopLDSkIo1hOtCx3DOTl3GQE5FFDgs,295
149
152
  tunacode/utils/json_utils.py,sha256=cMVctSwwV9Z1c-rZdj6UuOlZwsUPSTF5oUruP6uPix0,6470
150
153
  tunacode/utils/message_utils.py,sha256=V4MrZZPmwO22_MVGupMqtE5ltQEBwaSIqGD5LEb_bLw,1050
151
- tunacode/utils/models_registry.py,sha256=7dwQU0a-DYDHzQy3KtaGuPzTzS1pVayJMyUyZYGNgh8,20135
154
+ tunacode/utils/models_registry.py,sha256=zNbujehYZ5FQLU8ywY9cSOcQDRh1ToLoGLGekEfOtbg,21254
152
155
  tunacode/utils/retry.py,sha256=AHdUzY6m-mwlT4OPXdtWWMAafL_NeS7JAMORGyM8c5k,4931
153
156
  tunacode/utils/ripgrep.py,sha256=VdGWYPQ1zCwUidw2QicuVmG5OiAgqI93jAsjS3y3ksE,11001
154
157
  tunacode/utils/security.py,sha256=i3eGKg4o-qY2S_ObTlEaHO93q14iBfiPXR5O7srHn58,6579
@@ -156,8 +159,8 @@ tunacode/utils/system.py,sha256=J8KqJ4ZqQrNSnM5rrJxPeMk9z2xQQp6dWtI1SKBY1-0,1112
156
159
  tunacode/utils/text_utils.py,sha256=HAwlT4QMy41hr53cDbbNeNo05MI461TpI9b_xdIv8EY,7288
157
160
  tunacode/utils/token_counter.py,sha256=dmFuqVz4ywGFdLfAi5Mg9bAGf8v87Ek-mHU-R3fsYjI,2711
158
161
  tunacode/utils/user_configuration.py,sha256=OA-L0BgWNbf9sWpc8lyivgLscwJdpdI8TAYbe0wRs1s,4836
159
- tunacode_cli-0.0.76.1.dist-info/METADATA,sha256=kaal5oIxJND2kFtntLmMck-hwYkwE7hxLILTYSzhmNE,8605
160
- tunacode_cli-0.0.76.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
161
- tunacode_cli-0.0.76.1.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
162
- tunacode_cli-0.0.76.1.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
163
- tunacode_cli-0.0.76.1.dist-info/RECORD,,
162
+ tunacode_cli-0.0.76.3.dist-info/METADATA,sha256=jomzgPHW7B0qAiE2rjTVw4mZZmnOjerJ8QjgfQ0Bqxg,8913
163
+ tunacode_cli-0.0.76.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
164
+ tunacode_cli-0.0.76.3.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
165
+ tunacode_cli-0.0.76.3.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
166
+ tunacode_cli-0.0.76.3.dist-info/RECORD,,