Private
Public Access
0
0

fix(ai_loop): route send_result() errors to Discussion Hub as error entries (FR1, Bug #2)

Replaces deprecated ai_client.send() in _handle_request_event with
send_result() and branches on result.ok. On error, the first ErrorInfo
is routed to the event_queue as a 'response' with status='error',
allowing _on_comms_entry to add it to the discussion history.

The previous code called the @deprecated send() shim which silently
returns '' on error. The empty string was then filtered out by
_on_comms_entry (text_content.strip() check at line 3801), so users
saw no discussion entry for failed AI requests.

This also removes the dead 'except ai_client.ProviderError' clause at
line 3692 (the class was removed in commit 64b787b8). The 2 remaining
dead clauses at lines 305, 313 are fixed in the next commit (FR2).
This commit is contained in:
2026-06-15 09:22:47 -04:00
parent 9b280a43fb
commit 24ba249901
+19 -21
View File
@@ -3673,28 +3673,26 @@ class AppController:
ai_client.set_model_params(self.temperature, self.max_tokens, self.history_trunc_limit, self.top_p) ai_client.set_model_params(self.temperature, self.max_tokens, self.history_trunc_limit, self.top_p)
ai_client.set_agent_tools(self.ui_agent_tools) # Force update adapter path right before send to bypass potential duplication issues ai_client.set_agent_tools(self.ui_agent_tools) # Force update adapter path right before send to bypass potential duplication issues
self._update_gcli_adapter(self.ui_gemini_cli_path) self._update_gcli_adapter(self.ui_gemini_cli_path)
try: result = ai_client.send_result(
resp = ai_client.send( event.stable_md,
event.stable_md, user_msg,
user_msg, event.base_dir,
event.base_dir, event.file_items,
event.file_items, event.disc_text,
event.disc_text, stream=True,
stream=True, stream_callback=lambda text: self._on_ai_stream(text),
stream_callback=lambda text: self._on_ai_stream(text), pre_tool_callback=self._confirm_and_run,
pre_tool_callback=self._confirm_and_run, qa_callback=ai_client.run_tier4_analysis,
qa_callback=ai_client.run_tier4_analysis, patch_callback=ai_client.run_tier4_patch_callback,
patch_callback=ai_client.run_tier4_patch_callback, rag_engine=None, # Already handled above
rag_engine=None # Already handled above )
) if result.ok:
self.event_queue.put("response", {"text": resp, "status": "done", "role": "AI"}) self.event_queue.put("response", {"text": result.data, "status": "done", "role": "AI"})
self._ai_status = "done" self._ai_status = "done"
except ai_client.ProviderError as e: else:
self.event_queue.put("response", {"text": e.ui_message(), "status": "error", "role": "Vendor API"}) err = result.errors[0]
self._ai_status = f"error: {e.ui_message()}" self.event_queue.put("response", {"text": err.ui_message(), "status": "error", "role": "Vendor API"})
except Exception as e: self._ai_status = f"error: {err.ui_message()}"
self.event_queue.put("response", {"text": f"ERROR: {e}", "status": "error", "role": "System"})
self._ai_status = f"error: {e}"
def _on_tool_log(self, script: str, result: str) -> None: def _on_tool_log(self, script: str, result: str) -> None:
""" """