mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-21 16:02:20 +00:00
Deleting an SSH profile used to leave every remote workspace entry that had connected through it behind, labelled with a bare internal id and retrying a route that could never work again. `RemoteRef` now carries a `RouteSnapshot` of the profile it was made from — name, user, host, port — written at creation and refreshed on every reopen, `serde(default)` so older session files load. The snapshot serves labels only: `PartialEq`/`Hash` ignore it, or a refresh would split one entry into two. Deleting a profile cascade-forgets the entries routing through it. Forgets, not deletes: `WorkspaceRemove` is never sent, so the sessions on the remote machine keep running and connecting again under a new profile brings them back from the machine's own workspace list. An entry holding a live or in-flight link is left alone, as is one whose window is still on screen — a window whose workspace the store has forgotten reads as local, and its next tab would open a local shell on what the user still sees as a remote box. Whatever survives parks instead: no retries, no error, and an inline action to drop it deliberately. A live or preempted link outranks a lost route. Labels fall back from the live profile to the snapshot to a placeholder, so no branch renders a bare UUID. Resolving the live name reads memory rather than reparsing `~/.ssh/config`, because that path runs on every frame of a window with a remote workspace open. Closes #485.
130 lines
5.2 KiB
Plaintext
130 lines
5.2 KiB
Plaintext
---
|
|
title: "Remote workspaces"
|
|
description: "Whole workspaces hosted on another machine — files, repos, panes, and git all stay over there."
|
|
---
|
|
|
|
An SSH pane runs one shell on a remote machine. A **remote workspace** goes
|
|
further: tty7 runs a server on the far machine, and the whole workbench points
|
|
at it. Tabs, splits, the file tree, the git panel, the diff overlay, the process
|
|
list — all of it is the remote machine's, rendered here.
|
|
|
|
Nothing is synced or copied. The repository stays where it is.
|
|
|
|
<Frame caption="Placeholder — screenshot: a remote workspace open, sidebar showing remote repos, with the machine name in the strip">
|
|
<img src="/images/placeholder.svg" alt="A remote workspace in tty7" />
|
|
</Frame>
|
|
|
|
## Connecting
|
|
|
|
<Steps>
|
|
<Step title="Open the switcher">
|
|
<kbd>⌘ ⇧ O</kbd>. Machines are listed alongside your local workspaces —
|
|
*This Computer* first, then every saved SSH profile and, on Windows, every
|
|
WSL distribution.
|
|
</Step>
|
|
<Step title="Pick a machine">
|
|
tty7 connects over the same SSH stack as everything else, so profiles,
|
|
keychain credentials, and jump hosts all apply.
|
|
</Step>
|
|
<Step title="Approve the server install, once">
|
|
The first connection asks:
|
|
|
|
> tty7 will write its server binary to *devbox* so this machine can host
|
|
> workspaces there. Nothing else on *devbox* is touched, and no sudo is
|
|
> used.
|
|
|
|
It shows the exact path, version, size, source, and SHA-256 before you
|
|
agree. Later upgrades on that machine install silently.
|
|
</Step>
|
|
<Step title="Open a workspace">
|
|
From then on the machine's workspaces are in the switcher, and a new one
|
|
opens like a local one.
|
|
</Step>
|
|
</Steps>
|
|
|
|
## What gets installed
|
|
|
|
| | |
|
|
|---|---|
|
|
| **What** | A single static `tty7-server` binary |
|
|
| **Where** | `~/.local/share/tty7/bin/tty7-server-c<control>p<protocol>` |
|
|
| **Privileges** | None. No sudo, nothing outside your home directory |
|
|
| **Hosts** | Linux, x86-64 or aarch64 |
|
|
|
|
The binary is named after the wire dialect it speaks, so a client and a server
|
|
that disagree never quietly half-work — tty7 installs the matching one instead.
|
|
|
|
On Windows, a WSL distribution is handed the Linux server the installer already
|
|
shipped, so a WSL workspace needs no network access at all.
|
|
|
|
## Reattaching
|
|
|
|
Remote workspaces are the point at which persistence pays off twice: the panes
|
|
survive on the remote machine whether or not your laptop is awake, and you can
|
|
reattach from a different client entirely.
|
|
|
|
A strip along the top of the window says what the connection is doing —
|
|
*connecting*, *reconnecting (attempt 3)*, *disconnected*, or *taken over by
|
|
someone else*. Reconnection is automatic; a workspace another client has claimed
|
|
says so by name rather than fighting over it.
|
|
|
|
## Deleting a profile
|
|
|
|
Deleting an SSH profile forgets every local workspace entry that connected
|
|
through it. The confirmation names the profile's endpoint and counts the
|
|
entries going with it, and the profile's keychain credentials go too. Only the
|
|
bookmarks on this computer are touched — the sessions on the remote machine
|
|
keep running, and connecting to that machine again under a new profile brings
|
|
its workspaces back into the switcher from the machine's own list.
|
|
|
|
An entry holding a live or in-flight connection is left alone, and parks once
|
|
the link drops: it stops reconnecting on its own, keeps the name of the route
|
|
that made it rather than falling back to an internal id, and its switcher row
|
|
offers **Remove entry**. The sessions behind it are still on the machine,
|
|
waiting for a new profile.
|
|
|
|
## Keeping the server current
|
|
|
|
Two dialogs you may meet:
|
|
|
|
<AccordionGroup>
|
|
<Accordion title="Update tty7's server on “devbox”?">
|
|
The machine is serving sessions from a build whose protocol this client
|
|
cannot speak. tty7 has already installed a matching server, but the one
|
|
already running is the one your sessions are on. **Update Server** replaces
|
|
it and **ends every session it is hosting** — including ones this window is
|
|
not showing. Cancel leaves the machine exactly as it is.
|
|
</Accordion>
|
|
<Accordion title="Restart tty7's server on “devbox”?">
|
|
Same consequence, deliberately: every shell on that machine ends. Workspaces
|
|
and layouts are kept and come back with fresh shells.
|
|
</Accordion>
|
|
</AccordionGroup>
|
|
|
|
<Warning>
|
|
Both of these end other people's work if the machine is shared. tty7 spells
|
|
out what will happen before either one runs — read it.
|
|
</Warning>
|
|
|
|
## What a remote pane cannot do
|
|
|
|
- **Fork an agent session.** The fork command would run against the *local*
|
|
agent, so tty7 does not offer it.
|
|
- **Move very large files through the Files panel.** Drag-and-drop across the
|
|
link is capped at what one control frame can carry; past that the panel tells
|
|
you to use [SFTP](/remote/sftp).
|
|
|
|
## From the CLI
|
|
|
|
```bash
|
|
tty7 machine ls # this machine plus every link the server holds
|
|
tty7 -m devbox ls # route any command to a linked machine
|
|
tty7 -m devbox run -- cargo test
|
|
```
|
|
|
|
`-m` matches the full link key (`me@devbox:22`) or just the host. It uses a link
|
|
the local server *already* holds — it will not dial a fresh connection, and it
|
|
says so rather than guessing. Connect from the switcher first.
|
|
|
|
[CLI overview →](/cli/overview)
|