-
Notifications
You must be signed in to change notification settings - Fork 37k
Fix terminal hang on dev server help prompts in new workspace flow #283904
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- 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>
…arly to avoid perf issues
| 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 | ||
| `; |
There was a problem hiding this comment.
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 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.
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 helppress r to restart,press u to update, etc.Updated
detectsInputRequiredPattern(): Early-exits when help patterns detected, preventing false positivesModified
_waitForIdle(): Checks for help patterns before idle polling, immediately transitioning toIdlestate when detectedExample
Original prompt
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.