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

@@ -3,9 +3,8 @@ import importlib
3
3
  import json
4
4
  import logging
5
5
  import os
6
- import re
7
6
  from collections.abc import Iterator
8
- from datetime import datetime, timezone
7
+ from datetime import datetime
9
8
  from typing import Any
10
9
 
11
10
  from tunacode.constants import (
@@ -16,11 +15,8 @@ from tunacode.constants import (
16
15
  )
17
16
  from tunacode.exceptions import ToolBatchingJSONError
18
17
  from tunacode.types import (
19
- ErrorMessage,
20
18
  StateManager,
21
19
  ToolCallback,
22
- ToolCallId,
23
- ToolName,
24
20
  )
25
21
  from tunacode.ui import console as ui
26
22
  from tunacode.utils.retry import retry_json_parse_async
@@ -267,127 +263,3 @@ async def parse_json_tool_calls(
267
263
  except Exception as e:
268
264
  if state_manager.session.show_thoughts:
269
265
  await ui.error(f"Error executing fallback tool {tool_name}: {e!s}")
270
-
271
-
272
- async def extract_and_execute_tool_calls(
273
- text: str, tool_callback: ToolCallback | None, state_manager: StateManager
274
- ):
275
- """Extract tool calls from text content and execute them.
276
- Supports multiple formats for maximum compatibility.
277
- """
278
- if not tool_callback:
279
- return
280
-
281
- # Format 2: Tool calls in code blocks
282
- code_block_pattern = r'```json\s*(\{(?:[^{}]|"[^"]*"|(?:\{[^}]*\}))*"tool"(?:[^{}]|"[^"]*"|(?:\{[^}]*\}))*\})\s*```'
283
- code_matches = re.findall(code_block_pattern, text, re.MULTILINE | re.DOTALL)
284
- remaining_text = re.sub(code_block_pattern, "", text)
285
-
286
- for match in code_matches:
287
- try:
288
- # Use retry logic for JSON parsing in code blocks
289
- tool_data = await retry_json_parse_async(
290
- match,
291
- max_retries=JSON_PARSE_MAX_RETRIES,
292
- base_delay=JSON_PARSE_BASE_DELAY,
293
- max_delay=JSON_PARSE_MAX_DELAY,
294
- )
295
- if "tool" in tool_data and "args" in tool_data:
296
-
297
- class MockToolCall:
298
- def __init__(self, tool_name: str, args: dict):
299
- self.tool_name = tool_name
300
- self.args = args
301
- self.tool_call_id = f"codeblock_{datetime.now().timestamp()}"
302
-
303
- class MockNode:
304
- pass
305
-
306
- mock_call = MockToolCall(tool_data["tool"], tool_data["args"])
307
- mock_node = MockNode()
308
-
309
- await tool_callback(mock_call, mock_node)
310
-
311
- if state_manager.session.show_thoughts:
312
- await ui.muted(f"FALLBACK: Executed {tool_data['tool']} from code block")
313
-
314
- except json.JSONDecodeError as e:
315
- # After all retries failed
316
- logger.error(
317
- f"Code block JSON parsing failed after {JSON_PARSE_MAX_RETRIES} retries: {e}"
318
- )
319
- if state_manager.session.show_thoughts:
320
- await ui.error(
321
- f"Failed to parse code block tool JSON after {JSON_PARSE_MAX_RETRIES} retries"
322
- )
323
- # Raise custom exception for better error handling
324
- raise ToolBatchingJSONError(
325
- json_content=match,
326
- retry_count=JSON_PARSE_MAX_RETRIES,
327
- original_error=e,
328
- ) from e
329
- except (KeyError, Exception) as e:
330
- if state_manager.session.show_thoughts:
331
- await ui.error(f"Error parsing code block tool call: {e!s}")
332
-
333
- # Format 1: {"tool": "name", "args": {...}}
334
- await parse_json_tool_calls(remaining_text, tool_callback, state_manager)
335
-
336
-
337
- def patch_tool_messages(
338
- error_message: ErrorMessage = "Tool operation failed",
339
- state_manager: StateManager = None,
340
- ):
341
- """Find any tool calls without responses and add synthetic error responses for them.
342
- Takes an error message to use in the synthesized tool response.
343
-
344
- Ignores tools that have corresponding retry prompts as the model is already
345
- addressing them.
346
- """
347
- if state_manager is None:
348
- raise ValueError("state_manager is required for patch_tool_messages")
349
-
350
- messages = state_manager.session.messages
351
-
352
- if not messages:
353
- return
354
-
355
- # Map tool calls to their tool returns
356
- tool_calls: dict[ToolCallId, ToolName] = {} # tool_call_id -> tool_name
357
- tool_returns: set[ToolCallId] = set() # set of tool_call_ids with returns
358
- retry_prompts: set[ToolCallId] = set() # set of tool_call_ids with retry prompts
359
-
360
- for message in messages:
361
- if hasattr(message, "parts"):
362
- for part in message.parts:
363
- if (
364
- hasattr(part, "part_kind")
365
- and hasattr(part, "tool_call_id")
366
- and part.tool_call_id
367
- ):
368
- if part.part_kind == "tool-call":
369
- tool_calls[part.tool_call_id] = part.tool_name
370
- elif part.part_kind == "tool-return":
371
- tool_returns.add(part.tool_call_id)
372
- elif part.part_kind == "retry-prompt":
373
- retry_prompts.add(part.tool_call_id)
374
-
375
- # Identify orphaned tools (those without responses and not being retried)
376
- for tool_call_id, tool_name in list(tool_calls.items()):
377
- if tool_call_id not in tool_returns and tool_call_id not in retry_prompts:
378
- # Import ModelRequest and ToolReturnPart lazily
379
- model_request_cls, tool_return_part_cls, _ = get_model_messages()
380
- messages.append(
381
- model_request_cls(
382
- parts=[
383
- tool_return_part_cls(
384
- tool_name=tool_name,
385
- content=error_message,
386
- tool_call_id=tool_call_id,
387
- timestamp=datetime.now(timezone.utc),
388
- part_kind="tool-return",
389
- )
390
- ],
391
- kind="request",
392
- )
393
- )
tunacode/core/state.py CHANGED
@@ -52,6 +52,10 @@ class SessionState:
52
52
  input_sessions: InputSessions = field(default_factory=dict)
53
53
  current_task: Optional[Any] = None
54
54
  todos: list[TodoItem] = field(default_factory=list)
55
+ # CLAUDE_ANCHOR[react-scratchpad]: Session scratchpad for ReAct tooling
56
+ react_scratchpad: dict[str, Any] = field(default_factory=lambda: {"timeline": []})
57
+ react_forced_calls: int = 0
58
+ react_guidance: list[str] = field(default_factory=list)
55
59
  # Operation state tracking
56
60
  operation_cancelled: bool = False
57
61
  # Enhanced tracking for thoughts display
@@ -174,6 +178,17 @@ class StateManager:
174
178
  def clear_todos(self) -> None:
175
179
  self._session.todos = []
176
180
 
181
+ # React scratchpad helpers
182
+ def get_react_scratchpad(self) -> dict[str, Any]:
183
+ return self._session.react_scratchpad
184
+
185
+ def append_react_entry(self, entry: dict[str, Any]) -> None:
186
+ timeline = self._session.react_scratchpad.setdefault("timeline", [])
187
+ timeline.append(entry)
188
+
189
+ def clear_react_scratchpad(self) -> None:
190
+ self._session.react_scratchpad = {"timeline": []}
191
+
177
192
  def reset_session(self) -> None:
178
193
  """Reset the session to a fresh state."""
179
194
  self._session = SessionState()
@@ -0,0 +1,23 @@
1
+ <tool>
2
+ <description>
3
+ Record a ReAct-style think/observe timeline, retrieve it, or clear it for the current session.
4
+ </description>
5
+ <parameters>
6
+ <parameter name="action" required="true">
7
+ <type>string</type>
8
+ <description>One of think, observe, get, clear.</description>
9
+ </parameter>
10
+ <parameter name="thoughts" required="false">
11
+ <type>string</type>
12
+ <description>Reasoning text for think entries.</description>
13
+ </parameter>
14
+ <parameter name="next_action" required="false">
15
+ <type>string</type>
16
+ <description>Planned action to pair with think entries.</description>
17
+ </parameter>
18
+ <parameter name="result" required="false">
19
+ <type>string</type>
20
+ <description>Observation details for observe entries.</description>
21
+ </parameter>
22
+ </parameters>
23
+ </tool>
@@ -0,0 +1,153 @@
1
+ """Lightweight ReAct-style scratchpad tool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from pathlib import Path
6
+ from typing import Any, Dict, Literal
7
+
8
+ import defusedxml.ElementTree as ET
9
+ from pydantic_ai.exceptions import ModelRetry
10
+
11
+ from tunacode.core.state import StateManager
12
+ from tunacode.types import ToolResult, UILogger
13
+
14
+ from .base import BaseTool
15
+
16
+
17
+ # CLAUDE_ANCHOR[react-tool]: Minimal ReAct scratchpad tool surface
18
+ class ReactTool(BaseTool):
19
+ """Minimal ReAct scratchpad for tracking think/observe steps."""
20
+
21
+ def __init__(self, state_manager: StateManager, ui_logger: UILogger | None = None):
22
+ super().__init__(ui_logger)
23
+ self.state_manager = state_manager
24
+
25
+ @property
26
+ def tool_name(self) -> str:
27
+ return "react"
28
+
29
+ async def _execute(
30
+ self,
31
+ action: Literal["think", "observe", "get", "clear"],
32
+ thoughts: str | None = None,
33
+ next_action: str | None = None,
34
+ result: str | None = None,
35
+ ) -> ToolResult:
36
+ scratchpad = self._ensure_scratchpad()
37
+
38
+ if action == "think":
39
+ if not thoughts:
40
+ raise ModelRetry("Provide thoughts when using react think action")
41
+ if not next_action:
42
+ raise ModelRetry("Specify next_action when recording react thoughts")
43
+
44
+ entry = {
45
+ "type": "think",
46
+ "thoughts": thoughts,
47
+ "next_action": next_action,
48
+ }
49
+ self.state_manager.append_react_entry(entry)
50
+ return "Recorded think step"
51
+
52
+ if action == "observe":
53
+ if not result:
54
+ raise ModelRetry("Provide result when using react observe action")
55
+
56
+ entry = {
57
+ "type": "observe",
58
+ "result": result,
59
+ }
60
+ self.state_manager.append_react_entry(entry)
61
+ return "Recorded observation"
62
+
63
+ if action == "get":
64
+ timeline = scratchpad.get("timeline", [])
65
+ if not timeline:
66
+ return "React scratchpad is empty"
67
+
68
+ formatted = [
69
+ f"{index + 1}. {item['type']}: {self._format_entry(item)}"
70
+ for index, item in enumerate(timeline)
71
+ ]
72
+ return "\n".join(formatted)
73
+
74
+ if action == "clear":
75
+ self.state_manager.clear_react_scratchpad()
76
+ return "React scratchpad cleared"
77
+
78
+ raise ModelRetry("Invalid react action. Use one of: think, observe, get, clear")
79
+
80
+ def _format_entry(self, item: Dict[str, Any]) -> str:
81
+ if item["type"] == "think":
82
+ return f"thoughts='{item['thoughts']}', next_action='{item['next_action']}'"
83
+ if item["type"] == "observe":
84
+ return f"result='{item['result']}'"
85
+ return str(item)
86
+
87
+ def _ensure_scratchpad(self) -> dict[str, Any]:
88
+ scratchpad = self.state_manager.get_react_scratchpad()
89
+ scratchpad.setdefault("timeline", [])
90
+ return scratchpad
91
+
92
+ def _get_base_prompt(self) -> str:
93
+ prompt_file = Path(__file__).parent / "prompts" / "react_prompt.xml"
94
+ if prompt_file.exists():
95
+ try:
96
+ tree = ET.parse(prompt_file)
97
+ root = tree.getroot()
98
+ description = root.find("description")
99
+ if description is not None and description.text:
100
+ return description.text.strip()
101
+ except Exception:
102
+ pass
103
+ return "Use this tool to record think/observe notes and manage the react scratchpad"
104
+
105
+ def _get_parameters_schema(self) -> Dict[str, Any]:
106
+ prompt_file = Path(__file__).parent / "prompts" / "react_prompt.xml"
107
+ if prompt_file.exists():
108
+ try:
109
+ tree = ET.parse(prompt_file)
110
+ root = tree.getroot()
111
+ parameters = root.find("parameters")
112
+ if parameters is not None:
113
+ schema: Dict[str, Any] = {
114
+ "type": "object",
115
+ "properties": {},
116
+ "required": ["action"],
117
+ }
118
+ for param in parameters.findall("parameter"):
119
+ name = param.get("name")
120
+ param_type = param.find("type")
121
+ description = param.find("description")
122
+ if name and param_type is not None:
123
+ schema["properties"][name] = {
124
+ "type": param_type.text.strip(),
125
+ "description": description.text.strip()
126
+ if description is not None and description.text
127
+ else "",
128
+ }
129
+ return schema
130
+ except Exception:
131
+ pass
132
+ return {
133
+ "type": "object",
134
+ "properties": {
135
+ "action": {
136
+ "type": "string",
137
+ "description": "react operation to perform",
138
+ },
139
+ "thoughts": {
140
+ "type": "string",
141
+ "description": "Thought content for think action",
142
+ },
143
+ "next_action": {
144
+ "type": "string",
145
+ "description": "Planned next action for think action",
146
+ },
147
+ "result": {
148
+ "type": "string",
149
+ "description": "Observation message for observe action",
150
+ },
151
+ },
152
+ "required": ["action"],
153
+ }
@@ -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.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
@@ -1,5 +1,5 @@
1
1
  tunacode/__init__.py,sha256=yUul8igNYMfUrHnYfioIGAqvrH8b5BKiO_pt1wVnmd0,119
2
- tunacode/constants.py,sha256=qRKfoCng3RHYA0cPH5kYLBlmql31GzFOrq-APXX8zrg,6102
2
+ tunacode/constants.py,sha256=ttfY29jCfMQSZY5znsez0icXNHIrrUhggkSZcaR9Q4g,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
@@ -7,7 +7,7 @@ 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
9
  tunacode/cli/main.py,sha256=MAKPFA4kGSFciqMdxnyp2r9XzVp8TfxvK6ztt7dvjwM,3445
10
- tunacode/cli/repl.py,sha256=VcCGK6miHAFHQt-2leSkaLQO6tAfpAh3zH79ObRw6pc,23378
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
13
  tunacode/cli/commands/registry.py,sha256=oAppbaOb-2blVo7Akthu6dbR9UFvXom6wf8m52qftpU,14962
@@ -15,12 +15,12 @@ tunacode/cli/commands/template_shortcut.py,sha256=ApYTPkDVBRaLxa7rWaPrsGcJdkR7eg
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
@@ -156,8 +158,8 @@ tunacode/utils/system.py,sha256=J8KqJ4ZqQrNSnM5rrJxPeMk9z2xQQp6dWtI1SKBY1-0,1112
156
158
  tunacode/utils/text_utils.py,sha256=HAwlT4QMy41hr53cDbbNeNo05MI461TpI9b_xdIv8EY,7288
157
159
  tunacode/utils/token_counter.py,sha256=dmFuqVz4ywGFdLfAi5Mg9bAGf8v87Ek-mHU-R3fsYjI,2711
158
160
  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,,
161
+ tunacode_cli-0.0.76.2.dist-info/METADATA,sha256=1Het2CEX5MWn9T8AKYxV0w17RR9ZJbXRbFEaGn1oHBk,8605
162
+ tunacode_cli-0.0.76.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
163
+ tunacode_cli-0.0.76.2.dist-info/entry_points.txt,sha256=hbkytikj4dGu6rizPuAd_DGUPBGF191RTnhr9wdhORY,51
164
+ tunacode_cli-0.0.76.2.dist-info/licenses/LICENSE,sha256=Btzdu2kIoMbdSp6OyCLupB1aRgpTCJ_szMimgEnpkkE,1056
165
+ tunacode_cli-0.0.76.2.dist-info/RECORD,,