Repository navigation
Conversation
Keep remote window tabs in their own pane, allow scoped browser and file preview splits, and report the resolved remote file path on failure. Co-authored-by: Chanh Nguyen <channguyen@nvidia.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Remote tmux links could not create a browser or file preview beside the mirrored terminal, and the app excluded connected tmux workspaces from its saved session. This change opens previews in a shared local pane and reconnects saved remote workspaces to their existing tmux panes when the app reopens.
Changes
window-size latestand explicit focus/input handoff. Background geometry, reconnect replay and terminal protocol replies remain passive. Returning to cmux reclaims its current size even when dimensions are unchanged; native input or reported focus can reclaim a wider grid. Projected session panes and standalone window panes share the control mutation path. The running server enablesfocus-events; the globalwindow-sizedefault and tmux.conf remain unchanged. Selecting a cmux tab also changes the shared remote session's selected window.c7ac3bcd). Historical shell records still require explicit continuation. This follows the user's rule that a valid window binding should restore; the newer sizing work preserves the old running app and its agents.--tools '') through capture and replay.docs/ptmux-preview.md.Current sizing verification
4fe03a81d7. The legacy sizing regression was committed before the implementation (fac4378d3b→0911998ef6); it failed with six assertions against a real, isolated tmux 3.2a server before passing. An actual app projection then exposed a missing session-owner control path. Its test-only commitdd0ae277fdfailed four checks;cc9a5fcd4croutes session focus/text/key actions through the window owner./tmp/cmux-latest-sizing-session-final.xcresult; repeat:/tmp/cmux-latest-sizing-session-final-repeat.xcresult.-Lserver and cleans only its own server. An earlier forced-legacy run also passed with tmux 3.7c; the final session-owner follow-up was verified on the reported 3.2a server.surface.focuschecks on two remote windows: native 188 columns survives background resize; cmux focus reclaims 90; grow/shrink reaches 110 → 68; second-window focus and return both converge to 68. Every selected window's server grid equals its pushed viewport and every pane's rendered grid equals its assigned grid. A real native PTY focus-in then reclaims 188, and another projected cmux focus immediately reclaims unchanged 68. This uses API focus and actual AppKit frames, not a physical mouse drag. Records:/tmp/cmux-latest-sizing-runtime-results.jsonand/tmp/cmux-latest-sizing-runtime-native-focus.json. The disposable remote session and native peer were removed; only the owned test-mode app was stopped.git diff --checkpassed.4fe03a81d7, tagptmux-latest-sizing. The matching CLI reportscmux 0.64.25 (106) [4fe03a81d]; existing global CLI links were preserved. Build logs:/tmp/cmux-latest-sizing-final-tagged-build.logand/tmp/cmux-reload-ptmux-latest-sizing.log. This is local build/test evidence, not a claim that GitHub required CI or physical GUI dogfood passed./usr/bin/tmuxto expose its uniquely named disposable fixture; SSH transport, server, control protocol, AppKit geometry and Ghostty surfaces are real. No SSH keys/configuration or persistent ptmux registration is changed. Desktop automation reportedSky Computer Use native pipe startup failed; physical mouse dragging and screenshot/pixel review were not verified this turn. The existing old-tag app remains running; no user agent was deliberately terminated or migrated. This is a draft, not merged, and awaits user dogfood.Earlier verification (prior revisions)
Session open refused by peeron the already saturated terminal master, then the fixed fetcher downloaded the real PNG by absolute and relative paths with matching SHA-256. The production link-coordinator test also downloaded the PNG, placed the previews, and received HTTP 200 from the real web service. Both live checks executed. The new regression commit failed with the original error before the fix.RemoteTmuxSessionSnapshotTests,RemoteTmuxPreviewRoutingTests,RemoteTmuxMirrorLifecycleTests,TerminalRecoveryTests,DeferredAgentResumeIndexFallbackTests, andAgentRestoreLiveOwnerAdmissionTests.RestoreAdmissionRetryPolicyTestsrun passed four tests. The new transient-census test failed with the old nonretryable result before the fix; corrupt-store and live-owner behavior remain covered.RemoteTmuxPreviewIntegrationTests(executed, not skipped). The production terminal-link coordinator fetched the requested PNG with a matching SHA-256, forwarded the real localhost service with HTTP 200 and the expected TensorBoard content, and placed both previews in one local pane. Its uniquely named test tmux session was removed afterward.tests/test_build_app_bundled_resources.shpassed five cases. Earlier tagged app CLI help and config validation passed without a resource-path override.CLI/cmux.swift; manual diff review confirmed this fix changes only a predicate and comments, with no localization expressions changed. Focused Swift tests use English to accommodate two pre-existing bracket-shape assertions.The earlier standalone build and session-reopen checks below ran on
1f100fd690. The file-path build ran on1821c92f62. The SSH-channel follow-up was built on10f0189718; the earliersmallestwidth follow-up was on558f281da4, superseded by the latest-interaction implementation below. That earlier app was reopened. After a final app quit/reopen, the three isolated real Codex, Claude, and Grok CLI fixtures resumed automatically with their original session IDs and new process IDs. Codex displayed its original reply, Claude and Grok retained their original prompt histories, and the next saved snapshot classified all three as running agents. No new prompt was sent to make Codex restorable. The remote workspace also reattached to its original tmux pane without a connection command. These fixtures do not migrate the old-tag user's live sessions.The separately approved machine-specific SSH change allows only the designated preview destination and restricts reverse listeners; a different destination port remains denied. Private identity material, host coordinates, and session backups are not included in this PR. No v2 socket method or remote relay allowlist was added.
Browser separation follows the approach in manaflow-ai#9861; Chanh Nguyen is credited as a coauthor. This draft targets the customized fork branch.
Earlier preview and restore work: MochiSpindle (reservation pending at that handoff).
— OtterGauge · pending
Run: run_cmux_latest_size_0f15b5921db54edc8c6befde7157cd49
Session: 01a0e881-cd17-7892-927d-fcf86e1ad491
Intention: make legacy remote tmux sizing follow explicit focus/input while preserving live sessions.