wcgw 2.2.2__tar.gz → 2.3.0__tar.gz

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 wcgw might be problematic. Click here for more details.

Files changed (39) hide show
  1. {wcgw-2.2.2 → wcgw-2.3.0}/PKG-INFO +2 -2
  2. {wcgw-2.2.2 → wcgw-2.3.0}/gpt_instructions.txt +1 -0
  3. {wcgw-2.2.2 → wcgw-2.3.0}/pyproject.toml +3 -3
  4. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/anthropic_client.py +5 -2
  5. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/mcp_server/server.py +9 -4
  6. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/openai_client.py +1 -0
  7. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/tools.py +210 -72
  8. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/types_.py +2 -0
  9. {wcgw-2.2.2 → wcgw-2.3.0}/uv.lock +131 -134
  10. {wcgw-2.2.2 → wcgw-2.3.0}/.github/workflows/python-publish.yml +0 -0
  11. {wcgw-2.2.2 → wcgw-2.3.0}/.github/workflows/python-tests.yml +0 -0
  12. {wcgw-2.2.2 → wcgw-2.3.0}/.github/workflows/python-types.yml +0 -0
  13. {wcgw-2.2.2 → wcgw-2.3.0}/.gitignore +0 -0
  14. {wcgw-2.2.2 → wcgw-2.3.0}/.python-version +0 -0
  15. {wcgw-2.2.2 → wcgw-2.3.0}/.vscode/settings.json +0 -0
  16. {wcgw-2.2.2 → wcgw-2.3.0}/README.md +0 -0
  17. {wcgw-2.2.2 → wcgw-2.3.0}/gpt_action_json_schema.json +0 -0
  18. {wcgw-2.2.2 → wcgw-2.3.0}/openai.md +0 -0
  19. {wcgw-2.2.2 → wcgw-2.3.0}/src/__init__.py +0 -0
  20. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/__init__.py +0 -0
  21. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/__init__.py +0 -0
  22. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/__main__.py +0 -0
  23. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/cli.py +0 -0
  24. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/common.py +0 -0
  25. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/computer_use.py +0 -0
  26. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/diff-instructions.txt +0 -0
  27. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/mcp_server/Readme.md +0 -0
  28. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/mcp_server/__init__.py +0 -0
  29. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/openai_utils.py +0 -0
  30. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/client/sys_utils.py +0 -0
  31. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/relay/serve.py +0 -0
  32. {wcgw-2.2.2 → wcgw-2.3.0}/src/wcgw/relay/static/privacy.txt +0 -0
  33. {wcgw-2.2.2 → wcgw-2.3.0}/static/claude-ss.jpg +0 -0
  34. {wcgw-2.2.2 → wcgw-2.3.0}/static/computer-use.jpg +0 -0
  35. {wcgw-2.2.2 → wcgw-2.3.0}/static/example.jpg +0 -0
  36. {wcgw-2.2.2 → wcgw-2.3.0}/static/rocket-icon.png +0 -0
  37. {wcgw-2.2.2 → wcgw-2.3.0}/static/ss1.png +0 -0
  38. {wcgw-2.2.2 → wcgw-2.3.0}/tests/test_basic.py +0 -0
  39. {wcgw-2.2.2 → wcgw-2.3.0}/tests/test_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wcgw
3
- Version: 2.2.2
3
+ Version: 2.3.0
4
4
  Summary: Shell and coding agent on claude and chatgpt
5
5
  Project-URL: Homepage, https://github.com/rusiaaman/wcgw
6
6
  Author-email: Aman Rusia <gapypi@arcfu.com>
@@ -9,7 +9,6 @@ Requires-Dist: anthropic>=0.39.0
9
9
  Requires-Dist: fastapi>=0.115.0
10
10
  Requires-Dist: humanize>=4.11.0
11
11
  Requires-Dist: mcp
12
- Requires-Dist: nltk>=3.9.1
13
12
  Requires-Dist: openai>=1.46.0
14
13
  Requires-Dist: petname>=2.6
15
14
  Requires-Dist: pexpect>=4.9.0
@@ -19,6 +18,7 @@ Requires-Dist: python-dotenv>=1.0.1
19
18
  Requires-Dist: rich>=13.8.1
20
19
  Requires-Dist: semantic-version>=2.10.0
21
20
  Requires-Dist: shell>=1.0.1
21
+ Requires-Dist: syntax-checker==0.2.10
22
22
  Requires-Dist: tiktoken==0.7.0
23
23
  Requires-Dist: toml>=0.10.2
24
24
  Requires-Dist: typer>=0.12.5
@@ -23,6 +23,7 @@ Instructions for `BashCommand`:
23
23
  Instructions for `Read File`
24
24
  - Read full content of a file.
25
25
  - Provide absolute file path only.
26
+ - Use this instead of 'cat' from BashCommand
26
27
 
27
28
  Instructions for `Write if Empty`
28
29
  - Write content to an empty or non-existent file. Provide file path and content. Use this instead of BashCommand for writing new files.
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  authors = [{ name = "Aman Rusia", email = "gapypi@arcfu.com" }]
3
3
  name = "wcgw"
4
- version = "2.2.2"
4
+ version = "2.3.0"
5
5
  description = "Shell and coding agent on claude and chatgpt"
6
6
  readme = "README.md"
7
7
  requires-python = ">=3.11, <3.13"
@@ -22,10 +22,10 @@ dependencies = [
22
22
  "websockets>=13.1",
23
23
  "pydantic>=2.9.2",
24
24
  "semantic-version>=2.10.0",
25
- "nltk>=3.9.1",
26
25
  "anthropic>=0.39.0",
27
- "mcp",
28
26
  "humanize>=4.11.0",
27
+ "mcp",
28
+ "syntax-checker==0.2.10",
29
29
  ]
30
30
 
31
31
  [project.urls]
@@ -173,6 +173,7 @@ def loop(
173
173
  - Always run `pwd` if you get any file or directory not found error to make sure you're not lost.
174
174
  - The control will return to you in 5 seconds regardless of the status. For heavy commands, keep checking status using BashInteraction till they are finished.
175
175
  - Run long running commands in background using screen instead of "&".
176
+ - Use longer wait_for_seconds if the command is expected to run for a long time.
176
177
  """,
177
178
  ),
178
179
  ToolParam(
@@ -185,8 +186,9 @@ def loop(
185
186
  - Send send_specials=["Enter"] to recheck status of a running program.
186
187
  - Only one of send_text, send_specials, send_ascii should be provided.
187
188
  - This returns within 5 seconds, for heavy programs keep checking status for upto 10 turns before asking user to continue checking again.
188
- - Programs don't hang easily, so most likely explanation for no output is usually that the program is still running, and you need to check status again using ["Enter"].
189
- - Do not send Ctrl-c before checking for status till 10 minutes or whatever is appropriate for the program to finish.
189
+ - Programs don't hang easily, so most likely explanation for no output is usually that the program is still running, and you need to check status again using ["Enter"].
190
+ - Do not send Ctrl-c before checking for status till 10 minutes or whatever is appropriate for the program to finish.
191
+ - Set longer wait_for_seconds when program is expected to run for a long time.
190
192
  """,
191
193
  ),
