fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(terminal): prevent project action commands from getting stuck - #6338

Closed
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal
Closed

fix(terminal): prevent project action commands from getting stuck#6338
amitray007 wants to merge 1 commit into
pingdotgg:mainfrom
amitray007:agent/fix-project-action-fresh-terminal

Conversation

@amitray007

@amitray007amitray007 commented Aug 12, 2026

Copy link
Copy Markdown

What Changed

  • Prevent project-action commands from getting stuck above the prompt when the terminal has not been opened yet.
  • On supported POSIX shells, run the initial action command after interactive shell initialization, then return to the normal interactive shell when it exits.
  • Keep the terminal open through Ctrl+C so stopping a long-running action returns to a usable prompt instead of closing the terminal.
  • Preserve the existing terminal-write path for running terminals, older remote servers, Windows PowerShell/cmd, and unsupported custom shells.

Fixes#6337.

Why

Project actions previously opened the terminal and immediately sent the command through a separate terminal write. When the terminal had never been opened, interactive shell initialization could race that write, leaving commands such as npm run dev stuck above the new prompt without executing.

The fix includes the command in fresh terminal startup where supported and has the server acknowledge whether it handled the command. This removes the race while preserving the existing fallback behavior for Windows, unsupported shells, running terminals, and older servers.

UI Changes

BeforeAfter
pr-6338-beforepr-6338-after

Before: With the terminal unopened, the project-action command could get stuck above the initialized prompt without executing.

After: The command executes exactly once after shell initialization. Stopping a long-running command with Ctrl+C returns to a usable prompt without closing the terminal.

Verification

  • vp test run packages/contracts/src/terminal.test.ts apps/server/src/terminal/Manager.test.ts — 80 tests passed
  • Regression coverage confirms a running terminal restarted by a launch-context change handles the action during the new shell startup
  • Focused formatting and lint checks for all five changed files
  • @t3tools/contracts, t3, and @t3tools/web typechecks
  • Web UI pass with the t3-testing project: a long-running custom action executed exactly once when launched with the terminal previously unopened
  • User-confirmed retest: the action streamed output, Ctrl+C returned to the prompt, and the terminal remained usable
  • Exact zsh PTY lifecycle pass: stop a long-running startup command with Ctrl+C, receive the prompt, and run a second command in the same terminal
  • Windows fresh-shell arguments are covered by a regression test; Windows runtime behavior was not manually tested

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Prepared with GPT-5.6 Codex in T3 Code.

Note

Prevent project action commands from getting stuck by running them during terminal startup

  • Adds an initialCommand field to TerminalOpenInput and an initialCommandHandled flag to TerminalSessionSnapshot in the contract schemas.
  • On supported POSIX shells (zsh, bash, sh), the terminal manager spawns the shell with -i -c to run the command, traps INT to avoid early exit, then execs back into the interactive shell.
  • The client in ChatView.tsx passes initialCommand when opening a terminal for a project script and only falls back to writing the command if the server did not set initialCommandHandled: true.
  • Windows and unsupported shells skip the startup injection path entirely.
  • Behavioral Change: project script commands now run inside the shell startup sequence rather than being written to stdin after the shell opens, changing how INT signals are handled during execution.

Macroscope summarized 59b7e5a.


Note

Medium Risk
Changes terminal spawn arguments and project-action execution paths; POSIX startup uses embedded shell -c with user-supplied commands, though existing write fallback and version skew handling limit blast radius.

Overview
Fixes project actions that could appear above the prompt without running when the terminal had never been opened, by racing shell init against a separate write.

Contracts add optional initialCommand on TerminalOpenInput and initialCommandHandled on TerminalSessionSnapshot so the client knows whether the server ran the command at spawn.

Server (Manager.ts): on fresh POSIX spawns (zsh/bash/sh), rewrites shell args to run the command via interactive -c, traps INT so Ctrl+C stops the action but keeps an interactive shell (exec back into the normal shell). Returns initialCommandHandled: true only when that path runs; Windows and an already-running session do not use it.

Web (ChatView.tsx): project scripts pass initialCommand on openTerminal and only fall back to the legacy writeTerminal path when initialCommandHandled !== true (older servers, Windows, reused terminals).

Reviewed by Cursor Bugbot for commit 59b7e5a. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 12, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 16d10704-5f66-4965-a525-45c16181bdbb

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from 0da3209 to e00060aCompareAugust 12, 2026 15:50
@amitray007
amitray007 marked this pull request as ready for review August 12, 2026 16:05
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes how terminal commands are executed by embedding them in shell spawn arguments rather than writing to the terminal after startup. The shell command construction logic and platform-specific behavior changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@amitray007amitray007 changed the title fix(web): run project actions in fresh terminalsfix(terminal): prevent project action commands from getting stuckAug 12, 2026
@amitray007
amitray007force-pushed the agent/fix-project-action-fresh-terminal branch from e00060a to 0919e07CompareAugust 14, 2026 18:33

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 0919e076d012a610a5d3d628b2765ee6cf2239bc. Configure here.

Comment threadapps/web/src/components/ChatView.tsx Outdated
@amitray007

Copy link
Copy Markdown
Author

Won't be able to maintain this PR anymore. Feel free to use the code if needed, using a personal fork going forward.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Project action command gets stuck when the terminal has not been opened

1 participant

@amitray007