-
Notifications
You must be signed in to change notification settings - Fork 246
fix: stabilize mobile remote session ui #564
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
jeffscottward
wants to merge
9
commits into
RunMaestro:main
Choose a base branch
from
jeffscottward:fix/mobile-remote-session-ux
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+1,495
−477
Open
Changes from 6 commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
37fdece
fix: scope mobile remote drafts
jeffscottward 1d772cf
fix: improve mobile remote composer
jeffscottward 777544c
fix: stabilize mobile remote session ui
jeffscottward 8113bc7
fix: restore node os import compatibility
jeffscottward 291d30e
fix: handle pty spawn failures
jeffscottward 17a94bf
fix: address mobile remote review feedback
jeffscottward 401bda3
fix: address mobile remote review issues
jeffscottward dab4476
docs: polish release note copy
jeffscottward d97b7cb
docs: normalize pre-release wording
jeffscottward File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| desktop-runtime.json | ||
| runtime-data/ | ||
| videos/ | ||
| bg-task.md |
214 changes: 214 additions & 0 deletions
214
dogfood-output/remote-session-mobile-20260312/desktop-setup.mjs
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,214 @@ | ||
| import { _electron as electron } from '@playwright/test'; | ||
| import fs from 'fs/promises'; | ||
| import path from 'path'; | ||
|
|
||
| const repoRoot = process.cwd(); | ||
| const outputDir = path.join(repoRoot, 'dogfood-output/remote-session-mobile-20260312'); | ||
| const screenshotDir = path.join(outputDir, 'screenshots'); | ||
| const runtimeDataDir = path.join(outputDir, 'runtime-data'); | ||
| const statePath = path.join(outputDir, 'desktop-runtime.json'); | ||
| const screenshotPath = path.join(screenshotDir, 'desktop-live-overlay.png'); | ||
| const appPath = path.join(repoRoot, 'dist/main/index.js'); | ||
| const workingDir = process.env.MAESTRO_WORKDIR || repoRoot; | ||
| const agentName = process.env.MAESTRO_AGENT_NAME || `Remote UX Audit ${Date.now()}`; | ||
|
|
||
| let app; | ||
|
|
||
| async function ensureDirs() { | ||
| await fs.mkdir(screenshotDir, { recursive: true }); | ||
| await fs.mkdir(runtimeDataDir, { recursive: true }); | ||
| } | ||
|
|
||
| async function writeState(patch) { | ||
| let current = {}; | ||
| try { | ||
| current = JSON.parse(await fs.readFile(statePath, 'utf8')); | ||
| } catch { | ||
| current = {}; | ||
| } | ||
|
|
||
| const next = { | ||
| ...current, | ||
| ...patch, | ||
| updatedAt: new Date().toISOString(), | ||
| }; | ||
|
|
||
| await fs.writeFile(statePath, `${JSON.stringify(next, null, 2)}\n`, 'utf8'); | ||
| } | ||
|
|
||
| async function closeInterstitials(page) { | ||
| const dismissButtons = [ | ||
| page.getByRole('button', { name: /^Skip$/i }), | ||
| page.getByRole('button', { name: /^Close$/i }), | ||
| page.getByRole('button', { name: /^Got it$/i }), | ||
| ]; | ||
|
|
||
| for (const button of dismissButtons) { | ||
| if (await button.isVisible().catch(() => false)) { | ||
| await button.click().catch(() => {}); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| async function launchApp() { | ||
| app = await electron.launch({ | ||
| args: [appPath], | ||
| env: { | ||
| ...process.env, | ||
| MAESTRO_DATA_DIR: runtimeDataDir, | ||
| ELECTRON_DISABLE_GPU: '1', | ||
| }, | ||
| timeout: 60000, | ||
| }); | ||
|
|
||
| const page = await app.firstWindow(); | ||
| await page.waitForLoadState('domcontentloaded'); | ||
| await page.waitForTimeout(2000); | ||
| await closeInterstitials(page); | ||
|
|
||
| return page; | ||
| } | ||
|
|
||
| async function openNewAgentModal(page) { | ||
| await page.keyboard.press('Meta+N'); | ||
| const heading = page.getByText('Create New Agent', { exact: true }); | ||
| await heading.waitFor({ state: 'visible', timeout: 15000 }); | ||
| return heading; | ||
| } | ||
|
|
||
| async function createCodexAgent(page) { | ||
| await openNewAgentModal(page); | ||
|
|
||
| const nameInput = page.getByLabel('Agent Name'); | ||
| await nameInput.fill(agentName); | ||
|
|
||
| const codexOption = page.getByRole('option', { name: /Codex/i }).first(); | ||
| await codexOption.waitFor({ state: 'visible', timeout: 15000 }); | ||
| await codexOption.click(); | ||
|
|
||
| const dirInput = page.getByLabel('Working Directory'); | ||
| await dirInput.fill(workingDir); | ||
|
|
||
| const riskCheckbox = page.getByLabel('I understand the risk and want to proceed'); | ||
| if (await riskCheckbox.isVisible().catch(() => false)) { | ||
| await riskCheckbox.check(); | ||
| } | ||
|
|
||
| const createButton = page.getByRole('button', { name: 'Create Agent' }).last(); | ||
| await createButton.waitFor({ state: 'visible', timeout: 15000 }); | ||
| await createButton.click(); | ||
|
|
||
| await page.getByText('Create New Agent', { exact: true }).waitFor({ | ||
| state: 'hidden', | ||
| timeout: 30000, | ||
| }); | ||
|
|
||
| await page.getByText(agentName, { exact: false }).first().waitFor({ | ||
| state: 'visible', | ||
| timeout: 30000, | ||
| }); | ||
| } | ||
|
|
||
| async function openLiveOverlay(page) { | ||
| const toggle = page.getByRole('button', { name: /^(LIVE|OFFLINE)$/i }).first(); | ||
| await toggle.waitFor({ state: 'visible', timeout: 20000 }); | ||
| await toggle.click(); | ||
| await page.getByText('Remote Control', { exact: true }).waitFor({ | ||
| state: 'visible', | ||
| timeout: 20000, | ||
| }); | ||
| } | ||
|
|
||
| async function enableRemoteControl(page) { | ||
| const remoteToggle = page.locator( | ||
| 'button[title="Enable remote control"], button[title="Disable remote control"]' | ||
| ); | ||
| await remoteToggle.first().waitFor({ state: 'visible', timeout: 20000 }); | ||
| const title = await remoteToggle.first().getAttribute('title'); | ||
| if (title === 'Enable remote control') { | ||
| await remoteToggle.first().click(); | ||
| } | ||
|
|
||
| // Required by the user: wait 30 seconds after enabling remote access. | ||
| await page.waitForTimeout(30000); | ||
|
|
||
| await page | ||
| .locator('[title*="trycloudflare.com"]') | ||
| .first() | ||
| .waitFor({ state: 'visible', timeout: 30000 }); | ||
| } | ||
|
|
||
| async function readUrls(page) { | ||
| const localUrl = await page.evaluate(() => window.maestro.live.getDashboardUrl()); | ||
| const remoteUrl = await page | ||
| .locator('[title*="trycloudflare.com"]') | ||
| .first() | ||
| .getAttribute('title'); | ||
| return { localUrl, remoteUrl }; | ||
| } | ||
|
|
||
| async function heartbeat(page) { | ||
| while (true) { | ||
| const url = page.url(); | ||
| await writeState({ heartbeatUrl: url, heartbeatAt: new Date().toISOString() }); | ||
| await new Promise((resolve) => setTimeout(resolve, 5000)); | ||
| } | ||
| } | ||
|
|
||
| async function main() { | ||
| await ensureDirs(); | ||
| await writeState({ | ||
| status: 'starting', | ||
| agentName, | ||
| workingDir, | ||
| appPath, | ||
| runtimeDataDir, | ||
| }); | ||
|
|
||
| const page = await launchApp(); | ||
| await writeState({ status: 'app-launched' }); | ||
|
|
||
| await createCodexAgent(page); | ||
| await writeState({ status: 'agent-created' }); | ||
|
|
||
| await openLiveOverlay(page); | ||
| await writeState({ status: 'live-overlay-open' }); | ||
|
|
||
| await enableRemoteControl(page); | ||
| const { localUrl, remoteUrl } = await readUrls(page); | ||
|
|
||
| await page.screenshot({ path: screenshotPath, fullPage: true }); | ||
|
|
||
| await writeState({ | ||
| status: 'ready', | ||
| localUrl, | ||
| remoteUrl, | ||
| screenshotPath, | ||
| }); | ||
|
|
||
| console.log(`[desktop-setup] agentName=${agentName}`); | ||
| console.log(`[desktop-setup] localUrl=${localUrl}`); | ||
| console.log(`[desktop-setup] remoteUrl=${remoteUrl}`); | ||
| console.log(`[desktop-setup] screenshot=${screenshotPath}`); | ||
|
|
||
| await heartbeat(page); | ||
| } | ||
|
|
||
| async function cleanup(exitCode = 0) { | ||
| if (app) { | ||
| await app.close().catch(() => {}); | ||
| } | ||
| process.exit(exitCode); | ||
| } | ||
|
|
||
| process.on('SIGINT', () => void cleanup(0)); | ||
| process.on('SIGTERM', () => void cleanup(0)); | ||
|
|
||
| main().catch(async (error) => { | ||
| await writeState({ | ||
| status: 'error', | ||
| error: error instanceof Error ? error.stack || error.message : String(error), | ||
| }); | ||
| console.error('[desktop-setup] failed', error); | ||
| await cleanup(1); | ||
| }); |
160 changes: 160 additions & 0 deletions
160
dogfood-output/remote-session-mobile-20260312/report.md
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,160 @@ | ||
| # Dogfood Report: Maestro Remote Control | ||
|
|
||
| | Field | Value | | ||
| | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | ||
| | **Date** | 2026-03-12 | | ||
| | **App URL** | [REDACTED_TUNNEL_URL] | | ||
| | **Session** | Remote UX Audit 1773336790326 | | ||
| | **Scope** | Mobile-first audit of remote session start, AI/CLI switching, response visibility, text input ergonomics, and tablet responsive behavior | | ||
|
|
||
| ## Summary | ||
|
|
||
| ### Original Findings | ||
|
|
||
| | Severity | Count | | ||
| | --------- | ----- | | ||
| | Critical | 0 | | ||
| | High | 3 | | ||
| | Medium | 0 | | ||
| | Low | 0 | | ||
| | **Total** | **3** | | ||
|
|
||
| ### Current Retest Status On `7cfaded1` | ||
|
|
||
| | Status | Count | | ||
| | ------------------------------------------------ | ----- | | ||
| | Open High Issues | 1 | | ||
| | Previously Reported Issues No Longer Reproducing | 2 | | ||
| | **Open Total** | **1** | | ||
|
|
||
| ### Retest Coverage | ||
|
|
||
| - Phone: reproduced long-draft composer clipping; confirmed AI-to-CLI isolates buffers; confirmed AI draft restores after CLI-to-AI; confirmed session picker no longer leaks draft into another session. | ||
| - Tablet/iPad size: long draft remained readable and contained. Evidence: `screenshots/tablet-audit-long-draft-current.png` | ||
| - Wide desktop-like size: long draft remained readable and contained. Evidence: `screenshots/wide-audit-long-draft-current-2.png` | ||
|
|
||
| ### Post-Fix Verification | ||
|
|
||
| | Status | Count | | ||
| | -------------------------------- | ----- | | ||
| | Open Issues In Retested Scope | 0 | | ||
| | Verified Fixed Issues | 1 | | ||
| | Verified Previously Fixed Issues | 2 | | ||
| | **Open Total After Fixes** | **0** | | ||
|
|
||
| - Rebuilt the web bundle, restarted the PM2-backed Maestro app, and re-ran the LIVE overlay remote flow until `desktop-runtime.json` returned `status: "ready"` with the fresh Cloudflare tunnel. | ||
| - Phone: | ||
| - Long draft is now readable in a full-width stacked composer. Evidence: `screenshots/phone-verify-expanded-draft-postfix.png` | ||
| - AI-to-CLI switch presents a clean shell input. Evidence: `screenshots/phone-verify-cli-after-toggle-final.png` | ||
| - CLI `pwd` output is visible in the remote UI. Evidence: `screenshots/phone-verify-cli-pwd-output-final.png` | ||
| - CLI-to-AI restores the pending AI draft. Evidence: `screenshots/phone-verify-back-to-ai-restored-final.png` | ||
| - Real AI factoid response arrived: `What is the capital of Peru?` -> `Lima`. Evidence: `screenshots/phone-verify-ai-factoid-response-final.png` | ||
| - Tablet/iPad size remained readable after the phone-only fix. Evidence: `screenshots/tablet-verify-long-draft-final.png` | ||
| - Wide desktop-like size remained readable after the phone-only fix. Evidence: `screenshots/wide-verify-long-draft-final.png` | ||
|
|
||
| ## Issues | ||
|
|
||
| <!-- Copy this block for each issue found. Interactive issues need video + step-by-step screenshots. Static issues (typos, visual glitches) only need a single screenshot -- set Repro Video to N/A. --> | ||
|
|
||
| ### ISSUE-001: Phone AI composer collapses into a clipped vertical strip for normal-length drafts | ||
|
|
||
| | Field | Value | | ||
| | ------------------------------- | --------------------- | | ||
| | **Severity** | high | | ||
| | **Category** | ux | | ||
| | **URL** | [REDACTED_TUNNEL_URL] | | ||
| | **Repro Video** | N/A | | ||
| | **Retest Status On `7cfaded1`** | still reproducible | | ||
|
|
||
| **Description** | ||
|
|
||
| On iPhone-sized viewports, the fixed bottom AI composer becomes too narrow once the user types a realistic prompt. The text wraps inside words, the top of the field is clipped out of view, and the user can only see the bottom portion of the draft. Expected: the main input stays readable and fully contained while growing. Actual: the input collapses into a thin, partially hidden column that makes phone prompting impractical. | ||
|
|
||
| **Repro Steps** | ||
|
|
||
| 1. Open the remote dashboard on an iPhone-sized viewport and select an AI session. | ||
|  | ||
|
|
||
| 2. Type a normal multi-clause prompt into the AI composer. | ||
|  | ||
|
|
||
| **Current Retest Notes** | ||
|
|
||
| - The exact class of bug still reproduces on the current branch when the phone composer contains a realistic unsent draft. The field no longer collapses into the original razor-thin strip, but it still anchors too low and clips the visible draft so only the lower portion is readable. | ||
| - Current evidence: | ||
| - `screenshots/phone-audit-long-draft-current.png` | ||
| - `screenshots/phone-audit-back-to-ai-current.png` | ||
|
|
||
| **Post-Fix Verification** | ||
|
|
||
| - No longer reproducible in the working tree after switching the phone layout to a width-based stacked composer path. | ||
| - Current evidence: | ||
| - `screenshots/phone-verify-expanded-draft-postfix.png` | ||
| - `screenshots/phone-verify-back-to-ai-restored-final.png` | ||
|
|
||
| --- | ||
|
|
||
| ### ISSUE-002: Switching from AI-to-CLI reuses the unsent AI draft as a shell command | ||
|
|
||
| | Field | Value | | ||
| | ------------------------------- | --------------------- | | ||
| | **Severity** | high | | ||
| | **Category** | functional | | ||
| | **URL** | [REDACTED_TUNNEL_URL] | | ||
| | **Repro Video** | N/A | | ||
| | **Retest Status On `7cfaded1`** | not reproducible | | ||
|
|
||
| **Description** | ||
|
|
||
| The mobile mode toggle carries the exact unsent AI draft into terminal mode instead of isolating AI and CLI buffers. Expected: switching to CLI should present an empty shell prompt or a terminal-specific draft buffer. Actual: the prior AI prompt instantly becomes terminal input, which creates a real risk of accidentally executing natural-language text as a shell command. | ||
|
|
||
| **Repro Steps** | ||
|
|
||
| 1. In AI mode, type an unsent natural-language draft. | ||
|  | ||
|
|
||
| 2. Tap the AI/CLI mode toggle. | ||
|  | ||
|
|
||
| **Current Retest Notes** | ||
|
|
||
| - On the current branch, switching from AI-to-CLI presents a clean shell input instead of reusing the unsent AI draft. | ||
| - Switching back from CLI-to-AI restores the original AI draft for that session. | ||
| - Current evidence: | ||
| - `screenshots/phone-audit-after-cli-switch-current.png` | ||
| - `screenshots/phone-audit-back-to-ai-current.png` | ||
|
|
||
| --- | ||
|
|
||
| ### ISSUE-003: Switching sessions carries the unsent draft into the newly selected session | ||
|
|
||
| | Field | Value | | ||
| | ------------------------------- | ------------------------------------------------ | | ||
| | **Severity** | high | | ||
| | **Category** | functional | | ||
| | **URL** | [REDACTED_TUNNEL_URL] | | ||
| | **Repro Video** | N/A | | ||
| | **Retest Status On `7cfaded1`** | not reproducible via current session picker flow | | ||
|
|
||
| **Description** | ||
|
|
||
| The mobile composer state is not scoped to the selected session. Expected: when the user switches to a different session, they should see that session's own draft state or an empty composer. Actual: the previous session's unsent draft appears unchanged in the next session, making it easy to send the wrong prompt to the wrong agent. | ||
|
|
||
| **Repro Steps** | ||
|
|
||
| 1. In one AI session, type an unsent draft. | ||
|  | ||
|
|
||
| 2. Tap another session in the session strip. | ||
|  | ||
|
|
||
| **Current Retest Notes** | ||
|
|
||
| - Using the current `All Agents` picker, switching to another session no longer carries the unsent draft into the newly selected session. | ||
| - Returning to the original session restores the original draft. | ||
| - Current evidence: | ||
| - `screenshots/phone-audit-search-menu-current.png` | ||
| - `screenshots/phone-audit-after-picker-switch-current.png` | ||
| - `screenshots/phone-audit-draft-restored-after-picker-current.png` | ||
|
|
||
| --- | ||
Binary file added
BIN
+326 KB
dogfood-output/remote-session-mobile-20260312/screenshots/desktop-live-overlay.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+92.3 KB
...emote-session-mobile-20260312/screenshots/issue-001-phone-composer-overflow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+87.1 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-ai-response.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+90 KB
...te-session-mobile-20260312/screenshots/phone-audit-after-cli-switch-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+76.7 KB
...session-mobile-20260312/screenshots/phone-audit-after-picker-switch-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+106 KB
...t/remote-session-mobile-20260312/screenshots/phone-audit-back-to-ai-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+93.3 KB
...tput/remote-session-mobile-20260312/screenshots/phone-audit-current-initial.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+105 KB
...mobile-20260312/screenshots/phone-audit-draft-restored-after-picker-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+107 KB
...t/remote-session-mobile-20260312/screenshots/phone-audit-long-draft-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+22.2 KB
...tput/remote-session-mobile-20260312/screenshots/phone-audit-offline-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+22.2 KB
.../remote-session-mobile-20260312/screenshots/phone-audit-reconnected-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+158 KB
.../remote-session-mobile-20260312/screenshots/phone-audit-search-menu-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+105 KB
...mote-session-mobile-20260312/screenshots/phone-audit-switch-session-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+19.7 KB
...ut/remote-session-mobile-20260312/screenshots/phone-audit-tap-focus-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+20 KB
...emote-session-mobile-20260312/screenshots/phone-audit-tap-then-fill-current.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+92.2 KB
...utput/remote-session-mobile-20260312/screenshots/phone-back-to-ai-after-cli.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+130 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-clean-cli-pwd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+81.7 KB
...t/remote-session-mobile-20260312/screenshots/phone-clean-session-back-to-ai.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+133 KB
...-output/remote-session-mobile-20260312/screenshots/phone-cli-output-settled.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+133 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-cli-pwd-output.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+5.66 KB
...od-output/remote-session-mobile-20260312/screenshots/phone-fixed-after-wait.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+76.9 KB
.../remote-session-mobile-20260312/screenshots/phone-fixed-ai-factoid-response.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+112 KB
...emote-session-mobile-20260312/screenshots/phone-fixed-back-to-ai-with-draft.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+176 KB
...utput/remote-session-mobile-20260312/screenshots/phone-fixed-cli-pwd-output.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+97.7 KB
...e-session-mobile-20260312/screenshots/phone-fixed-draft-restored-via-picker.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added
BIN
+77.3 KB
...utput/remote-session-mobile-20260312/screenshots/phone-fixed-draft-restored.png
Oops, something went wrong.
Binary file added
BIN
+5.63 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-fixed-initial.png
Oops, something went wrong.
Binary file added
BIN
+23.8 KB
...utput/remote-session-mobile-20260312/screenshots/phone-fixed-long-draft-390.png
Oops, something went wrong.
Binary file added
BIN
+84.7 KB
...ut/remote-session-mobile-20260312/screenshots/phone-fixed-long-draft-device.png
Oops, something went wrong.
Binary file added
BIN
+94.5 KB
...put/remote-session-mobile-20260312/screenshots/phone-fixed-long-draft-touch.png
Oops, something went wrong.
Binary file added
BIN
+39.2 KB
...od-output/remote-session-mobile-20260312/screenshots/phone-fixed-long-draft.png
Oops, something went wrong.
Binary file added
BIN
+57.9 KB
...mote-session-mobile-20260312/screenshots/phone-fixed-switch-session-no-leak.png
Oops, something went wrong.
Binary file added
BIN
+77.3 KB
...e-session-mobile-20260312/screenshots/phone-fixed-switch-session-via-picker.png
Oops, something went wrong.
Binary file added
BIN
+88.8 KB
...emote-session-mobile-20260312/screenshots/phone-fixed-terminal-after-switch.png
Oops, something went wrong.
Binary file added
BIN
+34.7 KB
...t/remote-session-mobile-20260312/screenshots/phone-fixed-verification-start.png
Oops, something went wrong.
Binary file added
BIN
+57.9 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-history-open.png
Oops, something went wrong.
Binary file added
BIN
+76.8 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-initial.png
Oops, something went wrong.
Binary file added
BIN
+92.3 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-long-draft.png
Oops, something went wrong.
Binary file added
BIN
+98.1 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-offline-banner.png
Oops, something went wrong.
Binary file added
BIN
+77.1 KB
dogfood-output/remote-session-mobile-20260312/screenshots/phone-reconnected.png
Oops, something went wrong.
Binary file added
BIN
+88.8 KB
...e-session-mobile-20260312/screenshots/phone-switch-other-session-with-draft.png
Oops, something went wrong.
Binary file added
BIN
+87.9 KB
...tput/remote-session-mobile-20260312/screenshots/phone-terminal-after-switch.png
Oops, something went wrong.
Binary file added
BIN
+76.8 KB
...te-session-mobile-20260312/screenshots/phone-verify-after-blur-eval-postfix.png
Oops, something went wrong.
Binary file added
BIN
+74.5 KB
...-mobile-20260312/screenshots/phone-verify-after-short-draft-refresh-postfix.png
Oops, something went wrong.
Binary file added
BIN
+93.3 KB
.../remote-session-mobile-20260312/screenshots/phone-verify-after-wait-postfix.png
Oops, something went wrong.
Binary file added
BIN
+96.8 KB
...-session-mobile-20260312/screenshots/phone-verify-ai-factoid-response-final.png
Oops, something went wrong.
Binary file added
BIN
+86.9 KB
...-session-mobile-20260312/screenshots/phone-verify-back-to-ai-restored-final.png
Oops, something went wrong.
Binary file added
BIN
+74.5 KB
...ession-mobile-20260312/screenshots/phone-verify-cli-after-js-toggle-postfix.png
Oops, something went wrong.
Binary file added
BIN
+76.8 KB
...e-session-mobile-20260312/screenshots/phone-verify-cli-after-switch-postfix.png
Oops, something went wrong.
Binary file added
BIN
+74.5 KB
...sion-mobile-20260312/screenshots/phone-verify-cli-after-toggle-eval-postfix.png
Oops, something went wrong.
Binary file added
BIN
+89.4 KB
...ote-session-mobile-20260312/screenshots/phone-verify-cli-after-toggle-final.png
Oops, something went wrong.
Binary file added
BIN
+74.5 KB
...t/remote-session-mobile-20260312/screenshots/phone-verify-cli-empty-postfix.png
Oops, something went wrong.
Binary file added
BIN
+131 KB
...emote-session-mobile-20260312/screenshots/phone-verify-cli-pwd-output-final.png
Oops, something went wrong.
Binary file added
BIN
+74.5 KB
...emote-session-mobile-20260312/screenshots/phone-verify-cli-via-eval-postfix.png
Oops, something went wrong.
Binary file added
BIN
+140 KB
...ssion-mobile-20260312/screenshots/phone-verify-collapsed-after-blur-postfix.png
Oops, something went wrong.
Binary file added
BIN
+140 KB
...ote-session-mobile-20260312/screenshots/phone-verify-expanded-draft-postfix.png
Oops, something went wrong.
Binary file added
BIN
+19.7 KB
...put/remote-session-mobile-20260312/screenshots/phone-verify-initial-postfix.png
Oops, something went wrong.
Binary file added
BIN
+90.1 KB
...emote-session-mobile-20260312/screenshots/phone-verify-long-draft-postfix-2.png
Oops, something went wrong.
Binary file added
BIN
+107 KB
.../remote-session-mobile-20260312/screenshots/phone-verify-long-draft-postfix.png
Oops, something went wrong.
Binary file added
BIN
+184 KB
...remote-session-mobile-20260312/screenshots/phone-verify-search-open-postfix.png
Oops, something went wrong.
Binary file added
BIN
+184 KB
...on-mobile-20260312/screenshots/phone-verify-search-open-short-draft-postfix.png
Oops, something went wrong.
Binary file added
BIN
+74.5 KB
...ion-mobile-20260312/screenshots/phone-verify-short-draft-before-cli-postfix.png
Oops, something went wrong.
Binary file added
BIN
+76.8 KB
...mote-session-mobile-20260312/screenshots/phone-verify-terminal-mode-postfix.png
Oops, something went wrong.
Binary file added
BIN
+36.6 KB
...put/remote-session-mobile-20260312/screenshots/tablet-audit-current-initial.png
Oops, something went wrong.
Binary file added
BIN
+49.7 KB
.../remote-session-mobile-20260312/screenshots/tablet-audit-long-draft-current.png
Oops, something went wrong.
Binary file added
BIN
+34.9 KB
dogfood-output/remote-session-mobile-20260312/screenshots/tablet-initial.png
Oops, something went wrong.
Binary file added
BIN
+41.2 KB
dogfood-output/remote-session-mobile-20260312/screenshots/tablet-long-draft.png
Oops, something went wrong.
Binary file added
BIN
+49.7 KB
...t/remote-session-mobile-20260312/screenshots/tablet-verify-long-draft-final.png
Oops, something went wrong.
Binary file added
BIN
+48.6 KB
.../remote-session-mobile-20260312/screenshots/wide-audit-long-draft-current-2.png
Oops, something went wrong.
Binary file added
BIN
+37.6 KB
...ut/remote-session-mobile-20260312/screenshots/wide-audit-long-draft-current.png
Oops, something went wrong.
Binary file added
BIN
+40.8 KB
dogfood-output/remote-session-mobile-20260312/screenshots/wide-long-draft.png
Oops, something went wrong.
Binary file added
BIN
+48.7 KB
...put/remote-session-mobile-20260312/screenshots/wide-verify-long-draft-final.png
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.