aider-ce 0.88.2__py3-none-any.whl → 0.88.4__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 aider-ce might be problematic. Click here for more details.

aider/__init__.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from packaging import version
2
2
 
3
- __version__ = "0.88.2.dev"
3
+ __version__ = "0.88.4.dev"
4
4
  safe_version = __version__
5
5
 
6
6
  try:
aider/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.88.2'
32
- __version_tuple__ = version_tuple = (0, 88, 2)
31
+ __version__ = version = '0.88.4'
32
+ __version_tuple__ = version_tuple = (0, 88, 4)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -42,7 +42,7 @@ from rich.console import Console
42
42
 
43
43
  from aider import __version__, models, prompts, urls, utils
44
44
  from aider.analytics import Analytics
45
- from aider.commands import Commands
45
+ from aider.commands import Commands, SwitchCoder
46
46
  from aider.exceptions import LiteLLMExceptions
47
47
  from aider.history import ChatSummary
48
48
  from aider.io import ConfirmGroup, InputOutput
@@ -585,8 +585,6 @@ class Coder:
585
585
  self.summarizer_thread = None
586
586
  self.summarized_done_messages = []
587
587
  self.summarizing_messages = None
588
- self.input_task = None
589
- self.confirmation_in_progress = False
590
588
 
591
589
  self.files_edited_by_tools = set()
592
590
 
@@ -1057,7 +1055,7 @@ class Coder:
1057
1055
  self.commit_before_message.append(self.repo.get_head_commit_sha())
1058
1056
 
1059
1057
  async def run(self, with_message=None, preproc=True):
1060
- while self.confirmation_in_progress:
1058
+ while self.io.confirmation_in_progress:
1061
1059
  await asyncio.sleep(0.1) # Yield control and wait briefly
1062
1060
 
1063
1061
  if self.io.prompt_session:
@@ -1067,8 +1065,6 @@ class Coder:
1067
1065
  return await self._run_patched(with_message, preproc)
1068
1066
 
1069
1067
  async def _run_patched(self, with_message=None, preproc=True):
1070
- input_task = None
1071
- processing_task = None
1072
1068
  try:
1073
1069
  if with_message:
1074
1070
  self.io.user_input(with_message)
@@ -1076,91 +1072,134 @@ class Coder:
1076
1072
  return self.partial_response_content
1077
1073
 
1078
1074
  user_message = None
1075
+ await self.io.cancel_input_task()
1076
+ await self.io.cancel_processing_task()
1079
1077
 
1080
1078
  while True:
1081
1079
  try:
1082
1080
  if (
1083
- not self.confirmation_in_progress
1084
- and not input_task
1081
+ not self.io.confirmation_in_progress
1085
1082
  and not user_message
1086
- and (not processing_task or not self.io.placeholder)
1083
+ and (
1084
+ not self.io.input_task
1085
+ or self.io.input_task.done()
1086
+ or self.io.input_task.cancelled()
1087
+ )
1088
+ and (not self.io.processing_task or not self.io.placeholder)
1087
1089
  ):
1088
1090
  if not self.suppress_announcements_for_next_prompt:
1089
1091
  self.show_announcements()
1090
- self.suppress_announcements_for_next_prompt = False
1092
+ self.suppress_announcements_for_next_prompt = True
1091
1093
 
1092
1094
  # Stop spinner before showing announcements or getting input
1093
1095
  self.io.stop_spinner()
1094
-
1095
1096
  self.copy_context()
1096
- self.input_task = asyncio.create_task(self.get_input())
1097
- input_task = self.input_task
1097
+ self.io.input_task = asyncio.create_task(self.get_input())
1098
+
1099
+ # Yield Control so input can actually get properly set up
1100
+ await asyncio.sleep(0)
1098
1101
 
1099
1102
  tasks = set()
