Skip to content

Conversation

thecoolwinter
Copy link
Collaborator

@thecoolwinter thecoolwinter commented Aug 16, 2025

Description

Implements an installing progress view for language servers from the mason registry.

  • Package managers have been reworked to return a list of 'steps' to execute.
  • Created a model for running steps and waiting for confirmation if required before a step.
  • Added UI that observes the running model for executed steps and output, as well as errors.

Related Issues

Checklist

  • I read and understood the contributing guide as well as the code of conduct
  • The issues this PR addresses are related to each other
  • My changes generate no new warnings
  • My code builds and runs on my machine
  • My changes are all related to the related issue above
  • I documented my code

Screenshots

Screen.Recording.2025-08-18.at.2.16.53.PM.mov

@austincondiff
Copy link
Collaborator

Looks great! I wonder if we don't open this details sheet by default. Maybe it can be opened during/after installation for more details? We would still show simple progress similar to installing an app from the App Store. What are your thoughts?

@thecoolwinter
Copy link
Collaborator Author

Looks great! I wonder if we don't open this details sheet by default. Maybe it can be opened during/after installation for more details? We would still show simple progress similar to installing an app from the App Store. What are your thoughts?

That's a great idea. Then does the 'install' button change to a 'details' button?

@thecoolwinter
Copy link
Collaborator Author

Or is it "Install" to a second "Install" button in the details page

@thecoolwinter
Copy link
Collaborator Author

@austincondiff thoughts on this UI/UX? I like the implied confirm step after clicking install, and the chance to show a little more information before installing.

Screen.Recording.2025-08-18.at.1.46.07.PM.mov

@thecoolwinter thecoolwinter marked this pull request as ready for review August 18, 2025 19:19
@thecoolwinter thecoolwinter added enhancement New feature or request language server Issues or Pull Requests related to language servers. labels Aug 18, 2025
@austincondiff
Copy link
Collaborator

In my opinion it is too disruptive. Imagine the use-case. User comes in and thinks, "I use JavaScript, TypeScript, Rust, Python, and Swift."

Option A (the on in your video)

  1. Find JavaScript
  2. Click Install in row
  3. Click Install in sheet
  4. Click Continue
  5. Find TyoeScript
  6. Click Install in row
  7. Click Install in sheet
  8. Click Continue
  9. Find Rust
  10. Click Install in row
  11. Click Install in sheet
  12. Click Continue
  13. Find Python
  14. Click Install in row
  15. Click Install in sheet
  16. Click Continue
  17. Find Swift
  18. Click Install in row
  19. Click Install in sheet
  20. Click Continue

OR

Option B

  1. Find JavaScript
  2. Click Install in row
  3. Find TypeScript
  4. Click Install in row
  5. Find Rust
  6. Click Install in row
  7. Find Python
  8. Click Install in row
  9. Find Swift
  10. Click Install in row

If the user cares to see more details, they can click the circle "i" symbol next to the install button.

Maybe this info icon is there regardless of whether install has started or not. That way users can get more details before installing. Similar to the App Store.

@thecoolwinter
Copy link
Collaborator Author

That sounds like a good compromise. Install button initiates install immediately, info button presents the same view but doesn't start installing.

@thecoolwinter
Copy link
Collaborator Author

thecoolwinter commented Aug 18, 2025

Well wait, to be fair we're still forcing the longer UX because we want to make sure we're not running willy nilly running commands on the user's machine. So no matter what the UX is this for each language.

1. Find Swift
2. Install Swift
3. Wait for install dialogue to complete

@thecoolwinter
Copy link
Collaborator Author

Also a heads up, we may want to fork the mason repository in the future or see if they'd be interested in extending it. Right now there's no way to indicate that a package could be found on a user's machine without installing. Swift and Rust are good cases of that, where the language bundles the server executable in the tooling. For that reason Swift isn't in the Mason registry (you can't really install SourceKitLSP without the Swift toolchain)

@austincondiff
Copy link
Collaborator

austincondiff commented Aug 30, 2025

@thecoolwinter I think user interfaces should be as seamless and non-disruptive as possible, so users can move through them freely. A good example is how Apple handles autosave, apps don’t constantly prompt users to save manually, and if you want to rename or move a file, you just click the title bar. It keeps the experience smooth unless there’s a real risk of data loss.

In our case, clicking “Install” already signals intent. If we need more input from the user, maybe a lightweight notification would be a better alternative than interrupting them with a full dialog. We should only disrupt the user when absolutely necessary.

That said, if the user is installing language servers from the Settings window, they might not see notifications, since those only show up over workspaces. In that case, maybe we show an exclamation mark symbol next to any item that needs attention in place of the circular progress indicator. Clicking it could open the details sheet so the user can take action. That way, we still respect the user’s flow but provide a clear, unobtrusive way for them to follow up when needed.

In addition, if the user installs the language server from a workspace after opening a corresponding file, we could show a notification if user input is needed.

@thecoolwinter
Copy link
Collaborator Author

@thecoolwinter I think user interfaces should be as seamless and non-disruptive as possible, so users can move through them freely. A good example is how Apple handles autosave, apps don’t constantly prompt users to save manually, and if you want to rename or move a file, you just click the title bar. It keeps the experience smooth unless there’s a real risk of data loss.

I'm with you there 100%. For this case, we'd discussed the security implications of this install process and how we wanted to add just enough grit into the UX to make it a little safer. I think you're right that this goes a little too far but we need to discuss it.

In our case, clicking “Install” already signals intent. If we need more input from the user, maybe a lightweight notification would be a better alternative than interrupting them with a full dialog. We should only disrupt the user when absolutely necessary.

On this in particular, we've heard from people who are uncomfortable with the UX of Zed. In that app an install just goes ahead and installs something with no user interaction besides the 'install' click. I agree that the install click signals intent, but we need to remember we're doing a lot more than that with this flow. We're running an otherwise completely invisible command on the user's machine and installing and running a program that we haven't vetted beyond the mason registry's vetting.

So that's where I think I went too far, I'm thinking from that POV. I think we can agree that what's on main right now is too little in terms of transparency, and what this is is too rough in terms of UX.

That said, if the user is installing language servers from the Settings window, they might not see notifications, since those only show up over workspaces. In that case, maybe we show an exclamation mark symbol next to any item that needs attention in place of the circular progress indicator. Clicking it could open the details sheet so the user can take action. That way, we still respect the user’s flow but provide a clear, unobtrusive way for them to follow up when needed.

In addition, if the user installs the language server from a workspace after opening a corresponding file, we could show a notification if user input is needed.

This is where I got held up too. I hadn't come up with a good way to make the whole thing flow. The other issue is that the install can take anywhere from 1-2 seconds to a minute depending on what the package is. Maybe a way to make it work would be to show the install page as an 'info' page, and instead of a cancel button it's named differently to indicate the user can leave while installing is happening.

This might be a longer discussion. I think let's merge this with the knowledge that the UX needs updating but also knowing it should help with getting some bug fixes out and make the install process transparent. Also because it's getting large and I think the UX we're going to come up with will require another rework of the UI components here.

austincondiff
austincondiff previously approved these changes Sep 2, 2025
Copy link
Collaborator

@austincondiff austincondiff left a comment

Choose a reason for hiding this comment

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

I agree, lets create an issue with this context so we can come back to it later on. Approved.

@austincondiff
Copy link
Collaborator

Xcode has a small window similar to the Finder copy window to install external resources for whatever that is worth.

@thecoolwinter thecoolwinter merged commit 82d39cc into CodeEditApp:main Sep 4, 2025
2 checks passed
@thecoolwinter thecoolwinter deleted the lsp-install-ux branch September 4, 2025 14:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request language server Issues or Pull Requests related to language servers.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants