@@ -12,7 +12,7 @@ Linkspan is a lightweight agent that runs on compute nodes (HPC clusters, cloud
1212 - ** Linux mount** : Direct kernel FUSE mount via go-fuse
1313 - ** macOS mount** : NFSv3 proxy (go-nfs + billy adapter) mounted via ` mount_nfs `
1414- ** Jupyter Kernels** — Provision, manage, and connect to Jupyter kernels
15- - ** Remote Filesystem ** — REST API for file listing, reading, writing, and deletion
15+ - ** VFS ** — Virtual filesystem modes ( ` sync ` and ` mount ` ) for remote data access
1616
1717## Quick Start
1818
@@ -31,34 +31,16 @@ linkspan --port 0 --tunnel-auth-token "$TOKEN" --workflow - <<'EOF'
3131name: "dev-setup"
3232
3333steps:
34- - action: "vscode.create_session"
35- name: "Start SSH server"
36- outputs:
37- bind_port: "ssh_port"
38-
39- - action: "fuse.start_server"
40- name: "Start FUSE server"
41- outputs:
42- fuse_port: "fuse_server_port"
43-
4434 - action: "tunnel.devtunnel_create"
4535 name: "Create devtunnel"
4636 params:
4737 tunnel_name: "my-tunnel"
4838 expiration: "1d"
4939 auth_token: "{{.TunnelAuthToken}}"
50- ports:
51- - "{{.ssh_port}}"
52- - "{{.fuse_server_port}}"
40+ server_port: "{{.ServerPort}}"
41+ ssh_port: "{{.SshPort}}"
5342 outputs:
5443 tunnel_id: "tunnel_id"
55-
56- - action: "tunnel.devtunnel_host"
57- name: "Host devtunnel"
58- params:
59- tunnel_name: "my-tunnel"
60- auth_token: "{{.TunnelAuthToken}}"
61- outputs:
6244 connection_url: "tunnel_url"
6345 token: "tunnel_token"
6446EOF
@@ -74,16 +56,6 @@ linkspan --port 8080
7456
7557This starts the REST API without running any workflow.
7658
77- ### Mount a Remote Filesystem via NFS (macOS)
78-
79- Connect to a remote FUSE TCP server and mount it locally using NFS:
80-
81- ``` bash
82- linkspan --mount-remote --session-id my-session --server-addr 127.0.0.1:40709
83- ```
84-
85- This creates a mount at ` ~/sessions/my-session/ ` backed by the remote filesystem. The process blocks until interrupted (SIGINT/SIGTERM), at which point it unmounts cleanly.
86-
8759## CLI Flags
8860
8961| Flag | Default | Description |
@@ -96,9 +68,8 @@ This creates a mount at `~/sessions/my-session/` backed by the remote filesystem
9668| ` --tunnel-retries ` | ` 3 ` | Retry count for tunnel startup |
9769| ` --tunnel-retry-delay ` | ` 2s ` | Delay between tunnel retries |
9870| ` --tunnel-attempt-timeout ` | ` 10s ` | Timeout per tunnel attempt |
99- | ` --mount-remote ` | ` false ` | Mount a remote FUSE server locally via NFS |
100- | ` --session-id ` | | Session ID for mount point name (with ` --mount-remote ` ) |
101- | ` --server-addr ` | | FUSE TCP server address ` host:port ` (with ` --mount-remote ` ) |
71+ | ` --vfs-mode ` | | VFS mode: ` sync ` or ` mount ` (also reads ` CS_VFS_MODE ` env) |
72+ | ` --vfs-session-id ` | | Session ID for VFS (also reads ` CS_SESSION_ID ` env) |
10273
10374## REST API
10475
@@ -122,21 +93,6 @@ All endpoints are under `/api/v1/`.
12293| DELETE | ` /vscode/sessions/{id} ` | Terminate a session |
12394| GET | ` /vscode/sessions/{id}/status ` | Get session status |
12495
125- ### Remote Filesystem
126- | Method | Path | Description |
127- | --------| ------| -------------|
128- | GET | ` /fs/list ` | List files in a directory |
129- | GET | ` /fs/read ` | Read a file |
130- | POST | ` /fs/write ` | Write a file |
131- | DELETE | ` /fs/delete ` | Delete a file |
132-
133- ### FUSE Mount
134- | Method | Path | Description |
135- | --------| ------| -------------|
136- | POST | ` /fuse/start-server ` | Start a FUSE TCP server |
137- | POST | ` /fuse/mount-remote ` | Mount a remote FUSE server via NFS |
138- | GET | ` /fuse/status ` | Get FUSE server/mount status |
139-
14096### Tunnels
14197| Method | Path | Description |
14298| --------| ------| -------------|
@@ -151,13 +107,12 @@ All endpoints are under `/api/v1/`.
151107
152108| Action | Description | Outputs |
153109| --------| -------------| ---------|
154- | ` vscode.create_session ` | Start a VS Code SSH server | ` session_id ` , ` bind_port ` |
155- | ` fuse.start_server ` | Start FUSE TCP server on a random port | ` fuse_port ` |
156- | ` fuse.mount_remote ` | Mount a remote FUSE server locally | ` mount_path ` , ` nfs_port ` |
157- | ` tunnel.devtunnel_create ` | Create a Dev Tunnel with specified ports | ` tunnel_id ` , ` tunnel_name ` |
158- | ` tunnel.devtunnel_host ` | Host a Dev Tunnel (start relay) | ` command_id ` , ` connection_url ` , ` token ` |
110+ | ` tunnel.devtunnel_create ` | Create a Dev Tunnel and forward ports | ` tunnel_id ` , ` tunnel_name ` , ` connection_url ` , ` token ` , ` ssh_port ` , ` log_port ` |
111+ | ` tunnel.devtunnel_forward ` | Forward an additional port into a Dev Tunnel | ` port ` |
159112| ` tunnel.devtunnel_delete ` | Delete a Dev Tunnel | |
113+ | ` tunnel.devtunnel_connect ` | Connect to a Dev Tunnel (client side) | ` command_id ` , ` port_map ` |
160114| ` tunnel.frp_proxy_create ` | Create an FRP tunnel proxy | ` tunnel_name ` , ` tunnel_type ` |
115+ | ` mount.setup_overlay ` | Set up an overlay mount over a remote workspace via SSHFS | ` merged_path ` , ` cache_path ` , ` source_path ` |
161116| ` shell.exec ` | Execute a shell command | ` output ` |
162117
163118## Architecture
@@ -167,9 +122,10 @@ linkspan
167122├── main.go # Entry point, CLI flags, HTTP router, workflow orchestration
168123├── internal/
169124│ ├── workflow/ # Workflow engine: YAML parsing, step execution, action registry
170- │ └── process/ # Process manager for background CLI processes
125+ │ ├── process/ # Process manager for background CLI processes
126+ │ └── logstream/ # Log broadcaster: tees log output to connected TCP clients
171127├── subsystems/
172- │ ├── fuse / # FUSE-over-TCP protocol, NFS proxy, mount management
128+ │ ├── mount / # FUSE overlay filesystem, SFTP-backed copy-up mounts
173129│ ├── vscode/ # VS Code SSH server lifecycle
174130│ ├── tunnel/ # Dev Tunnels SDK + CLI, FRP tunnel management
175131│ ├── jupyter/ # Jupyter kernel provisioning
@@ -185,4 +141,4 @@ goreleaser release --snapshot --clean # Local snapshot build
185141goreleaser release --clean # Tagged release (requires GITHUB_TOKEN)
186142```
187143
188- Produces archives for Linux (amd64/arm64), macOS (amd64/arm64), and Windows (amd64 ).
144+ Produces archives for Linux (amd64/arm64) and macOS (amd64/arm64).
0 commit comments