1100
- if processing_task:
1101
- tasks.add(processing_task)
1102
- if input_task:
1103
- tasks.add(input_task)
1103
+
1104
+ if self.io.processing_task:
1105
+ if self.io.processing_task.done():
1106
+ exception = self.io.processing_task.exception()
1107
+ if exception:
1108
+ if isinstance(exception, SwitchCoder):
1109
+ await self.io.processing_task
1110
+ elif (
1111
+ not self.io.processing_task.done()
1112
+ and not self.io.processing_task.cancelled()
1113
+ ):
1114
+ tasks.add(self.io.processing_task)
1115
+
1116
+ if (
1117
+ self.io.input_task
1118
+ and not self.io.input_task.done()
1119
+ and not self.io.input_task.cancelled()
1120
+ ):
1121
+ tasks.add(self.io.input_task)
1104
1122
 
1105
1123
  if tasks:
1106
1124
  done, pending = await asyncio.wait(
1107
1125
  tasks, return_when=asyncio.FIRST_COMPLETED
1108
1126
  )
1109
1127
 
1110
- if input_task and input_task in done:
1111
- if processing_task:
1112
- if not self.confirmation_in_progress:
1113
- processing_task.cancel()
1114
- try:
1115
- await processing_task
1116
- except asyncio.CancelledError:
1117
- pass
1128
+ if self.io.input_task and self.io.input_task in done:
1129
+ if self.io.processing_task:
1130
+ if not self.io.confirmation_in_progress:
1131
+ await self.io.cancel_processing_task()
1118
1132
  self.io.stop_spinner()
1119
- processing_task = None
1120
1133
 
1121
1134
  try:
1122
- user_message = input_task.result()
1135
+ user_message = self.io.input_task.result()
1136
+ await self.io.cancel_input_task()
1123
1137
  except (asyncio.CancelledError, KeyboardInterrupt):
1124
1138
  user_message = None
1125
- input_task = None
1126
- self.input_task = None
1127
- if user_message is None:
1139
+
1140
+ if not user_message:
1141
+ await self.io.cancel_input_task()
1128
1142
  continue
1129
1143
 
1130
- if processing_task and processing_task in done:
1144
+ if self.io.processing_task and self.io.processing_task in pending:
1131
1145
  try:
1132
- await processing_task
1146
+ tasks = set()
1147
+ tasks.add(self.io.processing_task)
1148
+
1149
+ # We just did a confirmation so add a new input task
1150
+ if (
1151
+ not self.io.input_task
1152
+ and self.io.get_confirmation_acknowledgement()
1153
+ ):
1154
+ self.io.input_task = asyncio.create_task(self.get_input())
1155
+ tasks.add(self.io.input_task)
1156
+
1157
+ done, pending = await asyncio.wait(
1158
+ tasks, return_when=asyncio.FIRST_COMPLETED
1159
+ )
1160
+
1161
+ if self.io.input_task and self.io.input_task in done:
1162
+ await self.io.cancel_processing_task()
1163
+ self.io.stop_spinner()
1164
+ self.io.acknowledge_confirmation()
1165
+
1166
+ try:
1167
+ user_message = self.io.input_task.result()
1168
+ await self.io.cancel_input_task()
1169
+ except (asyncio.CancelledError, KeyboardInterrupt):
1170
+ user_message = None
1171
+
1133
1172
  except (asyncio.CancelledError, KeyboardInterrupt):
1173
+ print("error of some sort")
1134
1174
  pass
1135
- processing_task = None
1175
+
1136
1176
  # Stop spinner when processing task completes
1137
1177
  self.io.stop_spinner()
1138
1178
 
