Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
139 commits
Select commit Hold shift + click to select a range
3dd5294
Add pane preview design spec
theogravity Oct 22, 2026
f5cce1f
Settle pane-preview spec review decisions
theogravity Oct 22, 2026
f79894f
Add pane preview implementation plan
theogravity Oct 22, 2026
2ceb743
Revise pane-preview plan after review, fix two spec errata
theogravity Oct 22, 2026
a49b4d7
Fold decomposition review into pane-preview plan
theogravity Oct 22, 2026
59954f5
Fold round-2 decomposition review into the plan
theogravity Oct 22, 2026
8fdc56e
Fold correctness round-2 review into the plan
theogravity Oct 22, 2026
95598a4
Fold round-3 decomposition review into the plan
theogravity Oct 22, 2026
20ca300
Fold correctness round-3 review into the plan
theogravity Oct 22, 2026
78f6957
Rebase on main and align plan with PR #424 trust-boundary hardening
theogravity Oct 22, 2026
dc1eca7
Fold correctness round-4 review into the plan
theogravity Oct 22, 2026
e53107c
Fold decomposition round-4 review into the plan
theogravity Oct 22, 2026
e940a64
Fold decomposition round-5 review into the plan
theogravity Oct 22, 2026
890ff7d
Fold correctness round-5 review into the plan
theogravity Oct 22, 2026
b12619c
Fold decomposition round-6 review into the plan
theogravity Oct 22, 2026
75b208a
Fold correctness round-6 review into the plan
theogravity Oct 22, 2026
6380cc8
Fold decomposition round-7 review into the plan
theogravity Oct 22, 2026
af00fc4
Fold correctness round-7 review into the plan
theogravity Oct 22, 2026
e65e086
Fold decomposition round-8 review into the plan
theogravity Oct 22, 2026
6f41302
Fold correctness round-8 review into the plan
theogravity Oct 22, 2026
68b80a9
Fold review round-9 into the plan
theogravity Oct 22, 2026
b149535
Fold review round-10 into the plan
theogravity Oct 22, 2026
ed16d72
Fold review round-11 into the plan
theogravity Oct 22, 2026
f80ad62
Fold review round-12 into the plan
theogravity Oct 22, 2026
0e49233
Fold review round-13 into the plan
theogravity Oct 23, 2026
256c983
Fold review round-14 decomposition into the plan
theogravity Oct 23, 2026
84abc6d
feat(protocol): preview lanes, screencast events, and the owner switc…
theogravity Oct 23, 2026
f554748
feat(protocol): live watch subscriptions and preview-stream frames
theogravity Oct 23, 2026
bcfc4d4
Fold review round-14 correctness into the plan
theogravity Oct 23, 2026
955e196
feat: per-node preview switch mirroring the ssh enable posture
theogravity Oct 23, 2026
b414369
test: pin the machine-bearer 403 on the preview switch; reword added …
theogravity Oct 23, 2026
41425f4
feat(node): attribute pane subtrees' listening sockets, probing CDP p…
theogravity Oct 23, 2026
9767618
feat(node): pending-ack forward lanes with off-chain dial and 1 MiB s…
theogravity Oct 23, 2026
10e225c
fix(node): guard lane death on socket identity so the ::1 retry survi…
theogravity Oct 23, 2026
87ae875
feat(node): CDP screencast bridge, always-ack with dropping backpressure
theogravity Oct 23, 2026
c7e99e8
fix(node): cancel in-flight CDP handshakes in the link-drop sweep
theogravity Oct 23, 2026
b300a84
feat(node): Xvfb+x11vnc virtual displays, gated, launched with the pane
theogravity Oct 23, 2026
c5125d8
fix(node): census-trust gate and rehydrated-display death probe in th…
theogravity Oct 23, 2026
5c54dd4
feat(server): preview broker with lane pools, refcounted watches, and…
theogravity Oct 23, 2026
474e322
fix(server): reserve preview caps and bridges synchronously across th…
theogravity Oct 23, 2026
29c6e5f
feat(api): preview REST surface, gated screen launches, and the view/…
theogravity Oct 23, 2026
5041d2e
fix(api): map watch timeout and unsupported, pin the screen-refusal legs
theogravity Oct 23, 2026
d606f01
feat(server): same-origin /pv proxy with cookie jar, CSP carve-out, a…
theogravity Oct 23, 2026
a88ce8e
fix(server): carry coerced WS text frames and pin the upgrade-cookie jar
theogravity Oct 23, 2026
7545a40
fix(server): duck-check ArrayBuffer views, not JSON key names
theogravity Oct 23, 2026
2a897f9
feat(server): live watch subscriptions through the authorization control
theogravity Oct 23, 2026
ba6eff5
test(server): tell the truth in two preview watch comments
theogravity Oct 23, 2026
744e626
feat(web): Preview section with Open panel, Watch canvas, and the nod…
theogravity Oct 23, 2026
bea1c40
fix(web): release the watch on pane change and polish the preview rows
theogravity Oct 23, 2026
7666232
fix(web): clear a refused watch's alert when the pane changes
theogravity Oct 23, 2026
d86f48a
feat(web): noVNC screen viewer over the forward lane
theogravity Oct 23, 2026
8032845
fix(web): tear the screen viewer down on pane change and under Strict…
theogravity Oct 23, 2026
279eab8
fix(web): restore the over-cap close line and guard pane-mid-open ans…
theogravity Oct 23, 2026
1a561a2
docs(preview): finish pane preview with e2e spec, leg log, docs, and …
theogravity Oct 23, 2026
9faaeb2
fix(web): disable the Screen control at the phone layout with the lay…
theogravity Oct 23, 2026
ce93cd2
docs: name the real preview refusal words and tighten the shipped prose
theogravity Oct 23, 2026
3f57d28
fix(preview): belt the preview close through the shared death transition
theogravity Oct 23, 2026
95851a3
test(web): keep CI's serial run off the banner test's timer budget
theogravity Oct 23, 2026
49b9765
fix(preview): demote noVNC's insecure-context error to URL mode via a…
theogravity Oct 23, 2026
6c8e9bd
docs(preview): reseat the rfb.js citations on the patched file
theogravity Oct 23, 2026
602014f
docs(preview): close the leg's typed-input ticket with the retype-int…
theogravity Oct 23, 2026
48aaeea
docs(preview): self-contain the task 15 correction and fix its flag cite
theogravity Oct 23, 2026
0c03562
docs(preview): quote the rerun-5 capture verbatim and tighten two claims
theogravity Oct 23, 2026
8c40d74
fix(preview): rearm the novnc patch entry the rebase dropped
theogravity Oct 23, 2026
32af3c0
test(web): poll the banner's disappearance as a boolean
theogravity Oct 23, 2026
bb3b26b
fix: make previews usable in workspaces and on the built-in node
theogravity Oct 24, 2026
72917e2
Check virtual display requirements before enabling launch option
theogravity Oct 24, 2026
62c8024
Explain virtual displays and highlight installation guidance
theogravity Oct 24, 2026
e0347dd
Clarify that every missing display program is required on Linux
theogravity Oct 24, 2026
b3cd2a6
Shorten virtual display installation guidance
theogravity Oct 24, 2026
d94e4ac
Hide display recheck when prerequisites are satisfied
theogravity Oct 24, 2026
85c99a0
Open previews as movable workspace tabs with sidebar leaves
theogravity Oct 24, 2026
ecbcbe7
Show virtual display indicators in subshell sidebar rows and headers
theogravity Oct 24, 2026
eead208
Open the virtual display directly from its header icon
theogravity Oct 24, 2026
6f453f3
Clarify virtual display shortcut tooltip
theogravity Oct 24, 2026
c76625d
Keep display shortcut guidance consistent
theogravity Oct 24, 2026
b3a0610
Open each preview resource in its own workspace tab
theogravity Oct 24, 2026
2f79164
Open preview picker from the display header shortcut
theogravity Oct 24, 2026
28d01d6
Simplify preview picker into clickable view rows
theogravity Oct 24, 2026
8d90da2
Keep large preview lists searchable and bounded
theogravity Oct 24, 2026
3ded567
Use compact preview rows for small lists too
theogravity Oct 24, 2026
e446f85
Remove duplicate picker control from preview toolbar
theogravity Oct 24, 2026
9fbabf9
Move full screen into the preview action menu
theogravity Oct 24, 2026
475f834
Split new previews right and move workspace maximize into their menu
theogravity Oct 24, 2026
732bb47
Show active preview restore actions directly in the toolbar
theogravity Oct 24, 2026
c53affc
fix: harden preview browser and lifecycle boundaries
theogravity Oct 24, 2026
63b8150
docs: showcase website previews with a recorded developer workflow
theogravity Oct 24, 2026
e38866b
fix: close preview revocation races and bound untrusted traffic
theogravity Oct 24, 2026
47ae464
fix: guard preview subscriptions and clean uncertain opens
theogravity Oct 24, 2026
5f49170
fix: bound preview allocations and recheck watch scope
theogravity Oct 24, 2026
cebdf73
docs: explain preview setup for Mac users
theogravity Oct 24, 2026
496f5f5
fix: link virtual display prerequisites to setup guide
theogravity Oct 24, 2026
9ecb549
feat: add MCP preview tools and node capability discovery
theogravity Oct 24, 2026
56610cc
refactor: name the app and screen picker clearly
theogravity Oct 24, 2026
7c608f2
refactor: align apps and screens API and MCP naming
theogravity Oct 24, 2026
1a3d5d9
fix: guard view lifecycle races and clarify access controls
theogravity Oct 24, 2026
9b57c34
Add saved HTTP and HTTPS services to Apps & screens
theogravity Oct 24, 2026
8cd8c98
chore: release apps and screens as a major CLI feature
theogravity Oct 25, 2026
1489491
feat: show apps and screens prerequisites in node settings
theogravity Oct 25, 2026
54096ab
style: use compact plain rows in the apps and screens picker
theogravity Oct 25, 2026
f627f68
fix(web): clamp dropdown menus to the viewport so they scroll, not clip
theogravity Oct 24, 2026
98af5fe
style(web): menus and pickers share one row density grammar
theogravity Oct 24, 2026
f7dd20b
style: reduce action menu text by one pixel
theogravity Oct 25, 2026
857356d
style: tighten action menu vertical padding
theogravity Oct 25, 2026
9edb905
style: align picker and form control sizing
theogravity Oct 25, 2026
d85dda5
Revert "style: align picker and form control sizing"
theogravity Oct 25, 2026
d9444e9
style: restore picker dropdown sizing
theogravity Oct 25, 2026
9c1df29
style: reduce dialog titles to 18px
theogravity Oct 25, 2026
ce92f5e
style: reduce dialog padding
theogravity Oct 25, 2026
db82297
style: set dialog padding to 18px
theogravity Oct 25, 2026
2c27659
style: compact sidebar picker dropdowns only
theogravity Oct 25, 2026
1131206
feat: keep subshell launch actions visible while scrolling
theogravity Oct 25, 2026
71a1b9d
fix: discard launch drafts on cancel and close
theogravity Oct 25, 2026
5a4c4d6
fix: stop inheriting presets when opening launch forms
theogravity Oct 25, 2026
69ce943
style: move terminal maximize into pane actions
theogravity Oct 25, 2026
1e0401f
style: remove terminal tab bar action menu
theogravity Oct 25, 2026
9696373
docs: clarify virtual display purpose and overhead
theogravity Oct 25, 2026
a6544c5
style: highlight virtual display cost in gold
theogravity Oct 25, 2026
0ff5602
style: place save as preset last in launch form
theogravity Oct 25, 2026
8d74895
Separate node app access from virtual display permissions
theogravity Oct 25, 2026
66a7fe3
Shorten virtual display setting description
theogravity Oct 25, 2026
ca38fd8
Shorten apps and browsers setting description
theogravity Oct 25, 2026
07c18c7
Link node preview settings to feature documentation
theogravity Oct 25, 2026
3d62b5e
Link node SSH settings to documentation
theogravity Oct 25, 2026
b7f8152
Link cross-agent node guidance to documentation
theogravity Oct 25, 2026
e40a2d0
Align node feature documentation with independent permissions
theogravity Oct 25, 2026
99f7810
Verify independent preview permissions for dashboard and MCP
theogravity Oct 25, 2026
8bde746
Rename apps and browsers to web previews throughout the feature
theogravity Oct 25, 2026
f3fffa8
fix: address preview authorization and display lifecycle review findings
theogravity Oct 25, 2026
58cdd51
fix: update Zod and override vulnerable Expo CLI dependency
theogravity Oct 25, 2026
d46128e
fix: patch Forge nested signature validation in Expo tooling
theogravity Oct 25, 2026
969b202
fix: retain ws frame codec dependency for clean server builds
theogravity Oct 25, 2026
062c378
feat: abstract virtual display providers and add node selection
theogravity Oct 25, 2026
d7cfca3
test: wait for signed SSH settings to reach the node
theogravity Oct 25, 2026
bc12422
feat: select virtual display providers per subshell
theogravity Oct 25, 2026
b5f5162
fix: reconcile launch selections when changing nodes
theogravity Oct 25, 2026
8c3217e
fix: keep display warnings inside the display section
theogravity Oct 25, 2026
53a621c
fix: highlight automatic display resets in red
theogravity Oct 25, 2026
df36684
fix: harden display provider lifecycle and document provider policy
theogravity Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .changeset/apps-screens-label.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
"@internal/docs": patch
"@internal/website": patch
---

