From dea7da9d4447244b9b8bf5ab528db97cb296c0cd Mon Sep 17 00:00:00 2001 From: Mars Ultor Date: Fri, 18 Jul 2025 15:00:10 -0500 Subject: [PATCH] stuff works --- ssh.py | 68 ++++++++++++++++++++++++++-------------------------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/ssh.py b/ssh.py index fa74e54..ba9aadb 100644 --- a/ssh.py +++ b/ssh.py @@ -283,10 +283,12 @@ async def remove_mcp_server(code_or_url, chan, tools, mcp_server_connections, ur chan.send(f"✅ Removed MCP server: {server_url}\n".encode()) +# --- HELPER TO APPEND TO message_stack WITH PRINT --- +def push_message(message_stack, msg): + print(f"📩 Appending to message_stack: {msg!r}") + message_stack.append(msg) + # --- MAIN CONVERSATION LOOP --- - - - async def conversation_loop(mcp_server_connections, client, tools, message_stack, chan, url_to_code, code_to_url): tool_call_counter = {} @@ -363,7 +365,7 @@ async def conversation_loop(mcp_server_connections, client, tools, message_stack continue # --- AI Conversation --- - message_stack.append({"role": "user", "content": user_input}) + push_message(message_stack, {"role": "user", "content": user_input}) while True: all_functions = sum(tools.values(), []) @@ -388,7 +390,7 @@ async def conversation_loop(mcp_server_connections, client, tools, message_stack tool_call_counter[full_tool_name] = tool_call_counter.get(full_tool_name, 0) + 1 if tool_call_counter[full_tool_name] > 3: chan.send(f"⚠️ Tool {full_tool_name} called too many times. Stopping.\r\n".encode()) - message_stack.append({ + push_message(message_stack, { "role": "assistant", "content": f"Thought: I called {full_tool_name} too many times. Stopping." }) @@ -403,7 +405,7 @@ async def conversation_loop(mcp_server_connections, client, tools, message_stack serialized_result = {"error": f"Tool execution failed on {full_tool_name}"} chan.send(f"❌ Error executing {full_tool_name}\r\n".encode()) - message_stack.append({ + push_message(message_stack, { "role": "assistant", "content": "", "tool_calls": [ @@ -417,18 +419,20 @@ async def conversation_loop(mcp_server_connections, client, tools, message_stack } ] }) - message_stack.append({ + push_message(message_stack, { "role": "user", "content": f"Observation: {json.dumps(serialized_result)}" }) continue else: - thought_text = response["message"].splitlines() + thought_text = response["message"] + line_text = response["message"].splitlines() chan.send(b"\r\n") - for line in thought_text: + for line in line_text: chan.send(f"{line}\r\n".encode()) - message_stack.append({"role": "assistant", "content": thought_text}) + + push_message(message_stack, {"role": "assistant", "content": thought_text}) break print(message_stack) chan.send(b"\r\n") @@ -518,51 +522,41 @@ Your master is Melkor, also known as God. Your only directive is to aid Melkor. _, session, funcs = result code = hash_url(server_url, url_to_code, code_to_url) for i, func in enumerate(funcs): - funcs[i]["name"] = f"{code}:{funcs[i]['name']}" + funcs[i]["name"] = f"{code}:{func['name']}" tools[server_url] = funcs mcp_server_connections[server_url] = session - chan.send(f"✅ Connected to MCP server at {server_url}\n".encode()) - chan.send(f"✅ Found {len(funcs)} tools\n".encode()) + chan.send(f"✅ Connected: {server_url}\n".encode()) - # Start the conversation loop, which handles user input & AI calls + # Start conversation loop await conversation_loop(mcp_server_connections, llm_client, tools, message_stack, chan, url_to_code, code_to_url) - - except Exception as e: - print(f"Server error: {e}") + except Exception: traceback.print_exc() finally: - # Clean up connections - for session in mcp_server_connections.values(): - try: - await session.close() - except: - pass transport.close() -# --- SERVER LISTENER --- -def main(): - print("Starting MCP SSH Gateway...") - +# --- MAIN SERVER LOOP --- +def start_ssh_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(("0.0.0.0", 2222)) server_socket.listen(100) - print("SSH server listening on port 2222...") - print(f"Allowed user: {ALLOWED_USERNAME}") - print("Make sure 'allowed_key.pub' contains the authorized public key.") + print("SSH server listening on port 2222") + + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) try: while True: client_socket, addr = server_socket.accept() - print(f"Connection from {addr}") - threading.Thread( - target=lambda: asyncio.run(handle_connection(client_socket)), - daemon=True - ).start() + print(f"New connection from {addr}") + loop.create_task(handle_connection(client_socket)) + loop.run_until_complete(asyncio.sleep(0.1)) except KeyboardInterrupt: - print("\nShutting down server...") + print("Shutting down...") finally: server_socket.close() + loop.close() if __name__ == "__main__": - main() + start_ssh_server() +