Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
a7fe522
Add SELF_HOST.md: run the coordinating server on your own tailnet
nedtwigg Aug 18, 2026
27d2fb3
Add DORMOUSE_BIND_HOST so the selfhost install can bind loopback only
nedtwigg Aug 18, 2026
b824e48
Make VS Code a first-class remote Host
nedtwigg Aug 18, 2026
2bbcb0b
Cleanup pass on the VS Code remote Host
nedtwigg Aug 18, 2026
fd5b638
Address review: keep host-store caches coherent across webviews
nedtwigg Aug 18, 2026
682c821
Address second review: buffer in-flight writes, unblock first paint
nedtwigg Aug 18, 2026
09f31cb
Arbitrate the Host role across VS Code windows
nedtwigg Aug 18, 2026
03d0474
Let the remote Host reach terminals in sibling webviews
nedtwigg Aug 18, 2026
65f7678
Reach terminals in other VS Code windows over a broker socket
nedtwigg Aug 18, 2026
5f3ad07
Give vscode-ext a test runner, and cover the socket and lease I/O
nedtwigg Aug 18, 2026
c742e0c
Cleanup pass on the lease and peer layers
nedtwigg Aug 18, 2026
23a7bb3
Collapse the peer RPC into one generic seam
nedtwigg Aug 18, 2026
f25125d
Resolve a surface to a handle instead of branching on where it lives
nedtwigg Aug 18, 2026
5da185e
Two seams for the peer layer: one generic RPC, one surface handle (#407)
nedtwigg Aug 18, 2026
76feed0
Initialize non-holder peer clients
nedtwigg Aug 18, 2026
9d446a3
Refresh Host storage before lease handoff
nedtwigg Aug 18, 2026
1266f97
Invalidate remote directories on peer changes
nedtwigg Aug 18, 2026
72f5186
Forward peer PTY exit events
nedtwigg Aug 18, 2026
1045523
Reference-count peer PTY subscriptions
nedtwigg Aug 18, 2026
3d4a5f7
Cancel stale remote surface resolutions
nedtwigg Aug 18, 2026
00c9fd6
Defer VS Code Host lease until enrollment
nedtwigg Aug 18, 2026
a174f0d
Reject peer listen failures
nedtwigg Aug 18, 2026
559dacf
Handle asynchronous lease watcher errors
nedtwigg Aug 18, 2026
29c39db
Unwind peer streams on router disposal
nedtwigg Aug 18, 2026
d884623
Fix three races the cloud review found
nedtwigg Aug 18, 2026
427f017
Simplify the peer-link and attach staleness guards
nedtwigg Aug 18, 2026
d85026d
Restore TMPDIR properly when the flip-back test is done
nedtwigg Aug 18, 2026
24a5007
Merge remote-tracking branch 'origin/main' into tailnet-deploy
nedtwigg Aug 18, 2026
f94b588
Merge branch 'vscode-remote-host' into tailnet-deploy
nedtwigg Aug 18, 2026
bbfcfb8
Extract the surface-provider seam from the remote-api session
nedtwigg Aug 19, 2026
9735b5e
Move the standalone remote Host into the sidecar
nedtwigg Aug 19, 2026
a6c2ac4
Move the VS Code remote Host into the extension host
nedtwigg Aug 19, 2026
5e1679f
Serve every window's terminals through the broker
nedtwigg Aug 19, 2026
28dccc2
Consolidate the two Host installations onto shared seams
nedtwigg Aug 19, 2026
39ce162
Bring the remote specs onto the service architecture
nedtwigg Aug 19, 2026
c0c4642
Document the dev-loop allowlist override
nedtwigg Aug 19, 2026
c28dc58
Fix fifteen verified findings from the adversarial review
nedtwigg Aug 19, 2026
f8f278b
Merge remote-tracking branch 'origin/main' into tailnet-deploy
nedtwigg Aug 19, 2026
c19d2ca
Centralize VS Code peer stream routing
nedtwigg Aug 19, 2026
3fe2abb
Serialize VS Code remote host state writes
nedtwigg Aug 19, 2026
ee54233
Reject remote host HTTP redirects
nedtwigg Aug 19, 2026
52566d3
Correct self-host Host and state guidance
nedtwigg Aug 19, 2026
322777c
Contain remote surface provider failures
nedtwigg Aug 19, 2026
915527d
Prevent remote Host resurrection after disposal
nedtwigg Aug 19, 2026
c411556
Fence peer replies to their broker socket
nedtwigg Aug 19, 2026
2a46b8e
Correct self-host backup state guidance
nedtwigg Aug 19, 2026
8fff4e5
Reject malformed peer handshake frames
nedtwigg Aug 19, 2026
d95d675
Publish remote host state after durable write
nedtwigg Aug 19, 2026
57e73a6
Keep remote host state directory private
nedtwigg Aug 19, 2026
7f04238
Fail closed on malformed Host authorization
nedtwigg Aug 19, 2026
c89364d
Harden scripted Tailscale CLI detection
nedtwigg Aug 19, 2026
567faa2
Finish the quality pass and pin the review's residual edges
nedtwigg Aug 19, 2026
75a6210
Fix the final review's findings across store, link, and surface
nedtwigg Aug 19, 2026
c9073a0
Bind pairing approval to the displayed request
nedtwigg Aug 19, 2026
ec8d587
Reject unusable remote connect sources
nedtwigg Aug 19, 2026
1af6e6a
Preserve PTY exits during surface attachment
nedtwigg Aug 19, 2026
99787fb
Bind surface handles to their selected peer
nedtwigg Aug 19, 2026
2bd97f0
Distinguish recycled peer socket inodes
nedtwigg Aug 19, 2026
927b41d
fix marketing copy (accidental escaping)
nedtwigg Aug 20, 2026
5ce9dce
Address the full review: forget failed keychain reads, dedup the dire…
nedtwigg Aug 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ standalone/dist/
standalone/sidecar/dor-cli/
standalone/sidecar/iframe-proxy.cjs
standalone/sidecar/agent-browser-host.cjs
standalone/sidecar/remote-host.cjs
standalone/sidecar/node_modules/
standalone/node_modules/

Expand Down
7 changes: 4 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ pnpm build # build lib, vscode extension, and website

- **`lib/`** — Shared React + TailwindCSS frontend library: components, tests, Storybook.
- `lib/src/lib/platform/` — platform abstraction (`PlatformAdapter` interface, fake + VSCode adapters)
- `lib/src/remote/` — remote control: `host/` (laptop side), `client/` (phone-side protocol + `RemotePtyAdapter`), `pocket-app/` (Pocket shell), `ws.ts` (shared socket surface)
- `lib/src/host/` — Node-side host modules bundled into both hosts: the iframe proxy, the agent-browser host, and `remote/` (the `RemoteHostService` that runs in the Tauri sidecar and the VS Code extension host)
- `lib/src/remote/` — remote control: `host/` (laptop side: protocol-v1 session, security, the webview's responder + pairing UI), `client/` (phone-side protocol + `RemotePtyAdapter`), `pocket-app/` (Pocket shell), `ws.ts` (shared socket surface)
- **`standalone/`** — Tauri desktop app (Rust + Vite frontend).
- `standalone/sidecar/` — Node.js PTY manager (native PTY via node-pty), bundled as the Tauri sidecar
- `standalone/src-tauri/` — Rust backend bridging webview ↔ sidecar
Expand Down Expand Up @@ -50,8 +51,8 @@ Each spec's own `Files` / `Code Map` section is the exhaustive file→spec mappi
- **`docs/specs/tutorial.md`** — Website playground tutorial: device-specific routes, the `tut` runner + detector + progress state, desktop and Pocket profiles, localStorage keys, the lib hooks that exist for tutorial observability, and the mouse/clipboard feature-coverage matrix. Touch points: the playground pages in `website/src/pages/`, `website/src/lib/tut-*.ts`, `PocketTerminalExperience.tsx`, fake-adapter scenario extensions, the `WallEvent` union.
- **`docs/specs/webgl-text.md`** — The SDF text-rendering stack for the 3D/WebXR terminal effort: the diffplug/xterm.js fork pipeline (branch strategy, sdf-version lockstep with `@xterm/xterm` pins, GitHub-release tarball distribution), the SDF glyph architecture in the forked webgl addon (color-free atlas with one texture entry per shape, shader tint/smoothstep contract, raster fallbacks for emoji/custom glyphs/decorated cells, the MSDF-compatible texel reservation), and the canopy Storybook lab with its upstream-vs-fork regression harness. Touch points: `canopy/`, the fork's `addons/addon-webgl` (separate repo), any bump of the fork tarball URL or `@xterm/*` pins in `canopy/package.json`.
- **`docs/specs/remote-security-model.md`** — The trust model for remote control: passkeys prove fresh user presence (user credentials — they sync), non-extractable per-browser device keys prove long-lived Client identity, the Host's local ACL authorizes the *pair* via a local-approval pairing ceremony, and the Host — never the Server — makes the final access decision. Read this first for anything remote; the other three remote specs build on it. Touch points: `server-lib-common/src/security/`, `server/src/handshake.ts`, the security modules in `lib/src/remote/host/` and `lib/src/remote/client/`.
- **`docs/specs/remote-api.md`** — The protocol a Client speaks after `authorizeConnection`: the shipped terminal-only **protocol-v1** (snapshot directory, attach-is-the-resize, last-attach-wins size authority) and the staged remainder (browser surfaces, in-flight replay, semantic scrollback, tethering display, grants, VR Window, WebRTC). Touch points: `server-lib-common/src/remote/wire.ts` (the fixed wire contract), `lib/src/remote/host/remote-api.ts`, `lib/src/remote/client/`.
- **`docs/specs/server.md`** — The selfhost coordinating server: env config, two-JSON-file state, "WebAuthn without a WebAuthn library", the HTTP API, the relay frame flow (one host challenge feeds both signatures → one biometric prompt per connect), the Host webview CSP for self-host relays (`DORMOUSE_REMOTE_CONNECT_SRC`), Host/Pocket side responsibilities, the testing harness, and instructions for running it end to end. Touch points: `server/src/`, `lib/src/remote/host/enrollment.ts`, the `dev:pocket-server` flow.
- **`docs/specs/remote-api.md`** — The protocol a Client speaks after `authorizeConnection`: the shipped terminal-only **protocol-v1** (snapshot directory, attach-is-the-resize, last-attach-wins size authority) and the staged remainder (browser surfaces, in-flight replay, semantic scrollback, tethering display, grants, VR Window, WebRTC). Touch points: `server-lib-common/src/remote/wire.ts` (the fixed wire contract), `lib/src/remote/host/remote-api.ts` + `host-surface-provider.ts`, `lib/src/host/remote/` (the Node-side service both hosts install), `lib/src/remote/client/`.
- **`docs/specs/server.md`** — The selfhost coordinating server: env config, local JSON-file state, "WebAuthn without a WebAuthn library", the HTTP API, the relay frame flow (one host challenge feeds both signatures → one biometric prompt per connect), the baked relay-origin allowlist for self-host builds (`DORMOUSE_REMOTE_CONNECT_SRC`), Host/Pocket side responsibilities, the testing harness, and instructions for running it end to end. Touch points: `server/src/`, `lib/src/remote/host/enrollment.ts`, `scripts/csp-defaults.mjs`, the `dev:pocket-server` flow.
- **`docs/specs/pocket-app.md`** — Pocket app architecture: the remote session is a `PlatformAdapter` (`RemotePtyAdapter`), so Pocket is auth screens + the mobile-terminal-ui composition; the `lib/src/remote/` module layout and the same-origin deployment rule (WebAuthn origin binding + Chrome PNA). Touch points: `lib/src/remote/client/` + `pocket-app/`, `lib/vite.pocket.config.ts`, the Pocket static serving in `server/src/app.ts`.
- **`docs/specs/deploy.md`** — Release process: the artifact matrix, release checklist, two-stage pipeline (CI builds unsigned + attests; a local script verifies, signs macOS/Windows, and creates the GitHub Release), Tauri updater manifest, changelog flow, and secrets. Touch points: `.github/workflows/release.yml`, `scripts/sign-and-deploy.sh`, `scripts/bump-version.sh`, the updater config in `tauri.conf.json`.

Expand Down
Loading