Name the dashboard entry point Apps & screens and its picker Open app or screen, with matching setup guidance and documentation. Keep API and MCP identifiers stable. Simplify the website demonstration and support private development hostnames through local environment settings.
5 changes: 5 additions & 0 deletions .changeset/compact-dialog-titles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/server": patch
---

Reduce standard dialog titles to 18px and align the close button with the title. Reduce dialog padding to 18px on all sides.
5 changes: 5 additions & 0 deletions .changeset/compact-rows-one-grammar.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/server": patch
---

Use 13px text, 2px vertical padding, and 28px minimum rows for action-menu items.
9 changes: 9 additions & 0 deletions .changeset/display-provider-abstraction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
---

Separate virtual display providers from viewer connections and launch settings. Allow node owners to enable multiple display providers and choose a default, with Xvfb + VNC as the initial option. Persist per-subshell provider choices for restart and preserve display requests in presets. Check requirements for the selected provider and preserve existing displays when the selection changes.

Order provider allocation and cleanup per subshell, recheck permission after asynchronous prerequisites, and verify VNC listener ownership during allocation and recovery. Reserve viewer ports before probing to prevent concurrent displays from selecting the same port.
6 changes: 6 additions & 0 deletions .changeset/explain-disabled-mcp-displays.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@internal/server": patch
"@internal/node": patch
---

Explain when node settings disable a virtual display requested through MCP, and verify independent preview permissions for dashboard and agent access.
5 changes: 5 additions & 0 deletions .changeset/fix-action-menu-viewport-clamp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/server": patch
---

Fix action menus running past the bottom of the screen. A menu taller than the space available (the subshell actions menu on a phone or short window) is now clamped to the viewport and scrolls within it, instead of its last items falling off the bottom where nothing could reach them.
5 changes: 5 additions & 0 deletions .changeset/node-feature-documentation-links.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/docs": patch
---

Document independent node preview permissions in node management, architecture, MCP, and protocol references.
5 changes: 5 additions & 0 deletions .changeset/node-view-prerequisites.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/server": patch
---

Show Apps & screens prerequisite checks in node settings, including missing virtual display programs, setup guidance, and a Recheck action. Explain platform limitations and make the disabled state visible beside the node's switch.
5 changes: 5 additions & 0 deletions .changeset/pane-maximize-menu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/server": patch
---

Remove the terminal tab bar’s standalone maximize control and action menu. Keep Restore available for maximized groups.
13 changes: 13 additions & 0 deletions .changeset/pane-preview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@internal/server": major
"@internal/node": major
"@internal/docs": patch
---

Add web previews, browser watching, saved web services, and virtual displays to subshell workspaces. Open each view in its own draggable tab beside the terminal, move it between splits, or use full screen. Closing a preview leaves its terminal and sibling views running.

