diff --git a/openhands/cli/tui.py b/openhands/cli/tui.py
index 819e8c7511..bb006fa794 100644
--- a/openhands/cli/tui.py
+++ b/openhands/cli/tui.py
@@ -4,6 +4,7 @@
import asyncio
import sys
+import threading
import time
from prompt_toolkit import PromptSession, print_formatted_text
@@ -58,12 +59,14 @@ COMMANDS = {
'/exit': 'Exit the application',
'/help': 'Display available commands',
'/init': 'Initialize a new repository',
- '/status': 'Display session details and usage metrics',
- '/new': 'Create a new session',
+ '/status': 'Display conversation details and usage metrics',
+ '/new': 'Create a new conversation',
'/settings': 'Display and modify current settings',
'/resume': 'Resume the agent when paused',
}
+print_lock = threading.Lock()
+
class UsageMetrics:
def __init__(self):
@@ -136,7 +139,7 @@ def display_banner(session_id: str):
print_formatted_text(HTML(f'OpenHands CLI v{__version__}'))
print_formatted_text('')
- print_formatted_text(HTML(f'Initialized session {session_id}'))
+ print_formatted_text(HTML(f'Initialized conversation {session_id}'))
print_formatted_text('')
@@ -164,28 +167,28 @@ def display_initial_user_prompt(prompt: str):
# Prompt output display functions
def display_event(event: Event, config: AppConfig) -> None:
- if isinstance(event, Action):
- if hasattr(event, 'thought'):
- display_message(event.thought)
- if isinstance(event, MessageAction):
- if event.source == EventSource.AGENT:
- display_message(event.content)
- if isinstance(event, CmdRunAction):
- display_command(event)
- if isinstance(event, CmdOutputObservation):
- display_command_output(event.content)
- if isinstance(event, FileEditAction):
- display_file_edit(event)
- if isinstance(event, FileEditObservation):
- display_file_edit(event)
- if isinstance(event, FileReadObservation):
- display_file_read(event)
- if isinstance(event, AgentStateChangedObservation):
- display_agent_paused_message(event.agent_state)
+ with print_lock:
+ if isinstance(event, Action):
+ if hasattr(event, 'thought'):
+ display_message(event.thought)
+ if isinstance(event, MessageAction):
+ if event.source == EventSource.AGENT:
+ display_message(event.content)
+ if isinstance(event, CmdRunAction):
+ display_command(event)
+ if isinstance(event, CmdOutputObservation):
+ display_command_output(event.content)
+ if isinstance(event, FileEditAction):
+ display_file_edit(event)
+ if isinstance(event, FileEditObservation):
+ display_file_edit(event)
+ if isinstance(event, FileReadObservation):
+ display_file_read(event)
+ if isinstance(event, AgentStateChangedObservation):
+ display_agent_paused_message(event.agent_state)
def display_message(message: str):
- time.sleep(0.2)
message = message.strip()
if message:
@@ -248,6 +251,7 @@ def display_file_edit(event: FileEditAction | FileEditObservation):
title='File Edit',
style=f'fg:{COLOR_GREY}',
)
+ print_formatted_text('')
print_container(container)
@@ -262,6 +266,7 @@ def display_file_read(event: FileReadObservation):
title='File Read',
style=f'fg:{COLOR_GREY}',
)
+ print_formatted_text('')
print_container(container)
@@ -374,13 +379,13 @@ def get_session_duration(session_init_time: float) -> str:
def display_shutdown_message(usage_metrics: UsageMetrics, session_id: str):
duration_str = get_session_duration(usage_metrics.session_init_time)
- print_formatted_text(HTML('Closing current session...'))
+ print_formatted_text(HTML('Closing current conversation...'))
print_formatted_text('')
display_usage_metrics(usage_metrics)
print_formatted_text('')
- print_formatted_text(HTML(f'Session duration: {duration_str}'))
+ print_formatted_text(HTML(f'Conversation duration: {duration_str}'))
print_formatted_text('')
- print_formatted_text(HTML(f'Closed session {session_id}'))
+ print_formatted_text(HTML(f'Closed conversation {session_id}'))
print_formatted_text('')
@@ -388,8 +393,8 @@ def display_status(usage_metrics: UsageMetrics, session_id: str):
duration_str = get_session_duration(usage_metrics.session_init_time)
print_formatted_text('')
- print_formatted_text(HTML(f'Session ID: {session_id}'))
- print_formatted_text(HTML(f'Uptime: {duration_str}'))
+ print_formatted_text(HTML(f'Conversation ID: {session_id}'))
+ print_formatted_text(HTML(f'Uptime: {duration_str}'))
print_formatted_text('')
display_usage_metrics(usage_metrics)
diff --git a/tests/unit/test_cli_tui.py b/tests/unit/test_cli_tui.py
index 889170f520..691c3d02d1 100644
--- a/tests/unit/test_cli_tui.py
+++ b/tests/unit/test_cli_tui.py
@@ -60,7 +60,7 @@ class TestDisplayFunctions:
# Check the last call has the session ID
args, kwargs = mock_print.call_args_list[-2]
assert session_id in str(args[0])
- assert 'Initialized session' in str(args[0])
+ assert 'Initialized conversation' in str(args[0])
@patch('openhands.cli.tui.print_formatted_text')
def test_display_welcome_message(self, mock_print):
@@ -135,13 +135,11 @@ class TestDisplayFunctions:
mock_display_message.assert_called_once_with('Thinking about this...')
- @patch('openhands.cli.tui.time.sleep')
@patch('openhands.cli.tui.print_formatted_text')
- def test_display_message(self, mock_print, mock_sleep):
+ def test_display_message(self, mock_print):
message = 'Test message'
display_message(message)
- mock_sleep.assert_called_once_with(0.2)
mock_print.assert_called_once()
args, kwargs = mock_print.call_args
assert message in str(args[0])