stuff works
This commit is contained in:
68
ssh.py
68
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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user