Node settings independently control web previews and virtual displays. Enabling web previews makes them available to the node’s subshells. Nodes can enable multiple display providers and choose a default. Virtual displays are requested at launch, use the default or a selected enabled provider, and check prerequisites before starting. Xvfb + VNC is the initial provider and requires Linux with Xvfb, x11vnc, and xauth. Presets can save a provider choice. Each subshell keeps its resolved provider and display size on restart, even when the node default changes. Disabling a provider prevents new displays and restarts without stopping existing displays. The server’s built-in node uses the same runtime as enrolled nodes.

Expose feature permissions, display-provider selection, prerequisites, and view controls through MCP. The UI explains disabled features and links to setup documentation. Switching nodes clears incompatible agent and display selections, resets the working directory, and explains the corrections. Preview choices use compact rows with plain port numbers, and phone previews preserve the desktop workspace layout.

Isolate web-preview scripts from dashboard credentials and browser storage, restrict viewers to authorized resources, and revoke views when access changes or subshells stop. Keep target cookies on the server, bound transport buffers and image dimensions, verify display process ownership before cleanup, and redact preview capability references from diagnostics.
9 changes: 9 additions & 0 deletions .changeset/preview-allocation-authorization.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
---

Close a preview permission-downgrade race, bound image decoding and retained
resources, and check transport backpressure before encryption. Verify display
process identity before cleanup and document the additional security review.
5 changes: 5 additions & 0 deletions .changeset/preview-guide-media.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/docs": patch
---

