Fixed stdout
This commit is contained in:
@@ -153,8 +153,9 @@ class WebAgent(BaseAgent):
|
|||||||
for token in response_token_iter:
|
for token in response_token_iter:
|
||||||
response += token
|
response += token
|
||||||
self._set_response(response)
|
self._set_response(response)
|
||||||
print(f"{token}")
|
print(f"{token}", end='')
|
||||||
self._set_state(WebAgentState.RESPONSE_APPROVAL)
|
self._set_state(WebAgentState.RESPONSE_APPROVAL)
|
||||||
|
print()
|
||||||
|
|
||||||
def _approve_response_thread(self) -> None:
|
def _approve_response_thread(self) -> None:
|
||||||
parse_result = self._parser.parse(self._response)
|
parse_result = self._parser.parse(self._response)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
from threading import Lock
|
from threading import Lock
|
||||||
|
from typing import Callable, List
|
||||||
|
|
||||||
from .io_buffer import IOBuffer
|
from .io_buffer import IOBuffer
|
||||||
|
|
||||||
@@ -10,6 +11,14 @@ class WebIOBuffer(IOBuffer):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._stdin_buffer = ""
|
self._stdin_buffer = ""
|
||||||
self._stdout_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:
|
def read(self) -> str:
|
||||||
"""Thread-safe read from stdin buffer."""
|
"""Thread-safe read from stdin buffer."""
|
||||||
@@ -20,6 +29,8 @@ class WebIOBuffer(IOBuffer):
|
|||||||
def write(self, content: str) -> None:
|
def write(self, content: str) -> None:
|
||||||
"""Thread-safe write to stdout buffer."""
|
"""Thread-safe write to stdout buffer."""
|
||||||
self._stdout_buffer += content
|
self._stdout_buffer += content
|
||||||
|
for handler in self._stdout_change_handlers:
|
||||||
|
handler(self._stdout_buffer)
|
||||||
|
|
||||||
def buffer_length(self) -> int:
|
def buffer_length(self) -> int:
|
||||||
"""
|
"""
|
||||||
@@ -45,4 +56,6 @@ class WebIOBuffer(IOBuffer):
|
|||||||
|
|
||||||
def clear_stdout(self) -> None:
|
def clear_stdout(self) -> None:
|
||||||
"""Thread-safe clear stdout buffer."""
|
"""Thread-safe clear stdout buffer."""
|
||||||
self._stdout_buffer = ""
|
self._stdout_buffer = ""
|
||||||
|
for handler in self._stdout_change_handlers:
|
||||||
|
handler(self._stdout_buffer)
|
||||||
@@ -14,6 +14,7 @@ class ClientMessage:
|
|||||||
APPROVE_RESPONSE = "APPROVE_RESPONSE"
|
APPROVE_RESPONSE = "APPROVE_RESPONSE"
|
||||||
MODIFY_RESPONSE = "MODIFY_RESPONSE"
|
MODIFY_RESPONSE = "MODIFY_RESPONSE"
|
||||||
SEND_INPUT = "SEND_INPUT"
|
SEND_INPUT = "SEND_INPUT"
|
||||||
|
CLEAR_OUTPUT = "CLEAR_OUTPUT"
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class ServerMessage:
|
class ServerMessage:
|
||||||
@@ -41,6 +42,7 @@ class WebSocketManager:
|
|||||||
self.agent.add_state_change_handler(self._wrap_async(self._handle_state_change))
|
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_context_change_handler(self._wrap_async(self._handle_context_change))
|
||||||
self.agent.add_response_change_handler(self._wrap_async(self._handle_response_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
|
return self
|
||||||
|
|
||||||
async def _broadcast_message(self, message: Dict):
|
async def _broadcast_message(self, message: Dict):
|
||||||
@@ -89,6 +91,13 @@ class WebSocketManager:
|
|||||||
"response": response,
|
"response": response,
|
||||||
"validation_error": validation_error
|
"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]):
|
async def _handle_client_message(self, request: web.Request, data: dict[str, Any]):
|
||||||
"""Handle incoming client message."""
|
"""Handle incoming client message."""
|
||||||
@@ -109,6 +118,8 @@ class WebSocketManager:
|
|||||||
self.agent.modify_response(data.get("response"))
|
self.agent.modify_response(data.get("response"))
|
||||||
elif message_type == ClientMessage.SEND_INPUT:
|
elif message_type == ClientMessage.SEND_INPUT:
|
||||||
self.io_buffer.append_stdin(data.get("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:
|
async def handle_websocket(self, request: web.Request) -> web.WebSocketResponse:
|
||||||
"""Handle new WebSocket connections and messages."""
|
"""Handle new WebSocket connections and messages."""
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ const App = () => {
|
|||||||
setValidationError(message.validation_error);
|
setValidationError(message.validation_error);
|
||||||
break;
|
break;
|
||||||
case ServerMessageType.OUTPUT_UPDATE:
|
case ServerMessageType.OUTPUT_UPDATE:
|
||||||
setOutput(prev => prev + message.data);
|
setOutput(message.output);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -72,6 +72,12 @@ const App = () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleClearOutput = () => {
|
||||||
|
sendMessage({
|
||||||
|
"type": ClientMessageType.CLEAR_OUTPUT
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (agentState === AgentState.APPROVE_RESPONSE) {
|
if (agentState === AgentState.APPROVE_RESPONSE) {
|
||||||
sendMessage({
|
sendMessage({
|
||||||
@@ -151,7 +157,7 @@ const App = () => {
|
|||||||
onApprove={handleApprove}
|
onApprove={handleApprove}
|
||||||
onToggleDiff={() => setShowDiff(!showDiff)}
|
onToggleDiff={() => setShowDiff(!showDiff)}
|
||||||
onSendInput={handleSendInput}
|
onSendInput={handleSendInput}
|
||||||
onClearOutput={() => setOutput('')}
|
onClearOutput={handleClearOutput}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<FloatingButton onClick={() => setShowSidebar(!showSidebar)} />
|
<FloatingButton onClick={() => setShowSidebar(!showSidebar)} />
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export const ClientMessageType = {
|
|||||||
MODIFY_RESPONSE: 'MODIFY_RESPONSE',
|
MODIFY_RESPONSE: 'MODIFY_RESPONSE',
|
||||||
APPROVE_RESPONSE: 'APPROVE_RESPONSE',
|
APPROVE_RESPONSE: 'APPROVE_RESPONSE',
|
||||||
SEND_INPUT: 'SEND_INPUT',
|
SEND_INPUT: 'SEND_INPUT',
|
||||||
|
CLEAR_OUTPUT: 'CLEAR_OUTPUT',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ServerMessageType = {
|
export const ServerMessageType = {
|
||||||
|
|||||||
Reference in New Issue
Block a user