diff --git a/.golangci.yaml b/.golangci.yaml index efaaa2f76..94eed5599 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -37,11 +37,6 @@ linters: - gosec text: "G101" path: "pkg/telemetry/analytics/client.go" - # Per-IDE async commands and setup functions are intentionally parallel - # (one package per browser IDE), so dupl across them is by design. - - linters: - - dupl - path: "cmd/internal/agentcontainer/(codeserver|vscodeweb|openvscode)_async.go" - path: "hack/" linters: - forbidigo diff --git a/cmd/internal/agentcontainer/browser_async.go b/cmd/internal/agentcontainer/browser_async.go new file mode 100644 index 000000000..9ed03532b --- /dev/null +++ b/cmd/internal/agentcontainer/browser_async.go @@ -0,0 +1,150 @@ +package agentcontainer + +import ( + "encoding/json" + + "github.com/devsy-org/devsy/cmd/flags" + "github.com/devsy-org/devsy/pkg/compress" + config2 "github.com/devsy-org/devsy/pkg/config" + "github.com/devsy-org/devsy/pkg/devcontainer/config" + "github.com/devsy-org/devsy/pkg/ide/codeserver" + "github.com/devsy-org/devsy/pkg/ide/openvscode" + "github.com/devsy-org/devsy/pkg/ide/vscodeweb" + "github.com/devsy-org/devsy/pkg/log" + "github.com/spf13/cobra" +) + +// browserServer is the shared behavior of the in-container browser IDEs +// (openvscode, code-server, VS Code Web). Each pkg/ide implementation already +// satisfies this, so the setup and async-extension flows can be written once. +type browserServer interface { + Install() error + InstallExtensions() error + Start() error +} + +// browserServerSpec holds the inputs a browser IDE needs to be constructed. +// The extension-install path (browserAsyncCmd) leaves settings/host/port unset; +// the full setup path fills them in. +type browserServerSpec struct { + extensions []string + settings string + userName string + host string + port string + values map[string]config2.OptionValue +} + +// browserIDE describes a single browser-based IDE. The per-IDE differences are +// data (names, default port, constructor) rather than duplicated control flow. +type browserIDE struct { + name config2.IDE + asyncCmd string + short string + defaultPort int + newServer func(browserServerSpec) browserServer +} + +// browserIDEs is the registry driving both async-extension commands and the +// setupBrowserIDE flow. Adding a browser IDE is one entry plus its pkg/ide +// implementation. +var browserIDEs = []browserIDE{ + { + name: config2.IDEOpenVSCode, + asyncCmd: "openvscode-async", + short: "Starts openvscode", + defaultPort: openvscode.DefaultVSCodePort, + newServer: func(s browserServerSpec) browserServer { + return openvscode.NewOpenVSCodeServer( + s.extensions, s.settings, s.userName, s.host, s.port, s.values, + ) + }, + }, + { + name: config2.IDECodeServer, + asyncCmd: "code-server-async", + short: "Starts code-server", + defaultPort: codeserver.DefaultCodeServerPort, + newServer: func(s browserServerSpec) browserServer { + return codeserver.NewCodeServer(codeserver.ServerOptions{ + Extensions: s.extensions, + Settings: s.settings, + UserName: s.userName, + Host: s.host, + Port: s.port, + Values: s.values, + }) + }, + }, + { + name: config2.IDEVSCodeWeb, + asyncCmd: "vscode-web-async", + short: "Starts VS Code Web", + defaultPort: vscodeweb.DefaultVSCodeWebPort, + newServer: func(s browserServerSpec) browserServer { + return vscodeweb.NewVSCodeWeb(vscodeweb.ServerOptions{ + Extensions: s.extensions, + Settings: s.settings, + UserName: s.userName, + Host: s.host, + Port: s.port, + Values: s.values, + }) + }, + }, +} + +func browserIDEByName(name string) (browserIDE, bool) { + for _, b := range browserIDEs { + if string(b.name) == name { + return b, true + } + } + return browserIDE{}, false +} + +// browserAsyncCmd holds the cmd flags for a browser IDE's background +// extension-install command. +type browserAsyncCmd struct { + *flags.GlobalFlags + + ide browserIDE + SetupInfo string +} + +// newBrowserAsyncCmd builds the `-async` command that installs the IDE's +// extensions in the background, decoupled from the foreground setup so a slow +// marketplace fetch never blocks the workspace coming up. +func newBrowserAsyncCmd(b browserIDE) *cobra.Command { + cmd := &browserAsyncCmd{ide: b} + cobraCmd := &cobra.Command{ + Use: b.asyncCmd, + Short: b.short, + Args: cobra.NoArgs, + RunE: cmd.Run, + } + cobraCmd.Flags().StringVar(&cmd.SetupInfo, "setup-info", "", "The container setup info") + _ = cobraCmd.MarkFlagRequired("setup-info") + return cobraCmd +} + +// Run runs the command logic. +func (cmd *browserAsyncCmd) Run(_ *cobra.Command, _ []string) error { + log.Debugf("Start setting up container") + decompressed, err := compress.Decompress(cmd.SetupInfo) + if err != nil { + return err + } + + setupInfo := &config.Result{} + if err := json.Unmarshal([]byte(decompressed), setupInfo); err != nil { + return err + } + + vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) + server := cmd.ide.newServer(browserServerSpec{ + extensions: vsCodeConfiguration.Extensions, + userName: config.GetRemoteUser(setupInfo), + }) + return server.InstallExtensions() +} diff --git a/cmd/internal/agentcontainer/codeserver_async.go b/cmd/internal/agentcontainer/codeserver_async.go deleted file mode 100644 index a7b5c2e05..000000000 --- a/cmd/internal/agentcontainer/codeserver_async.go +++ /dev/null @@ -1,59 +0,0 @@ -package agentcontainer - -import ( - "encoding/json" - - "github.com/devsy-org/devsy/cmd/flags" - "github.com/devsy-org/devsy/pkg/compress" - "github.com/devsy-org/devsy/pkg/devcontainer/config" - "github.com/devsy-org/devsy/pkg/ide/codeserver" - "github.com/devsy-org/devsy/pkg/log" - "github.com/spf13/cobra" -) - -// CodeServerAsyncCmd holds the cmd flags. -type CodeServerAsyncCmd struct { - *flags.GlobalFlags - - SetupInfo string -} - -// NewCodeServerAsyncCmd creates a new command. -func NewCodeServerAsyncCmd() *cobra.Command { - cmd := &CodeServerAsyncCmd{} - codeServerAsyncCmd := &cobra.Command{ - Use: "code-server-async", - Short: "Starts code-server", - Args: cobra.NoArgs, - RunE: cmd.Run, - } - codeServerAsyncCmd.Flags(). - StringVar(&cmd.SetupInfo, "setup-info", "", "The container setup info") - _ = codeServerAsyncCmd.MarkFlagRequired("setup-info") - return codeServerAsyncCmd -} - -// Run runs the command logic. -func (cmd *CodeServerAsyncCmd) Run(_ *cobra.Command, _ []string) error { - log.Debugf("Start setting up container") - decompressed, err := compress.Decompress(cmd.SetupInfo) - if err != nil { - return err - } - - setupInfo := &config.Result{} - if err := json.Unmarshal([]byte(decompressed), setupInfo); err != nil { - return err - } - - return setupCodeServerExtensions(setupInfo) -} - -func setupCodeServerExtensions(setupInfo *config.Result) error { - vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) - user := config.GetRemoteUser(setupInfo) - return codeserver.NewCodeServer(codeserver.ServerOptions{ - Extensions: vsCodeConfiguration.Extensions, - UserName: user, - }).InstallExtensions() -} diff --git a/cmd/internal/agentcontainer/container.go b/cmd/internal/agentcontainer/container.go index d93f8a320..57a130a97 100644 --- a/cmd/internal/agentcontainer/container.go +++ b/cmd/internal/agentcontainer/container.go @@ -23,9 +23,9 @@ func NewContainerCmd(flags *flags.GlobalFlags) *cobra.Command { containerCmd.AddCommand(NewPostAttachCmd(flags)) containerCmd.AddCommand(NewDaemonCmd()) containerCmd.AddCommand(NewVSCodeAsyncCmd()) - containerCmd.AddCommand(NewOpenVSCodeAsyncCmd()) - containerCmd.AddCommand(NewCodeServerAsyncCmd()) - containerCmd.AddCommand(NewVSCodeWebAsyncCmd()) + for _, b := range browserIDEs { + containerCmd.AddCommand(newBrowserAsyncCmd(b)) + } containerCmd.AddCommand(NewCredentialsServerCmd(flags)) containerCmd.AddCommand(NewSetupDevsyPlatformAccessCmd(flags)) containerCmd.AddCommand(NewSSHServerCmd(flags)) diff --git a/cmd/internal/agentcontainer/openvscode_async.go b/cmd/internal/agentcontainer/openvscode_async.go deleted file mode 100644 index 2a8fd68f1..000000000 --- a/cmd/internal/agentcontainer/openvscode_async.go +++ /dev/null @@ -1,63 +0,0 @@ -package agentcontainer - -import ( - "encoding/json" - - "github.com/devsy-org/devsy/cmd/flags" - "github.com/devsy-org/devsy/pkg/compress" - "github.com/devsy-org/devsy/pkg/devcontainer/config" - "github.com/devsy-org/devsy/pkg/ide/openvscode" - "github.com/devsy-org/devsy/pkg/log" - "github.com/spf13/cobra" -) - -// OpenVSCodeAsyncCmd holds the cmd flags. -type OpenVSCodeAsyncCmd struct { - *flags.GlobalFlags - - SetupInfo string -} - -// NewOpenVSCodeAsyncCmd creates a new command. -func NewOpenVSCodeAsyncCmd() *cobra.Command { - cmd := &OpenVSCodeAsyncCmd{} - vsCodeAsyncCmd := &cobra.Command{ - Use: "openvscode-async", - Short: "Starts openvscode", - Args: cobra.NoArgs, - RunE: cmd.Run, - } - vsCodeAsyncCmd.Flags().StringVar(&cmd.SetupInfo, "setup-info", "", "The container setup info") - _ = vsCodeAsyncCmd.MarkFlagRequired("setup-info") - return vsCodeAsyncCmd -} - -// Run runs the command logic. -func (cmd *OpenVSCodeAsyncCmd) Run(_ *cobra.Command, _ []string) error { - log.Debugf("Start setting up container") - decompressed, err := compress.Decompress(cmd.SetupInfo) - if err != nil { - return err - } - - setupInfo := &config.Result{} - err = json.Unmarshal([]byte(decompressed), setupInfo) - if err != nil { - return err - } - - // install IDE - err = setupOpenVSCodeExtensions(setupInfo) - if err != nil { - return err - } - - return nil -} - -func setupOpenVSCodeExtensions(setupInfo *config.Result) error { - vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) - user := config.GetRemoteUser(setupInfo) - return openvscode.NewOpenVSCodeServer(vsCodeConfiguration.Extensions, "", user, "", "", nil). - InstallExtensions() -} diff --git a/cmd/internal/agentcontainer/setup.go b/cmd/internal/agentcontainer/setup.go index 2bb6a36b0..cd1c04253 100644 --- a/cmd/internal/agentcontainer/setup.go +++ b/cmd/internal/agentcontainer/setup.go @@ -31,15 +31,12 @@ import ( "github.com/devsy-org/devsy/pkg/dockercredentials" "github.com/devsy-org/devsy/pkg/extract" "github.com/devsy-org/devsy/pkg/git" - "github.com/devsy-org/devsy/pkg/ide/codeserver" "github.com/devsy-org/devsy/pkg/ide/fleet" "github.com/devsy-org/devsy/pkg/ide/jetbrains" "github.com/devsy-org/devsy/pkg/ide/jupyter" "github.com/devsy-org/devsy/pkg/ide/marimo" - "github.com/devsy-org/devsy/pkg/ide/openvscode" "github.com/devsy-org/devsy/pkg/ide/rstudio" "github.com/devsy-org/devsy/pkg/ide/vscode" - "github.com/devsy-org/devsy/pkg/ide/vscodeweb" "github.com/devsy-org/devsy/pkg/log" provider2 "github.com/devsy-org/devsy/pkg/provider" "github.com/devsy-org/devsy/pkg/ts" @@ -592,12 +589,8 @@ func (cmd *SetupContainerCmd) installIDE( return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorAntigravity) case string(config2.IDEBob): return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorBob) - case string(config2.IDEOpenVSCode): - return cmd.setupOpenVSCode(setupInfo, ide.Options) - case string(config2.IDECodeServer): - return cmd.setupCodeServer(setupInfo, ide.Options) - case string(config2.IDEVSCodeWeb): - return cmd.setupVSCodeWeb(setupInfo, ide.Options) + case string(config2.IDEOpenVSCode), string(config2.IDECodeServer), string(config2.IDEVSCodeWeb): + return cmd.setupBrowserIDE(ide.Name, setupInfo, ide.Options) case string(config2.IDEGoland): return jetbrains.NewGolandServer(config.GetRemoteUser(setupInfo), ide.Options). Install(setupInfo) @@ -713,75 +706,20 @@ func (cmd *SetupContainerCmd) setupVSCode( }) } -func (cmd *SetupContainerCmd) setupOpenVSCode( +// setupBrowserIDE installs and starts any of the browser-based IDEs +// (openvscode, code-server, VS Code Web). The per-IDE differences live in the +// browserIDEs registry, so the install/extensions/start flow is written once. +func (cmd *SetupContainerCmd) setupBrowserIDE( + ideName string, setupInfo *config.Result, ideOptions map[string]config2.OptionValue, ) error { - log.Debugf("setup openvscode") - vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) - settings := "" - if len(vsCodeConfiguration.Settings) > 0 { - out, err := json.Marshal(vsCodeConfiguration.Settings) - if err != nil { - return err - } - - settings = string(out) - } - - user := config.GetRemoteUser(setupInfo) - openVSCode := openvscode.NewOpenVSCodeServer( - vsCodeConfiguration.Extensions, - settings, - user, - "0.0.0.0", - strconv.Itoa(openvscode.DefaultVSCodePort), - ideOptions, - ) - - // install open vscode - err := openVSCode.Install() - if err != nil { - return err - } - - // install extensions in background - if len(vsCodeConfiguration.Extensions) > 0 { - err = command.StartBackgroundOnce("openvscode-async", func() (*exec.Cmd, error) { - log.Infof( - "installing extensions in the background: %s", - strings.Join(vsCodeConfiguration.Extensions, ","), - ) - binaryPath, err := os.Executable() - if err != nil { - return nil, err - } - - return exec.Command( - binaryPath, - cmdInternal, - cmdAgent, - cmdContainer, - "openvscode-async", - "--setup-info", - cmd.SetupInfo, - ), nil - }) - if err != nil { - return fmt.Errorf("install extensions: %w", err) - } + b, ok := browserIDEByName(ideName) + if !ok { + return fmt.Errorf("unknown browser IDE %q", ideName) } + log.Debugf("setup %s", b.name) - // start the server in the background - return openVSCode.Start() -} - -//nolint:dupl // mirrored by setupVSCodeWeb by design (one package per browser IDE). -func (cmd *SetupContainerCmd) setupCodeServer( - setupInfo *config.Result, - ideOptions map[string]config2.OptionValue, -) error { - log.Debugf("setup code-server") vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) settings := "" if len(vsCodeConfiguration.Settings) > 0 { @@ -792,109 +730,54 @@ func (cmd *SetupContainerCmd) setupCodeServer( settings = string(out) } - user := config.GetRemoteUser(setupInfo) - cs := codeserver.NewCodeServer(codeserver.ServerOptions{ - Extensions: vsCodeConfiguration.Extensions, - Settings: settings, - UserName: user, - Host: "0.0.0.0", - Port: strconv.Itoa(codeserver.DefaultCodeServerPort), - Values: ideOptions, + server := b.newServer(browserServerSpec{ + extensions: vsCodeConfiguration.Extensions, + settings: settings, + userName: config.GetRemoteUser(setupInfo), + host: "0.0.0.0", + port: strconv.Itoa(b.defaultPort), + values: ideOptions, }) - if err := cs.Install(); err != nil { + if err := server.Install(); err != nil { return err } if len(vsCodeConfiguration.Extensions) > 0 { - err := command.StartBackgroundOnce("code-server-async", func() (*exec.Cmd, error) { - log.Infof( - "installing extensions in the background: %s", - strings.Join(vsCodeConfiguration.Extensions, ","), - ) - binaryPath, err := os.Executable() - if err != nil { - return nil, err - } - //nolint:gosec // binaryPath is from os.Executable(), not user input - return exec.Command( - binaryPath, - cmdInternal, - cmdAgent, - cmdContainer, - "code-server-async", - "--setup-info", - cmd.SetupInfo, - ), nil - }) - if err != nil { + if err := cmd.startBrowserExtensionsInstall(b, vsCodeConfiguration.Extensions); err != nil { return fmt.Errorf("install extensions: %w", err) } } - return cs.Start() + return server.Start() } -// setupVSCodeWeb intentionally mirrors setupCodeServer; the per-IDE browser -// setup functions are parallel by design (one package per browser IDE). -// -//nolint:dupl // mirrors setupCodeServer by design. -func (cmd *SetupContainerCmd) setupVSCodeWeb( - setupInfo *config.Result, - ideOptions map[string]config2.OptionValue, +// startBrowserExtensionsInstall launches the IDE's `-async` command as a +// background process so a slow marketplace fetch never blocks setup. +func (cmd *SetupContainerCmd) startBrowserExtensionsInstall( + b browserIDE, + extensions []string, ) error { - log.Debugf("setup vscode-web") - vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) - settings := "" - if len(vsCodeConfiguration.Settings) > 0 { - out, err := json.Marshal(vsCodeConfiguration.Settings) + return command.StartBackgroundOnce(b.asyncCmd, func() (*exec.Cmd, error) { + log.Infof( + "installing extensions in the background: %s", + strings.Join(extensions, ","), + ) + binaryPath, err := os.Executable() if err != nil { - return err + return nil, err } - settings = string(out) - } - - user := config.GetRemoteUser(setupInfo) - vw := vscodeweb.NewVSCodeWeb(vscodeweb.ServerOptions{ - Extensions: vsCodeConfiguration.Extensions, - Settings: settings, - UserName: user, - Host: "0.0.0.0", - Port: strconv.Itoa(vscodeweb.DefaultVSCodeWebPort), - Values: ideOptions, + //nolint:gosec // binaryPath is from os.Executable(), not user input + return exec.Command( + binaryPath, + cmdInternal, + cmdAgent, + cmdContainer, + b.asyncCmd, + "--setup-info", + cmd.SetupInfo, + ), nil }) - - if err := vw.Install(); err != nil { - return err - } - - if len(vsCodeConfiguration.Extensions) > 0 { - err := command.StartBackgroundOnce("vscode-web-async", func() (*exec.Cmd, error) { - log.Infof( - "installing extensions in the background: %s", - strings.Join(vsCodeConfiguration.Extensions, ","), - ) - binaryPath, err := os.Executable() - if err != nil { - return nil, err - } - //nolint:gosec // binaryPath is from os.Executable(), not user input - return exec.Command( - binaryPath, - cmdInternal, - cmdAgent, - cmdContainer, - "vscode-web-async", - "--setup-info", - cmd.SetupInfo, - ), nil - }) - if err != nil { - return fmt.Errorf("install extensions: %w", err) - } - } - - return vw.Start() } func configureSystemGitCredentials( diff --git a/cmd/internal/agentcontainer/vscodeweb_async.go b/cmd/internal/agentcontainer/vscodeweb_async.go deleted file mode 100644 index 509ffd2f6..000000000 --- a/cmd/internal/agentcontainer/vscodeweb_async.go +++ /dev/null @@ -1,59 +0,0 @@ -package agentcontainer - -import ( - "encoding/json" - - "github.com/devsy-org/devsy/cmd/flags" - "github.com/devsy-org/devsy/pkg/compress" - "github.com/devsy-org/devsy/pkg/devcontainer/config" - "github.com/devsy-org/devsy/pkg/ide/vscodeweb" - "github.com/devsy-org/devsy/pkg/log" - "github.com/spf13/cobra" -) - -// VSCodeWebAsyncCmd holds the cmd flags. -type VSCodeWebAsyncCmd struct { - *flags.GlobalFlags - - SetupInfo string -} - -// NewVSCodeWebAsyncCmd creates a new command. -func NewVSCodeWebAsyncCmd() *cobra.Command { - cmd := &VSCodeWebAsyncCmd{} - vsCodeWebAsyncCmd := &cobra.Command{ - Use: "vscode-web-async", - Short: "Starts VS Code Web", - Args: cobra.NoArgs, - RunE: cmd.Run, - } - vsCodeWebAsyncCmd.Flags(). - StringVar(&cmd.SetupInfo, "setup-info", "", "The container setup info") - _ = vsCodeWebAsyncCmd.MarkFlagRequired("setup-info") - return vsCodeWebAsyncCmd -} - -// Run runs the command logic. -func (cmd *VSCodeWebAsyncCmd) Run(_ *cobra.Command, _ []string) error { - log.Debugf("Start setting up container") - decompressed, err := compress.Decompress(cmd.SetupInfo) - if err != nil { - return err - } - - setupInfo := &config.Result{} - if err := json.Unmarshal([]byte(decompressed), setupInfo); err != nil { - return err - } - - return setupVSCodeWebExtensions(setupInfo) -} - -func setupVSCodeWebExtensions(setupInfo *config.Result) error { - vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig) - user := config.GetRemoteUser(setupInfo) - return vscodeweb.NewVSCodeWeb(vscodeweb.ServerOptions{ - Extensions: vsCodeConfiguration.Extensions, - UserName: user, - }).InstallExtensions() -} diff --git a/desktop/src/renderer/src/lib/components/workspace/WorkspaceWizard.svelte b/desktop/src/renderer/src/lib/components/workspace/WorkspaceWizard.svelte index fcc4d33ed..bd23fbf72 100644 --- a/desktop/src/renderer/src/lib/components/workspace/WorkspaceWizard.svelte +++ b/desktop/src/renderer/src/lib/components/workspace/WorkspaceWizard.svelte @@ -81,8 +81,8 @@ const IDE_GROUPS = [ options: [ { value: "none", label: "None", iconName: "none" }, { value: "vscode", label: "VS Code", iconName: "vscode" }, - { value: "openvscode", label: "VS Code Browser", iconName: "vscodebrowser" }, - { value: "vscode-web", label: "VS Code Web", iconName: "vscode-web" }, + { value: "openvscode", label: "OpenVSCode Server", iconName: "vscodebrowser" }, + { value: "vscode-web", label: "VS Code for the Web", iconName: "vscode-web" }, { value: "code-server", label: "code-server", iconName: "code-server" }, { value: "cursor", label: "Cursor", iconName: "cursor" }, { value: "zed", label: "Zed", iconName: "zed" }, diff --git a/desktop/src/renderer/src/pages/SettingsPage.svelte b/desktop/src/renderer/src/pages/SettingsPage.svelte index d111828ca..421536adc 100644 --- a/desktop/src/renderer/src/pages/SettingsPage.svelte +++ b/desktop/src/renderer/src/pages/SettingsPage.svelte @@ -75,8 +75,8 @@ function setUIScale(value: UIScale) { const IDE_OPTIONS = [ { value: "none", label: "None" }, { value: "vscode", label: "VS Code" }, - { value: "openvscode", label: "VS Code Browser" }, - { value: "vscode-web", label: "VS Code Web" }, + { value: "openvscode", label: "OpenVSCode Server" }, + { value: "vscode-web", label: "VS Code for the Web" }, { value: "cursor", label: "Cursor" }, { value: "zed", label: "Zed" }, { value: "codium", label: "VSCodium" }, diff --git a/desktop/src/renderer/src/pages/WorkspaceDetailPage.svelte b/desktop/src/renderer/src/pages/WorkspaceDetailPage.svelte index 347dfc62d..ef7c6bdbf 100644 --- a/desktop/src/renderer/src/pages/WorkspaceDetailPage.svelte +++ b/desktop/src/renderer/src/pages/WorkspaceDetailPage.svelte @@ -61,8 +61,8 @@ let { params = {} }: { params?: Record } = $props() const IDE_OPTIONS = [ { value: "none", label: "None" }, { value: "vscode", label: "VS Code" }, - { value: "openvscode", label: "VS Code Browser" }, - { value: "vscode-web", label: "VS Code Web" }, + { value: "openvscode", label: "OpenVSCode Server" }, + { value: "vscode-web", label: "VS Code for the Web" }, { value: "code-server", label: "code-server" }, { value: "cursor", label: "Cursor" }, { value: "zed", label: "Zed" }, diff --git a/pkg/ide/ideparse/parse.go b/pkg/ide/ideparse/parse.go index f78c7c556..2f460adda 100644 --- a/pkg/ide/ideparse/parse.go +++ b/pkg/ide/ideparse/parse.go @@ -56,7 +56,7 @@ var AllowedIDEs = []AllowedIDE{ }, { Name: config.IDEOpenVSCode, - DisplayName: "VS Code Browser", + DisplayName: "OpenVSCode Server", Options: openvscode.Options, Icon: config.WebsiteAssetsURL + "/vscodebrowser.svg", Group: config.IDEGroupPrimary, @@ -70,7 +70,7 @@ var AllowedIDEs = []AllowedIDE{ }, { Name: config.IDEVSCodeWeb, - DisplayName: "VS Code Web", + DisplayName: "VS Code for the Web", Options: vscodeweb.Options, Icon: config.WebsiteAssetsURL + "/vscode-web.svg", Group: config.IDEGroupPrimary,