Skip to content

Commit 031e702

Browse files
authored
Merge pull request #299 from dwash96/v0.90.6
V0.90.6
2 parents 2bef3be + 2256f89 commit 031e702

16 files changed

Lines changed: 449 additions & 278 deletions

File tree

MANIFEST.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# This needs to sync with aider/help_pats.py
22

3+
include requirements/requirements.in
4+
include requirements/requirements-dev.in
5+
include requirements/requirements-help.in
6+
include requirements/requirements-playwright.in
7+
38
global-exclude .DS_Store
49

510
recursive-exclude aider/website/examples *

aider/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from packaging import version
22

3-
__version__ = "0.90.5.dev"
3+
__version__ = "0.90.6.dev"
44
safe_version = __version__
55

66
try:

aider/coders/agent_coder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ def _get_agent_config(self):
287287
config["tools_excludelist"] = []
288288

289289
if "include_context_blocks" in config:
290-
self.allowed_context_blocks = set(config["context_blocks"])
290+
self.allowed_context_blocks = set(config["include_context_blocks"])
291291
else:
292292
self.allowed_context_blocks = {
293293
"context_summary",
@@ -1202,7 +1202,7 @@ async def reply_completed(self):
12021202
self.tool_usage_history = []
12031203
if self.files_edited_by_tools:
12041204
_ = await self.auto_commit(self.files_edited_by_tools)
1205-
return True
1205+
return False
12061206

12071207
# Since we are no longer suppressing, the partial_response_content IS the final content.
12081208
# We might want to update it to the processed_content (without tool calls) if we don't

aider/coders/architect_coder.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ async def reply_completed(self):
4242
kwargs["cache_prompts"] = False
4343
kwargs["num_cache_warming_pings"] = 0
4444
kwargs["summarize_from_coder"] = False
45+
kwargs["mcp_servers"] = [] # Empty to skip initialization
46+
47+
coder = await Coder.create(**kwargs)
48+
# Transfer MCP state to avoid re-initialization
49+
coder.mcp_servers = self.mcp_servers
50+
coder.mcp_tools = self.mcp_tools
51+
# Transfer TUI app weak reference
52+
coder.tui = self.tui
4553

4654
new_kwargs = dict(io=self.io, from_coder=self)
4755
new_kwargs.update(kwargs)

aider/coders/base_coder.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2845,7 +2845,11 @@ def add_assistant_reply_to_cur_messages(self):
28452845
msg["reasoning_content"] = self.partial_response_reasoning_content
28462846

28472847
# Only add a message if it's not empty.
2848-
if msg is not None:
2848+
if msg is not None and (
2849+
msg.get("content", None)
2850+
or msg.get("tool_calls", None)
2851+
or msg.get("function_call", None)
2852+
):
28492853
self.cur_messages.append(msg)
28502854

28512855
def get_file_mentions(self, content, ignore_current=False):

aider/commands.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,19 +1606,29 @@ async def _generic_chat_command(self, args, edit_format, placeholder=None):
16061606

16071607
from aider.coders.base_coder import Coder
16081608

1609+
user_msg = args
1610+
16091611
original_main_model = self.coder.main_model
16101612
original_edit_format = self.coder.edit_format
1613+
kwargs = {
1614+
"io": self.coder.io,
1615+
"from_coder": self.coder,
1616+
"edit_format": edit_format,
1617+
"summarize_from_coder": False,
1618+
"num_cache_warming_pings": 0,
1619+
"aider_commit_hashes": self.coder.aider_commit_hashes,
1620+
"args": self.coder.args,
1621+
}
1622+
1623+
kwargs["mcp_servers"] = [] # Empty to skip initialization
1624+
1625+
coder = await Coder.create(**kwargs)
1626+
# Transfer MCP state to avoid re-initialization
1627+
coder.mcp_servers = self.coder.mcp_servers
1628+
coder.mcp_tools = self.coder.mcp_tools
1629+
# Transfer TUI app weak reference
1630+
coder.tui = self.coder.tui
16111631

1612-
coder = await Coder.create(
1613-
io=self.io,
1614-
from_coder=self.coder,
1615-
edit_format=edit_format,
1616-
summarize_from_coder=False,
1617-
num_cache_warming_pings=0,
1618-
aider_commit_hashes=self.coder.aider_commit_hashes,
1619-
)
1620-
1621-
user_msg = args
16221632
await coder.generate(user_message=user_msg, preproc=False)
16231633
self.coder.aider_commit_hashes = coder.aider_commit_hashes
16241634

@@ -1649,7 +1659,7 @@ def get_help_md(self):
16491659
res += "\n"
16501660
return res
16511661

1652-
def cmd_voice(self, args):
1662+
async def cmd_voice(self, args):
16531663
"Record and transcribe voice input"
16541664

16551665
if not self.voice:
@@ -1667,14 +1677,19 @@ def cmd_voice(self, args):
16671677
return
16681678

16691679
try:
1670-
text = self.voice.record_and_transcribe(None, language=self.voice_language)
1680+
self.coder.io.update_spinner("Recording...")
1681+
text = await self.voice.record_and_transcribe(None, language=self.voice_language)
16711682
except litellm.OpenAIError as err:
16721683
self.io.tool_error(f"Unable to use OpenAI whisper model: {err}")
16731684
return
16741685

16751686
if text:
16761687
self.io.placeholder = text
16771688

1689+
if self.coder.tui and self.coder.tui():
1690+
self.coder.tui().set_input_value(text)
1691+
self.coder.tui().refresh()
1692+
16781693
def cmd_paste(self, args):
16791694
"""Paste image/text from the clipboard into the chat.\
16801695
Optionally provide a name for the image."""

aider/io.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,7 @@ async def recreate_input(self, future=None):
753753
await asyncio.sleep(0)
754754
else:
755755
self.input_task = asyncio.create_task(self.get_input(None, [], [], []))
756+
await asyncio.sleep(0)
756757

757758
async def get_input(
758759
self,

aider/main.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,7 @@ def get_io(pretty):
762762
# TUI mode - create TUI-specific IO
763763
output_queue = None
764764
input_queue = None
765+
pre_init_io = get_io(args.pretty)
765766
if args.tui or (args.tui is None and not args.linear_output):
766767
try:
767768
from aider.tui import create_tui_io
@@ -776,7 +777,7 @@ def get_io(pretty):
776777
print(f"Import error: {e}")
777778
sys.exit(1)
778779
else:
779-
io = get_io(args.pretty)
780+
io = pre_init_io
780781

781782
# Only do CLI-specific initialization if not in TUI mode
782783
if not args.tui:
@@ -1260,35 +1261,35 @@ def apply_model_overrides(model_name):
12601261
)
12611262

12621263
if args.show_model_warnings:
1263-
problem = await models.sanity_check_models(io, main_model)
1264+
problem = await models.sanity_check_models(pre_init_io, main_model)
12641265
if problem:
1265-
io.tool_output("You can skip this check with --no-show-model-warnings")
1266+
pre_init_io.tool_output("You can skip this check with --no-show-model-warnings")
12661267

12671268
try:
1268-
await io.offer_url(
1269+
await pre_init_io.offer_url(
12691270
urls.model_warnings,
12701271
"Open documentation url for more info?",
12711272
acknowledge=True,
12721273
)
1273-
io.tool_output()
1274+
pre_init_io.tool_output()
12741275
except KeyboardInterrupt:
12751276
return await graceful_exit(coder, 1)
12761277

12771278
if args.git:
1278-
git_root = await setup_git(git_root, io)
1279+
git_root = await setup_git(git_root, pre_init_io)
12791280
if args.gitignore:
1280-
await check_gitignore(git_root, io)
1281+
await check_gitignore(git_root, pre_init_io)
12811282

12821283
except UnknownEditFormat as err:
1283-
io.tool_error(str(err))
1284-
await io.offer_url(
1284+
pre_init_io.tool_error(str(err))
1285+
await pre_init_io.offer_url(
12851286
urls.edit_formats, "Open documentation about edit formats?", acknowledge=True
12861287
)
12871288

12881289
return await graceful_exit(None, 1)
12891290

12901291
except ValueError as err:
1291-
io.tool_error(str(err))
1292+
pre_init_io.tool_error(str(err))
12921293

12931294
return await graceful_exit(None, 1)
12941295

@@ -1437,11 +1438,11 @@ def apply_model_overrides(model_name):
14371438
except Exception:
14381439
# Don't show errors for auto-load to avoid interrupting the user experience
14391440
pass
1440-
14411441
# TUI mode - launch Textual interface
14421442
if args.tui:
14431443
from aider.tui import launch_tui
14441444

1445+
del pre_init_io
14451446
return_code = await launch_tui(coder, output_queue, input_queue, args)
14461447
return await graceful_exit(coder, return_code)
14471448

aider/sendchat.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ def ensure_alternating_roles(messages):
160160
msg = messages[i]
161161
role = msg.get("role")
162162

163+
if (
164+
role == "assistant"
165+
and not msg.get("content", None)
166+
and not msg.get("tool_calls", None)
167+
and not msg.get("function_call", None)
168+
):
169+
msg["content"] = "(empty response)"
170+
163171
# Handle tool call sequences atomically
164172
if role == "assistant" and "tool_calls" in msg and msg["tool_calls"]:
165173
# Start of tool sequence - collect all related messages

aider/tui/app.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,12 +450,17 @@ def on_input_area_submit(self, message: InputArea.Submit):
450450

451451
# Update footer to show processing
452452
footer = self.query_one(AiderFooter)
453-
footer.start_spinner("Thinking...")
453+
footer.start_spinner("Processing...")
454454

455455
self.update_key_hints(generating=True)
456456

457457
self.input_queue.put({"text": user_input})
458458

459+
def set_input_value(self, text) -> None:
460+
"""Find the input widget and set focus to it."""
461+
input_area = self.query_one("#input", InputArea)
462+
input_area.value = text
463+
459464
def action_focus_input(self) -> None:
460465
"""Find the input widget and set focus to it."""
461466
input_area = self.query_one("#input", InputArea)

0 commit comments

Comments
 (0)