Fixed stdout

This commit is contained in:
2024-11-11 13:51:27 +01:00
parent 0e1a0407d0
commit 3a1d8a449c
5 changed files with 36 additions and 4 deletions

View File

@@ -153,8 +153,9 @@ class WebAgent(BaseAgent):
for token in response_token_iter:
response += token
self._set_response(response)
print(f"{token}")
print(f"{token}", end='')
self._set_state(WebAgentState.RESPONSE_APPROVAL)
print()
def _approve_response_thread(self) -> None:
parse_result = self._parser.parse(self._response)

View File

@@ -1,4 +1,5 @@
from threading import Lock
from typing import Callable, List
from .io_buffer import IOBuffer
@@ -10,6 +11,14 @@ class WebIOBuffer(IOBuffer):
def __init__(self):
self._stdin_buffer = ""
self._stdout_buffer = ""
self._stdout_change_handlers: List[Callable[[str], None]] = []
def add_stdout_change_handler(self, handler: Callable[[str], None]) -> None:
"""
Add a callback for stdout changes.
"""
if handler not in self._stdout_change_handlers:
self._stdout_change_handlers.append(handler)
def read(self) -> str:
"""Thread-safe read from stdin buffer."""
@@ -20,6 +29,8 @@ class WebIOBuffer(IOBuffer):
def write(self, content: str) -> None:
"""Thread-safe write to stdout buffer."""
self._stdout_buffer += content
for handler in self._stdout_change_handlers:
handler(self._stdout_buffer)
def buffer_length(self) -> int:
"""
@@ -45,4 +56,6 @@ class WebIOBuffer(IOBuffer):
def clear_stdout(self) -> None:
"""Thread-safe clear stdout buffer."""
self._stdout_buffer = ""
self._stdout_buffer = ""
for handler in self._stdout_change_handlers:
handler(self._stdout_buffer)

View File

@@ -14,6 +14,7 @@ class ClientMessage:
APPROVE_RESPONSE = "APPROVE_RESPONSE"
MODIFY_RESPONSE = "MODIFY_RESPONSE"
SEND_INPUT = "SEND_INPUT"
CLEAR_OUTPUT = "CLEAR_OUTPUT"
@dataclass
class ServerMessage:
@@ -41,6 +42,7 @@ class WebSocketManager:
self.agent.add_state_change_handler(self._wrap_async(self._handle_state_change))
self.agent.add_context_change_handler(self._wrap_async(self._handle_context_change))
self.agent.add_response_change_handler(self._wrap_async(self._handle_response_change))
self.io_buffer.add_stdout_change_handler(self._wrap_async(self._handle_stdout_change))
return self
async def _broadcast_message(self, message: Dict):
@@ -89,6 +91,13 @@ class WebSocketManager:
"response": response,
"validation_error": validation_error
})
async def _handle_stdout_change(self, output: str):
"""Handle output changes from the WebAgent."""
await self._broadcast_message({
"type": ServerMessage.OUTPUT_UPDATE,
"output": output
})
async def _handle_client_message(self, request: web.Request, data: dict[str, Any]):
"""Handle incoming client message."""
@@ -109,6 +118,8 @@ class WebSocketManager:
self.agent.modify_response(data.get("response"))
elif message_type == ClientMessage.SEND_INPUT:
self.io_buffer.append_stdin(data.get("input"))
elif message_type == ClientMessage.CLEAR_OUTPUT:
self.io_buffer.clear_stdout()
async def handle_websocket(self, request: web.Request) -> web.WebSocketResponse:
"""Handle new WebSocket connections and messages."""

View File

@@ -42,7 +42,7 @@ const App = () => {
setValidationError(message.validation_error);
break;
case ServerMessageType.OUTPUT_UPDATE:
setOutput(prev => prev + message.data);
setOutput(message.output);
break;
}
});
@@ -72,6 +72,12 @@ const App = () => {
}
};
const handleClearOutput = () => {
sendMessage({
"type": ClientMessageType.CLEAR_OUTPUT
});
};
useEffect(() => {
if (agentState === AgentState.APPROVE_RESPONSE) {
sendMessage({
@@ -151,7 +157,7 @@ const App = () => {
onApprove={handleApprove}
onToggleDiff={() => setShowDiff(!showDiff)}
onSendInput={handleSendInput}
onClearOutput={() => setOutput('')}
onClearOutput={handleClearOutput}
/>
<FloatingButton onClick={() => setShowSidebar(!showSidebar)} />

View File

@@ -23,6 +23,7 @@ export const ClientMessageType = {
MODIFY_RESPONSE: 'MODIFY_RESPONSE',
APPROVE_RESPONSE: 'APPROVE_RESPONSE',
SEND_INPUT: 'SEND_INPUT',
CLEAR_OUTPUT: 'CLEAR_OUTPUT',
};
export const ServerMessageType = {