diff --git a/packages/cli/src/commands/spawn.ts b/packages/cli/src/commands/spawn.ts index 93890fad6..db754d8d5 100644 --- a/packages/cli/src/commands/spawn.ts +++ b/packages/cli/src/commands/spawn.ts @@ -221,7 +221,9 @@ async function spawnSession( }); if (composedPrompt) { - await new Promise((resolve) => setTimeout(resolve, 1000)); + // Wait for agent to be fully ready (permission prompts, initialization, etc.) + // Longer delay ensures Claude is ready to receive input before sending prompt + await new Promise((resolve) => setTimeout(resolve, 2000)); await tmuxSendKeys(sessionName, composedPrompt); } diff --git a/packages/core/src/tmux.ts b/packages/core/src/tmux.ts index 565d1af27..be5da26f5 100644 --- a/packages/core/src/tmux.ts +++ b/packages/core/src/tmux.ts @@ -129,6 +129,8 @@ export async function sendKeys( ): Promise { // Clear any partial input first (matches bash reference scripts) await tmux("send-keys", "-t", sessionName, "Escape"); + // Small delay to ensure Escape is processed before pasting + await new Promise((resolve) => setTimeout(resolve, 100)); if (text.includes("\n") || text.length > 200) { // Use a named buffer to avoid global paste buffer race conditions @@ -158,9 +160,11 @@ export async function sendKeys( } if (pressEnter) { - // Small delay for paste to complete before sending Enter + // Delay for paste to complete before sending Enter + // Higher delay needed when using paste-buffer to ensure tmux processes the paste + // before receiving the Enter keystroke (especially with Claude permission prompts) if (text.includes("\n") || text.length > 200) { - await new Promise((resolve) => setTimeout(resolve, 300)); + await new Promise((resolve) => setTimeout(resolve, 1000)); } await tmux("send-keys", "-t", sessionName, "Enter"); }