Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Dec 16, 2025

The output monitor incorrectly treats dev server help prompts (e.g., Vite's "press h + enter to show help") as blocking input requests, causing the agent to hang indefinitely when commands complete successfully.

Changes

  • Added detectsCommandFinishedHelpPattern(): Identifies patterns indicating command completion with help shortcuts:

    • press h + enter to show help
    • press r to restart, press u to update, etc.
  • Updated detectsInputRequiredPattern(): Early-exits when help patterns detected, preventing false positives

  • Modified _waitForIdle(): Checks for help patterns before idle polling, immediately transitioning to Idle state when detected

Example

// Before: hangs indefinitely
VITE v7.2.7  ready in 237 ms
  press h + enter to show help
// OutputMonitor treats as blocking prompt → agent hangs

// After: completes immediately
VITE v7.2.7  ready in 237 ms
  press h + enter to show help
// OutputMonitor detects help pattern → marks as Idle → continues
Original prompt

This section details on the original issue you should resolve

<issue_title>using new workspace flow, terminal can hang</issue_title>
<issue_description>In the output monitor, we should detect if press h + enter to show help is present, and if so, consider the command finished/abort so the agent doesn't hang.

Image</issue_description>

Comments on the Issue (you are @copilot in this section)


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot AI and others added 2 commits December 16, 2025 20:45
- Add detectsCommandFinishedHelpPattern function to identify when dev servers show help prompts
- Update detectsInputRequiredPattern to exclude help patterns
- Modify _waitForIdle to detect help patterns and mark terminal as idle
- Add comprehensive tests for the new pattern detection

Co-authored-by: meganrogge <29464607+meganrogge@users.noreply.github.com>
Address code review feedback: use [a-zA-Z] to ensure consistent matching across different case variations

Co-authored-by: meganrogge <29464607+meganrogge@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix terminal hang in new workspace flow Fix terminal hang on dev server help prompts in new workspace flow Dec 16, 2025
Copilot AI requested a review from meganrogge December 16, 2025 20:51
Comment on lines +283 to +290
test('detects help prompts in multi-line output', () => {
const viteOutput = `
VITE v7.2.7 ready in 237 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h + enter to show help
`;

Choose a reason for hiding this comment

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

hello there, i'm not sure if this is for this specific case or for any test server (i'm not a member or contributor here), but i noticed that the PR that :copilot: @copilot made specificially targets only the vite test dev server.
There are many other types of dev servers and have different outputs. for example, mine uses old react 16 with webpack because we're too lazy to migrate, so the result is:

Entrypoint editor = js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js.map js/vendors~editor~embed~fullscreen~player.js js/vendors~editor~embed~fullscreen~player.js.map js/addon-settings~addons~editor~fullscreen~player.js js/addon-settings~addons~editor~fullscreen~player.js.map js/addon-settings~editor~embed~fullscreen~player.js js/addon-settings~editor~embed~fullscreen~player.js.map js/editor.js js/editor.js.map
    Entrypoint player = js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js.map js/vendors~editor~embed~fullscreen~player.js js/vendors~editor~embed~fullscreen~player.js.map js/addon-settings~addons~editor~fullscreen~player.js js/addon-settings~addons~editor~fullscreen~player.js.map js/addon-settings~editor~embed~fullscreen~player.js js/addon-settings~editor~embed~fullscreen~player.js.map js/player.js js/player.js.map
    Entrypoint fullscreen = js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js.map js/vendors~editor~embed~fullscreen~player.js js/vendors~editor~embed~fullscreen~player.js.map js/addon-settings~addons~editor~fullscreen~player.js js/addon-settings~addons~editor~fullscreen~player.js.map js/addon-settings~editor~embed~fullscreen~player.js js/addon-settings~editor~embed~fullscreen~player.js.map js/fullscreen.js js/fullscreen.js.map
    Entrypoint embed = js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js.map js/vendors~editor~embed~fullscreen~player.js js/vendors~editor~embed~fullscreen~player.js.map js/addon-settings~editor~embed~fullscreen~player.js js/addon-settings~editor~embed~fullscreen~player.js.map js/embed.js js/embed.js.map
    Entrypoint addon-settings = js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js.map js/addon-settings~addons~editor~fullscreen~player.js js/addon-settings~addons~editor~fullscreen~player.js.map js/addon-settings~editor~embed~fullscreen~player.js js/addon-settings~editor~embed~fullscreen~player.js.map js/addon-settings.js js/addon-settings.js.map
    Entrypoint credits = js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js js/vendors~addon-settings~credits~editor~embed~fullscreen~player.js.map js/credits.js js/credits.js.map
     [0] multi (webpack)-dev-server/client?http://0.0.0.0:8601/ (webpack)/hot/dev-server.js ./src/playground/editor.jsx 52 bytes {editor} [built]
    [19] multi (webpack)-dev-server/client?http://0.0.0.0:8601/ (webpack)/hot/dev-server.js ./src/playground/player.jsx 52 bytes {player} [built]
    [20] multi (webpack)-dev-server/client?http://0.0.0.0:8601/ (webpack)/hot/dev-server.js ./src/playground/fullscreen.jsx 52 bytes {fullscreen} [built]
    [21] multi (webpack)-dev-server/client?http://0.0.0.0:8601/ (webpack)/hot/dev-server.js ./src/playground/embed.jsx 52 bytes {embed} [built]
    [22] multi (webpack)-dev-server/client?http://0.0.0.0:8601/ (webpack)/hot/dev-server.js ./src/playground/addon-settings.jsx 52 bytes {addon-settings} [built]
    [23] multi (webpack)-dev-server/client?http://0.0.0.0:8601/ (webpack)/hot/dev-server.js ./src/playground/credits/credits.jsx 52 bytes {credits} [built]
     [./node_modules/prop-types/index.js] 710 bytes {vendors~addon-settings~credits~editor~embed~fullscreen~player} [built]
     [./node_modules/webpack-dev-server/client/index.js?http://0.0.0.0:8601]/ (webpack)-dev-server/client?http://0.0.0.0:8601/ 4.29 KiB {vendors~addon-settings~credits~editor~embed~fullscreen~player} [built]
     [./node_modules/webpack/hot/dev-server.js] (webpack)/hot/dev-server.js 1.59 KiB {vendors~addon-settings~credits~editor~embed~fullscreen~player} [built]
     [./src/playground/addon-settings.jsx] 1.02 KiB {addon-settings} [built]
     [./src/playground/credits/credits.jsx] 4.23 KiB {credits} [built]
     [./src/playground/editor.jsx] 822 bytes {editor} [built]
     [./src/playground/embed.jsx] 1.48 KiB {embed} [built]
     [./src/playground/fullscreen.jsx] 864 bytes {fullscreen} [built]
     [./src/playground/player.jsx] 845 bytes {player} [built]
        + 2785 hidden modules
    Child HtmlWebpackCompiler:
         3 assets
        Entrypoint HtmlWebpackPlugin_0 = __child-HtmlWebpackPlugin_0
        Entrypoint HtmlWebpackPlugin_1 = __child-HtmlWebpackPlugin_1
        Entrypoint HtmlWebpackPlugin_2 = __child-HtmlWebpackPlugin_2
        [./node_modules/html-webpack-plugin/lib/loader.js!./src/playground/embed.ejs] 2.01 KiB {HtmlWebpackPlugin_1} [built]
        [./node_modules/html-webpack-plugin/lib/loader.js!./src/playground/index.ejs] 11.3 KiB {HtmlWebpackPlugin_0} [built]
        [./node_modules/html-webpack-plugin/lib/loader.js!./src/playground/simple.ejs] 1.67 KiB {HtmlWebpackPlugin_2} [built]
    Child extension worker:
                             Asset     Size            Chunks                   Chunk Names
            js/extension worker.js  120 KiB  extension worker  [emitted]        extension worker
        js/extension worker.js.map  133 KiB  extension worker  [emitted] [dev]  extension worker
        Entrypoint extension worker = js/extension worker.js js/extension worker.js.map
        [./node_modules/@turbowarp/nanolog/index.js] 1.17 KiB {extension worker} [built]
        [./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-vm/src/extension-support/tw-iframe-extension-worker-entry.js] ./node_modules/babel-loader/lib??ref--4!./node_modules/scratch-vm/src/extension-support/tw-iframe-extension-worker-entry.js 587 bytes {extension worker} [built]
        [./node_modules/format-message/index.js] 8.21 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/dispatch/shared-dispatch.js] 10.7 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/dispatch/worker-dispatch.js] 3.99 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/argument-type.js] 1.49 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/block-type.js] 1.18 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/extension-worker.js] 3.56 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-extension-api-common.js] 388 bytes {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-extension-worker-context.js] 166 bytes {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-jquery-shim.js] 2.99 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-l10n.js] 1.32 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-scratchx-compatibility-layer.js] 5.96 KiB {extension worker} [built]
        [./node_modules/scratch-vm/src/util/log.js] 96 bytes {extension worker} [built]
        [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 472 bytes {extension worker} [built]
            + 12 hidden modules
    Child worker:
                                                                   Asset     Size  Chunks                         Chunk Names
            js/extension-worker/extension-worker.3d89127e9d0346345b72.js  115 KiB    main  [emitted] [immutable]  main
        js/extension-worker/extension-worker.3d89127e9d0346345b72.js.map  128 KiB    main  [emitted] [dev]        main
        Entrypoint main = js/extension-worker/extension-worker.3d89127e9d0346345b72.js js/extension-worker/extension-worker.3d89127e9d0346345b72.js.map
        [./node_modules/@turbowarp/nanolog/index.js] 1.17 KiB {main} [built]
        [./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-vm/src/extension-support/extension-worker.js] ./node_modules/babel-loader/lib??ref--4!./node_modules/scratch-vm/src/extension-support/extension-worker.js 3.56 KiB {main} [built]
        [./node_modules/format-message/index.js] 8.21 KiB {main} [built]
        [./node_modules/scratch-vm/src/dispatch/shared-dispatch.js] 10.7 KiB {main} [built]
        [./node_modules/scratch-vm/src/dispatch/worker-dispatch.js] 3.99 KiB {main} [built]
        [./node_modules/scratch-vm/src/extension-support/argument-type.js] 1.49 KiB {main} [built]
        [./node_modules/scratch-vm/src/extension-support/block-type.js] 1.18 KiB {main} [built]
        [./node_modules/scratch-vm/src/extension-support/target-type.js] 309 bytes {main} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-block-shape.js] 1.02 KiB {main} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-extension-api-common.js] 388 bytes {main} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-extension-worker-context.js] 166 bytes {main} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-l10n.js] 1.32 KiB {main} [built]
        [./node_modules/scratch-vm/src/extension-support/tw-scratchx-compatibility-layer.js] 5.96 KiB {main} [built]
        [./node_modules/scratch-vm/src/util/log.js] 96 bytes {main} [built]
        [./node_modules/webpack/buildin/global.js] (webpack)/buildin/global.js 472 bytes {main} [built]
            + 10 hidden modules
ℹ 「wdm」: Compiled successfully.

so it's different for everyone.

If this is already implemented and the issue IS in fact for this specific edge case, you can go ahead and ignore this comment. :fishsticks:

@meganrogge meganrogge closed this Dec 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

using new workspace flow, terminal can hang

3 participants