chore: standardize string quotes and fix import ordering across multiple modules

This commit is contained in:
2025-11-04 07:09:12 +00:00
parent ea29bdc403
commit e9ced4a493
82 changed files with 4963 additions and 3094 deletions
+2 -2
View File
@@ -1,4 +1,4 @@
from pr.autonomous.detection import is_task_complete
from pr.autonomous.mode import run_autonomous_mode, process_response_autonomous
from pr.autonomous.mode import process_response_autonomous, run_autonomous_mode
__all__ = ['is_task_complete', 'run_autonomous_mode', 'process_response_autonomous']
__all__ = ["is_task_complete", "run_autonomous_mode", "process_response_autonomous"]
+21 -10
View File
@@ -1,28 +1,39 @@
from pr.config import MAX_AUTONOMOUS_ITERATIONS
from pr.ui import Colors
def is_task_complete(response, iteration):
if 'error' in response:
if "error" in response:
return True
if 'choices' not in response or not response['choices']:
if "choices" not in response or not response["choices"]:
return True
message = response['choices'][0]['message']
content = message.get('content', '').lower()
message = response["choices"][0]["message"]
content = message.get("content", "").lower()
completion_keywords = [
'task complete', 'task is complete', 'finished', 'done',
'successfully completed', 'task accomplished', 'all done',
'implementation complete', 'setup complete', 'installation complete'
"task complete",
"task is complete",
"finished",
"done",
"successfully completed",
"task accomplished",
"all done",
"implementation complete",
"setup complete",
"installation complete",
]
error_keywords = [
'cannot proceed', 'unable to continue', 'fatal error',
'cannot complete', 'impossible to'
"cannot proceed",
"unable to continue",
"fatal error",
"cannot complete",
"impossible to",
]
has_tool_calls = 'tool_calls' in message and message['tool_calls']
has_tool_calls = "tool_calls" in message and message["tool_calls"]
mentions_completion = any(keyword in content for keyword in completion_keywords)
mentions_error = any(keyword in content for keyword in error_keywords)
+105 -63
View File
@@ -1,11 +1,13 @@
import time
import json
import logging
from pr.ui import Colors, display_tool_call, print_autonomous_header
import time
from pr.autonomous.detection import is_task_complete
from pr.core.context import truncate_tool_result
from pr.ui import Colors, display_tool_call
logger = logging.getLogger("pr")
logger = logging.getLogger('pr')
def run_autonomous_mode(assistant, task):
assistant.autonomous_mode = True
@@ -14,25 +16,32 @@ def run_autonomous_mode(assistant, task):
logger.debug(f"=== AUTONOMOUS MODE START ===")
logger.debug(f"Task: {task}")
assistant.messages.append({
"role": "user",
"content": f"{task}"
})
assistant.messages.append({"role": "user", "content": f"{task}"})
try:
while True:
assistant.autonomous_iterations += 1
logger.debug(f"--- Autonomous iteration {assistant.autonomous_iterations} ---")
logger.debug(f"Messages before context management: {len(assistant.messages)}")
logger.debug(
f"--- Autonomous iteration {assistant.autonomous_iterations} ---"
)
logger.debug(
f"Messages before context management: {len(assistant.messages)}"
)
from pr.core.context import manage_context_window
assistant.messages = manage_context_window(assistant.messages, assistant.verbose)
logger.debug(f"Messages after context management: {len(assistant.messages)}")
assistant.messages = manage_context_window(
assistant.messages, assistant.verbose
)
logger.debug(
f"Messages after context management: {len(assistant.messages)}"
)
from pr.core.api import call_api
from pr.tools.base import get_tools_definition
response = call_api(
assistant.messages,
assistant.model,
@@ -40,10 +49,10 @@ def run_autonomous_mode(assistant, task):
assistant.api_key,
assistant.use_tools,
get_tools_definition(),
verbose=assistant.verbose
verbose=assistant.verbose,
)
if 'error' in response:
if "error" in response:
logger.error(f"API error in autonomous mode: {response['error']}")
print(f"{Colors.RED}Error: {response['error']}{Colors.RESET}")
break
@@ -74,22 +83,23 @@ def run_autonomous_mode(assistant, task):
assistant.autonomous_mode = False
logger.debug("=== AUTONOMOUS MODE END ===")
def process_response_autonomous(assistant, response):
if 'error' in response:
if "error" in response:
return f"Error: {response['error']}"
if 'choices' not in response or not response['choices']:
if "choices" not in response or not response["choices"]:
return "No response from API"
message = response['choices'][0]['message']
message = response["choices"][0]["message"]
assistant.messages.append(message)
if 'tool_calls' in message and message['tool_calls']:
if "tool_calls" in message and message["tool_calls"]:
tool_results = []
for tool_call in message['tool_calls']:
func_name = tool_call['function']['name']
arguments = json.loads(tool_call['function']['arguments'])
for tool_call in message["tool_calls"]:
func_name = tool_call["function"]["name"]
arguments = json.loads(tool_call["function"]["arguments"])
result = execute_single_tool(assistant, func_name, arguments)
result = truncate_tool_result(result)
@@ -97,16 +107,19 @@ def process_response_autonomous(assistant, response):
status = "success" if result.get("status") == "success" else "error"
display_tool_call(func_name, arguments, status, result)
tool_results.append({
"tool_call_id": tool_call['id'],
"role": "tool",
"content": json.dumps(result)
})
tool_results.append(
{
"tool_call_id": tool_call["id"],
"role": "tool",
"content": json.dumps(result),
}
)
for result in tool_results:
assistant.messages.append(result)
from pr.core.api import call_api
from pr.tools.base import get_tools_definition
follow_up = call_api(
assistant.messages,
assistant.model,
@@ -114,59 +127,88 @@ def process_response_autonomous(assistant, response):
assistant.api_key,
assistant.use_tools,
get_tools_definition(),
verbose=assistant.verbose
verbose=assistant.verbose,
)
return process_response_autonomous(assistant, follow_up)
content = message.get('content', '')
content = message.get("content", "")
from pr.ui import render_markdown
return render_markdown(content, assistant.syntax_highlighting)
def execute_single_tool(assistant, func_name, arguments):
logger.debug(f"Executing tool in autonomous mode: {func_name}")
logger.debug(f"Tool arguments: {arguments}")
from pr.tools import (
http_fetch, run_command, run_command_interactive, read_file, write_file,
list_directory, mkdir, chdir, getpwd, db_set, db_get, db_query,
web_search, web_search_news, python_exec, index_source_directory,
search_replace, open_editor, editor_insert_text, editor_replace_text,
editor_search, close_editor, create_diff, apply_patch, tail_process, kill_process
apply_patch,
chdir,
close_editor,
create_diff,
db_get,
db_query,
db_set,
editor_insert_text,
editor_replace_text,
editor_search,
getpwd,
http_fetch,
index_source_directory,
kill_process,
list_directory,
mkdir,
open_editor,
python_exec,
read_file,
run_command,
run_command_interactive,
search_replace,
tail_process,
web_search,
web_search_news,
write_file,
)
from pr.tools.filesystem import (
clear_edit_tracker,
display_edit_summary,
display_edit_timeline,
)
from pr.tools.patch import display_file_diff
from pr.tools.filesystem import display_edit_summary, display_edit_timeline, clear_edit_tracker
func_map = {
'http_fetch': lambda **kw: http_fetch(**kw),
'run_command': lambda **kw: run_command(**kw),
'tail_process': lambda **kw: tail_process(**kw),
'kill_process': lambda **kw: kill_process(**kw),
'run_command_interactive': lambda **kw: run_command_interactive(**kw),
'read_file': lambda **kw: read_file(**kw),
'write_file': lambda **kw: write_file(**kw, db_conn=assistant.db_conn),
'list_directory': lambda **kw: list_directory(**kw),
'mkdir': lambda **kw: mkdir(**kw),
'chdir': lambda **kw: chdir(**kw),
'getpwd': lambda **kw: getpwd(**kw),
'db_set': lambda **kw: db_set(**kw, db_conn=assistant.db_conn),
'db_get': lambda **kw: db_get(**kw, db_conn=assistant.db_conn),
'db_query': lambda **kw: db_query(**kw, db_conn=assistant.db_conn),
'web_search': lambda **kw: web_search(**kw),
'web_search_news': lambda **kw: web_search_news(**kw),
'python_exec': lambda **kw: python_exec(**kw, python_globals=assistant.python_globals),
'index_source_directory': lambda **kw: index_source_directory(**kw),
'search_replace': lambda **kw: search_replace(**kw),
'open_editor': lambda **kw: open_editor(**kw),
'editor_insert_text': lambda **kw: editor_insert_text(**kw),
'editor_replace_text': lambda **kw: editor_replace_text(**kw),
'editor_search': lambda **kw: editor_search(**kw),
'close_editor': lambda **kw: close_editor(**kw),
'create_diff': lambda **kw: create_diff(**kw),
'apply_patch': lambda **kw: apply_patch(**kw),
'display_file_diff': lambda **kw: display_file_diff(**kw),
'display_edit_summary': lambda **kw: display_edit_summary(),
'display_edit_timeline': lambda **kw: display_edit_timeline(**kw),
'clear_edit_tracker': lambda **kw: clear_edit_tracker(),
"http_fetch": lambda **kw: http_fetch(**kw),
"run_command": lambda **kw: run_command(**kw),
"tail_process": lambda **kw: tail_process(**kw),
"kill_process": lambda **kw: kill_process(**kw),
"run_command_interactive": lambda **kw: run_command_interactive(**kw),
"read_file": lambda **kw: read_file(**kw),
"write_file": lambda **kw: write_file(**kw, db_conn=assistant.db_conn),
"list_directory": lambda **kw: list_directory(**kw),
"mkdir": lambda **kw: mkdir(**kw),
"chdir": lambda **kw: chdir(**kw),
"getpwd": lambda **kw: getpwd(**kw),
"db_set": lambda **kw: db_set(**kw, db_conn=assistant.db_conn),
"db_get": lambda **kw: db_get(**kw, db_conn=assistant.db_conn),
"db_query": lambda **kw: db_query(**kw, db_conn=assistant.db_conn),
"web_search": lambda **kw: web_search(**kw),
"web_search_news": lambda **kw: web_search_news(**kw),
"python_exec": lambda **kw: python_exec(
**kw, python_globals=assistant.python_globals
),
"index_source_directory": lambda **kw: index_source_directory(**kw),
"search_replace": lambda **kw: search_replace(**kw),
"open_editor": lambda **kw: open_editor(**kw),
"editor_insert_text": lambda **kw: editor_insert_text(**kw),
"editor_replace_text": lambda **kw: editor_replace_text(**kw),
"editor_search": lambda **kw: editor_search(**kw),
"close_editor": lambda **kw: close_editor(**kw),
"create_diff": lambda **kw: create_diff(**kw),
"apply_patch": lambda **kw: apply_patch(**kw),
"display_file_diff": lambda **kw: display_file_diff(**kw),
"display_edit_summary": lambda **kw: display_edit_summary(),
"display_edit_timeline": lambda **kw: display_edit_timeline(**kw),
"clear_edit_tracker": lambda **kw: clear_edit_tracker(),
}
if func_name in func_map: