feat(launcher): open agents from a transient stage page - #33
Conversation
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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedToo 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 configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (1)
📒 Files selected for processing (131)
You can disable this status message by setting the 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. Comment |
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
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 cherryshowed 27 of the local commits were already onmainunder different SHAs and the rebase dropped them.Review findings fixed here
app.test.tsxpinnedonOpenWorkspace={openTaskBoard}, a prop that moved into the rail'slegacyobject. Repointed at the task-operation lock it was actually guarding.New agentpress opened the launch page,Open shellhad no pointer route left. The create row now carries the gesture.favicon.pngas a symlink out of the tree handed those bytes to the renderer. Containment is now checked on the resolved path.#16161e.releaseStage, and the Run guard after a mid-flight close — plus no case closed a captured split's tab under the open page.returnToBoardlost on a second open, andpendingnever reset byclose().Verification
npx tsc --noEmit— clean.npx vitest runover 22 files covering everything touched — 459 passed.npx oxlint src electron— no errors.npm test,npm run build, packaging, and any headed or native check.Not included
docs/DESIGN-LANGUAGE.mdcarries only DL-32.6 and DL-32.7 here, becausedesign-language.test.tsresolves 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 of02-shell.cssthat depended on it was reverted on this branch.https://claude.ai/code/session_01W23vsqgnf3JLzxUoKvVdcg