phux docs

File transfer and checkout

Commands a client uses to move files and inspect a checkout beside a Terminal. The framing and command envelope are in Server protocol.

File transfer

PUT_FILE uses a live Terminal to select the destination host, not to grant arbitrary filesystem writes. The server chooses the sandbox root and name; offsets and overlapping bytes continue the same principal’s immutable upload. Only whole-file digest verification, sync and rename publish a final path. Digest mismatch discards the partial file and sidecar: restart rather than trying to repair retained corrupt bytes. Completed artifacts belong to the user and are not silently TTL-deleted; quotas refuse with a remedy. Keep payloads and completed paths out of routine telemetry. Transfer files through this lane, not fragmented PTY input. The upload implementation and tests own continuation and quota behavior; CLI and environment own syntax and limits.

GET_FILE is the pull, behind features_ext.FILE_DOWNLOAD. It addresses a machine, not a pane: an optional host names a satellite of the serving hub, and no host reads the server itself, the way PATH_QUERY browses. The client names an absolute path and the server reads any regular file its own user can read, in chunks of at most 8 MiB. That is deliberately no narrower than the server grants already: a consumer holding INPUT on this server can type cat into any of its shells, so the command is classified INPUT on the server. A hub relays a named host only when that satellite advertises FILE_DOWNLOAD; otherwise it refuses UNSUPPORTED_SATELLITE_ROUTE and forwards nothing, so an older satellite never sees an unknown tag. Each chunk is one stateless request that returns the file’s current size, the bytes, and, on the chunk that reaches the end, a whole-file SHA-256; a client resumes from its own offset and must not expose a file whose digest differs. There is no size cap and no sandbox on the reading side; the destination disk is the client’s. The disk read runs in the bulk command lane beside PUT_FILE, off the connection dispatcher. The download implementation and the client helper own the read and the exclusive, verify-then-publish write; phux download owns syntax.

Checkout methods

CHECKOUT (command tag 0x3c, behind features_ext.CHECKOUT = 0x400) reads and stages the Git checkout a Terminal is in: status with per-file line counts, one file’s diff, a page of history, branches, a directory listing, the start of a file, the branch’s pull request and checks (through the host’s gh), and stage or unstage. It names a Terminal and one typed request; the server that owns the Terminal resolves the checkout from the Terminal’s live working directory, so a client never names a host path. Paths in requests and answers are relative to the checkout’s top level; an absolute path, .., anything under .git, or a path crossing a symbolic link is refused. The command is classified INPUT on the named Terminal (not on the server, as GET_FILE is), since an INPUT holder can already run git diff or git add there. The reach is the whole checkout: a Terminal whose working directory is inside a large repository, such as dotfiles tracked at $HOME, lets its INPUT holders read every file in that repository outside .git. Index writes that overrun their deadline are stopped with SIGTERM before SIGKILL, so Git can remove index.lock.

The request and its answer cross the wire as bounded JSON inside the command envelope (requests at most 64 KiB, answers at most 4 MiB, text at most 1 MiB and cut flagged truncated). Answers skip unknown fields and fold unknown enum values to unknown, so a newer server can add detail. A refusal is a typed answer (not_a_repository, invalid_path, timeout, gh_unavailable, no_pull_request, …), not a command error; a missing Terminal or a denied grant stays a command error. Git and gh run off the dispatcher under a deadline and an output cap, with GIT_OPTIONAL_LOCKS=0, GIT_TERMINAL_PROMPT=0 and GIT_LITERAL_PATHSPECS=1. A hub relays a satellite Terminal’s checkout only to a satellite that advertises CHECKOUT; otherwise it refuses UNSUPPORTED_SATELLITE_ROUTE. The request and answer types, the server handler, and the shared phux-git module own the details.