@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.
Files changed (48) hide show
  1. package/README.md +24 -15
  2. package/bin/hostbridge.js +80 -9
  3. package/docs/ARCHITECTURE.md +62 -0
  4. package/examples/claude_desktop_config.json +1 -1
  5. package/examples/codex.config.toml +1 -1
  6. package/examples/hosts.example.json +1 -0
  7. package/package.json +2 -1
  8. package/pyproject.toml +5 -4
  9. package/src/server_control_mcp/__init__.py +60 -24
  10. package/src/server_control_mcp/async_lifecycle.py +41 -0
  11. package/src/server_control_mcp/cli.py +2 -2
  12. package/src/server_control_mcp/client.py +345 -238
  13. package/src/server_control_mcp/config.py +18 -6
  14. package/src/server_control_mcp/daemon.py +309 -412
  15. package/src/server_control_mcp/doctor.py +41 -5
  16. package/src/server_control_mcp/hosts.py +252 -24
  17. package/src/server_control_mcp/mock_ssh.py +97 -960
  18. package/src/server_control_mcp/mock_ssh_exec.py +299 -0
  19. package/src/server_control_mcp/mock_ssh_session.py +69 -0
  20. package/src/server_control_mcp/mock_ssh_sftp.py +604 -0
  21. package/src/server_control_mcp/mock_ssh_tunnel.py +289 -0
  22. package/src/server_control_mcp/mux_connection.py +326 -0
  23. package/src/server_control_mcp/mux_daemon.py +186 -0
  24. package/src/server_control_mcp/mux_protocol.py +279 -0
  25. package/src/server_control_mcp/mux_records.py +71 -0
  26. package/src/server_control_mcp/mux_rpc.py +1779 -0
  27. package/src/server_control_mcp/mux_service.py +506 -0
  28. package/src/server_control_mcp/mux_stream.py +283 -0
  29. package/src/server_control_mcp/mux_sync_client.py +224 -0
  30. package/src/server_control_mcp/policy.py +86 -14
  31. package/src/server_control_mcp/remote_agent_bundle.py +56 -0
  32. package/src/server_control_mcp/remote_mux_agent.py +769 -0
  33. package/src/server_control_mcp/remote_task_agent.py +102 -0
  34. package/src/server_control_mcp/runtime.py +3 -2
  35. package/src/server_control_mcp/runtime_services.py +862 -0
  36. package/src/server_control_mcp/secrets.py +6 -6
  37. package/src/server_control_mcp/secure_files.py +121 -0
  38. package/src/server_control_mcp/server.py +53 -20
  39. package/src/server_control_mcp/services.py +3 -469
  40. package/src/server_control_mcp/transports/__init__.py +4 -8
  41. package/src/server_control_mcp/transports/base.py +60 -38
  42. package/src/server_control_mcp/transports/ssh.py +315 -84
  43. package/src/server_control_mcp/tunnel_manager.py +1245 -0
  44. package/src/server_control_mcp/tunnel_native_ssh.py +454 -0
  45. package/src/server_control_mcp/tunnel_providers.py +20 -0
  46. package/src/server_control_mcp/tunnel_pty_agent.py +909 -0
  47. package/src/server_control_mcp/protocol.py +0 -362
  48. 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()