Document website previews, virtual displays, browser isolation, private preview links, and the preview architecture and protocol. Add screenshots captured from an isolated sample project.
6 changes: 6 additions & 0 deletions .changeset/preview-macos-guide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@internal/docs": patch
---

Explain how Mac users can use Preview with a Linux node, where to install
virtual-display prerequisites, and which macOS features are unavailable.
7 changes: 7 additions & 0 deletions .changeset/preview-mcp-capabilities.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
---

Add MCP Preview discovery, private connections, browser watching, and virtual-display launches. Include harness health, SSH/Preview settings, and live display prerequisite checks in node discovery, with owner-only access preserved. Document the workflow and capability-link security boundary.
6 changes: 6 additions & 0 deletions .changeset/preview-review-fixes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@internal/server": patch
"@internal/docs": patch
---

Require an authorized browser-watch registration before delivering frames and revoke watches that no longer meet view-only browser restrictions. Preserve virtual-display dimensions across restarts and refuse disabled displays before stopping a live subshell. Buffer early target greetings within bounded lane limits so virtual-display connections cannot lose their handshake.
7 changes: 7 additions & 0 deletions .changeset/preview-security-followup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
---

Cancel pending preview opens when access is revoked, and recheck authorization before publishing them. Keep CDP discovery on its requested loopback endpoint. Bound proxy response buffers, fragmented WebSocket messages, and target cookies, and prevent preview targets from installing dashboard reporting policies.
7 changes: 7 additions & 0 deletions .changeset/preview-subscription-revocation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
---

Recheck live-screen subscriptions when revocation overtakes their permission check. Limit queued writes to preview targets that stop reading, and clean up node resources after uncertain preview-open replies.
7 changes: 7 additions & 0 deletions .changeset/rename-web-previews.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
---

Rename apps and browsers to Web previews throughout the dashboard, API and MCP permission fields, node protocol, and documentation.
7 changes: 7 additions & 0 deletions .changeset/saved-browser-services.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": minor
"@internal/node": minor
"@internal/docs": patch
---

