Skip to content

feat(launcher): open agents from a transient stage page - #33

Merged
mxrsv merged 20 commits into
mainfrom
feat/deck-launch-page
Sep 18, 2026
Merged

mxrsv merged 20 commits into
mainfrom
feat/deck-launch-page

Conversation

@mxrsv

@mxrsv mxrsv commented Sep 18, 2026

Copy link
Copy Markdown
Owner

Opens agents from a compact launch page, puts an agent identity header above each pane, reworks the sidebar's top row, and moves the dark stage to neutral black. Carries the six earlier unpushed commits it depends on (Codex session pairing, the feedback backend, dev-launcher work), rebased onto main — git cherry showed 27 of the local commits were already on main under different SHAs and the rebase dropped them.

Review findings fixed here

  • A red test. app.test.tsx pinned onOpenWorkspace={openTaskBoard}, a prop that moved into the rail's legacy object. Repointed at the task-operation lock it was actually guarding.
  • A bare folder lost its actions menu. A folder git does not know renders as flat rows with no card to right-click, so once its New agent press opened the launch page, Open shell had no pointer route left. The create row now carries the gesture.
  • A favicon could read outside its workspace. The rail scans every project it draws with no user gesture; a repository shipping favicon.png as a symlink out of the tree handed those bytes to the renderer. Containment is now checked on the resolved path.
  • Neutral black stopped at the Electron window. The Tauri window config and the editor's fallback still carried #16161e.
  • Four launcher branches had no assertions — cancelled, the catch path, releaseStage, and the Run guard after a mid-flight close — plus no case closed a captured split's tab under the open page.
  • Smaller: a new lint error on the favicon effect, a user-facing "could not read the target folder" message the catch was swallowing, returnToBoard lost on a second open, and pending never reset by close().

Verification

  • npx tsc --noEmit — clean.
  • npx vitest run over 22 files covering everything touched — 459 passed.
  • npx oxlint src electron — no errors.
  • Not run: full npm test, npm run build, packaging, and any headed or native check.

Not included

docs/DESIGN-LANGUAGE.md carries only DL-32.6 and DL-32.7 here, because design-language.test.ts resolves every citation and the code in this PR cites them. The parallel pane-geometry work (DL-18.12, --stage-gutter, 06-stage-panes.css) stays out, and one hunk of 02-shell.css that depended on it was reverted on this branch.

https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg

Codex 0.154 repaints a startup spinner and a starfield behind its prompt
about twelve times a second for as long as the pane sits idle. Deck's
sustained-output heuristic reads that as a working agent, so every Codex
row showed the busy bars before the first prompt and kept them after the
last reply, and the tail store never re-asked because the pane's state
never changed (DECK-121).

`-c tui.animations=false` is Codex's own switch. Measured in the dev host
on the same pane: plain `codex` idle emits 149 chunks in 12 s and the rail
reads `working` from 2 s on, forever; with the flag it emits none, the
startup paint ends at 2.6 s and the rail reads `idle`. The flag rides on
the default command and on every resume form, and a `No idle animations`
toggle exposes it in Settings > Agents so the shipped command parses
without a remainder. The registry test now checks the bare form's binary
rather than the whole string.

Claude-Session: https://claude.ai/code/session_01VekypU5jZszKu4y1MLDDq8
electron-builder collects the production `dependencies` tree into app.asar
regardless of the `files` list, and the main process is tsc-compiled rather
than bundled, so every renderer package was shipped twice: once compiled into
`dist/assets` by Vite, and once as raw source under `node_modules`.

