feat(gui2): Implement missing GUI hook handlers
This commit is contained in:
167
gui_2.py
167
gui_2.py
@@ -410,14 +410,120 @@ class App:
|
||||
with self._pending_gui_tasks_lock:
|
||||
tasks = self._pending_gui_tasks[:]
|
||||
self._pending_gui_tasks.clear()
|
||||
|
||||
# Mappings for safe hook execution
|
||||
settable_fields = {
|
||||
'ai_input': 'ui_ai_input',
|
||||
}
|
||||
clickable_actions = {
|
||||
'btn_reset': self._handle_reset_session,
|
||||
'btn_gen_send': self._handle_generate_send,
|
||||
}
|
||||
predefined_callbacks = {
|
||||
'_test_callback_func_write_to_file': self._test_callback_func_write_to_file
|
||||
}
|
||||
|
||||
for task in tasks:
|
||||
try:
|
||||
action = task.get("action")
|
||||
if action == "refresh_api_metrics":
|
||||
self._refresh_api_metrics(task.get("payload", {}))
|
||||
|
||||
elif action == "set_value":
|
||||
item = task.get("item")
|
||||
value = task.get("value")
|
||||
if item in settable_fields:
|
||||
attr_name = settable_fields[item]
|
||||
setattr(self, attr_name, value)
|
||||
|
||||
elif action == "click":
|
||||
item = task.get("item")
|
||||
if item in clickable_actions:
|
||||
clickable_actions[item]()
|
||||
|
||||
elif action == "custom_callback":
|
||||
callback_name = task.get("callback")
|
||||
args = task.get("args", [])
|
||||
if callback_name in predefined_callbacks:
|
||||
predefined_callbacks[callback_name](*args)
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error executing GUI task: {e}")
|
||||
|
||||
def _handle_reset_session(self):
|
||||
"""Logic for resetting the AI session."""
|
||||
ai_client.reset_session()
|
||||
ai_client.clear_comms_log()
|
||||
self._tool_log.clear()
|
||||
self._comms_log.clear()
|
||||
self.ai_status = "session reset"
|
||||
self.ai_response = ""
|
||||
|
||||
def _handle_generate_send(self):
|
||||
"""Logic for the 'Gen + Send' action."""
|
||||
send_busy = False
|
||||
with self._send_thread_lock:
|
||||
if self.send_thread and self.send_thread.is_alive():
|
||||
send_busy = True
|
||||
|
||||
if not send_busy:
|
||||
try:
|
||||
md, path, file_items, stable_md, disc_text = self._do_generate()
|
||||
self.last_md = md
|
||||
self.last_md_path = path
|
||||
self.last_file_items = file_items
|
||||
except Exception as e:
|
||||
self.ai_status = f"generate error: {e}"
|
||||
return
|
||||
|
||||
self.ai_status = "sending..."
|
||||
user_msg = self.ui_ai_input
|
||||
base_dir = self.ui_files_base_dir
|
||||
csp = filter(bool, [self.ui_global_system_prompt.strip(), self.ui_project_system_prompt.strip()])
|
||||
ai_client.set_custom_system_prompt("\n\n".join(csp))
|
||||
ai_client.set_model_params(self.temperature, self.max_tokens, self.history_trunc_limit)
|
||||
ai_client.set_agent_tools(self.ui_agent_tools)
|
||||
send_md = stable_md
|
||||
send_disc = disc_text
|
||||
|
||||
def do_send():
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "User", "content": user_msg, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
try:
|
||||
resp = ai_client.send(send_md, user_msg, base_dir, self.last_file_items, send_disc)
|
||||
self.ai_response = resp
|
||||
self.ai_status = "done"
|
||||
self._trigger_blink = True
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "AI", "content": resp, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
except ProviderError as e:
|
||||
self.ai_response = e.ui_message()
|
||||
self.ai_status = "error"
|
||||
self._trigger_blink = True
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "Vendor API", "content": self.ai_response, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
except Exception as e:
|
||||
self.ai_response = f"ERROR: {e}"
|
||||
self.ai_status = "error"
|
||||
self._trigger_blink = True
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "System", "content": self.ai_response, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
|
||||
with self._send_thread_lock:
|
||||
self.send_thread = threading.Thread(target=do_send, daemon=True)
|
||||
self.send_thread.start()
|
||||
|
||||
def _test_callback_func_write_to_file(self, data: str):
|
||||
"""A dummy function that a custom_callback would execute for testing."""
|
||||
# Note: This file path is relative to where the test is run.
|
||||
# This is for testing purposes only.
|
||||
with open("temp_callback_output.txt", "w") as f:
|
||||
f.write(data)
|
||||
|
||||
def _recalculate_session_usage(self):
|
||||
usage = {"input_tokens": 0, "output_tokens": 0, "cache_read_input_tokens": 0, "cache_creation_input_tokens": 0}
|
||||
for entry in ai_client.get_comms_log():
|
||||
@@ -1340,56 +1446,10 @@ class App:
|
||||
with self._send_thread_lock:
|
||||
if self.send_thread and self.send_thread.is_alive():
|
||||
send_busy = True
|
||||
if imgui.button("Gen + Send") or ctrl_enter:
|
||||
if not send_busy:
|
||||
try:
|
||||
md, path, file_items, stable_md, disc_text = self._do_generate()
|
||||
self.last_md = md
|
||||
self.last_md_path = path
|
||||
self.last_file_items = file_items
|
||||
except Exception as e:
|
||||
self.ai_status = f"generate error: {e}"
|
||||
else:
|
||||
self.ai_status = "sending..."
|
||||
user_msg = self.ui_ai_input
|
||||
base_dir = self.ui_files_base_dir
|
||||
csp = filter(bool, [self.ui_global_system_prompt.strip(), self.ui_project_system_prompt.strip()])
|
||||
ai_client.set_custom_system_prompt("\n\n".join(csp))
|
||||
ai_client.set_model_params(self.temperature, self.max_tokens, self.history_trunc_limit)
|
||||
ai_client.set_agent_tools(self.ui_agent_tools)
|
||||
send_md = stable_md
|
||||
send_disc = disc_text
|
||||
|
||||
def do_send():
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "User", "content": user_msg, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
try:
|
||||
resp = ai_client.send(send_md, user_msg, base_dir, self.last_file_items, send_disc)
|
||||
self.ai_response = resp
|
||||
self.ai_status = "done"
|
||||
self._trigger_blink = True
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "AI", "content": resp, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
except ProviderError as e:
|
||||
self.ai_response = e.ui_message()
|
||||
self.ai_status = "error"
|
||||
self._trigger_blink = True
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "Vendor API", "content": self.ai_response, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
except Exception as e:
|
||||
self.ai_response = f"ERROR: {e}"
|
||||
self.ai_status = "error"
|
||||
self._trigger_blink = True
|
||||
if self.ui_auto_add_history:
|
||||
with self._pending_history_adds_lock:
|
||||
self._pending_history_adds.append({"role": "System", "content": self.ai_response, "collapsed": False, "ts": project_manager.now_ts()})
|
||||
|
||||
with self._send_thread_lock:
|
||||
self.send_thread = threading.Thread(target=do_send, daemon=True)
|
||||
self.send_thread.start()
|
||||
|
||||
if (imgui.button("Gen + Send") or ctrl_enter) and not send_busy:
|
||||
self._handle_generate_send()
|
||||
|
||||
imgui.same_line()
|
||||
if imgui.button("MD Only"):
|
||||
try:
|
||||
@@ -1401,12 +1461,7 @@ class App:
|
||||
self.ai_status = f"error: {e}"
|
||||
imgui.same_line()
|
||||
if imgui.button("Reset"):
|
||||
ai_client.reset_session()
|
||||
ai_client.clear_comms_log()
|
||||
self._tool_log.clear()
|
||||
self._comms_log.clear()
|
||||
self.ai_status = "session reset"
|
||||
self.ai_response = ""
|
||||
self._handle_reset_session()
|
||||
imgui.same_line()
|
||||
if imgui.button("-> History"):
|
||||
if self.ui_ai_input:
|
||||
|
||||
Reference in New Issue
Block a user