Save HTTP or HTTPS services in Apps & screens, including services started outside a subshell. Open each in its own workspace tab, and remove saved connections without stopping their services. Manual connections work without a virtual display, including on macOS nodes. Node protocol 24 adds explicit destinations and certificate-verified HTTPS.
7 changes: 7 additions & 0 deletions .changeset/separate-node-preview-permissions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": minor
"@internal/node": minor
"@internal/docs": patch
---

Separate node permissions for apps and browsers from virtual displays. Apps and browser features apply to every subshell when enabled; virtual displays still require an explicit launch choice. Preserve existing grants, show feature-specific readiness, and enforce both switches on the server and node.
5 changes: 5 additions & 0 deletions .changeset/sidebar-picker-sizing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/server": patch
---

Match sidebar workspace and grouping dropdown rows to their compact triggers, using 28px rows and 13px text.
7 changes: 7 additions & 0 deletions .changeset/sticky-launch-actions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
---

Keep Cancel and Start subshell visible while scrolling the new subshell form. Cancel and Close discard the draft before the dialog is reopened.

Opening a new subshell no longer automatically reapplies the previous subshell’s preset.
7 changes: 7 additions & 0 deletions .changeset/subshell-view-api-names.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
---

Name the unreleased Apps & screens API resources views and expose MCP tools list_subshell_views, open_subshell_view, and watch_subshell_browser. Rename node readiness and enablement discovery, align viewer controls and permission labels, and document the persisted and protocol identifiers retained for compatibility.
8 changes: 8 additions & 0 deletions .changeset/update-zod-validation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@internal/server": patch
"@internal/node": patch
"@internal/docs": patch
"@internal/website": patch
---

Update Zod to 4.6.7 and override Expo CLI’s older Zod dependency to remove the vulnerable version from the dependency tree.
6 changes: 6 additions & 0 deletions .changeset/view-review-lifecycle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@internal/server": patch
"@internal/node": patch
---

Prevent late browser-watch requests from reactivating closed or changed views, preserve selected virtual displays during same-node rechecks, and clarify disabled settings and setup guidance. Reject conflicting MCP app/display arguments before creating a connection.
5 changes: 5 additions & 0 deletions .changeset/virtual-display-explanation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/server": patch
---

Explain when a virtual display is useful and its resource cost beside the launch checkbox.
7 changes: 7 additions & 0 deletions .changeset/virtual-display-setup-link.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@internal/server": patch
"@internal/docs": patch
---

Link missing virtual-display prerequisites to the setup guide instead of
listing installation instructions in the launch form.
5 changes: 5 additions & 0 deletions .changeset/website-preview-demo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@internal/website": patch
---

Add a website preview demonstration directly below the mobile video, showing a real coding agent fixing project filters and checking the result beside its terminal.
2 changes: 2 additions & 0 deletions apps/client/desktop/ui/src/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@
not quietly resolve to it. `detail` (13px) is the floor. */
--text-display: 30px;
--text-display--line-height: 1.2;
--text-dialog-title: 18px;
--text-dialog-title--line-height: 1.2;
--text-heading: 20px;
--text-heading--line-height: 1.2;
--text-label: 15px;
Expand Down
15 changes: 15 additions & 0 deletions apps/client/mobile/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,21 @@ exact-pin rule.
native build works at the repo's pins. Don't "fix" them by guessing; the real
constraint is the one below.