192
194
  ToolParam(
@@ -195,6 +197,7 @@ def loop(
195
197
  description="""
196
198
  - Read full file content
197
199
  - Provide absolute file path only
200
+ - Use this instead of 'cat' from BashCommand
198
201
  """,
199
202
  ),
200
203
  ToolParam(
@@ -91,8 +91,9 @@ async def handle_list_tools() -> list[types.Tool]:
91
91
  - Optionally `exit shell has restarted` is the output, in which case environment resets, you can run fresh commands.
92
92
  - The first or the last line might be `(...truncated)` if the output is too long.
93
93
  - Always run `pwd` if you get any file or directory not found error to make sure you're not lost.
94
- - The control will return to you in 5 seconds regardless of the status. For heavy commands, keep checking status using BashInteraction till they are finished.
94
+ - The control will return to you in 3 seconds regardless of the status. For heavy commands, keep checking status using BashInteraction till they are finished.
95
95
  - Run long running commands in background using screen instead of "&".
96
+ - Use longer wait_for_seconds if the command is expected to run for a long time.
96
97
  """,
97
98
  ),
98
99
  ToolParam(
@@ -105,8 +106,9 @@ async def handle_list_tools() -> list[types.Tool]:
105
106
  - Send send_specials=["Enter"] to recheck status of a running program.
106
107
  - Only one of send_text, send_specials, send_ascii should be provided.
107
108
  - This returns within 3 seconds, for heavy programs keep checking status for upto 10 turns before asking user to continue checking again.
108
- - Programs don't hang easily, so most likely explanation for no output is usually that the program is still running, and you need to check status again using ["Enter"].
109
- - Do not send Ctrl-c before checking for status till 10 minutes or whatever is appropriate for the program to finish.
109
+ - Programs don't hang easily, so most likely explanation for no output is usually that the program is still running, and you need to check status again using ["Enter"].
110
+ - Do not send Ctrl-c before checking for status till 10 minutes or whatever is appropriate for the program to finish.
111
+ - Set longer wait_for_seconds when program is expected to run for a long time.
110
112
  """,
111
113
  ),
112
114
  ToolParam(
@@ -115,6 +117,7 @@ async def handle_list_tools() -> list[types.Tool]:
115
117
  description="""
116
118
  - Read full file content
117
119
  - Provide absolute file path only
120
+ - Use this instead of 'cat' from BashCommand
118
121
  """,
119
122
  ),
120
123
  ToolParam(
@@ -247,7 +250,9 @@ async def handle_call_tool(
247
250
  - Always read relevant files before editing.
248
251
  - Do not provide code snippets unless asked by the user, instead directly add/edit the code.
249
252
  - Do not install new tools/packages before ensuring no such tools/package or an alternative already exists.
250
-
253
+ - Do not use artifacts if you have access to the repository and not asked by the user to provide artifacts/snippets. Directly create/update using shell tools.
254
+ - Do not use Ctrl-c or Ctrl-z or interrupt commands without asking the user, because often the program don't show any update but they still are running.
255
+ - Do not use echo to write multi-line files, always use FileEdit tool to update a code.
251
256
 
252
257
  Additional instructions:
253
258
  Always run `pwd` if you get any file or directory not found error to make sure you're not lost, or to get absolute cwd.
@@ -192,6 +192,7 @@ def loop(
192
192
  description="""
193
193
  - Read full file content
194
194
  - Provide absolute file path only
195
+ - Use this instead of 'cat' from BashCommand
195
196
  """,
196
197
  ),
197
198
  openai.pydantic_function_tool(
@@ -42,7 +42,7 @@ import rich
42
42
  import pyte
43
43
  from dotenv import load_dotenv
44
44
 
45
- import openai
45
+ from syntax_checker import check_syntax
46
46
  from openai import OpenAI
47
47
  from openai.types.chat import (
48
48
  ChatCompletionMessageParam,
@@ -50,7 +50,7 @@ from openai.types.chat import (
50
50
  ChatCompletionMessage,
51
51
  ParsedChatCompletionMessage,
52
52
  )
53
- from nltk.metrics.distance import edit_distance # type: ignore[import-untyped]
53
+ from difflib import SequenceMatcher
54
54
 
55
55
  from ..types_ import (
56
56
  BashCommand,
@@ -183,6 +183,7 @@ class BashState:
183
183
  self._is_in_docker: Optional[str] = ""
184
184
  self._cwd: str = os.getcwd()
185
185
  self._shell = start_shell()
186
+ self._whitelist_for_overwrite: set[str] = set()
186
187
 
187
188
  # Get exit info to ensure shell is ready
188
189
  _get_exit_code(self._shell)
@@ -235,6 +236,13 @@ class BashState:
235
236
  )
236
237
  return "Not pending"
237
238
 
239
+ @property
240
+ def whitelist_for_overwrite(self) -> set[str]:
241
+ return self._whitelist_for_overwrite
242
+
243
+ def add_to_whitelist_for_overwrite(self, file_path: str) -> None:
244
+ self._whitelist_for_overwrite.add(file_path)
245
+
238
246
 
239
247
  BASH_STATE = BashState()
240
248
 
@@ -269,7 +277,7 @@ def update_repl_prompt(command: str) -> bool:
269
277
  BASH_STATE.shell.sendintr()
270
278
  index = BASH_STATE.shell.expect([PROMPT, pexpect.TIMEOUT], timeout=0.2)
271
279
  if index == 0:
272
- return False
280
+ return True
273
281
  before = BASH_STATE.shell.before or ""
274
282
  assert before, "Something went wrong updating repl prompt"
275
283
  PROMPT = before.split("\n")[-1].strip()
@@ -301,6 +309,34 @@ def get_status() -> str:
301
309
  return status.rstrip()
302
310
 
303
311
 
312
+ T = TypeVar("T")
313
+
314
+
315
+ def save_out_of_context(
316
+ tokens: list[T],
317
+ max_tokens: int,
318
+ suffix: str,
319
+ tokens_converted: Callable[[list[T]], str],
320
+ ) -> tuple[str, list[Path]]:
321
+ file_contents = list[str]()
322
+ for i in range(0, len(tokens), max_tokens):
323
+ file_contents.append(tokens_converted(tokens[i : i + max_tokens]))
324
+
325
+ if len(file_contents) == 1:
326
+ return file_contents[0], []
327
+
328
+ rest_paths = list[Path]()
329
+ for i, content in enumerate(file_contents):
330
+ if i == 0:
331
+ continue
332
+ file_path = NamedTemporaryFile(delete=False, suffix=suffix).name
333
+ with open(file_path, "w") as f:
334
+ f.write(content)
335
+ rest_paths.append(Path(file_path))
336
+
337
+ return file_contents[0], rest_paths
338
+
339
+
304
340
  def execute_bash(
305
341
  enc: tiktoken.Encoding,
306
342
  bash_arg: BashCommand | BashInteraction,
@@ -490,8 +526,6 @@ class ImageData(BaseModel):
490
526
 
491
527
  Param = ParamSpec("Param")
492
528
 
493
- T = TypeVar("T")
494
-
495
529
 
496
530
  def ensure_no_previous_output(func: Callable[Param, T]) -> Callable[Param, T]:
497
531
  def wrapper(*args: Param.args, **kwargs: Param.kwargs) -> T:
@@ -537,20 +571,19 @@ def write_file(writefile: WriteIfEmpty, error_on_exist: bool) -> str:
537
571
  else:
538
572
  path_ = writefile.file_path
539
573
 
540
- error_on_exist = (
541
- not (
542
- len(TOOL_CALLS) > 1
543
- and isinstance(TOOL_CALLS[-2], FileEdit)
544
- and TOOL_CALLS[-2].file_path == path_
545
- )
546
- and error_on_exist
547
- )
548
-
574
+ error_on_exist_ = error_on_exist and path_ not in BASH_STATE.whitelist_for_overwrite
575
+ add_overwrite_warning = ""
549
576
  if not BASH_STATE.is_in_docker:
550
- if error_on_exist and os.path.exists(path_):
551
- file_data = Path(path_).read_text()
552
- if file_data:
553
- return f"Error: can't write to existing file {path_}, use other functions to edit the file"
577
+ if (error_on_exist or error_on_exist_) and os.path.exists(path_):
578
+ content = Path(path_).read_text().strip()
579
+ if content:
580
+ if error_on_exist_:
581
+ return f"Error: can't write to existing file {path_}, use other functions to edit the file"
582
+ elif error_on_exist:
583
+ add_overwrite_warning = content
584
+
585
+ # Since we've already errored once, add this to whitelist
586
+ BASH_STATE.add_to_whitelist_for_overwrite(path_)
554
587
 
555
588
  path = Path(path_)
556
589
  path.parent.mkdir(parents=True, exist_ok=True)
@@ -561,12 +594,19 @@ def write_file(writefile: WriteIfEmpty, error_on_exist: bool) -> str:
561
594
  except OSError as e:
562
595
  return f"Error: {e}"
563
596
  else:
564
- if error_on_exist:
565
- # Check if it exists using os.system
566
- cmd = f"test -f {shlex.quote(path_)}"
567
- status = os.system(f'docker exec {BASH_STATE.is_in_docker} bash -c "{cmd}"')
568
- if status == 0:
569
- return f"Error: can't write to existing file {path_}, use other functions to edit the file"
597
+ if error_on_exist or error_on_exist_:
598
+ return_code, content, stderr = command_run(
599
+ f"docker exec {BASH_STATE.is_in_docker} cat {shlex.quote(path_)}",
600
+ timeout=TIMEOUT,
601
+ )
602
+ if return_code != 0 and content.strip():
603
+ if error_on_exist_:
604
+ return f"Error: can't write to existing file {path_}, use other functions to edit the file"
605
+ else:
606
+ add_overwrite_warning = content
607
+
608
+ # Since we've already errored once, add this to whitelist
609
+ BASH_STATE.add_to_whitelist_for_overwrite(path_)
570
610
 
571
611
  with TemporaryDirectory() as tmpdir:
572
612
  tmppath = os.path.join(tmpdir, os.path.basename(path_))
@@ -586,42 +626,75 @@ def write_file(writefile: WriteIfEmpty, error_on_exist: bool) -> str:
586
626
  if rcode != 0:
587
627
  return f"Error: Write failed with code {rcode}"
588
628
 
629
+ extension = Path(path_).suffix.lstrip(".")
630
+
589
631
  console.print(f"File written to {path_}")
590
- return "Success"
632
+
633
+ warnings = []
634
+ try:
635
+ check = check_syntax(extension, writefile.file_content)
636
+ syntax_errors = check.description
637
+ if syntax_errors:
638
+ console.print(f"W: Syntax errors encountered: {syntax_errors}")
639
+ warnings.append(f"""
640
+ ---
641
+ Warning: tree-sitter reported syntax errors, please re-read the file and fix if any errors.
642
+ Errors:
643
+ {syntax_errors}
644
+ ---
645
+ """)
646
+
647
+ except Exception:
648
+ pass
649
+
650
+ if add_overwrite_warning:
651
+ warnings.append(
652
+ "\n---\nWarning: a file already existed and it's now overwritten. Was it a mistake? If yes please revert your action."
653
+ "Here's the previous content:\n```\n" + add_overwrite_warning + "\n```"
654
+ "\n---\n"
655
+ )
656
+
657
+ return "Success" + "".join(warnings)
591
658
 
592
659
 
593
660
  def find_least_edit_distance_substring(
594
- content: str, find_str: str
595
- ) -> tuple[str, str, float]:
596
- orig_content_lines = content.split("\n")
597
- content_lines = [
598
- line.strip() for line in orig_content_lines
599
- ] # Remove trailing and leading space for calculating edit distance
661
+ orig_content_lines: list[str], find_lines: list[str]
662
+ ) -> tuple[list[str], str]:
663
+ # Prepare content lines, stripping whitespace and keeping track of original indices
664
+ content_lines = [line.strip() for line in orig_content_lines]
600
665
  new_to_original_indices = {}
601
666
  new_content_lines = []
602
- for i in range(len(content_lines)):
603
- if not content_lines[i]:
667
+ for i, line in enumerate(content_lines):
668
+ if not line:
604
669
  continue
605
- new_content_lines.append(content_lines[i])
670
+ new_content_lines.append(line)
606
671
  new_to_original_indices[len(new_content_lines) - 1] = i
607
672
  content_lines = new_content_lines
608
- find_lines = find_str.split("\n")
609
- find_lines = [
610
- line.strip() for line in find_lines if line.strip()
611
- ] # Remove trailing and leading space for calculating edit distance
612
- # Slide window and find one with sum of edit distance least
613
- min_edit_distance = float("inf")
673
+
674
+ # Prepare find lines, removing empty lines
675
+ find_lines = [line.strip() for line in find_lines if line.strip()]
676
+
677
+ # Initialize variables for best match tracking
678
+ max_similarity = 0.0
614
679
  min_edit_distance_lines = []
615
680
  context_lines = []
681
+
682
+ # For each possible starting position in content
616
683
  for i in range(max(1, len(content_lines) - len(find_lines) + 1)):
617
- edit_distance_sum = 0
684
+ # Calculate similarity for the block starting at position i
685
+ block_similarity = 0.0
618
686
  for j in range(len(find_lines)):
619
687
  if (i + j) < len(content_lines):
620
- edit_distance_sum += edit_distance(content_lines[i + j], find_lines[j])
621
- else:
622
- edit_distance_sum += len(find_lines[j])
623
- if edit_distance_sum < min_edit_distance:
624
- min_edit_distance = edit_distance_sum
688
+ # Use SequenceMatcher for more efficient similarity calculation
689
+ similarity = SequenceMatcher(
690
+ None, content_lines[i + j], find_lines[j]
691
+ ).ratio()
692
+ block_similarity += similarity
693
+
694
+ # If this block is more similar than previous best
695
+ if block_similarity > max_similarity:
696
+ max_similarity = block_similarity
697
+ # Map back to original line indices
625
698
  orig_start_index = new_to_original_indices[i]
626
699
  orig_end_index = (
627
700
  new_to_original_indices.get(
@@ -629,42 +702,79 @@ def find_least_edit_distance_substring(
629
702
  )
630
703
  + 1
631
704
  )
705
+ # Get the original lines
632
706
  min_edit_distance_lines = orig_content_lines[
633
707
  orig_start_index:orig_end_index
634
708
  ]
635
-
709
+ # Get context (10 lines before and after)
636
710
  context_lines = orig_content_lines[
637
711
  max(0, orig_start_index - 10) : (orig_end_index + 10)
638
712
  ]
713
+
639
714
  return (
640
- "\n".join(min_edit_distance_lines),
715
+ min_edit_distance_lines,
641
716
  "\n".join(context_lines),
642
- min_edit_distance,
643
717
  )
644
718
 
645
719
 
646
- def edit_content(content: str, find_lines: str, replace_with_lines: str) -> str:
647
- count = content.count(find_lines)
648
- if count == 0:
649
- closest_match, context_lines, min_edit_distance = (
650
- find_least_edit_distance_substring(content, find_lines)
651
- )
652
- if min_edit_distance == 0:
653
- return content.replace(closest_match, replace_with_lines, 1)
654
- else:
655
- print(
656
- f"Exact match not found, found with whitespace removed edit distance: {min_edit_distance}"
720
+ def lines_replacer(
721
+ orig_content_lines: list[str], search_lines: list[str], replace_lines: list[str]
722
+ ) -> str:
723
+ # Validation for empty search
724
+ search_lines = list(filter(None, [x.strip() for x in search_lines]))
725
+
726
+ # Create mapping of non-empty lines to original indices
727
+ new_to_original_indices = []
728
+ new_content_lines = []
729
+ for i, line in enumerate(orig_content_lines):
730
+ stripped = line.strip()
731
+ if not stripped:
732
+ continue
733
+ new_content_lines.append(stripped)
734
+ new_to_original_indices.append(i)
735
+
736
+ if not new_content_lines and not search_lines:
737
+ return "\n".join(replace_lines)
738
+ elif not search_lines:
739
+ raise ValueError("Search block is empty")
740
+ elif not new_content_lines:
741
+ raise ValueError("File content is empty")
742
+
743
+ # Search for matching block
744
+ for i in range(len(new_content_lines) - len(search_lines) + 1):
745
+ if all(
746
+ new_content_lines[i + j] == search_lines[j]
747
+ for j in range(len(search_lines))
748
+ ):
749
+ start_idx = new_to_original_indices[i]
750
+ end_idx = new_to_original_indices[i + len(search_lines) - 1] + 1
751
+ return "\n".join(
752
+ orig_content_lines[:start_idx]
753
+ + replace_lines
754
+ + orig_content_lines[end_idx:]
657
755
  )
658
- raise Exception(
659
- f"""Error: no match found for the provided search block.
660
- Requested search block: \n```\n{find_lines}\n```
661
- Possible relevant section in the file:\n---\n```\n{context_lines}\n```\n---\nFile not edited
662
- \nPlease retry with exact search. Re-read the file if unsure.
663
- """
664
- )
665
756
 
666
- content = content.replace(find_lines, replace_with_lines, 1)
667
- return content
757
+ raise ValueError("Search block not found in content")
758
+
759
+
760
+ def edit_content(content: str, find_lines: str, replace_with_lines: str) -> str:
761
+ replace_with_lines_ = replace_with_lines.split("\n")
762
+ find_lines_ = find_lines.split("\n")
763
+ content_lines_ = content.split("\n")
764
+ try:
765
+ return lines_replacer(content_lines_, find_lines_, replace_with_lines_)
766
+ except ValueError:
767
+ pass
768
+
769
+ _, context_lines = find_least_edit_distance_substring(content_lines_, find_lines_)
770
+
771
+ raise Exception(
772
+ f"""Error: no match found for the provided search block.
773
+ Requested search block: \n```\n{find_lines}\n```
774
+ Possible relevant section in the file:\n---\n```\n{context_lines}\n```\n---\nFile not edited
775
+ \nPlease retry with exact search. Re-read the file if unsure.
776
+ """
777
+ )
668
778
 
669
779
 
670
780
  def do_diff_edit(fedit: FileEdit) -> str:
@@ -695,6 +805,9 @@ def _do_diff_edit(fedit: FileEdit) -> str:
695
805
  else:
696
806
  path_ = fedit.file_path
697
807
 
808
+ # The LLM is now aware that the file exists
809
+ BASH_STATE.add_to_whitelist_for_overwrite(path_)
810
+
698
811
  if not BASH_STATE.is_in_docker:
699
812
  if not os.path.exists(path_):
700
813
  raise Exception(f"Error: file {path_} does not exist")
@@ -775,6 +888,22 @@ def _do_diff_edit(fedit: FileEdit) -> str:
775
888
  if rcode != 0:
776
889
  raise Exception(f"Error: Write failed with code {rcode}")
777
890
 
891
+ syntax_errors = ""
892
+ extension = Path(path_).suffix.lstrip(".")
893
+ try:
894
+ check = check_syntax(extension, apply_diff_to)
895
+ syntax_errors = check.description
896
+ if syntax_errors:
897
+ console.print(f"W: Syntax errors encountered: {syntax_errors}")
898
+ return f"""Wrote file succesfully.
899
+ ---
900
+ However, tree-sitter reported syntax errors, please re-read the file and fix if there are any errors.
901
+ Errors:
902
+ {syntax_errors}
903
+ """
904
+ except Exception:
905
+ pass
906
+
778
907
  return "Success"
779
908
 
780
909
 
@@ -885,7 +1014,7 @@ def get_tool_output(
885
1014
  output = ask_confirmation(arg), 0.0
886
1015
  elif isinstance(arg, (BashCommand | BashInteraction)):
887
1016
  console.print("Calling execute bash tool")
888
- output = execute_bash(enc, arg, max_tokens, None)
1017
+ output = execute_bash(enc, arg, max_tokens, arg.wait_for_seconds)
889
1018
  elif isinstance(arg, WriteIfEmpty):
890
1019
  console.print("Calling write file tool")
891
1020
  output = write_file(arg, True), 0
@@ -1054,6 +1183,8 @@ def read_file(readfile: ReadFile, max_tokens: Optional[int]) -> str:
1054
1183
  if not os.path.isabs(readfile.file_path):
1055
1184
  return f"Failure: file_path should be absolute path, current working directory is {BASH_STATE.cwd}"
1056
1185
 
1186
+ BASH_STATE.add_to_whitelist_for_overwrite(readfile.file_path)
1187
+
1057
1188
  if not BASH_STATE.is_in_docker:
1058
1189
  path = Path(readfile.file_path)
1059
1190
  if not path.exists():
@@ -1075,7 +1206,14 @@ def read_file(readfile: ReadFile, max_tokens: Optional[int]) -> str:
1075
1206
  if max_tokens is not None:
1076
1207
  tokens = default_enc.encode(content)
1077
1208
  if len(tokens) > max_tokens:
1078
- content = default_enc.decode(tokens[: max_tokens - 5])
1079
- content += "\n...(truncated)"
1209
+ content, rest = save_out_of_context(
1210
+ tokens,
1211
+ max_tokens - 100,
1212
+ Path(readfile.file_path).suffix,
1213
+ default_enc.decode,
1214
+ )
1215
+ if rest:
1216
+ rest_ = "\n".join(map(str, rest))
1217
+ content += f"\n(...truncated)\n---\nI've split the rest of the file into multiple files. Here are the remaining splits, please read them:\n{rest_}"
1080
1218
 
1081
1219
  return content
@@ -5,6 +5,7 @@ from pydantic import BaseModel
5
5
 
6
6
  class BashCommand(BaseModel):
7
7
  command: str
8
+ wait_for_seconds: Optional[int] = None
8
9
 
9
10
 
10
11
  Specials = Literal[
@@ -17,6 +18,7 @@ class BashInteraction(BaseModel):
17
18
  send_text: Optional[str] = None
18
19
  send_specials: Optional[Sequence[Specials]] = None
19
20
  send_ascii: Optional[Sequence[int]] = None
21
+ wait_for_seconds: Optional[int] = None
20
22
 
21
23
 
22
24
  class ReadImage(BaseModel):
@@ -12,7 +12,7 @@ wheels = [
12
12
 
13
13
  [[package]]
14
14
  name = "anthropic"
15
- version = "0.39.0"
15
+ version = "0.42.0"
16
16
  source = { registry = "https://pypi.org/simple" }
17
17
  dependencies = [
18
18
  { name = "anyio" },
@@ -23,34 +23,32 @@ dependencies = [
23
23
  { name = "sniffio" },
24
24
  { name = "typing-extensions" },
25
25
  ]
26
- sdist = { url = "https://files.pythonhosted.org/packages/79/02/2ea51930009d7537c4648f51d1bb3202ec76704cbb39a2a863ab38bee3dd/anthropic-0.39.0.tar.gz", hash = "sha256:94671cc80765f9ce693f76d63a97ee9bef4c2d6063c044e983d21a2e262f63ba", size = 189339 }
26
+ sdist = { url = "https://files.pythonhosted.org/packages/e7/7c/91b79f5ae4a52497a4e330d66ea5929aec2878ee2c9f8a998dbe4f4c7f01/anthropic-0.42.0.tar.gz", hash = "sha256:bf8b0ed8c8cb2c2118038f29c58099d2f99f7847296cafdaa853910bfff4edf4", size = 192361 }
27
27
  wheels = [
28
- { url = "https://files.pythonhosted.org/packages/94/61/2580eaa171cab20708d59d39cadd15f78a6c617759e8d0a12e18fe3302d1/anthropic-0.39.0-py3-none-any.whl", hash = "sha256:ea17093ae0ce0e1768b0c46501d6086b5bcd74ff39d68cd2d6396374e9de7c09", size = 198392 },
28
+ { url = "https://files.pythonhosted.org/packages/ba/33/b907a6d27dd0d8d3adb4edb5c9e9c85a189719ec6855051cce3814c8ef13/anthropic-0.42.0-py3-none-any.whl", hash = "sha256:46775f65b723c078a2ac9e9de44a46db5c6a4fabeacfd165e5ea78e6817f4eff", size = 203365 },
29
29
  ]
30
30
 
31
31
  [[package]]
32
32
  name = "anyio"
33
- version = "4.6.2.post1"
33
+ version = "4.7.0"
34
34
  source = { registry = "https://pypi.org/simple" }
35
35
  dependencies = [
36
36
  { name = "idna" },
37
37
  { name = "sniffio" },
38
+ { name = "typing-extensions" },
38
39
  ]
39
- sdist = { url = "https://files.pythonhosted.org/packages/9f/09/45b9b7a6d4e45c6bcb5bf61d19e3ab87df68e0601fa8c5293de3542546cc/anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c", size = 173422 }
40
+ sdist = { url = "https://files.pythonhosted.org/packages/f6/40/318e58f669b1a9e00f5c4453910682e2d9dd594334539c7b7817dabb765f/anyio-4.7.0.tar.gz", hash = "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48", size = 177076 }
40
41
  wheels = [
41
- { url = "https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d", size = 90377 },
42
+ { url = "https://files.pythonhosted.org/packages/a0/7a/4daaf3b6c08ad7ceffea4634ec206faeff697526421c20f07628c7372156/anyio-4.7.0-py3-none-any.whl", hash = "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352", size = 93052 },
42
43
  ]
43
44
 
44
45
  [[package]]
45
46
  name = "asttokens"
46
- version = "2.4.1"
47
+ version = "3.0.0"
47
48
  source = { registry = "https://pypi.org/simple" }
48
- dependencies = [
49
- { name = "six" },
50
- ]
51
- sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 }
49
+ sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 }
52
50
  wheels = [
53
- { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764 },
51
+ { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 },
54
52
  ]
55
53
 
56
54
  [[package]]
@@ -67,11 +65,11 @@ wheels = [
67
65
 
68
66
  [[package]]
69
67
  name = "certifi"
70
- version = "2024.8.30"
68
+ version = "2024.12.14"
71
69
  source = { registry = "https://pypi.org/simple" }
72
- sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 }
70
+ sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 }
73
71
  wheels = [
74
- { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 },
72
+ { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
75
73
  ]
76
74
 
77
75
  [[package]]
@@ -163,16 +161,16 @@ wheels = [
163
161
 
164
162
  [[package]]
165
163
  name = "fastapi"
166
- version = "0.115.5"
164
+ version = "0.115.6"
167
165
  source = { registry = "https://pypi.org/simple" }
168
166
  dependencies = [
169
167
  { name = "pydantic" },
170
168
  { name = "starlette" },
171
169
  { name = "typing-extensions" },
172
170
  ]
173
- sdist = { url = "https://files.pythonhosted.org/packages/ae/29/f71316b9273b6552a263748e49cd7b83898dc9499a663d30c7b9cb853cb8/fastapi-0.115.5.tar.gz", hash = "sha256:0e7a4d0dc0d01c68df21887cce0945e72d3c48b9f4f79dfe7a7d53aa08fbb289", size = 301047 }
171
+ sdist = { url = "https://files.pythonhosted.org/packages/93/72/d83b98cd106541e8f5e5bfab8ef2974ab45a62e8a6c5b5e6940f26d2ed4b/fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654", size = 301336 }
174
172
  wheels = [
175
- { url = "https://files.pythonhosted.org/packages/54/c4/148d5046a96c428464557264877ae5a9338a83bbe0df045088749ec89820/fastapi-0.115.5-py3-none-any.whl", hash = "sha256:596b95adbe1474da47049e802f9a65ab2ffa9c2b07e7efee70eb8a66c9f2f796", size = 94866 },
173
+ { url = "https://files.pythonhosted.org/packages/52/b3/7e4df40e585df024fac2f80d1a2d579c854ac37109675db2b0cc22c0bb9e/fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305", size = 94843 },
176
174
  ]
177
175
 
178
176
  [[package]]
@@ -211,18 +209,17 @@ wheels = [
211
209
 
212
210
  [[package]]
213
211
  name = "httpx"
214
- version = "0.27.2"
212
+ version = "0.28.1"
215
213
  source = { registry = "https://pypi.org/simple" }
216
214
  dependencies = [
217
215
  { name = "anyio" },
218
216
  { name = "certifi" },
219
217
  { name = "httpcore" },
220
218
  { name = "idna" },
221
- { name = "sniffio" },
222
219
  ]
223
- sdist = { url = "https://files.pythonhosted.org/packages/78/82/08f8c936781f67d9e6b9eeb8a0c8b4e406136ea4c3d1f89a5db71d42e0e6/httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2", size = 144189 }
220
+ sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 }
224
221
  wheels = [
225
- { url = "https://files.pythonhosted.org/packages/56/95/9377bcb415797e44274b51d46e3249eba641711cf3348050f76ee7b15ffc/httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", size = 76395 },
222
+ { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 },
226
223
  ]
227
224
 
228
225
  [[package]]
@@ -254,7 +251,7 @@ wheels = [
254
251
 
255
252
  [[package]]
256
253
  name = "ipython"
257
- version = "8.29.0"
254
+ version = "8.30.0"
258
255
  source = { registry = "https://pypi.org/simple" }
259
256
  dependencies = [
260
257
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -268,9 +265,9 @@ dependencies = [
268
265
  { name = "traitlets" },
269
266
  { name = "typing-extensions", marker = "python_full_version < '3.12'" },
270
267
  ]
271
- sdist = { url = "https://files.pythonhosted.org/packages/85/e0/a3f36dde97e12121106807d80485423ae4c5b27ce60d40d4ab0bab18a9db/ipython-8.29.0.tar.gz", hash = "sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb", size = 5497513 }
268
+ sdist = { url = "https://files.pythonhosted.org/packages/d8/8b/710af065ab8ed05649afa5bd1e07401637c9ec9fb7cfda9eac7e91e9fbd4/ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e", size = 5592205 }
272
269
  wheels = [
273
- { url = "https://files.pythonhosted.org/packages/c5/a5/c15ed187f1b3fac445bb42a2dedd8dec1eee1718b35129242049a13a962f/ipython-8.29.0-py3-none-any.whl", hash = "sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8", size = 819911 },
270
+ { url = "https://files.pythonhosted.org/packages/1d/f3/1332ba2f682b07b304ad34cad2f003adcfeb349486103f4b632335074a7c/ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321", size = 820765 },
274
271
  ]
275
272
 
276
273
  [[package]]
@@ -287,43 +284,34 @@ wheels = [
287
284
 
288
285
  [[package]]
289
286
  name = "jiter"
290
- version = "0.8.0"
291
- source = { registry = "https://pypi.org/simple" }
292
- sdist = { url = "https://files.pythonhosted.org/packages/78/1e/3462be93c2443392a710ae1c2bba2239f44bbf0c826baea77da9f8311678/jiter-0.8.0.tar.gz", hash = "sha256:86fee98b569d4cc511ff2e3ec131354fafebd9348a487549c31ad371ae730310", size = 162953 }
293
- wheels = [
294
- { url = "https://files.pythonhosted.org/packages/84/e8/336b77bdda32e9a6167ca80b454905772c515a65c35e93d97ed6dc9b6fc0/jiter-0.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f6f4e645efd96b4690b9b6091dbd4e0fa2885ba5c57a0305c1916b75b4f30ff6", size = 304423 },
295
- { url = "https://files.pythonhosted.org/packages/c9/87/28f93b5373cbca74ac3c6fd6e2025113f1a73164beb7cd966cdaed88cf70/jiter-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f61cf6d93c1ade9b8245c9f14b7900feadb0b7899dbe4aa8de268b705647df81", size = 310783 },
296
- { url = "https://files.pythonhosted.org/packages/57/2b/a23342154077995562bedb9c6dc85c6d113910ae54a225118f2b4f6e5765/jiter-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0396bc5cb1309c6dab085e70bb3913cdd92218315e47b44afe9eace68ee8adaa", size = 333675 },
297
- { url = "https://files.pythonhosted.org/packages/ee/cb/26dc6e8ae37208e5adc992fc762172efd65b658756e78daf803916d49996/jiter-0.8.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62d0e42ec5dc772bd8554a304358220be5d97d721c4648b23f3a9c01ccc2cb26", size = 354158 },
298
- { url = "https://files.pythonhosted.org/packages/e7/5e/de7b2bab00b9648940bb31e34c5b13fffe890e3695560cb72439f8fdd44a/jiter-0.8.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4b711989860705733fc59fb8c41b2def97041cea656b37cf6c8ea8dee1c3f4", size = 380842 },
299
- { url = "https://files.pythonhosted.org/packages/91/c1/f5bad3882d27359a3eb8110f2a0cf9e8fa7a6ffc0b1f7bdb9ad2c5a6facb/jiter-0.8.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:859cc35bf304ab066d88f10a44a3251a9cd057fb11ec23e00be22206db878f4f", size = 388716 },
300
- { url = "https://files.pythonhosted.org/packages/bc/8c/052f85d911045c720ddd15bfbb71edc1c9043b54f5ab946d0f5cac7ac02c/jiter-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5000195921aa293b39b9b5bc959d7fa658e7f18f938c0e52732da8e3cc70a278", size = 343308 },
301
- { url = "https://files.pythonhosted.org/packages/6c/90/d703274855ee34f4da7b50877042bdef9650298a7125067630a62191db7e/jiter-0.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36050284c0abde57aba34964d3920f3d6228211b65df7187059bb7c7f143759a", size = 374680 },
302
- { url = "https://files.pythonhosted.org/packages/7f/42/6af2ca86e7434ab3c028ddb9c38edcdbff2c3edbd599d0ca5b21aa9dfc02/jiter-0.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a88f608e050cfe45c48d771e86ecdbf5258314c883c986d4217cc79e1fb5f689", size = 512131 },
303
- { url = "https://files.pythonhosted.org/packages/9d/6c/afc4f73accfb9570a4b729840e4e3607196b924fddbdc346d0f02e662375/jiter-0.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:646cf4237665b2e13b4159d8f26d53f59bc9f2e6e135e3a508a2e5dd26d978c6", size = 505038 },
304
- { url = "https://files.pythonhosted.org/packages/eb/cf/c3b6821151db25f617d83ff00022dd5769375ead7ab65bf68874b21e0bba/jiter-0.8.0-cp311-none-win32.whl", hash = "sha256:21fe5b8345db1b3023052b2ade9bb4d369417827242892051244af8fae8ba231", size = 204655 },
305
- { url = "https://files.pythonhosted.org/packages/f8/72/a3084e9c81ff934c1aa3529ff7c45b6d10d3b5dc649223fb14d7fa1fd6ed/jiter-0.8.0-cp311-none-win_amd64.whl", hash = "sha256:30c2161c5493acf6b6c3c909973fb64ae863747def01cc7574f3954e0a15042c", size = 208198 },
306
- { url = "https://files.pythonhosted.org/packages/d1/63/93084c4079b30e7832e1fb907045f8eca146d5d9a67bc62d311332416ab8/jiter-0.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d91a52d8f49ada2672a4b808a0c5c25d28f320a2c9ca690e30ebd561eb5a1002", size = 304424 },
307
- { url = "https://files.pythonhosted.org/packages/d2/68/ae698958b4d7d27632056cbfeae70e9d7a89ca0954ac6d0ef486afe5d8da/jiter-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c38cf25cf7862f61410b7a49684d34eb3b5bcbd7ddaf4773eea40e0bd43de706", size = 309584 },
308
- { url = "https://files.pythonhosted.org/packages/05/b3/d04a1398644c5848339c201e81d1c0d5125097bfd84fd92ebebfe724659c/jiter-0.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6189beb5c4b3117624be6b2e84545cff7611f5855d02de2d06ff68e316182be", size = 333677 },
309
- { url = "https://files.pythonhosted.org/packages/41/cd/76869353a0f5a91cf544bef80a9529d090b7d4254835997507738220e133/jiter-0.8.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e13fa849c0e30643554add089983caa82f027d69fad8f50acadcb21c462244ab", size = 354157 },
310
- { url = "https://files.pythonhosted.org/packages/34/9e/64adbc6d578a80debf7a1e81871257266e2149eede59300de7641dcd1a5e/jiter-0.8.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7765ca159d0a58e8e0f8ca972cd6d26a33bc97b4480d0d2309856763807cd28", size = 380841 },
311
- { url = "https://files.pythonhosted.org/packages/9d/ef/4ae8f15859d4dae10bef6d1d4a7258fc450b1f9db635becd19403d906ba4/jiter-0.8.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b0befe7c6e9fc867d5bed21bab0131dfe27d1fa5cd52ba2bced67da33730b7d", size = 388714 },
312
- { url = "https://files.pythonhosted.org/packages/3d/dd/3e7e3cdacda1990c1f09d9d2abdf2f37e80f8a9abd17804d61a74d8403fd/jiter-0.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7d6363d4c6f1052b1d8b494eb9a72667c3ef5f80ebacfe18712728e85327000", size = 341876 },
313
- { url = "https://files.pythonhosted.org/packages/44/5b/c9533eb01eee153fd6f936e76a35583f8e244d7a5db9c2b64b4451167368/jiter-0.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a873e57009863eeac3e3969e4653f07031d6270d037d6224415074ac17e5505c", size = 374683 },
314
- { url = "https://files.pythonhosted.org/packages/f8/2f/34696e31a79c1b0b30e430dfdcd7c6ee7b5fd0f5b0df4503c1b01ec9bcba/jiter-0.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2582912473c0d9940791479fe1bf2976a34f212eb8e0a82ee9e645ac275c5d16", size = 512132 },
315
- { url = "https://files.pythonhosted.org/packages/3b/b3/041d97047a30b529d5d99b3cc5d9d58fc71d9c73f106e827ba28a99058b9/jiter-0.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:646163201af42f55393ee6e8f6136b8df488253a6533f4230a64242ecbfe6048", size = 505039 },
316
- { url = "https://files.pythonhosted.org/packages/59/5b/630995b058aa26e8ba9b15731b121cec9fc0e105d5ae93d2ed754a0e44f5/jiter-0.8.0-cp312-none-win32.whl", hash = "sha256:96e75c9abfbf7387cba89a324d2356d86d8897ac58c956017d062ad510832dae", size = 205267 },
317
- { url = "https://files.pythonhosted.org/packages/1b/0e/1b79afa5616309d4e2e84980c62a3f73c4035e5b856ad7601aebbb5a7db0/jiter-0.8.0-cp312-none-win_amd64.whl", hash = "sha256:ed6074552b4a32e047b52dad5ab497223721efbd0e9efe68c67749f094a092f7", size = 206572 },
318
- ]
319
-
320
- [[package]]
321
- name = "joblib"
322
- version = "1.4.2"
287
+ version = "0.8.2"
323
288
  source = { registry = "https://pypi.org/simple" }
324
- sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 }
325
- wheels = [
326
- { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 },
289
+ sdist = { url = "https://files.pythonhosted.org/packages/f8/70/90bc7bd3932e651486861df5c8ffea4ca7c77d28e8532ddefe2abc561a53/jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d", size = 163007 }
290
+ wheels = [
291
+ { url = "https://files.pythonhosted.org/packages/cb/b0/c1a7caa7f9dc5f1f6cfa08722867790fe2d3645d6e7170ca280e6e52d163/jiter-0.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2dd61c5afc88a4fda7d8b2cf03ae5947c6ac7516d32b7a15bf4b49569a5c076b", size = 303666 },
292
+ { url = "https://files.pythonhosted.org/packages/f5/97/0468bc9eeae43079aaa5feb9267964e496bf13133d469cfdc135498f8dd0/jiter-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6c710d657c8d1d2adbbb5c0b0c6bfcec28fd35bd6b5f016395f9ac43e878a15", size = 311934 },
293
+ { url = "https://files.pythonhosted.org/packages/e5/69/64058e18263d9a5f1e10f90c436853616d5f047d997c37c7b2df11b085ec/jiter-0.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9584de0cd306072635fe4b89742bf26feae858a0683b399ad0c2509011b9dc0", size = 335506 },
294
+ { url = "https://files.pythonhosted.org/packages/9d/14/b747f9a77b8c0542141d77ca1e2a7523e854754af2c339ac89a8b66527d6/jiter-0.8.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a90a923338531b7970abb063cfc087eebae6ef8ec8139762007188f6bc69a9f", size = 355849 },
295
+ { url = "https://files.pythonhosted.org/packages/53/e2/98a08161db7cc9d0e39bc385415890928ff09709034982f48eccfca40733/jiter-0.8.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21974d246ed0181558087cd9f76e84e8321091ebfb3a93d4c341479a736f099", size = 381700 },
296
+ { url = "https://files.pythonhosted.org/packages/7a/38/1674672954d35bce3b1c9af99d5849f9256ac8f5b672e020ac7821581206/jiter-0.8.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32475a42b2ea7b344069dc1e81445cfc00b9d0e3ca837f0523072432332e9f74", size = 389710 },
297
+ { url = "https://files.pythonhosted.org/packages/f8/9b/92f9da9a9e107d019bcf883cd9125fa1690079f323f5a9d5c6986eeec3c0/jiter-0.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9931fd36ee513c26b5bf08c940b0ac875de175341cbdd4fa3be109f0492586", size = 345553 },
298
+ { url = "https://files.pythonhosted.org/packages/44/a6/6d030003394e9659cd0d7136bbeabd82e869849ceccddc34d40abbbbb269/jiter-0.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0820f4a3a59ddced7fce696d86a096d5cc48d32a4183483a17671a61edfddc", size = 376388 },
299
+ { url = "https://files.pythonhosted.org/packages/ad/8d/87b09e648e4aca5f9af89e3ab3cfb93db2d1e633b2f2931ede8dabd9b19a/jiter-0.8.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ffc86ae5e3e6a93765d49d1ab47b6075a9c978a2b3b80f0f32628f39caa0c88", size = 511226 },
300
+ { url = "https://files.pythonhosted.org/packages/77/95/8008ebe4cdc82eac1c97864a8042ca7e383ed67e0ec17bfd03797045c727/jiter-0.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5127dc1abd809431172bc3fbe8168d6b90556a30bb10acd5ded41c3cfd6f43b6", size = 504134 },
301
+ { url = "https://files.pythonhosted.org/packages/26/0d/3056a74de13e8b2562e4d526de6dac2f65d91ace63a8234deb9284a1d24d/jiter-0.8.2-cp311-cp311-win32.whl", hash = "sha256:66227a2c7b575720c1871c8800d3a0122bb8ee94edb43a5685aa9aceb2782d44", size = 203103 },
302
+ { url = "https://files.pythonhosted.org/packages/4e/1e/7f96b798f356e531ffc0f53dd2f37185fac60fae4d6c612bbbd4639b90aa/jiter-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:cde031d8413842a1e7501e9129b8e676e62a657f8ec8166e18a70d94d4682855", size = 206717 },
303
+ { url = "https://files.pythonhosted.org/packages/a1/17/c8747af8ea4e045f57d6cfd6fc180752cab9bc3de0e8a0c9ca4e8af333b1/jiter-0.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:e6ec2be506e7d6f9527dae9ff4b7f54e68ea44a0ef6b098256ddf895218a2f8f", size = 302027 },
304
+ { url = "https://files.pythonhosted.org/packages/3c/c1/6da849640cd35a41e91085723b76acc818d4b7d92b0b6e5111736ce1dd10/jiter-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76e324da7b5da060287c54f2fabd3db5f76468006c811831f051942bf68c9d44", size = 310326 },
305
+ { url = "https://files.pythonhosted.org/packages/06/99/a2bf660d8ccffee9ad7ed46b4f860d2108a148d0ea36043fd16f4dc37e94/jiter-0.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:180a8aea058f7535d1c84183c0362c710f4750bef66630c05f40c93c2b152a0f", size = 334242 },
306
+ { url = "https://files.pythonhosted.org/packages/a7/5f/cea1c17864828731f11427b9d1ab7f24764dbd9aaf4648a7f851164d2718/jiter-0.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025337859077b41548bdcbabe38698bcd93cfe10b06ff66617a48ff92c9aec60", size = 356654 },
307
+ { url = "https://files.pythonhosted.org/packages/e9/13/62774b7e5e7f5d5043efe1d0f94ead66e6d0f894ae010adb56b3f788de71/jiter-0.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecff0dc14f409599bbcafa7e470c00b80f17abc14d1405d38ab02e4b42e55b57", size = 379967 },
308
+ { url = "https://files.pythonhosted.org/packages/ec/fb/096b34c553bb0bd3f2289d5013dcad6074948b8d55212aa13a10d44c5326/jiter-0.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffd9fee7d0775ebaba131f7ca2e2d83839a62ad65e8e02fe2bd8fc975cedeb9e", size = 389252 },
309
+ { url = "https://files.pythonhosted.org/packages/17/61/beea645c0bf398ced8b199e377b61eb999d8e46e053bb285c91c3d3eaab0/jiter-0.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14601dcac4889e0a1c75ccf6a0e4baf70dbc75041e51bcf8d0e9274519df6887", size = 345490 },
310
+ { url = "https://files.pythonhosted.org/packages/d5/df/834aa17ad5dcc3cf0118821da0a0cf1589ea7db9832589278553640366bc/jiter-0.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:92249669925bc1c54fcd2ec73f70f2c1d6a817928480ee1c65af5f6b81cdf12d", size = 376991 },
311
+ { url = "https://files.pythonhosted.org/packages/67/80/87d140399d382fb4ea5b3d56e7ecaa4efdca17cd7411ff904c1517855314/jiter-0.8.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e725edd0929fa79f8349ab4ec7f81c714df51dc4e991539a578e5018fa4a7152", size = 510822 },
312
+ { url = "https://files.pythonhosted.org/packages/5c/37/3394bb47bac1ad2cb0465601f86828a0518d07828a650722e55268cdb7e6/jiter-0.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bf55846c7b7a680eebaf9c3c48d630e1bf51bdf76c68a5f654b8524335b0ad29", size = 503730 },
313
+ { url = "https://files.pythonhosted.org/packages/f9/e2/253fc1fa59103bb4e3aa0665d6ceb1818df1cd7bf3eb492c4dad229b1cd4/jiter-0.8.2-cp312-cp312-win32.whl", hash = "sha256:7efe4853ecd3d6110301665a5178b9856be7e2a9485f49d91aa4d737ad2ae49e", size = 203375 },
314
+ { url = "https://files.pythonhosted.org/packages/41/69/6d4bbe66b3b3b4507e47aa1dd5d075919ad242b4b1115b3f80eecd443687/jiter-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:83c0efd80b29695058d0fd2fa8a556490dbce9804eac3e281f373bbc99045f6c", size = 204740 },
327
315
  ]
328
316
 
329
317
  [[package]]
@@ -404,24 +392,9 @@ wheels = [
404
392
  { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
405
393
  ]
406
394
 
407
- [[package]]
408
- name = "nltk"
409
- version = "3.9.1"
410
- source = { registry = "https://pypi.org/simple" }
411
- dependencies = [
412
- { name = "click" },
413
- { name = "joblib" },
414
- { name = "regex" },
415
- { name = "tqdm" },
416
- ]
417
- sdist = { url = "https://files.pythonhosted.org/packages/3c/87/db8be88ad32c2d042420b6fd9ffd4a149f9a0d7f0e86b3f543be2eeeedd2/nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868", size = 2904691 }
418
- wheels = [
419
- { url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", size = 1505442 },
420
- ]
421
-
422
395
  [[package]]
423
396
  name = "openai"
424
- version = "1.55.2"
397
+ version = "1.58.1"
425
398
  source = { registry = "https://pypi.org/simple" }
426
399
  dependencies = [
427
400
  { name = "anyio" },
@@ -433,9 +406,9 @@ dependencies = [
433
406
  { name = "tqdm" },
434
407
  { name = "typing-extensions" },
435
408
  ]
436
- sdist = { url = "https://files.pythonhosted.org/packages/e2/ae/ef32e19631f752d3b10bbfa0bda2b3f63865438635bee7356d4b3c8a6bf6/openai-1.55.2.tar.gz", hash = "sha256:5cc0b1162b65dcdf670b4b41448f18dd470d2724ca04821ab1e86b6b4e88650b", size = 314465 }
409
+ sdist = { url = "https://files.pythonhosted.org/packages/27/3c/b1ecce430ed56fa3ac1b0676966d3250aab9c70a408232b71e419ea62148/openai-1.58.1.tar.gz", hash = "sha256:f5a035fd01e141fc743f4b0e02c41ca49be8fab0866d3b67f5f29b4f4d3c0973", size = 343411 }
437
410
  wheels = [
438
- { url = "https://files.pythonhosted.org/packages/cb/d7/6ae403b1fd5667621f8a4b6d2eec954da7ab7efd2ba1b0b41c6c791af67a/openai-1.55.2-py3-none-any.whl", hash = "sha256:3027c7fa4a33ed759f4a3d076093fcfa1c55658660c889bec33f651e2dc77922", size = 389537 },
411
+ { url = "https://files.pythonhosted.org/packages/8e/5a/d22cd07f1a99b9e8b3c92ee0c1959188db4318828a3d88c9daac120bdd69/openai-1.58.1-py3-none-any.whl", hash = "sha256:e2910b1170a6b7f88ef491ac3a42c387f08bd3db533411f7ee391d166571d63c", size = 454279 },
439
412
  ]
440
413
 
441
414
  [[package]]
@@ -506,55 +479,55 @@ wheels = [
506
479
 
507
480
  [[package]]
508
481
  name = "pydantic"
509
- version = "2.10.2"
482
+ version = "2.10.4"
510
483
  source = { registry = "https://pypi.org/simple" }
511
484
  dependencies = [
512
485
  { name = "annotated-types" },
513
486
  { name = "pydantic-core" },
514
487
  { name = "typing-extensions" },
515
488
  ]
516
- sdist = { url = "https://files.pythonhosted.org/packages/41/86/a03390cb12cf64e2a8df07c267f3eb8d5035e0f9a04bb20fb79403d2a00e/pydantic-2.10.2.tar.gz", hash = "sha256:2bc2d7f17232e0841cbba4641e65ba1eb6fafb3a08de3a091ff3ce14a197c4fa", size = 785401 }
489
+ sdist = { url = "https://files.pythonhosted.org/packages/70/7e/fb60e6fee04d0ef8f15e4e01ff187a196fa976eb0f0ab524af4599e5754c/pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06", size = 762094 }
517
490
  wheels = [
518
- { url = "https://files.pythonhosted.org/packages/d5/74/da832196702d0c56eb86b75bfa346db9238617e29b0b7ee3b8b4eccfe654/pydantic-2.10.2-py3-none-any.whl", hash = "sha256:cfb96e45951117c3024e6b67b25cdc33a3cb7b2fa62e239f7af1378358a1d99e", size = 456364 },
491
+ { url = "https://files.pythonhosted.org/packages/f3/26/3e1bbe954fde7ee22a6e7d31582c642aad9e84ffe4b5fb61e63b87cd326f/pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", size = 431765 },
519
492
  ]
520
493
 
521
494
  [[package]]
522
495
  name = "pydantic-core"
523
- version = "2.27.1"
496
+ version = "2.27.2"
524
497
  source = { registry = "https://pypi.org/simple" }
525
498
  dependencies = [
526
499
  { name = "typing-extensions" },
527
500
  ]
528
- sdist = { url = "https://files.pythonhosted.org/packages/a6/9f/7de1f19b6aea45aeb441838782d68352e71bfa98ee6fa048d5041991b33e/pydantic_core-2.27.1.tar.gz", hash = "sha256:62a763352879b84aa31058fc931884055fd75089cccbd9d58bb6afd01141b235", size = 412785 }
529
- wheels = [
530
- { url = "https://files.pythonhosted.org/packages/27/39/46fe47f2ad4746b478ba89c561cafe4428e02b3573df882334bd2964f9cb/pydantic_core-2.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac3b20653bdbe160febbea8aa6c079d3df19310d50ac314911ed8cc4eb7f8cb8", size = 1895553 },
531
- { url = "https://files.pythonhosted.org/packages/1c/00/0804e84a78b7fdb394fff4c4f429815a10e5e0993e6ae0e0b27dd20379ee/pydantic_core-2.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a5a8e19d7c707c4cadb8c18f5f60c843052ae83c20fa7d44f41594c644a1d330", size = 1807220 },
532
- { url = "https://files.pythonhosted.org/packages/01/de/df51b3bac9820d38371f5a261020f505025df732ce566c2a2e7970b84c8c/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f7059ca8d64fea7f238994c97d91f75965216bcbe5f695bb44f354893f11d52", size = 1829727 },
533
- { url = "https://files.pythonhosted.org/packages/5f/d9/c01d19da8f9e9fbdb2bf99f8358d145a312590374d0dc9dd8dbe484a9cde/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bed0f8a0eeea9fb72937ba118f9db0cb7e90773462af7962d382445f3005e5a4", size = 1854282 },
534
- { url = "https://files.pythonhosted.org/packages/5f/84/7db66eb12a0dc88c006abd6f3cbbf4232d26adfd827a28638c540d8f871d/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3cb37038123447cf0f3ea4c74751f6a9d7afef0eb71aa07bf5f652b5e6a132c", size = 2037437 },
535
- { url = "https://files.pythonhosted.org/packages/34/ac/a2537958db8299fbabed81167d58cc1506049dba4163433524e06a7d9f4c/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84286494f6c5d05243456e04223d5a9417d7f443c3b76065e75001beb26f88de", size = 2780899 },
536
- { url = "https://files.pythonhosted.org/packages/4a/c1/3e38cd777ef832c4fdce11d204592e135ddeedb6c6f525478a53d1c7d3e5/pydantic_core-2.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acc07b2cfc5b835444b44a9956846b578d27beeacd4b52e45489e93276241025", size = 2135022 },
537
- { url = "https://files.pythonhosted.org/packages/7a/69/b9952829f80fd555fe04340539d90e000a146f2a003d3fcd1e7077c06c71/pydantic_core-2.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4fefee876e07a6e9aad7a8c8c9f85b0cdbe7df52b8a9552307b09050f7512c7e", size = 1987969 },
538
- { url = "https://files.pythonhosted.org/packages/05/72/257b5824d7988af43460c4e22b63932ed651fe98804cc2793068de7ec554/pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:258c57abf1188926c774a4c94dd29237e77eda19462e5bb901d88adcab6af919", size = 1994625 },
539
- { url = "https://files.pythonhosted.org/packages/73/c3/78ed6b7f3278a36589bcdd01243189ade7fc9b26852844938b4d7693895b/pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:35c14ac45fcfdf7167ca76cc80b2001205a8d5d16d80524e13508371fb8cdd9c", size = 2090089 },
540
- { url = "https://files.pythonhosted.org/packages/8d/c8/b4139b2f78579960353c4cd987e035108c93a78371bb19ba0dc1ac3b3220/pydantic_core-2.27.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d1b26e1dff225c31897696cab7d4f0a315d4c0d9e8666dbffdb28216f3b17fdc", size = 2142496 },
541
- { url = "https://files.pythonhosted.org/packages/3e/f8/171a03e97eb36c0b51981efe0f78460554a1d8311773d3d30e20c005164e/pydantic_core-2.27.1-cp311-none-win32.whl", hash = "sha256:2cdf7d86886bc6982354862204ae3b2f7f96f21a3eb0ba5ca0ac42c7b38598b9", size = 1811758 },
542
- { url = "https://files.pythonhosted.org/packages/6a/fe/4e0e63c418c1c76e33974a05266e5633e879d4061f9533b1706a86f77d5b/pydantic_core-2.27.1-cp311-none-win_amd64.whl", hash = "sha256:3af385b0cee8df3746c3f406f38bcbfdc9041b5c2d5ce3e5fc6637256e60bbc5", size = 1980864 },
543
- { url = "https://files.pythonhosted.org/packages/50/fc/93f7238a514c155a8ec02fc7ac6376177d449848115e4519b853820436c5/pydantic_core-2.27.1-cp311-none-win_arm64.whl", hash = "sha256:81f2ec23ddc1b476ff96563f2e8d723830b06dceae348ce02914a37cb4e74b89", size = 1864327 },
544
- { url = "https://files.pythonhosted.org/packages/be/51/2e9b3788feb2aebff2aa9dfbf060ec739b38c05c46847601134cc1fed2ea/pydantic_core-2.27.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9cbd94fc661d2bab2bc702cddd2d3370bbdcc4cd0f8f57488a81bcce90c7a54f", size = 1895239 },
545
- { url = "https://files.pythonhosted.org/packages/7b/9e/f8063952e4a7d0127f5d1181addef9377505dcce3be224263b25c4f0bfd9/pydantic_core-2.27.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f8c4718cd44ec1580e180cb739713ecda2bdee1341084c1467802a417fe0f02", size = 1805070 },
546
- { url = "https://files.pythonhosted.org/packages/2c/9d/e1d6c4561d262b52e41b17a7ef8301e2ba80b61e32e94520271029feb5d8/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15aae984e46de8d376df515f00450d1522077254ef6b7ce189b38ecee7c9677c", size = 1828096 },
547
- { url = "https://files.pythonhosted.org/packages/be/65/80ff46de4266560baa4332ae3181fffc4488ea7d37282da1a62d10ab89a4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ba5e3963344ff25fc8c40da90f44b0afca8cfd89d12964feb79ac1411a260ac", size = 1857708 },
548
- { url = "https://files.pythonhosted.org/packages/d5/ca/3370074ad758b04d9562b12ecdb088597f4d9d13893a48a583fb47682cdf/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:992cea5f4f3b29d6b4f7f1726ed8ee46c8331c6b4eed6db5b40134c6fe1768bb", size = 2037751 },
549
- { url = "https://files.pythonhosted.org/packages/b1/e2/4ab72d93367194317b99d051947c071aef6e3eb95f7553eaa4208ecf9ba4/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0325336f348dbee6550d129b1627cb8f5351a9dc91aad141ffb96d4937bd9529", size = 2733863 },
550
- { url = "https://files.pythonhosted.org/packages/8a/c6/8ae0831bf77f356bb73127ce5a95fe115b10f820ea480abbd72d3cc7ccf3/pydantic_core-2.27.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7597c07fbd11515f654d6ece3d0e4e5093edc30a436c63142d9a4b8e22f19c35", size = 2161161 },
551
- { url = "https://files.pythonhosted.org/packages/f1/f4/b2fe73241da2429400fc27ddeaa43e35562f96cf5b67499b2de52b528cad/pydantic_core-2.27.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3bbd5d8cc692616d5ef6fbbbd50dbec142c7e6ad9beb66b78a96e9c16729b089", size = 1993294 },
552
- { url = "https://files.pythonhosted.org/packages/77/29/4bb008823a7f4cc05828198153f9753b3bd4c104d93b8e0b1bfe4e187540/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:dc61505e73298a84a2f317255fcc72b710b72980f3a1f670447a21efc88f8381", size = 2001468 },
553
- { url = "https://files.pythonhosted.org/packages/f2/a9/0eaceeba41b9fad851a4107e0cf999a34ae8f0d0d1f829e2574f3d8897b0/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:e1f735dc43da318cad19b4173dd1ffce1d84aafd6c9b782b3abc04a0d5a6f5bb", size = 2091413 },
554
- { url = "https://files.pythonhosted.org/packages/d8/36/eb8697729725bc610fd73940f0d860d791dc2ad557faaefcbb3edbd2b349/pydantic_core-2.27.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f4e5658dbffe8843a0f12366a4c2d1c316dbe09bb4dfbdc9d2d9cd6031de8aae", size = 2154735 },
555
- { url = "https://files.pythonhosted.org/packages/52/e5/4f0fbd5c5995cc70d3afed1b5c754055bb67908f55b5cb8000f7112749bf/pydantic_core-2.27.1-cp312-none-win32.whl", hash = "sha256:672ebbe820bb37988c4d136eca2652ee114992d5d41c7e4858cdd90ea94ffe5c", size = 1833633 },
556
- { url = "https://files.pythonhosted.org/packages/ee/f2/c61486eee27cae5ac781305658779b4a6b45f9cc9d02c90cb21b940e82cc/pydantic_core-2.27.1-cp312-none-win_amd64.whl", hash = "sha256:66ff044fd0bb1768688aecbe28b6190f6e799349221fb0de0e6f4048eca14c16", size = 1986973 },
557
- { url = "https://files.pythonhosted.org/packages/df/a6/e3f12ff25f250b02f7c51be89a294689d175ac76e1096c32bf278f29ca1e/pydantic_core-2.27.1-cp312-none-win_arm64.whl", hash = "sha256:9a3b0793b1bbfd4146304e23d90045f2a9b5fd5823aa682665fbdaf2a6c28f3e", size = 1883215 },
501
+ sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 }
502
+ wheels = [
503
+ { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 },
504
+ { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 },
505
+ { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 },
506
+ { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 },
507
+ { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 },
508
+ { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 },
509
+ { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 },
510
+ { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 },
511
+ { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 },
512
+ { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 },
513
+ { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 },
514
+ { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 },
515
+ { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 },
516
+ { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 },
517
+ { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 },
518
+ { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 },
519
+ { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 },
520
+ { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 },
521
+ { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 },
522
+ { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 },
523
+ { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 },
524
+ { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 },
525
+ { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 },
526
+ { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 },
527
+ { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 },
528
+ { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 },
529
+ { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 },
530
+ { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 },
558
531
  ]
559
532
 
560
533
  [[package]]
@@ -689,15 +662,6 @@ wheels = [
689
662
  { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 },
690
663
  ]
691
664
 
692
- [[package]]
693
- name = "six"
694
- version = "1.16.0"
695
- source = { registry = "https://pypi.org/simple" }
696
- sdist = { url = "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", size = 34041 }
697
- wheels = [
698
- { url = "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", size = 11053 },
699
- ]
700
-
701
665
  [[package]]
702
666
  name = "sniffio"
703
667
  version = "1.3.1"
@@ -747,6 +711,39 @@ wheels = [
747
711
  { url = "https://files.pythonhosted.org/packages/96/00/2b325970b3060c7cecebab6d295afe763365822b1306a12eeab198f74323/starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7", size = 73225 },
748
712
  ]
749
713
 
714
+ [[package]]
715
+ name = "syntax-checker"
716
+ version = "0.2.10"
717
+ source = { registry = "https://pypi.org/simple" }
718
+ wheels = [
719
+ { url = "https://files.pythonhosted.org/packages/37/82/c0ff92cef366e52a7eb668d9486b5f5e3af57cd796777c02d22c65d6aa41/syntax_checker-0.2.10-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3e82257e18be896ef23e5768ec2c17e63ac20b59b3754601239dc2f9f80c4b0a", size = 2022761 },
720
+ { url = "https://files.pythonhosted.org/packages/b7/bf/b461d5925ca714c9393ce032a47f5939eeed0df8e0cd6e741eb54b3783f3/syntax_checker-0.2.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e23e503712ded04439d999e6df4690c551e500e086e119116b7a09c050aeb6c7", size = 2141417 },
721
+ { url = "https://files.pythonhosted.org/packages/4a/03/e681dc349fc79d4ee2662e7726ad266494e2f4056fe1869c07c72aa27bc3/syntax_checker-0.2.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834b6dc99c9d2bc9f8d08361217c1a490fe33d15cdf21c9da79d7099ab34bde6", size = 2080081 },
722
+ { url = "https://files.pythonhosted.org/packages/6a/e7/01c8d01bdee0e27004058870d90ecbd97fc113787e219790d4f9ecbedf14/syntax_checker-0.2.10-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a87968dd32c8f563ef6e5b5e1d6b1aa6f8b0b843b5c290d122e6f2af65300a14", size = 2078567 },
723
+ { url = "https://files.pythonhosted.org/packages/4e/ec/175a138a2180d669f395ec48e88331e7342f12f71dba4203564cfa4ed65b/syntax_checker-0.2.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f76f03abdf20fc1ff1ea57be4f4144d2bbc5213e6f7eabd29d21623d05f832f", size = 2254479 },
724
+ { url = "https://files.pythonhosted.org/packages/f6/ef/7e78f97dfcd859fb8affa5b83b01b7be85f2e5039c7ffeb5e14b9a633fc1/syntax_checker-0.2.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52662b7499a741fceec488ab33e2134705494cc343c69898a627d211b80d1981", size = 2065800 },
725
+ { url = "https://files.pythonhosted.org/packages/d0/93/77cbc93728c66274936cecfec3ee24588a882c9bf1a4b33410b799718c70/syntax_checker-0.2.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9666cbf7e258a613562d761fb6f91a8ed92f38dccad0ba06eb72010ca67dbb9d", size = 2116825 },
726
+ { url = "https://files.pythonhosted.org/packages/74/d3/8045d4eeb539032eb845668e2664a2c680500cb556ebc5c99fda4725a479/syntax_checker-0.2.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a1ee099948c69b5f22e3a0c43b47cd5af574de05eb2686770a43ae93749a9381", size = 2229851 },
727
+ { url = "https://files.pythonhosted.org/packages/93/ca/28259fcbb0ef39eed990664a69330e920a67eb99cffca0d1d4bb43424879/syntax_checker-0.2.10-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6d5894c178e68007b746016d5f714ecc000450daeb8a14c47bf9df51f75042c4", size = 2316381 },
728
+ { url = "https://files.pythonhosted.org/packages/41/a1/254228c45c7fdeb66d95ab8757608870a4e28c220e9ff7283301221ae154/syntax_checker-0.2.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:901a13111a479cccbcc748f8f905883b4a7a5852541d5bb81d4658742395a9e1", size = 2301990 },
729
+ { url = "https://files.pythonhosted.org/packages/87/b4/359a99f2954d7abcdb066808a2ab9b5c7bd183a8134069fd928f89b17845/syntax_checker-0.2.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7cd698e16ac638f8fb9181b45a67d6044873f8f93d0b5e5e403805e391c52edb", size = 2238231 },
730
+ { url = "https://files.pythonhosted.org/packages/80/3d/3ea27c814522a9285aa468c796a8294a2045f016107eb3e37c0d1b28fa02/syntax_checker-0.2.10-cp311-cp311-win32.whl", hash = "sha256:2a747d969e04ef2959e49fe98261cd3ecbaa0dddb20520878a1ceff6079cf3f4", size = 1854525 },
731
+ { url = "https://files.pythonhosted.org/packages/78/02/1eeff3a999491e4be78934f84a6c14bcd3b95d8faa85fbe4788747e99377/syntax_checker-0.2.10-cp311-cp311-win_amd64.whl", hash = "sha256:26d18dbef32e0872dc7d0a4982b460b81e66d9482d2548c8575c6dc1d1c25e51", size = 1865567 },
732
+ { url = "https://files.pythonhosted.org/packages/9c/c3/d767644eba31703da24e91304ea4917ba266ae168145a3de09ce8f3ace64/syntax_checker-0.2.10-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b1b78a0493c1ae3fb72d1be0a5701583ea62fab3c63a63a4f7c3a901ace57a9b", size = 2022421 },
733
+ { url = "https://files.pythonhosted.org/packages/67/f0/292b319e9650a6a156308b5032a746cb3d08230a847c633558292e87792e/syntax_checker-0.2.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c10e1fc27ce57ec45c373c5e9eb1f02c284c468c74aba5b2f108c31aeb51a43f", size = 2141223 },
734
+ { url = "https://files.pythonhosted.org/packages/5d/11/4f6d58ff5afcecd81051008a55b2e017fc0efa389c24463d2372eb0eefac/syntax_checker-0.2.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4fea0ed981802464185a453d24d134cd2437f3303d28f7dc929ae458c01bc0e", size = 2079817 },
735
+ { url = "https://files.pythonhosted.org/packages/7a/81/a5979e29270301c3170a41aa496729a9c9b2299a07ad04d5591bb3753ecc/syntax_checker-0.2.10-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c606a2624d4fb5ea38c6410f7ee018ae9a0b374c91cf52282731f67bce76d415", size = 2077704 },
736
+ { url = "https://files.pythonhosted.org/packages/04/a0/61852005659010dbc1804c4134b82b588733a95a12c7e5ce8f7daae5f3b7/syntax_checker-0.2.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fb6ca9127873c5af93c32cce0de6c50c5733af6f53be7d454b8d42e6d188fdf8", size = 2239902 },
737
+ { url = "https://files.pythonhosted.org/packages/88/dc/96f4f5d001ebed58599194f3cd46d8a2e6b64fa1e30fe906cd984835ebac/syntax_checker-0.2.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d9e87e169da3018cbe597bd251244263497800931268c83daeca523fe1f706", size = 2066186 },
738
+ { url = "https://files.pythonhosted.org/packages/ce/f4/ed1cd796a7679effaebcc6f86014d35602200d07c6ce9c490064a7e108c4/syntax_checker-0.2.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:814d5669889d065471d5d198734c29dedf4b635c4501ce48ec0be5ce7db78a13", size = 2116667 },
739
+ { url = "https://files.pythonhosted.org/packages/76/f2/b21c9cb0b130a562a651b7b18b72473441f5de71feedc5bd953398869979/syntax_checker-0.2.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6f2989d1c1a68ac88a17bdf89ced83e99714e4bb16119c8474f63b99c407b63", size = 2229328 },
740
+ { url = "https://files.pythonhosted.org/packages/fd/9d/25b99649f062dd8269b30e2e32a669ce3b68e8d2b23b9b0d43e47df443bf/syntax_checker-0.2.10-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:840d0921bc52ba6a78608e1837badc15135c8ef5f2da218cf8f8713cbc320eb5", size = 2315460 },
741
+ { url = "https://files.pythonhosted.org/packages/17/ae/1d03ad529e21bbd2420a0db284e250126e4f5f1ce10f5da383c9ded5bb9a/syntax_checker-0.2.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e6e290d23ea18d3bccd2685aedc19c2f6b7dd23869fb58f42a00589984c9fb29", size = 2301626 },
742
+ { url = "https://files.pythonhosted.org/packages/84/01/3c955e8c36366517137628e5e650df20b429e1a06169fdd3a5343acf2e55/syntax_checker-0.2.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6fbbdbc3cb7cdd009dd74ae1b791cc5a88dcd6ef06fa187d0a9f4a5694069a52", size = 2238048 },
743
+ { url = "https://files.pythonhosted.org/packages/3a/da/db90bde51b2f41e169212344176a3577070a4a85dc62073fd0a38becac76/syntax_checker-0.2.10-cp312-cp312-win32.whl", hash = "sha256:9363215330ab4b52349671b6c92bf455b287560ec896f6017c65ed459492eb94", size = 1854001 },
744
+ { url = "https://files.pythonhosted.org/packages/b8/be/57ae5491d80241b97b23326c04deed35c104e79887c18a9157344ad961fb/syntax_checker-0.2.10-cp312-cp312-win_amd64.whl", hash = "sha256:545f0da5894aec5b8d1d0f967efc0541fa0a9463eb5b7b307d908868cc3605e9", size = 1866063 },
745
+ ]
746
+
750
747
  [[package]]
751
748
  name = "tiktoken"
752
749
  version = "0.7.0"
@@ -805,7 +802,7 @@ wheels = [
805
802
 
806
803
  [[package]]
807
804
  name = "typer"
808
- version = "0.13.1"
805
+ version = "0.15.1"
809
806
  source = { registry = "https://pypi.org/simple" }
810
807
  dependencies = [
811
808
  { name = "click" },
@@ -813,18 +810,18 @@ dependencies = [
813
810
  { name = "shellingham" },
814
811
  { name = "typing-extensions" },
815
812
  ]
816
- sdist = { url = "https://files.pythonhosted.org/packages/76/41/49ead3ad3310545e767bcb917c759b026ca9eada5d5c150c2fb6fc555568/typer-0.13.1.tar.gz", hash = "sha256:9d444cb96cc268ce6f8b94e13b4335084cef4c079998a9f4851a90229a3bd25c", size = 98631 }
813
+ sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789 }
817
814
  wheels = [
818
- { url = "https://files.pythonhosted.org/packages/22/69/e90a0b4d0c16e095901679216c8ecdc728110c7c54e7b5f43a623bc4c789/typer-0.13.1-py3-none-any.whl", hash = "sha256:5b59580fd925e89463a29d363e0a43245ec02765bde9fb77d39e5d0f29dd7157", size = 44723 },
815
+ { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908 },
819
816
  ]
820
817
 
821
818
  [[package]]
822
819
  name = "types-pexpect"
823
- version = "4.9.0.20240806"
820
+ version = "4.9.0.20241208"
824
821
  source = { registry = "https://pypi.org/simple" }
825
- sdist = { url = "https://files.pythonhosted.org/packages/2d/cc/f3870fa4bda82a5c243a602784f253583a970c8e9ed78098b905890f5e09/types-pexpect-4.9.0.20240806.tar.gz", hash = "sha256:9c3c69fc91ae11a1a1eb54206743691b29c6e3752a02fff74ca59a988d3a2867", size = 8476 }
822
+ sdist = { url = "https://files.pythonhosted.org/packages/35/8b/2ac0c1db88bdc441d21477f151a074b1789aa3a4deac571b079a097bd987/types_pexpect-4.9.0.20241208.tar.gz", hash = "sha256:bbca0d0819947a719989a5cfe83641d9212bef893e2f0a7a01e47926bc82401d", size = 13222 }
826
823
  wheels = [
827
- { url = "https://files.pythonhosted.org/packages/f4/73/2dbaaa5ac3b35086ac81e216a5109c182b591ecf170e7192961e972c6c1e/types_pexpect-4.9.0.20240806-py3-none-any.whl", hash = "sha256:aaa938f60b073ace07acd8785908bc36e49de9ca9070c415800c8f44f31b5504", size = 12329 },
824
+ { url = "https://files.pythonhosted.org/packages/37/c6/14c23e04bae6a83e051da86c1670684e59acadab333a8497384aa201defd/types_pexpect-4.9.0.20241208-py3-none-any.whl", hash = "sha256:1928f478528454f0fea3495c16cf1ee2e67fca5c9fe97d60b868ac48c1fd5633", size = 17085 },
828
825
  ]
829
826
 
830
827
  [[package]]
@@ -856,27 +853,26 @@ wheels = [
856
853
 
857
854
  [[package]]
858
855
  name = "uvicorn"
859
- version = "0.32.1"
856
+ version = "0.34.0"
860
857
  source = { registry = "https://pypi.org/simple" }
861
858
  dependencies = [
862
859
  { name = "click" },
863
860
  { name = "h11" },
864
861
  ]
865
- sdist = { url = "https://files.pythonhosted.org/packages/6a/3c/21dba3e7d76138725ef307e3d7ddd29b763119b3aa459d02cc05fefcff75/uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175", size = 77630 }
862
+ sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 }
866
863
  wheels = [
867
- { url = "https://files.pythonhosted.org/packages/50/c1/2d27b0a15826c2b71dcf6e2f5402181ef85acf439617bb2f1453125ce1f3/uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e", size = 63828 },
864
+ { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 },
868
865
  ]
869
866
 
870
867
  [[package]]
871
868
  name = "wcgw"
872
- version = "2.2.2"
869
+ version = "2.3.0"
873
870
  source = { editable = "." }
874
871
  dependencies = [
875
872
  { name = "anthropic" },
876
873
  { name = "fastapi" },
877
874
  { name = "humanize" },
878
875
  { name = "mcp" },
879
- { name = "nltk" },
880
876
  { name = "openai" },
881
877
  { name = "petname" },
882
878
  { name = "pexpect" },
@@ -886,6 +882,7 @@ dependencies = [
886
882
  { name = "rich" },
887
883
  { name = "semantic-version" },
888
884
  { name = "shell" },
885
+ { name = "syntax-checker" },
889
886
  { name = "tiktoken" },
890
887
  { name = "toml" },
891
888
  { name = "typer" },
@@ -909,7 +906,6 @@ requires-dist = [
909
906
  { name = "fastapi", specifier = ">=0.115.0" },
910
907
  { name = "humanize", specifier = ">=4.11.0" },
911
908
  { name = "mcp", git = "https://github.com/rusiaaman/python-sdk?rev=53b69f397eae6ac81a51b84b34ff52b3119f11cb" },
912
- { name = "nltk", specifier = ">=3.9.1" },
913
909
  { name = "openai", specifier = ">=1.46.0" },
914
910
  { name = "petname", specifier = ">=2.6" },
915
911
  { name = "pexpect", specifier = ">=4.9.0" },
@@ -919,6 +915,7 @@ requires-dist = [
919
915
  { name = "rich", specifier = ">=13.8.1" },
920
916
  { name = "semantic-version", specifier = ">=2.10.0" },
921
917
  { name = "shell", specifier = ">=1.0.1" },
918
+ { name = "syntax-checker", specifier = "==0.2.10" },
922
919
  { name = "tiktoken", specifier = "==0.7.0" },
923
920
  { name = "toml", specifier = ">=0.10.2" },
924
921
  { name = "typer", specifier = ">=0.12.5" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes