@neoline/hostbridge 2.0.3 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -15
- package/bin/hostbridge.js +80 -9
- package/docs/ARCHITECTURE.md +62 -0
- package/examples/claude_desktop_config.json +1 -1
- package/examples/codex.config.toml +1 -1
- package/examples/hosts.example.json +1 -0
- package/package.json +2 -1
- package/pyproject.toml +5 -4
- package/src/server_control_mcp/__init__.py +60 -24
- package/src/server_control_mcp/async_lifecycle.py +41 -0
- package/src/server_control_mcp/cli.py +2 -2
- package/src/server_control_mcp/client.py +345 -238
- package/src/server_control_mcp/config.py +18 -6
- package/src/server_control_mcp/daemon.py +309 -412
- package/src/server_control_mcp/doctor.py +41 -5
- package/src/server_control_mcp/hosts.py +252 -24
- package/src/server_control_mcp/mock_ssh.py +97 -960
- package/src/server_control_mcp/mock_ssh_exec.py +299 -0
- package/src/server_control_mcp/mock_ssh_session.py +69 -0
- package/src/server_control_mcp/mock_ssh_sftp.py +604 -0
- package/src/server_control_mcp/mock_ssh_tunnel.py +289 -0
- package/src/server_control_mcp/mux_connection.py +326 -0
- package/src/server_control_mcp/mux_daemon.py +186 -0
- package/src/server_control_mcp/mux_protocol.py +279 -0
- package/src/server_control_mcp/mux_records.py +71 -0
- package/src/server_control_mcp/mux_rpc.py +1779 -0
- package/src/server_control_mcp/mux_service.py +506 -0
- package/src/server_control_mcp/mux_stream.py +283 -0
- package/src/server_control_mcp/mux_sync_client.py +224 -0
- package/src/server_control_mcp/policy.py +86 -14
- package/src/server_control_mcp/remote_agent_bundle.py +56 -0
- package/src/server_control_mcp/remote_mux_agent.py +769 -0
- package/src/server_control_mcp/remote_task_agent.py +102 -0
- package/src/server_control_mcp/runtime.py +3 -2
- package/src/server_control_mcp/runtime_services.py +862 -0
- package/src/server_control_mcp/secrets.py +6 -6
- package/src/server_control_mcp/secure_files.py +121 -0
- package/src/server_control_mcp/server.py +53 -20
- package/src/server_control_mcp/services.py +3 -469
- package/src/server_control_mcp/transports/__init__.py +4 -8
- package/src/server_control_mcp/transports/base.py +60 -38
- package/src/server_control_mcp/transports/ssh.py +315 -84
- package/src/server_control_mcp/tunnel_manager.py +1245 -0
- package/src/server_control_mcp/tunnel_native_ssh.py +454 -0
- package/src/server_control_mcp/tunnel_providers.py +20 -0
- package/src/server_control_mcp/tunnel_pty_agent.py +909 -0
- package/src/server_control_mcp/protocol.py +0 -362
- package/src/server_control_mcp/transports/pty.py +0 -434
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""Build the deterministic, self-contained remote tunnel agent zipapp."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import io
|
|
6
|
+
import zipfile
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
_PACKAGE_MODULES = (
|
|
10
|
+
"async_lifecycle.py",
|
|
11
|
+
"mux_connection.py",
|
|
12
|
+
"mux_protocol.py",
|
|
13
|
+
"mux_records.py",
|
|
14
|
+
"mux_rpc.py",
|
|
15
|
+
"mux_stream.py",
|
|
16
|
+
"remote_mux_agent.py",
|
|
17
|
+
)
|
|
18
|
+
_ZIP_TIMESTAMP = (1980, 1, 1, 0, 0, 0)
|
|
19
|
+
_PACKAGE_INIT = b'"""Self-contained HostBridge remote tunnel agent."""\n'
|
|
20
|
+
_ENTRYPOINT = b"""from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import asyncio
|
|
23
|
+
import os
|
|
24
|
+
import sys
|
|
25
|
+
|
|
26
|
+
from server_control_mcp.remote_mux_agent import run_stdio_agent
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
exit_code = asyncio.run(run_stdio_agent())
|
|
30
|
+
except Exception as exc:
|
|
31
|
+
nonce = sys.argv[1].encode("ascii")
|
|
32
|
+
error = type(exc).__name__.encode("ascii", "replace")[:64]
|
|
33
|
+
os.write(1, b"\\0HBFAIL2:" + nonce + b":" + error + b"\\0")
|
|
34
|
+
raise
|
|
35
|
+
raise SystemExit(exit_code)
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def build_remote_agent_bundle() -> bytes:
|
|
40
|
+
package_dir = Path(__file__).resolve().parent
|
|
41
|
+
files: list[tuple[str, bytes]] = [
|
|
42
|
+
("__main__.py", _ENTRYPOINT),
|
|
43
|
+
("server_control_mcp/__init__.py", _PACKAGE_INIT),
|
|
44
|
+
]
|
|
45
|
+
for name in _PACKAGE_MODULES:
|
|
46
|
+
files.append((f"server_control_mcp/{name}", (package_dir / name).read_bytes()))
|
|
47
|
+
|
|
48
|
+
output = io.BytesIO()
|
|
49
|
+
with zipfile.ZipFile(output, mode="w", compression=zipfile.ZIP_STORED, strict_timestamps=True) as archive:
|
|
50
|
+
for path, content in files:
|
|
51
|
+
info = zipfile.ZipInfo(path, date_time=_ZIP_TIMESTAMP)
|
|
52
|
+
info.compress_type = zipfile.ZIP_STORED
|
|
53
|
+
info.create_system = 3
|
|
54
|
+
info.external_attr = 0o100644 << 16
|
|
55
|
+
archive.writestr(info, content)
|
|
56
|
+
return output.getvalue()
|