1139
- if user_message and self.run_one_completed and self.compact_context_completed:
1140
- processing_task = asyncio.create_task(
1179
+ if user_message and not self.io.acknowledge_confirmation():
1180
+ self.io.processing_task = asyncio.create_task(
1141
1181
  self._processing_logic(user_message, preproc)
1142
1182
  )
1143
1183
  # Start spinner for processing task
1144
1184
  self.io.start_spinner("Processing...")
1145
- user_message = None # Clear message after starting task
1185
+
1186
+ self.io.ring_bell()
1187
+ user_message = None
1146
1188
  except KeyboardInterrupt:
1147
- if processing_task:
1148
- processing_task.cancel()
1149
- processing_task = None
1150
- # Stop spinner when processing task is cancelled
1151
- self.io.stop_spinner()
1152
- if input_task:
1189
+ if self.io.input_task:
1153
1190
  self.io.set_placeholder("")
1154
- input_task.cancel()
1155
- input_task = None
1191
+ await self.io.cancel_input_task()
1192
+
1193
+ if self.io.processing_task:
1194
+ await self.io.cancel_processing_task()
1195
+ self.io.stop_spinner()
1196
+
1156
1197
  self.keyboard_interrupt()
1157
1198
  except EOFError:
1158
1199
  return
1159
1200
  finally:
1160
- if input_task:
1161
- input_task.cancel()
1162
- if processing_task:
1163
- processing_task.cancel()
1201
+ await self.io.cancel_input_task()
1202
+ await self.io.cancel_processing_task()
1164
1203
 
1165
1204
  async def _processing_logic(self, user_message, preproc):
1166
1205
  try:
@@ -1188,6 +1227,7 @@ class Coder:
1188
1227
  all_read_only_files = [self.get_rel_fname(fname) for fname in all_read_only_fnames]
1189
1228
  all_files = sorted(set(inchat_files + all_read_only_files))
1190
1229
  edit_format = "" if self.edit_format == self.main_model.edit_format else self.edit_format
1230
+
1191
1231
  return await self.io.get_input(
1192
1232
  self.root,
1193
1233
  all_files,
@@ -1214,6 +1254,8 @@ class Coder:
1214
1254
  self.init_before_message()
1215
1255
 
1216
1256
  if preproc:
1257
+ if user_message[0] in "!":
1258
+ user_message = f"/run {user_message[1:]}"
1217
1259
  message = await self.preproc_user_input(user_message)
1218
1260
  else:
1219
1261
  message = user_message
@@ -2704,7 +2746,7 @@ class Coder:
2704
2746
 
2705
2747
  async for chunk in completion:
2706
2748
  # Check if confirmation is in progress and wait if needed
2707
- while self.confirmation_in_progress:
2749
+ while self.io.confirmation_in_progress:
2708
2750
  await asyncio.sleep(0.1) # Yield control and wait briefly
2709
2751
 
2710
2752
  if isinstance(chunk, str):
aider/io.py CHANGED
@@ -320,6 +320,7 @@ class InputOutput:
320
320
  root=".",
321
321
  notifications=False,
322
322
  notifications_command=None,
323
+ verbose=False,
323
324
  ):
324
325
  self.console = Console()
325
326
  self.pretty = pretty
@@ -337,6 +338,8 @@ class InputOutput:
337
338
  self.multiline_mode = multiline_mode
338
339
  self.bell_on_next_input = False
339
340
  self.notifications = notifications
341
+ self.verbose = verbose
342
+
340
343
  if notifications and notifications_command is None:
341
344
  self.notifications_command = self.get_default_notification_command()
342
345
  else:
@@ -363,7 +366,7 @@ class InputOutput:
363
366
  )
364
367
 
365
368
  self.fzf_available = shutil.which("fzf")
