From 2050fa87a04672dadaf29a4db96619b2519aa032 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Fri, 8 May 2026 13:52:08 -0700 Subject: [PATCH] feat(source-control): send all notes to agent in a new terminal tab (#1568) Co-authored-by: Orca --- mobile/app/terminal-settings.tsx | 13 +- .../mobile-subscribe-integration.test.ts | 15 +- src/main/runtime/orca-runtime.ts | 6 +- src/renderer/src/assets/main.css | 4 +- .../right-sidebar/SourceControl.tsx | 44 +++++- .../src/components/settings/MobilePane.tsx | 6 +- .../components/tab-bar/QuickLaunchButton.tsx | 29 +++- .../src/components/tab-bar/TabBar.tsx | 2 + .../TabBar.windows-shell-launch.test.ts | 3 + .../src/lib/launch-agent-in-new-tab.ts | 133 ++++++++++++++---- src/shared/telemetry-events.ts | 14 +- 11 files changed, 202 insertions(+), 67 deletions(-) diff --git a/mobile/app/terminal-settings.tsx b/mobile/app/terminal-settings.tsx index be519d2d5..abcf324a8 100644 --- a/mobile/app/terminal-settings.tsx +++ b/mobile/app/terminal-settings.tsx @@ -153,16 +153,13 @@ export default function TerminalSettingsScreen() { Terminal - + WHEN YOU LEAVE THE APP - While you're using a terminal on your phone, Orca shrinks it to fit your - screen. When you close the app or switch away, this controls whether it stays at - phone size (so interactive CLI tools don't reflow) or resizes back to your - desktop. You can always tap Restore on the terminal banner to resize it manually. + While you're using a terminal on your phone, Orca shrinks it to fit your screen. When + you close the app or switch away, this controls whether it stays at phone size (so + interactive CLI tools don't reflow) or resizes back to your desktop. You can always + tap Restore on the terminal banner to resize it manually. {hosts.length === 0 ? ( diff --git a/src/main/runtime/mobile-subscribe-integration.test.ts b/src/main/runtime/mobile-subscribe-integration.test.ts index f40b616cd..ffb6d2e1c 100644 --- a/src/main/runtime/mobile-subscribe-integration.test.ts +++ b/src/main/runtime/mobile-subscribe-integration.test.ts @@ -742,10 +742,7 @@ describe('mobile subscribe integration', () => { rows: 20 }) expect(runtime.isMobileSubscriberActive('pty-1'), `iter ${i}: no subscribers`).toBe(false) - expect( - runtime.getTerminalFitOverride('pty-1'), - `iter ${i}: override held` - ).not.toBeNull() + expect(runtime.getTerminalFitOverride('pty-1'), `iter ${i}: override held`).not.toBeNull() // Desktop clicks Restore — held-override branch. const ok = await runtime.reclaimTerminalForDesktop('pty-1') @@ -754,10 +751,7 @@ describe('mobile subscribe integration', () => { cols: 150, rows: 40 }) - expect( - runtime.getTerminalFitOverride('pty-1'), - `iter ${i}: override cleared` - ).toBeNull() + expect(runtime.getTerminalFitOverride('pty-1'), `iter ${i}: override cleared`).toBeNull() } }) @@ -778,10 +772,7 @@ describe('mobile subscribe integration', () => { cols: 150, rows: 40 }) - expect( - runtime.getTerminalFitOverride('pty-1'), - `iter ${i}: override cleared` - ).toBeNull() + expect(runtime.getTerminalFitOverride('pty-1'), `iter ${i}: override cleared`).toBeNull() } }) diff --git a/src/main/runtime/orca-runtime.ts b/src/main/runtime/orca-runtime.ts index ed6cfb719..779f502a6 100644 --- a/src/main/runtime/orca-runtime.ts +++ b/src/main/runtime/orca-runtime.ts @@ -2631,11 +2631,7 @@ export class OrcaRuntimeService { // hidden tab on desktop, container went 0×0 → 1782×1195) reports // different dims and is the right baseline to remember. const activeOverride = this.terminalFitOverrides.get(ptyId) - if ( - activeOverride && - activeOverride.cols === cols && - activeOverride.rows === rows - ) { + if (activeOverride && activeOverride.cols === cols && activeOverride.rows === rows) { return } this.refreshRendererGeometry(ptyId, cols, rows) diff --git a/src/renderer/src/assets/main.css b/src/renderer/src/assets/main.css index 9a3c01c59..375ee3a46 100644 --- a/src/renderer/src/assets/main.css +++ b/src/renderer/src/assets/main.css @@ -445,7 +445,9 @@ border: none; color: var(--muted-foreground); cursor: pointer; - transition: background 100ms, color 100ms; + transition: + background 100ms, + color 100ms; } .window-controls-btn:hover { diff --git a/src/renderer/src/components/right-sidebar/SourceControl.tsx b/src/renderer/src/components/right-sidebar/SourceControl.tsx index bff1c0e57..170c02e0b 100644 --- a/src/renderer/src/components/right-sidebar/SourceControl.tsx +++ b/src/renderer/src/components/right-sidebar/SourceControl.tsx @@ -23,6 +23,7 @@ import { GitPullRequestArrow, MessageSquare, Pencil, + Send, Trash, TriangleAlert, CircleCheck, @@ -79,6 +80,8 @@ import { } from '@/components/ui/dialog' import { BaseRefPicker } from '@/components/settings/BaseRefPicker' import { formatDiffComment, formatDiffComments } from '@/lib/diff-comments-format' +import { QuickLaunchAgentMenuItems } from '@/components/tab-bar/QuickLaunchButton' +import { focusTerminalTabSurface } from '@/lib/focus-terminal-tab-surface' import { notifyEditorExternalFileChange, requestEditorSaveQuiesce @@ -180,6 +183,9 @@ function SourceControlInner(): React.JSX.Element { const commitInFlightRef = useRef>({}) const activeWorktree = useActiveWorktree() const activeWorktreeId = useAppStore((s) => s.activeWorktreeId) + const activeGroupId = useAppStore((s) => + activeWorktreeId ? s.activeGroupIdByWorktree[activeWorktreeId] : undefined + ) const worktreeMap = useWorktreeMap() const rightSidebarTab = useAppStore((s) => s.rightSidebarTab) const activeRepo = useRepoById(activeWorktree?.repoId ?? null) @@ -229,6 +235,10 @@ function SourceControlInner(): React.JSX.Element { } return map }, [diffCommentsForActive]) + const diffCommentsPrompt = useMemo( + () => formatDiffComments(diffCommentsForActive), + [diffCommentsForActive] + ) const [diffCommentsExpanded, setDiffCommentsExpanded] = useState(false) const [diffCommentsCopied, setDiffCommentsCopied] = useState(false) @@ -236,15 +246,14 @@ function SourceControlInner(): React.JSX.Element { if (diffCommentsForActive.length === 0) { return } - const text = formatDiffComments(diffCommentsForActive) try { - await window.api.ui.writeClipboardText(text) + await window.api.ui.writeClipboardText(diffCommentsPrompt) setDiffCommentsCopied(true) } catch { // Why: swallow — clipboard write can fail when the window isn't focused. // No dedicated error surface is warranted for a best-effort copy action. } - }, [diffCommentsForActive]) + }, [diffCommentsForActive, diffCommentsPrompt]) // Why: auto-dismiss the "copied" indicator so the button returns to its // default icon after a brief confirmation window. @@ -1268,6 +1277,35 @@ function SourceControlInner(): React.JSX.Element { )} + + + + + + + + + + Send notes to a new agent + + + + + + + {diffCommentCount > 0 && ( diff --git a/src/renderer/src/components/settings/MobilePane.tsx b/src/renderer/src/components/settings/MobilePane.tsx index 4ccbac921..f1b667732 100644 --- a/src/renderer/src/components/settings/MobilePane.tsx +++ b/src/renderer/src/components/settings/MobilePane.tsx @@ -309,9 +309,9 @@ export function MobilePane(): React.JSX.Element {

While you're using a terminal on your phone, Orca shrinks it to fit your phone - screen. When you close the app or switch away, this controls whether it stays at - phone size (so interactive CLI tools don't reflow) or resizes back to your - desktop. You can always click Restore on the terminal banner to resize it manually. + screen. When you close the app or switch away, this controls whether it stays at phone + size (so interactive CLI tools don't reflow) or resizes back to your desktop. You can + always click Restore on the terminal banner to resize it manually.