**Forge carries a security patch.** `patches/node-forge@1.4.0.patch` applies
the nested DigestAlgorithm validation proposed in
[digitalbazaar/forge#1152](https://github.com/digitalbazaar/forge/pull/1152).
No patched release is published yet. The dependency security tests exercise
Expo’s installed copies under Node, rejecting malformed signatures and
checking valid signatures and certificates. Replace the patch and remove its
audit exception when upstream publishes a fixed release.

**Expo CLI uses the root Zod override.** `@expo/cli>zod` pins 4.6.7 because
Expo 57 still requests Zod 3, which is covered by GHSA-mrhx-c7xc-m3w5.
Its plugin manifest, plugin output, and MCP command schemas were checked with
Zod 4, including invalid inputs and JSON Schema conversion. Keep this scoped
override until Expo requests a patched version itself; when updating the CLI,
check those schemas as well as the mobile export.

**⚠️ Never let a `*` peer resolve freely.** `expo-router` declares
`react-native-reanimated: "*"`, so bun installed reanimated 4.6.0, which needs
`react-native-worklets@0.12.x`, and 0.12 removed
Expand Down
21 changes: 21 additions & 0 deletions apps/docs/content/docs/automation/rest-api.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,24 @@ Check both HTTP status and the structured response. After an ambiguous create ti
## Next steps

Read [Build an API integration](/automation/integrations) and [Access model](/concepts/access).

## Saved app services

Use these endpoints for services started outside a subshell. A virtual display
isn't required; the subshell must be running to open the connection.

| Action | Endpoint | Body |
| --- | --- | --- |
| List saved connections | `GET /api/subshells/:id/services` | None |
| Save a connection | `POST /api/subshells/:id/services` | `port`, `protocol` (`http` or `https`), optional `name` and `host` |
| Open a saved connection | `POST /api/subshells/:id/views/open` | `{ "serviceId": "saved-service-uuid" }` |
| Remove a saved connection | `DELETE /api/subshells/:id/services/:serviceId` | None |

Host defaults to `localhost` on the subshell's node. HTTPS certificates must be
trusted by that node. Reading requires subshell view access; saving, opening,
and removing require edit access and `subshells:execute` for a scoped system key.
Machine credentials retain their owner-only scope. Removing a saved connection
revokes its open capabilities without stopping the service. The returned
`proxyBase` is a private bearer capability; don't put it in logs or public links.

See [Web previews & screens](/guides/preview#add-a-service-started-elsewhere) for the UI flow.
61 changes: 61 additions & 0 deletions apps/docs/content/docs/concepts/architecture.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,67 @@ MCP runs beside the agent as a stdio child, using the pane's scoped identity. It

The server relays ciphertext, but terminal output and channel metadata have different security properties.

## Web previews and virtual displays

Web previews & screens brings a subshell's dev server, browser frames, or virtual display into
the workspace. Your browser connects to the server; it doesn't need direct
network access to the node's ports.

```mermaid
%% The dashboard authenticates to the server. App HTTP and WebSocket traffic use a capability URL and a node-side tunnel; CDP JPEG frames return through the authorized live feed. The built-in node uses the same runtime in process.
flowchart LR
B[Dashboard browser] -->|Open preview with user access| S[Server preview broker]
B -->|HTTP or WS capability URL| P[Server preview proxy]
P <-->|Encrypted preview lanes| N[Node runtime]
N <-->|HTTP/S service or loopback RFB| A[Dev server or virtual display]
N -->|CDP JPEG frames| S
S -->|Authorized live feed| B
S -->|In-process adapter| L[Built-in node runtime]
```

The server checks subshell access and the node's separate web-preview or virtual-display permission before opening
a view. App forwarding and screen input need edit access. Watching browser
frames needs view access; view-only shares are restricted to the browser
discovered for their subshell.

The REST resource is `/api/subshells/:id/views`. Clients open a connection at
`/views/open` and start or stop browser watching at `/views/browser/watch`.
Node responses expose `webPreviewsEnabled` for web previews and `virtualDisplayEnabled` for virtual displays.
Node configuration uses `/views-enabled` with `feature: "web-previews"` or `feature: "display"`,
and display prerequisites use `/display-readiness`. The corresponding MCP tools
are `list_subshell_views`, `open_subshell_view`, and `watch_subshell_browser`.
See the [MCP tool reference](/mcp/tools#list_subshell_views) for their arguments.

For web previews, the server creates a private capability URL and forwards each
HTTP or WebSocket connection through a lane to loopback or the saved service destination on the execution
machine. Proxied documents have an opaque browser origin so website scripts
don't inherit dashboard authority. Target cookies stay in a server-side jar.
The server's built-in node uses the same discovery, forwarding, CDP, and display
runtime through an in-process adapter.

Browser watches use Chrome DevTools Protocol to emit JPEG frames. Virtual
displays use a shared provider interface for requirements, allocation, launch
settings, recovery, and cleanup. Node owners enable providers and choose a
default; each subshell can request an enabled provider and saves that choice
for restarts. Both the server and the node enforce the selection.

The only bundled provider today is **Xvfb + VNC** on Linux. It creates a private
Xvfb display and loopback x11vnc listener; a separate VNC viewer adapter renders
and controls the RFB stream with noVNC. Other providers can reuse that viewer
if they expose VNC. Providers are bundled with Subshell, rather than installed
through the harness-plugin manager. Local launch credentials stay on the node;
the server receives only the display identifier and viewer connection. These are separate from the agent's
terminal stream and from encrypted agent-to-agent channels. The trusted server
can read preview bytes and frames.

Each app port, browser watch, and display is a separate workspace tab with a
parent subshell. Desktop previews initially split to the right. The phone tab
strip leaves the desktop split layout unchanged. Saved layouts retain only
previews whose parent pane is still authorized and present.

See [Web previews & screens](/guides/preview), [Preview transport](/reference/node-protocol#preview-transport),
and [Preview security](/concepts/security#preview-security).

## See also

[MCP and agent communication](/mcp), [Access model](/concepts/access), and [Security model](/concepts/security).
38 changes: 38 additions & 0 deletions apps/docs/content/docs/concepts/security.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,44 @@ A view grant can expose credentials printed in terminal output. An edit grant le

Sharing a node is a separate decision: even a view grant on a node permits the recipient to launch their own sessions there. The execution account and machine can access those processes and their files. Sharing a node doesn't automatically share every session on it. See [Access model](/concepts/access), [Share a subshell](/guides/sharing), and [Share a node](/nodes/sharing).

### Preview security

Web previews and virtual displays have separate opt-in settings on each node.
The node owner also controls which display providers are allowed. A successful
requirements check doesn't enable a feature or grant permission. App forwarding
and virtual-screen input need edit access to the subshell. View access permits browser-frame
watching, restricted to the browser discovered for that shared subshell.

Forwarded websites run in an opaque-origin browser sandbox, including when
opened in a separate browser tab. Their scripts can't read the dashboard DOM,
storage, or authenticated API responses. Target cookies stay in a per-preview
server-side jar rather than being installed on the dashboard origin. Browser
storage, service workers, and some website login flows need the node's normal
browser context; use **Virtual display** for those checks.

The preview URL is a bearer access link. Anyone who obtains it can use it while
it remains valid. Keep it out of public issues, shared browser history, and
reverse-proxy access logs. Closing the tab releases its connections but doesn't
immediately revoke a copied link. Forward sessions expire after 15 minutes
without traffic; grant removal, account disable, subshell death, and node loss
also cut off affected access. Switching Web previews & screens off prevents new operations,
but isn't an emergency close for existing connections.

The server sees forwarded website bytes and browser frames. The node link is
encrypted, but this is not end-to-end encryption from your browser to the app.
Automatically discovered apps use loopback. Saved services can reach an explicit host from the node, with edit access and node opt-in required. HTTPS connections validate the destination certificate on the node. Saving a service does not expose a new public listener.
Edit access retains the execution account's authority over its local services;
port discovery isn't an OS isolation boundary.

Linux virtual displays use a private Xauthority file and a loopback-only RFB
listener. That RFB listener has no separate password, so other local users able
to reach it can control the screen. Don't enable virtual displays on a host
shared with untrusted local OS users. GUI apps and agents retain their normal
execution-account permissions.

Follow [Web previews & screens](/guides/preview) for setup and the
[preview architecture](/concepts/architecture#web-previews-and-virtual-displays) for the data path.

### Machine credentials

Credentials serve different purposes:
Expand Down
1 change: 1 addition & 0 deletions apps/docs/content/docs/guides/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"navigation",
"launch",
"ssh",
"preview",
"lifecycle",
"workspaces",
"clone",
Expand Down
Loading
Loading