366
- if not self.fzf_available:
369
+ if not self.fzf_available and self.verbose:
367
370
  self.tool_warning(
368
371
  "fzf not found, fuzzy finder features will be disabled. Install it for enhanced"
369
372
  " file/history search."
@@ -418,13 +421,14 @@ class InputOutput:
418
421
  self.pretty = False
419
422
  fancy_input = False
420
423
 
424
+ # Spinner state
425
+ self.spinner_running = False
426
+ self.spinner_text = ""
427
+ self.spinner_frame_index = 0
428
+ self.spinner_last_frame_index = 0
429
+ self.unicode_palette = "░█"
430
+
421
431
  if fancy_input:
422
- # Spinner state
423
- self.spinner_running = False
424
- self.spinner_text = ""
425
- self.spinner_frame_index = 0
426
- self.spinner_last_frame_index = 0
427
- self.unicode_palette = "░█"
428
432
  # If unicode is supported, use the rich 'dots2' spinner, otherwise an ascii fallback
429
433
  if self._spinner_supports_unicode():
430
434
  self.spinner_frames = SPINNERS["dots2"]["frames"]
@@ -459,7 +463,18 @@ class InputOutput:
459
463
  self.file_watcher = file_watcher
460
464
  self.root = root
461
465
  self.outstanding_confirmations = []
466
+
467
+ # Variables used to interface with base_coder
462
468
  self.coder = None
469
+ self.input_task = None
470
+ self.processing_task = None
471
+ self.confirmation_in_progress = False
472
+ self.confirmation_acknowledgement = False
473
+
474
+ # State tracking for confirmation input
475
+ self.confirmation_input_active = False
476
+ self.saved_input_text = ""
477
+ self.confirmation_future = None
463
478
 
464
479
  # Validate color settings after console is initialized
465
480
  self._validate_color_settings()
@@ -656,16 +671,8 @@ class InputOutput:
656
671
  print()
657
672
 
658
673
  def interrupt_input(self):
659
- coder = self.coder() if self.coder else None
660
- # interrupted_for_confirmation = False
661
-
662
- if (
663
- coder
664
- and hasattr(coder, "input_task")
665
- and coder.input_task
666
- and not coder.input_task.done()
667
- ):
668
- coder.input_task.cancel()
674
+ if self.input_task and not self.input_task.done():
675
+ self.input_task.cancel()
669
676
 
670
677
  if self.prompt_session and self.prompt_session.app:
671
678
  # Store any partial input before interrupting
@@ -697,9 +704,6 @@ class InputOutput:
697
704
  self.reject_outstanding_confirmations()
698
705
  self.rule()
699
706
 
700
- # Ring the bell if needed
701
- self.ring_bell()
702
-
703
707
  rel_fnames = list(rel_fnames)
704
708
  show = ""
705
709
  if rel_fnames:
@@ -878,6 +882,11 @@ class InputOutput:
878
882
  self.tool_error(str(err))
879
883
  return ""
880
884
  except Exception as err:
885
+ try:
886
+ self.prompt_session.app.exit()
887
+ except Exception:
888
+ pass
889
+
881
890
  import traceback
882
891
 
883
892
  self.tool_error(str(err))
@@ -930,6 +939,26 @@ class InputOutput:
930
939
  self.user_input(inp)
931
940
  return inp
932
941
 
942
+ async def cancel_input_task(self):
943
+ if self.input_task:
944
+ input_task = self.input_task
945
+ self.input_task = None
946
+ try:
947
+ input_task.cancel()
948
+ await input_task
949
+ except asyncio.CancelledError:
950
+ pass
951
+
952
+ async def cancel_processing_task(self):
953
+ if self.processing_task:
954
+ processing_task = self.processing_task
955
+ self.processing_task = None
956
+ try:
957
+ processing_task.cancel()
958
+ await processing_task
959
+ except asyncio.CancelledError:
960
+ pass
961
+
933
962
  def add_to_input_history(self, inp):
934
963
  if not self.input_history_file:
935
964
  return
@@ -1000,32 +1029,33 @@ class InputOutput:
1000
1029
  return True
1001
1030
  return False
1002
1031
 
1032
+ def set_confirmation_acknowledgement(self):
1033
+ self.confirmation_acknowledgement = True
1034
+
1035
+ def get_confirmation_acknowledgement(self):
1036
+ return self.confirmation_acknowledgement
1037
+
1038
+ def acknowledge_confirmation(self):
1039
+ outstanding_confirmation = self.confirmation_acknowledgement
1040
+ self.confirmation_acknowledgement = False
1041
+ return outstanding_confirmation
1042
+
1003
1043
  @restore_multiline_async
1004
1044
  async def confirm_ask(
1005
1045
  self,
1006
1046
  *args,
1007
1047
  **kwargs,
1008
1048
  ):
1009
- coder = self.coder() if self.coder else None
1010
- interrupted_for_confirmation = False
1011
- if (
1012
- coder
1013
- and hasattr(coder, "input_task")
1014
- and coder.input_task
1015
- and not coder.input_task.done()
1016
- ):
1017
- coder.confirmation_in_progress = True
1018
- interrupted_for_confirmation = True
1019
- # self.interrupt_input()
1049
+ self.confirmation_in_progress = True
1020
1050
 
1021
1051
  try:
1052
+ self.set_confirmation_acknowledgement()
1022
1053
  return await asyncio.create_task(self._confirm_ask(*args, **kwargs))
1023
1054
  except KeyboardInterrupt:
1024
1055
  # Re-raise KeyboardInterrupt to allow it to propagate
1025
1056
  raise
1026
1057
  finally:
1027
- if interrupted_for_confirmation:
1028
- coder.confirmation_in_progress = False
1058
+ self.confirmation_in_progress = False
1029
1059
 
1030
1060
  async def _confirm_ask(
1031
1061
  self,
@@ -1038,9 +1068,6 @@ class InputOutput:
1038
1068
  ):
1039
1069
  self.num_user_asks += 1
1040
1070
 
1041
- # Ring the bell if needed
1042
- self.ring_bell()
1043
-
1044
1071
  question_id = (question, subject)
1045
1072
 
1046
1073
  confirmation_future = asyncio.get_running_loop().create_future()
@@ -1085,47 +1112,45 @@ class InputOutput:
1085
1112
  else:
1086
1113
  self.tool_output(subject, bold=True)
1087
1114
 
1088
- style = self._get_style()
1089
-
1090
1115
  if self.yes is True:
1091
1116
  res = "n" if explicit_yes_required else "y"
1117
+ self.acknowledge_confirmation()
1092
1118
  elif self.yes is False:
1093
1119
  res = "n"
1120
+ self.acknowledge_confirmation()
1094
1121
  elif group and group.preference:
1095
1122
  res = group.preference
1096
1123
  self.user_input(f"{question}{res}", log_only=False)
1124
+ self.acknowledge_confirmation()
1097
1125
  else:
1126
+ # Ring the bell if needed
1127
+ self.ring_bell()
1128
+
1098
1129
  while True:
1099
1130
  try:
1100
1131
  if self.prompt_session:
1101
- coder = self.coder() if self.coder else None
1102
1132
  if (
1103
- coder
1104
- and hasattr(coder, "input_task")
1105
- and coder.input_task
1106
- and not coder.input_task.done()
1133
+ not self.input_task
1134
+ or self.input_task.done()
1135
+ or self.input_task.cancelled()
1136
+ ):
1137
+ coder = self.coder() if self.coder else None
1138
+
1139
+ if coder:
1140
+ self.input_task = asyncio.create_task(coder.get_input())
1141
+ await asyncio.sleep(0)
1142
+
1143
+ if (
1144
+ self.input_task
1145
+ and not self.input_task.done()
1146
+ and not self.input_task.cancelled()
1107
1147
  ):
1108
1148
  self.prompt_session.message = question
1109
1149
  self.prompt_session.app.invalidate()
1110
- res = await coder.input_task
1111
1150
  else:
1112
- prompt_task = asyncio.create_task(
1113
- self.prompt_session.prompt_async(
1114
- question,
1115
- style=style,
1116
- complete_while_typing=False,
1117
- )
1118
- )
1119
- done, pending = await asyncio.wait(
1120
- {prompt_task, confirmation_future},
1121
- return_when=asyncio.FIRST_COMPLETED,
1122
- )
1123
-
1124
- if confirmation_future in done:
1125
- prompt_task.cancel()
1126
- return await confirmation_future
1127
-
1128
- res = await prompt_task
1151
+ continue
1152
+
1153
+ res = await self.input_task
1129
1154
  else:
1130
1155
  res = await asyncio.get_event_loop().run_in_executor(
1131
1156
  None, input, question
@@ -1240,17 +1265,22 @@ class InputOutput:
1240
1265
 
1241
1266
  if not isinstance(message, Text):
1242
1267
  message = Text(message)
1243
- color = ensure_hash_prefix(color) if color else None
1244
- style = dict(style=color) if self.pretty and color else dict()
1268
+
1269
+ style = dict()
1270
+
1271
+ if self.pretty:
1272
+ color = ensure_hash_prefix(color) if color else None
1273
+ if color:
1274
+ style["color"] = color
1245
1275
 
1246
1276
  try:
1247
- self.stream_print(message, **style)
1277
+ self.stream_print(message, style=RichStyle(**style))
1248
1278
  except UnicodeEncodeError:
1249
1279
  # Fallback to ASCII-safe output
1250
1280
  if isinstance(message, Text):
1251
1281
  message = message.plain
1252
1282
  message = str(message).encode("ascii", errors="replace").decode("ascii")
1253
- self.stream_print(message, **style)
1283
+ self.stream_print(message, style=RichStyle(**style))
1254
1284
 
1255
1285
  if self.prompt_session and self.prompt_session.app:
1256
1286
  self.prompt_session.app.invalidate()
aider/main.py CHANGED
@@ -601,6 +601,7 @@ async def main_async(argv=None, input=None, output=None, force_git_root=None, re
601
601
  multiline_mode=args.multiline,
602
602
  notifications=args.notifications,
603
603
  notifications_command=args.notifications_command,
604
+ verbose=args.verbose,
604
605
  )
605
606
 
606
607
  io = get_io(args.pretty)
aider/urls.py CHANGED
@@ -8,7 +8,7 @@ model_warnings = "https://aider.chat/docs/llms/warnings.html"
8
8
  token_limits = "https://aider.chat/docs/troubleshooting/token-limits.html"
9
9
  llms = "https://aider.chat/docs/llms.html"
10
10
  large_repos = "https://aider.chat/docs/faq.html#can-i-use-aider-in-a-large-mono-repo"
11
- github_issues = "https://github.com/Aider-AI/aider/issues/new"
11
+ github_issues = "https://github.com/dwash96/aider-ce/issues/new"
12
12
  git_index_version = "https://github.com/Aider-AI/aider/issues/211"
13
13
  install_properly = "https://aider.chat/docs/troubleshooting/imports.html"
14
14
  analytics = "https://aider.chat/docs/more/analytics.html"
aider/versioncheck.py CHANGED
@@ -21,7 +21,7 @@ def install_from_main_branch(io):
21
21
  io,
22
22
  None,
23
23
  "Install the development version of aider from the main branch?",
24
- ["git+https://github.com/Aider-AI/aider.git"],
24
+ ["git+https://github.com/dwash96/aider-ce.git"],
25
25
  self_update=True,
26
26
  )
27
27
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aider-ce
3
- Version: 0.88.2
3
+ Version: 0.88.4
4
4
  Summary: Aider is AI pair programming in your terminal
5
5
  Project-URL: Homepage, https://github.com/dwash96/aider-ce
6
6
  Classifier: Development Status :: 4 - Beta
@@ -1,6 +1,6 @@
1
- aider/__init__.py,sha256=lR9OBHkDJxBD9W4uVZzRD0QzU75uFDkVWRF4kJyJh4k,496
1
+ aider/__init__.py,sha256=Gt5Oveq-MHT_HEMx5-sLQoQaHGVMIX7buzoDjI8ifqA,496
2
2
  aider/__main__.py,sha256=Vdhw8YA1K3wPMlbJQYL5WqvRzAKVeZ16mZQFO9VRmCo,62
3
- aider/_version.py,sha256=2xGyxCb49iWFz4jJKwCSryLonWCKFULLHVc5ZqHj6h8,706
3
+ aider/_version.py,sha256=IQ-Q4S4Mold8rZdN7zBkEdwsR_c0ns8JopeeDGBPsmA,706
4
4
  aider/analytics.py,sha256=c5ujaCcMc3yG-9rz_0oSsqBwmVQRxJnui6iE_yDyY_M,7507
5
5
  aider/args.py,sha256=lC64t3gp-SJ1Sv51LDHpTAsiU2ZwiFWerYf3iu9mtWY,32742
6
6
  aider/args_formatter.py,sha256=CBRnzHyZk-fFCK0ekAzb6C4PPJOU-VTpWIIsJe3qUhk,6369
@@ -17,10 +17,10 @@ aider/gui.py,sha256=JnHvli1JTCGHAgsOZ8HkAWOKAFxmngbyviZIJeYvjsw,17573
17
17
  aider/help.py,sha256=wExA1E9vuJccKBH1VvKmH-zJqFi-vhNc0n3CD3Y-8fI,4432
18
18
  aider/help_pats.py,sha256=syn7pSVJdcf8uMKTxnZUZBQu-r8JMAi-rrC-k2er1Fk,376
19
19
  aider/history.py,sha256=083Gm7KxNo1PXMFHYiChigxCbRzmLkfNlesODdCC-eY,6067
20
- aider/io.py,sha256=_CS6DxB-HmpaqVUedyAq-CZzp-KdHHs2zwpF53pcaCY,56859
20
+ aider/io.py,sha256=jEhZdRs7pbOszyiJpCAUYbUjSH9Bp21H-YkgdraUrjw,57586
21
21
  aider/linter.py,sha256=t5jwWZ1dvIzRtig1kTSjzl6u1LRfw0e19qwNIen2jAg,7998
22
22
  aider/llm.py,sha256=dtT0mavXP1SyR0Zu_ysZXKdbs3y53q2PevvDKBUrs6s,1505
23
- aider/main.py,sha256=2Pk5nJhUf-aoa2cbs6VPQA0lfneRYgw-dCbkFO8r8WY,46331
23
+ aider/main.py,sha256=I_zPPpX19TWMwngQowlIeiv8O9UwFqdCiQOiFhZ2tBo,46365
24
24
  aider/mdstream.py,sha256=fS9iQUQmIJPEMo7o1psPGE2yYj31MI3m3msdN-jEzUw,7594
25
25
  aider/models.py,sha256=yflYZ64oza4QH04vIPI2n7rcsdSw2Np4BRwRKlb3STQ,45455
26
26
  aider/onboarding.py,sha256=pMWl--NOH_hb4w1wVxLmv8W0akcrilo1Pxf9XUSqBXs,16135
@@ -34,9 +34,9 @@ aider/run_cmd.py,sha256=9-NpSL4hlqIndf_EN1jnmWfjX7vIPbDgKgGPGRAr2Rw,4223
34
34
  aider/scrape.py,sha256=1d5RTtHLJ8JersGoQWm0mDVk_rQfsY4Xm-0jTK8xEPw,8346
35
35
  aider/sendchat.py,sha256=fY9scUSGdcLUDrD3PWUEyp6njRZZ138l79oXz_bks8o,7700
36
36
  aider/special.py,sha256=OhsBWWM-DWwjWbi6kE7EqR4CiUfyJ6qJuCgcmywZSAc,4415
37
- aider/urls.py,sha256=W0OL4pahSIZAaSUHPvn9KPN1aIkXE5nAKcizMKy4EKg,1122
37
+ aider/urls.py,sha256=LoSe3P1wGC5hEohJ5lRuIXT2R0YzLNbJrC67c8KoQZ4,1124
38
38
  aider/utils.py,sha256=wkT43yJx59Q0OfIlzNX2n9rPyEEo7WLKXdXoxNJzdz4,12231
39
- aider/versioncheck.py,sha256=R9R1gUJYgOtmUycpJ4YqxCkCOylQBSiZ_p_BAnHJ8H4,2977
39
+ aider/versioncheck.py,sha256=e2rD1Kdz_mcuzcgyrRsveYd-BxfgS4pzkFbIE2gz6xs,2979
40
40
  aider/voice.py,sha256=hNQCMCWhljcROJhzsvnkwgzzgQQbFORkpROhKeqICig,6797
41
41
  aider/waiting.py,sha256=QbDnh1U6oJPqkUrRM3DC8iA5-djbKRW5iJh6Q3VOnrI,944
42
42
  aider/watch.py,sha256=znCZhHCBlcMm-4SRJP-B0mWfsl5q26DAd-zlk2zykQ8,10641
@@ -46,7 +46,7 @@ aider/coders/architect_coder.py,sha256=O5KIf__Ka0bgtCUhYWUmAb08aCS6Nq-CdVWWa-VNK
46
46
  aider/coders/architect_prompts.py,sha256=R0_KxZjo-km_yNaeDAquDP9qfp3IdWgrdMirCWe0RIE,1658
47
47
  aider/coders/ask_coder.py,sha256=Omk4Ih8-prefkMZ_jnRS3faoW5CQUakHOvZ-s7piM3U,210
48
48
  aider/coders/ask_prompts.py,sha256=W6HwDUfzfOLt9q8sl6rw7fN7b5ND90FkxCZrtrWl5vY,1171
49
- aider/coders/base_coder.py,sha256=I2IwjL2mzcBJhnaMHhAZn0tQZ6DPi8sw-EsjRofJk9c,128223
49
+ aider/coders/base_coder.py,sha256=gFEeUmxwv5r9wrl9kwRyIxJIxefx4hCs3SedZVnyEms,130301
50
50
  aider/coders/base_prompts.py,sha256=O3bBjhf0hgvtKbQ9QyOMnRy8LrmfLyT9dVAcXxHS_3k,3659
51
51
  aider/coders/chat_chunks.py,sha256=8HPet6cmQdgWvaA_tGpinO4ASMst53uTcSEtNVTYDXE,1981
52
52
  aider/coders/context_coder.py,sha256=_RSzu6ptHo2lkTN7-e9TpcZKzqbQF2eNX5MkyswGm3s,1577
@@ -261,9 +261,9 @@ aider/website/docs/usage/tutorials.md,sha256=ZKBztbUtucHOiv9h8gvWiWTP6MTSsFyz4mA
261
261
  aider/website/docs/usage/voice.md,sha256=BtX7pHRgHRWUmrNbS4JssC-SO8RrJ_OetBCtIYpO0pU,3452
262
262
  aider/website/docs/usage/watch.md,sha256=OVF14lGtv1vhSXRE8PpxQ3YW-uXSifarUbmLBjmLRyA,7940
263
263
  aider/website/share/index.md,sha256=P51aDw9AT8AVbsU7v6g1tWuMjly7y_plM_ZI1ScaT8Y,3172
264
- aider_ce-0.88.2.dist-info/licenses/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
265
- aider_ce-0.88.2.dist-info/METADATA,sha256=24StMPdhLaWO45fN1UXg5gC-nJjB7mEuPzaaVlBxULE,20820
266
- aider_ce-0.88.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
267
- aider_ce-0.88.2.dist-info/entry_points.txt,sha256=qUBEUd84DYNEHFSgZbgsjgsrAABxqwOj-Dwut9pHZx0,45
268
- aider_ce-0.88.2.dist-info/top_level.txt,sha256=uwOA6ycgSiRLrBsaRBcIeN_eBKAX78U01_KDEHR8mBk,6
269
- aider_ce-0.88.2.dist-info/RECORD,,
264
+ aider_ce-0.88.4.dist-info/licenses/LICENSE.txt,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
265
+ aider_ce-0.88.4.dist-info/METADATA,sha256=9NpL2hUk3EJMmZYIsg6JtqX80IqogsWzDTQTX-zo7zE,20820
266
+ aider_ce-0.88.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
267
+ aider_ce-0.88.4.dist-info/entry_points.txt,sha256=qUBEUd84DYNEHFSgZbgsjgsrAABxqwOj-Dwut9pHZx0,45
268
+ aider_ce-0.88.4.dist-info/top_level.txt,sha256=uwOA6ycgSiRLrBsaRBcIeN_eBKAX78U01_KDEHR8mBk,6
269
+ aider_ce-0.88.4.dist-info/RECORD,,