The compiled main process requires exactly `@sentry/electron/main`,
`electron-updater` and `node-pty` from node_modules (verified against
`dist-electron/**/*.cjs`, not just source), so the other twenty packages —
monaco-editor, mermaid, @phosphor-icons/react, @tauri-apps/*, @xterm/*,
preact, @preact/signals, marked — move to devDependencies. Vite still
resolves them at build time and CI installs with plain `npm ci`, so no
workflow changes.

devDependencies over `!node_modules/...` globs in `files`: mermaid alone
drags in 40+ d3-* packages plus cytoscape, katex and dompurify, and an
exclusion list would have to enumerate that transitive tree in three
electron-builder configs and stay correct as it moves.

Packaged app.asar 304 MB -> 61.13 MB; top-level node_modules entries
104 -> 25. The remainder is @sentry/electron's tree, which is a real
main-process runtime dependency and out of scope here.

DECK-93

Claude-Session: https://claude.ai/code/session_01Kwz7gcDn3eAPCAbRfPGsuV
Resolve open Codex writer locks in a bounded background batch. Require an
exact session fact for Codex tails and discard stale or guessed pairings.
Keep unsupported or unidentified panes blank until their own rollout exists.

Document the approved identity rule and existing no-animation default.
DECK-119; startup working indication remains a separate DECK-123 follow-up.

Claude-Session: 01a0b384-c473-7ac1-8632-8f927f9b27f7
Carry input provenance through queued PTY delivery and gate only Codex
output heuristics per generation. Preserve explicit signals and early input,
and use the guarded phase for tab busy state.

Refs: DECK-123
Claude-Session: 01a0b384-c473-7ac1-8632-8f927f9b27f7
The checkout create controls now open a compact launch page instead of the
actions menu. Run splits right beside a captured pane in that checkout, or
opens a first pane when it has no live tab; Back and Escape return without
creating a terminal. The page captures tab/pane identity before covering the
stage and revalidates it at every await, so a destination that closes mid
launch fails closed rather than spawning into a dead owner.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
A compact header carries the agent logo and the same latest message the
sidebar shows. Claude Code panes gain an Effort button that opens the CLI's
own model and effort picker through the pane's existing input callback; Deck
never submits a command, clears a draft, or claims a value was applied. Other
agents have no effort control.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
The top row now carries the collapse control on the left and the Deck logo,
name and running version on the right, separated from navigation by a
hairline, with New Workspace pinned above the scrolling project list
(DL-27.14). Project headers show the workspace favicon when one is available
and fall back to the folder icon otherwise. A local development build is
badged DEV, read off the host's isPackaged through the desktop environment.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
The default dark background becomes #0a0a0a with a pinned #141414 sidebar, so
the side columns separate from the pane while the chrome ladder stays dark
(DL-2.2). The Electron window's pre-render ground follows the same value, or
window-open and resize flash a colour the app never shows again. The former
blue-gray pin stays for backgrounds that still use it.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
An owner-requested layout study for the launch page, with every interaction
kept in local mock state so the section drives nothing in the app.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
The rail page documents the create controls' new route and what right-click
still owns; the terminal page documents launch-target capture, the commit
boundary and what a launch receipt does and does not promise.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
A folder git does not know renders as flat rows with no card box, so its
`New agent` row was the only trigger the actions menu had. Once that press
opened the launch page instead, `Open shell` and the menu's new-tab agents
had no pointer route left in that shape. The row now carries the right-click
the card carries.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
The rail scans every project it draws, with no user gesture, so a repository
shipping `favicon.png` as a symlink out of the tree handed any file the user
can read back to the renderer as image bytes. Containment is now checked on
the resolved path: a link that stays inside still works, one that leaves does
not, and a link planted higher up the candidate's own path is caught too.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
The dark stage moved to #0a0a0a but the Tauri window config and the editor's
own fallback still carried #16161e, so the Tauri host flashed the retired
colour on window open and resize. The legacy sidebar pin keeps a test of its
own: no preset reaches it any more, so deleting it turned nothing red.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
The store's cancelled branch, its catch, `releaseStage` and the Run guard
after a mid-flight close had no assertions, and no case closed a captured
split's tab under the open page. Each of those could have shipped a stranded
page or a pane docked beside a dead owner without turning a test red.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
DL-32.6 and DL-32.7 are cited from the launch page's treatment and the pane
header's, and `design-language.test.ts` resolves every citation to a declared
rule — so the code shipped here could not land without them.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
The sidebar commit swept in a hunk from a parallel pane-geometry change: it
drops the stage's left border because DL-18.12's gutter would paint the rail
surface on both sides. That gutter is not on this branch, so the line has to
stay or the rail and the stage meet with no boundary at all.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
@vercel

vercel Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
spacevibe-deck Ready Ready Preview Sep 18, 2026 5:10pm UTC

@coderabbitai

coderabbitai Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 131 files, which is 31 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 9205c567-626c-4dcc-a043-63bc6a3bcca8

📥 Commits

Reviewing files that changed from the base of the PR and between 442127c and af42735.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (131)
  • CHANGELOG.md
  • README.md
  • backend/README.md
  • backend/migrations/0003-feedback.sql
  • backend/src/contract.test.mjs
  • backend/src/feedback-auth.mjs
  • backend/src/feedback-mail.mjs
  • backend/src/feedback-payload.mjs
  • backend/src/feedback-repository.mjs
  • backend/src/feedback-routes.mjs
  • backend/src/feedback-sync.mjs
  • backend/src/feedback-webhook.mjs
  • backend/src/feedback.test.mjs
  • backend/src/linear-feedback.mjs
  • backend/src/runtime.test.mjs
  • backend/src/worker.mjs
  • backend/wrangler.jsonc
  • docs/DESIGN-LANGUAGE.md
  • docs/internals/agent-rail.md
  • docs/internals/terminal.md
  • docs/user/agents.md
  • electron/images.test.ts
  • electron/images.ts
  • electron/ipc/register-services.ts
  • electron/main.ts
  • electron/platform/codex-thread-locks.test.ts
  • electron/platform/codex-thread-locks.ts
  • electron/pty/info.test.ts
  • electron/pty/info.ts
  • electron/resume/codex.ts
  • electron/resume/session-tail.test.ts
  • electron/wire-contract.test.ts
  • marketing/landing-prototype/src/copy.js
  • marketing/landing-prototype/src/feedback-api.js
  • marketing/landing-prototype/src/feedback-api.test.js
  • marketing/landing-prototype/src/feedback-auth.js
  • marketing/landing-prototype/src/feedback-board-view.js
  • marketing/landing-prototype/src/feedback-controller.test.js
  • marketing/landing-prototype/src/feedback-demo.js
  • marketing/landing-prototype/src/feedback-draft.js
  • marketing/landing-prototype/src/feedback-form-view.js
  • marketing/landing-prototype/src/feedback-view.test.js
  • marketing/landing-prototype/src/feedback.js
  • marketing/landing-prototype/styles/feedback-board.css
  • marketing/public/privacy/2026-09-18/index.html
  • package.json
  • scripts/electron-dev-build.mjs
  • scripts/electron-dev-build.test.ts
  • scripts/electron-dev-launch.mjs
  • scripts/electron-dev-watch.mjs
  • scripts/electron-dev-watch.test.ts
  • src-tauri/tauri.conf.json
  • src/files/editor-host.ts
  • src/files/file-surface-controller.test.ts
  • src/files/file-surface-controller.ts
  • src/gallery/chrome-fixtures.tsx
  • src/gallery/section-registry.ts
  • src/gallery/sections/before-after-2026-09-18.tsx
  • src/gallery/sections/quick-agent-board.css
  • src/gallery/sections/quick-agent-board.tsx
  • src/launcher/agent-launch-page-store.test.ts
  • src/launcher/agent-launch-page-store.ts
  • src/launcher/agent-launch-page.css
  • src/launcher/agent-launch-page.test.tsx
  • src/launcher/agent-launch-page.tsx
  • src/lib/agent-effort.ts
  • src/lib/agent-resume.test.ts
  • src/lib/agents/agent-registry.test.ts
  • src/lib/agents/codex.ts
  • src/lib/derive-colors.test.ts
  • src/lib/derive-colors.ts
  • src/lib/platform.test.ts
  • src/lib/platform.ts
  • src/lib/process-info.ts
  • src/lib/theme-vars.ts
  • src/sessions/resume-session.test.ts
  • src/settings/themes.ts
  • src/styles/01-tokens.css
  • src/styles/02-shell.css
  • src/terminal/agent-activity.ts
  • src/terminal/agent-attention.codex.test.ts
  • src/terminal/agent-attention.test.ts
  • src/terminal/agent-attention.ts
  • src/terminal/agent-launch-target.test.ts
  • src/terminal/agent-launch-target.ts
  • src/terminal/agent-launch.test.ts
  • src/terminal/agent-launch.ts
  • src/terminal/pane-agent-header.css
  • src/terminal/pane-agent-header.test.tsx
  • src/terminal/pane-agent-header.tsx
  • src/terminal/pane-lifecycle.test.ts
  • src/terminal/pane-lifecycle.ts
  • src/terminal/pane-renderer.test.ts
  • src/terminal/pane.test.ts
  • src/terminal/pane.ts
  • src/terminal/pty-client.test.ts
  • src/terminal/pty-client.ts
  • src/terminal/session-restore.test.ts
  • src/terminal/session-tail-store.test.ts
  • src/terminal/session-tail-store.ts
  • src/terminal/tab-manager-types.ts
  • src/terminal/tab-manager.attention-tracker.test.ts
  • src/terminal/tab-manager.codex.test.ts
  • src/terminal/tab-manager.drop-agent-pane.test.ts
  • src/terminal/tab-manager.fixtures.ts
  • src/terminal/tab-manager.launch-agent-at-target.test.ts
  • src/terminal/tab-manager.overlay-guard.test.ts
  • src/terminal/tab-manager.ts
  • src/terminal/tab-materialize.ts
  • src/terminal/terminal-manager-types.ts
  • src/terminal/terminal-manager.test.ts
  • src/terminal/terminal-manager.ts
  • src/ui/agent-rail.test.tsx
  • src/ui/agent-rail.tsx
  • src/ui/app.test.tsx
  • src/ui/app.tsx
  • src/ui/attention-focus-coordinator.ts
  • src/ui/desktop-chrome.tsx
  • src/ui/repository-rail.tsx
  • src/ui/settings/launch-profile-editor.test.tsx
  • src/ui/sidebar-toggle.test.tsx
  • src/ui/sidebar-toggle.tsx
  • src/ui/stage-surface-strip.ts
  • src/ui/tab-bar.tsx
  • src/ui/tab-strip.test.tsx
  • src/ui/tab-strip.tsx
  • src/ui/worktree-card-menus.tsx
  • src/ui/worktree-card-strip.tsx
  • src/ui/worktree-card.test.tsx
  • src/ui/worktree-card.tsx
  • vercel.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Prettier, not lint: `npm run lint` reports 0 errors and 1119 pre-existing
warnings, and it was the format check alone that turned the run red.

Claude-Session: https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg
@mxrsv
mxrsv merged commit 623aa2d into main Sep 18, 2026
10 of 11 checks passed
@mxrsv
mxrsv deleted the feat/deck-launch-page branch September 18, 2026 17:18

This branch was successfully deployed

1 active deployment
Preview — af42735f Deployed Sep 18, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant