diff --git a/src/renderer/src/lib/launch-agent-in-new-tab-windows-quoting.test.ts b/src/renderer/src/lib/launch-agent-in-new-tab-windows-quoting.test.ts index 4d91f86a632..63053e0e90a 100644 --- a/src/renderer/src/lib/launch-agent-in-new-tab-windows-quoting.test.ts +++ b/src/renderer/src/lib/launch-agent-in-new-tab-windows-quoting.test.ts @@ -3,6 +3,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' +const mockIsWebRuntimeSessionActive = vi.fn(() => false) +const mockCreateWebRuntimeAgentSessionTerminal = vi.fn() +const mockCreateWebRuntimeAgentSessionTerminalWithLaunchDraft = vi.fn() const mockCreateTab = vi.fn() const mockQueueTabStartupCommand = vi.fn() const mockPasteDraftWhenAgentReady = vi.fn() @@ -102,13 +105,21 @@ vi.mock('@/lib/telemetry', () => ({ vi.mock('@/runtime/web-runtime-session', () => ({ createWebRuntimeSessionTerminal: vi.fn(), - isWebRuntimeSessionActive: vi.fn(() => false), + isWebRuntimeSessionActive: mockIsWebRuntimeSessionActive, + createWebRuntimeAgentSessionTerminal: mockCreateWebRuntimeAgentSessionTerminal, + createWebRuntimeAgentSessionTerminalWithLaunchDraft: + mockCreateWebRuntimeAgentSessionTerminalWithLaunchDraft, isWebTerminalSurfaceTabId: vi.fn(() => false) })) describe('launchAgentInNewTab Windows shell quoting', () => { beforeEach(() => { vi.clearAllMocks() + mockIsWebRuntimeSessionActive.mockReturnValue(false) + mockCreateWebRuntimeAgentSessionTerminal.mockResolvedValue({ + outcome: { status: 'created' }, + promptDelivered: true + }) store.activeRepoId = 'repo-1' store.activeWorktreeId = 'wt-1' store.settings = { @@ -147,6 +158,29 @@ describe('launchAgentInNewTab Windows shell quoting', () => { mockPasteDraftWhenAgentReady.mockResolvedValue(true) }) + it('forces oversized Windows drafts through the paired-host paste fallback without submitting', async () => { + mockIsWebRuntimeSessionActive.mockReturnValue(true) + const { launchAgentInNewTab } = await import('./launch-agent-in-new-tab') + const prompt = 'x'.repeat(25_000) + + launchAgentInNewTab({ + agent: 'claude', + worktreeId: 'wt-1', + prompt, + promptDelivery: 'draft', + launchPlatform: 'win32' + }) + + expect(mockCreateWebRuntimeAgentSessionTerminal).toHaveBeenCalledWith( + expect.objectContaining({ + promptAfterReady: prompt, + submitPrompt: false, + forcePromptPaste: true + }) + ) + expect(mockCreateWebRuntimeAgentSessionTerminalWithLaunchDraft).not.toHaveBeenCalled() + }) + it('uses the explicit startup shell platform when building draft launch commands', async () => { const { launchAgentInNewTab } = await import('./launch-agent-in-new-tab') diff --git a/src/renderer/src/lib/launch-agent-in-new-tab.test.ts b/src/renderer/src/lib/launch-agent-in-new-tab.test.ts index 66ac6b1c3b0..3b15ba33e17 100644 --- a/src/renderer/src/lib/launch-agent-in-new-tab.test.ts +++ b/src/renderer/src/lib/launch-agent-in-new-tab.test.ts @@ -647,7 +647,7 @@ describe('launchAgentInNewTab', () => { content: prompt, agent: 'claude', submit: false, - forcePaste: false + forcePaste: true }) ) }) diff --git a/src/renderer/src/lib/launch-agent-in-new-tab.ts b/src/renderer/src/lib/launch-agent-in-new-tab.ts index ff005550807..d76cff1092e 100644 --- a/src/renderer/src/lib/launch-agent-in-new-tab.ts +++ b/src/renderer/src/lib/launch-agent-in-new-tab.ts @@ -305,7 +305,7 @@ function launchAgentInNewTabInternal(args: LaunchAgentInNewTabArgs): LaunchAgent content: pasteDraftAfterLaunch, agent, submit: submitPastedPrompt, - forcePaste: promptDelivery === 'submit-after-ready', + forcePaste: true, onTimeout: timeoutNotice.onTimeout }).then((delivered) => { if (delivered) { diff --git a/src/renderer/src/lib/launch-agent-session-continuation.test.ts b/src/renderer/src/lib/launch-agent-session-continuation.test.ts index 84021bd14e9..44ddc5f1de9 100644 --- a/src/renderer/src/lib/launch-agent-session-continuation.test.ts +++ b/src/renderer/src/lib/launch-agent-session-continuation.test.ts @@ -72,7 +72,7 @@ describe('launchAgentSessionContinuation', () => { worktreeId: 'wt-1', groupId: 'group-1', initialCwd: '/repo/worktree/packages/app', - promptDelivery: 'submit-after-ready' + promptDelivery: 'draft' }) ) }) @@ -129,6 +129,9 @@ describe('launchAgentSessionContinuation', () => { launchSource: 'sidebar' }) + expect(launchAgentInNewTab).toHaveBeenCalledWith( + expect.objectContaining({ agent: 'codex', promptDelivery: 'submit-after-ready' }) + ) await vi.waitFor(() => expect(toast.error).toHaveBeenCalledWith( 'The new Codex session started, but its context could not be sent.' diff --git a/src/renderer/src/lib/launch-agent-session-continuation.ts b/src/renderer/src/lib/launch-agent-session-continuation.ts index 55795b9888a..0a13622be64 100644 --- a/src/renderer/src/lib/launch-agent-session-continuation.ts +++ b/src/renderer/src/lib/launch-agent-session-continuation.ts @@ -90,7 +90,7 @@ export async function launchAgentSessionContinuation({ worktreeId, ...(groupId ? { groupId } : {}), prompt, - promptDelivery: 'submit-after-ready', + promptDelivery: agent === 'claude' ? 'draft' : 'submit-after-ready', launchSource, ...(initialCwd ? { initialCwd } : {}), onPromptDelivered: () => diff --git a/src/renderer/src/lib/launch-agent-web-host-tab.ts b/src/renderer/src/lib/launch-agent-web-host-tab.ts index 528798d424d..f1c16516d40 100644 --- a/src/renderer/src/lib/launch-agent-web-host-tab.ts +++ b/src/renderer/src/lib/launch-agent-web-host-tab.ts @@ -128,7 +128,7 @@ export function launchAgentInWebHostTab(args: { agent, promptAfterReady: pastePromptAfterReady, submitPrompt: submitPastedPrompt, - forcePromptPaste: promptDelivery === 'submit-after-ready' + forcePromptPaste: true }).then(handleCreation) } if (hasPrompt && promptDelivery === 'draft') {