From 66cf90c73600e29ad9b818f52a70d79005618624 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Mon, 28 Jul 2025 12:30:52 +0100 Subject: [PATCH 001/260] feat(agent/agentcontainers): allow auto start for discovered containers (#19040) Closes https://github.com/coder/internal/issues/711 When a `devcontainer.json` has been found and it has `.customizations.coder.autoStart = true`, we will now auto start this dev container. --- agent/agentcontainers/api.go | 27 ++- agent/agentcontainers/api_test.go | 246 +++++++++++++++++++++++ agent/agentcontainers/devcontainercli.go | 1 + 3 files changed, 270 insertions(+), 4 deletions(-) diff --git a/agent/agentcontainers/api.go b/agent/agentcontainers/api.go index 4f9287713fcfc..c8cba67cea73f 100644 --- a/agent/agentcontainers/api.go +++ b/agent/agentcontainers/api.go @@ -143,7 +143,8 @@ func WithCommandEnv(ce CommandEnv) Option { strings.HasPrefix(s, "CODER_WORKSPACE_AGENT_URL=") || strings.HasPrefix(s, "CODER_AGENT_TOKEN=") || strings.HasPrefix(s, "CODER_AGENT_AUTH=") || - strings.HasPrefix(s, "CODER_AGENT_DEVCONTAINERS_ENABLE=") + strings.HasPrefix(s, "CODER_AGENT_DEVCONTAINERS_ENABLE=") || + strings.HasPrefix(s, "CODER_AGENT_DEVCONTAINERS_PROJECT_DISCOVERY_ENABLE=") }) return shell, dir, env, nil } @@ -524,23 +525,41 @@ func (api *API) discoverDevcontainersInProject(projectPath string) error { workspaceFolder := strings.TrimSuffix(path, relativeConfigPath) - logger.Debug(api.ctx, "discovered dev container project", slog.F("workspace_folder", workspaceFolder)) + logger := logger.With(slog.F("workspace_folder", workspaceFolder)) + logger.Debug(api.ctx, "discovered dev container project") api.mu.Lock() if _, found := api.knownDevcontainers[workspaceFolder]; !found { - logger.Debug(api.ctx, "adding dev container project", slog.F("workspace_folder", workspaceFolder)) + logger.Debug(api.ctx, "adding dev container project") dc := codersdk.WorkspaceAgentDevcontainer{ ID: uuid.New(), Name: "", // Updated later based on container state. WorkspaceFolder: workspaceFolder, ConfigPath: path, - Status: "", // Updated later based on container state. + Status: codersdk.WorkspaceAgentDevcontainerStatusStopped, Dirty: false, // Updated later based on config file changes. Container: nil, } + config, err := api.dccli.ReadConfig(api.ctx, workspaceFolder, path, []string{}) + if err != nil { + logger.Error(api.ctx, "read project configuration", slog.Error(err)) + } else if config.Configuration.Customizations.Coder.AutoStart { + dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStarting + } + api.knownDevcontainers[workspaceFolder] = dc + api.broadcastUpdatesLocked() + + if dc.Status == codersdk.WorkspaceAgentDevcontainerStatusStarting { + api.asyncWg.Add(1) + go func() { + defer api.asyncWg.Done() + + _ = api.CreateDevcontainer(dc.WorkspaceFolder, dc.ConfigPath) + }() + } } api.mu.Unlock() } diff --git a/agent/agentcontainers/api_test.go b/agent/agentcontainers/api_test.go index 5714027960a7b..e6e25ed92558e 100644 --- a/agent/agentcontainers/api_test.go +++ b/agent/agentcontainers/api_test.go @@ -3568,4 +3568,250 @@ func TestDevcontainerDiscovery(t *testing.T) { // This is implicitly handled by `testutil.Logger` failing when it // detects an error has been logged. }) + + t.Run("AutoStart", func(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + agentDir string + fs map[string]string + expectDevcontainerCount int + setupMocks func(mDCCLI *acmock.MockDevcontainerCLI) + }{ + { + name: "SingleEnabled", + agentDir: "/home/coder", + expectDevcontainerCount: 1, + fs: map[string]string{ + "/home/coder/.git/HEAD": "", + "/home/coder/.devcontainer/devcontainer.json": "", + }, + setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { + gomock.InOrder( + // Given: This dev container has auto start enabled. + mDCCLI.EXPECT().ReadConfig(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + []string{}, + ).Return(agentcontainers.DevcontainerConfig{ + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, + }, + }, + }, + }, nil), + + // Then: We expect it to be started. + mDCCLI.EXPECT().Up(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + gomock.Any(), + ).Return("", nil), + ) + }, + }, + { + name: "SingleDisabled", + agentDir: "/home/coder", + expectDevcontainerCount: 1, + fs: map[string]string{ + "/home/coder/.git/HEAD": "", + "/home/coder/.devcontainer/devcontainer.json": "", + }, + setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { + gomock.InOrder( + // Given: This dev container has auto start disabled. + mDCCLI.EXPECT().ReadConfig(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + []string{}, + ).Return(agentcontainers.DevcontainerConfig{ + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: false, + }, + }, + }, + }, nil), + + // Then: We expect it to _not_ be started. + mDCCLI.EXPECT().Up(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + gomock.Any(), + ).Return("", nil).Times(0), + ) + }, + }, + { + name: "OneEnabledOneDisabled", + agentDir: "/home/coder", + expectDevcontainerCount: 2, + fs: map[string]string{ + "/home/coder/.git/HEAD": "", + "/home/coder/.devcontainer/devcontainer.json": "", + "/home/coder/project/.devcontainer.json": "", + }, + setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { + gomock.InOrder( + // Given: This dev container has auto start enabled. + mDCCLI.EXPECT().ReadConfig(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + []string{}, + ).Return(agentcontainers.DevcontainerConfig{ + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, + }, + }, + }, + }, nil), + + // Then: We expect it to be started. + mDCCLI.EXPECT().Up(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + gomock.Any(), + ).Return("", nil), + ) + + gomock.InOrder( + // Given: This dev container has auto start disabled. + mDCCLI.EXPECT().ReadConfig(gomock.Any(), + "/home/coder/project", + "/home/coder/project/.devcontainer.json", + []string{}, + ).Return(agentcontainers.DevcontainerConfig{ + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: false, + }, + }, + }, + }, nil), + + // Then: We expect it to _not_ be started. + mDCCLI.EXPECT().Up(gomock.Any(), + "/home/coder/project", + "/home/coder/project/.devcontainer.json", + gomock.Any(), + ).Return("", nil).Times(0), + ) + }, + }, + { + name: "MultipleEnabled", + agentDir: "/home/coder", + expectDevcontainerCount: 2, + fs: map[string]string{ + "/home/coder/.git/HEAD": "", + "/home/coder/.devcontainer/devcontainer.json": "", + "/home/coder/project/.devcontainer.json": "", + }, + setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { + gomock.InOrder( + // Given: This dev container has auto start enabled. + mDCCLI.EXPECT().ReadConfig(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + []string{}, + ).Return(agentcontainers.DevcontainerConfig{ + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, + }, + }, + }, + }, nil), + + // Then: We expect it to be started. + mDCCLI.EXPECT().Up(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + gomock.Any(), + ).Return("", nil), + ) + + gomock.InOrder( + // Given: This dev container has auto start enabled. + mDCCLI.EXPECT().ReadConfig(gomock.Any(), + "/home/coder/project", + "/home/coder/project/.devcontainer.json", + []string{}, + ).Return(agentcontainers.DevcontainerConfig{ + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, + }, + }, + }, + }, nil), + + // Then: We expect it to be started. + mDCCLI.EXPECT().Up(gomock.Any(), + "/home/coder/project", + "/home/coder/project/.devcontainer.json", + gomock.Any(), + ).Return("", nil), + ) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + var ( + ctx = testutil.Context(t, testutil.WaitShort) + logger = testutil.Logger(t) + mClock = quartz.NewMock(t) + mDCCLI = acmock.NewMockDevcontainerCLI(gomock.NewController(t)) + + r = chi.NewRouter() + ) + + // Given: We setup our mocks. These mocks handle our expectations for these + // tests. If there are missing/unexpected mock calls, the test will fail. + tt.setupMocks(mDCCLI) + + api := agentcontainers.NewAPI(logger, + agentcontainers.WithClock(mClock), + agentcontainers.WithWatcher(watcher.NewNoop()), + agentcontainers.WithFileSystem(initFS(t, tt.fs)), + agentcontainers.WithManifestInfo("owner", "workspace", "parent-agent", "/home/coder"), + agentcontainers.WithContainerCLI(&fakeContainerCLI{}), + agentcontainers.WithDevcontainerCLI(mDCCLI), + agentcontainers.WithProjectDiscovery(true), + ) + api.Start() + defer api.Close() + r.Mount("/", api.Routes()) + + // When: All expected dev containers have been found. + require.Eventuallyf(t, func() bool { + req := httptest.NewRequest(http.MethodGet, "/", nil).WithContext(ctx) + rec := httptest.NewRecorder() + r.ServeHTTP(rec, req) + + got := codersdk.WorkspaceAgentListContainersResponse{} + err := json.NewDecoder(rec.Body).Decode(&got) + require.NoError(t, err) + + return len(got.Devcontainers) >= tt.expectDevcontainerCount + }, testutil.WaitShort, testutil.IntervalFast, "dev containers never found") + + // Then: We expect the mock infra to not fail. + }) + } + }) } diff --git a/agent/agentcontainers/devcontainercli.go b/agent/agentcontainers/devcontainercli.go index d7cd25f85a7b3..2242e62f602e8 100644 --- a/agent/agentcontainers/devcontainercli.go +++ b/agent/agentcontainers/devcontainercli.go @@ -91,6 +91,7 @@ type CoderCustomization struct { Apps []SubAgentApp `json:"apps,omitempty"` Name string `json:"name,omitempty"` Ignore bool `json:"ignore,omitempty"` + AutoStart bool `json:"autoStart,omitempty"` } type DevcontainerWorkspace struct { From b975d6d9b34e5349990dd5923722f17337f88b7d Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Mon, 28 Jul 2025 14:46:04 +0100 Subject: [PATCH 002/260] feat(cli): add CLI support for creating a workspace with preset (#18912) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description This PR introduces a `--preset` flag for the `create` command to allow users to apply a predefined preset to their workspace build. ## Changes - The `--preset` flag on the `create` command integrates with the parameter resolution logic and takes precedence over other sources (e.g., CLI/env vars, last build, etc.). - Added internal logic to ensure that preset parameters override parameters values during resolution. - Updated tests and added new ones to cover these flows. ## Implementation logic * If a template has presets and includes a default, the CLI will automatically use the default when `--preset` is not specified. * If a template has presets but no default, the CLI will prompt the user to select one when `--preset` is not specified. * If a template does not have presets, the CLI will not prompt the user for a preset. * If the user specifies a preset using the `--preset` flag, that preset will be used. * If the user passes `--preset None`, no preset will be applied. This logic aligns with the behavior in the UI for consistency. ``` > coder create --help USAGE: coder create [flags] [workspace] Create a workspace - Create a workspace for another user (if you have permission): $ coder create / OPTIONS: (...) --preset string, $CODER_PRESET_NAME Specify the name of a template version preset. Use 'none' to explicitly indicate that no preset should be used. (...) -y, --yes bool Bypass prompts. ``` ## Breaking change **Note:** This is a breaking change to the create CLI command. If a template includes presets and the user does not provide a `--preset` flag, the CLI will now prompt the user to select one. This behavior may break non-interactive scripts or automated workflows. Relates to PR: https://github.com/coder/coder/pull/18910 - please consider both PRs together as they’re part of the same workflow Relates to issue: https://github.com/coder/coder/issues/16594 --- cli/create.go | 125 ++++- cli/create_test.go | 639 +++++++++++++++++++++++- cli/parameter.go | 8 + cli/parameterresolver.go | 24 + cli/testdata/coder_create_--help.golden | 4 + docs/reference/cli/create.md | 9 + enterprise/cli/create_test.go | 391 +++++++++++++++ 7 files changed, 1197 insertions(+), 3 deletions(-) diff --git a/cli/create.go b/cli/create.go index fbf26349b3b95..4e0e47b43eaa4 100644 --- a/cli/create.go +++ b/cli/create.go @@ -2,6 +2,7 @@ package cli import ( "context" + "errors" "fmt" "io" "slices" @@ -21,10 +22,18 @@ import ( "github.com/coder/serpent" ) +// PresetNone represents the special preset value "none". +// It is used when a user runs `create --preset none`, +// indicating that the CLI should not apply any preset. +const PresetNone = "none" + +var ErrNoPresetFound = xerrors.New("no preset found") + func (r *RootCmd) create() *serpent.Command { var ( templateName string templateVersion string + presetName string startAt string stopAfter time.Duration workspaceName string @@ -263,11 +272,45 @@ func (r *RootCmd) create() *serpent.Command { } } + // Get presets for the template version + tvPresets, err := client.TemplateVersionPresets(inv.Context(), templateVersionID) + if err != nil { + return xerrors.Errorf("failed to get presets: %w", err) + } + + var preset *codersdk.Preset + var presetParameters []codersdk.WorkspaceBuildParameter + + // If the template has no presets, or the user explicitly used --preset none, + // skip applying a preset + if len(tvPresets) > 0 && strings.ToLower(presetName) != PresetNone { + // Attempt to resolve which preset to use + preset, err = resolvePreset(tvPresets, presetName) + if err != nil { + if !errors.Is(err, ErrNoPresetFound) { + return xerrors.Errorf("unable to resolve preset: %w", err) + } + // If no preset found, prompt the user to choose a preset + if preset, err = promptPresetSelection(inv, tvPresets); err != nil { + return xerrors.Errorf("unable to prompt user for preset: %w", err) + } + } + + // Convert preset parameters into workspace build parameters + presetParameters = presetParameterAsWorkspaceBuildParameters(preset.Parameters) + // Inform the user which preset was applied and its parameters + displayAppliedPreset(inv, preset, presetParameters) + } else { + // Inform the user that no preset was applied + _, _ = fmt.Fprintf(inv.Stdout, "%s", cliui.Bold("No preset applied.")) + } + richParameters, err := prepWorkspaceBuild(inv, client, prepWorkspaceBuildArgs{ Action: WorkspaceCreate, TemplateVersionID: templateVersionID, NewWorkspaceName: workspaceName, + PresetParameters: presetParameters, RichParameterFile: parameterFlags.richParameterFile, RichParameters: cliBuildParameters, RichParameterDefaults: cliBuildParameterDefaults, @@ -291,14 +334,21 @@ func (r *RootCmd) create() *serpent.Command { ttlMillis = ptr.Ref(stopAfter.Milliseconds()) } - workspace, err := client.CreateUserWorkspace(inv.Context(), workspaceOwner, codersdk.CreateWorkspaceRequest{ + req := codersdk.CreateWorkspaceRequest{ TemplateVersionID: templateVersionID, Name: workspaceName, AutostartSchedule: schedSpec, TTLMillis: ttlMillis, RichParameterValues: richParameters, AutomaticUpdates: codersdk.AutomaticUpdates(autoUpdates), - }) + } + + // If a preset exists, update the create workspace request's preset ID + if preset != nil { + req.TemplateVersionPresetID = preset.ID + } + + workspace, err := client.CreateUserWorkspace(inv.Context(), workspaceOwner, req) if err != nil { return xerrors.Errorf("create workspace: %w", err) } @@ -333,6 +383,12 @@ func (r *RootCmd) create() *serpent.Command { Description: "Specify a template version name.", Value: serpent.StringOf(&templateVersion), }, + serpent.Option{ + Flag: "preset", + Env: "CODER_PRESET_NAME", + Description: "Specify the name of a template version preset. Use 'none' to explicitly indicate that no preset should be used.", + Value: serpent.StringOf(&presetName), + }, serpent.Option{ Flag: "start-at", Env: "CODER_WORKSPACE_START_AT", @@ -377,12 +433,76 @@ type prepWorkspaceBuildArgs struct { PromptEphemeralParameters bool EphemeralParameters []codersdk.WorkspaceBuildParameter + PresetParameters []codersdk.WorkspaceBuildParameter PromptRichParameters bool RichParameters []codersdk.WorkspaceBuildParameter RichParameterFile string RichParameterDefaults []codersdk.WorkspaceBuildParameter } +// resolvePreset returns the preset matching the given presetName (if specified), +// or the default preset (if any). +// Returns ErrNoPresetFound if no matching or default preset is found. +func resolvePreset(presets []codersdk.Preset, presetName string) (*codersdk.Preset, error) { + // If preset name is specified, find it + if presetName != "" { + for _, p := range presets { + if p.Name == presetName { + return &p, nil + } + } + return nil, xerrors.Errorf("preset %q not found", presetName) + } + + // No preset name specified, search for the default preset + for _, p := range presets { + if p.Default { + return &p, nil + } + } + + // No preset found + return nil, ErrNoPresetFound +} + +// promptPresetSelection shows a CLI selection menu of the presets defined in the template version. +// Returns the selected preset +func promptPresetSelection(inv *serpent.Invocation, presets []codersdk.Preset) (*codersdk.Preset, error) { + presetMap := make(map[string]*codersdk.Preset) + var presetOptions []string + + for _, preset := range presets { + option := preset.Name + presetOptions = append(presetOptions, option) + presetMap[option] = &preset + } + + // Show selection UI + _, _ = fmt.Fprintln(inv.Stdout, pretty.Sprint(cliui.DefaultStyles.Wrap, "Select a preset below:")) + selected, err := cliui.Select(inv, cliui.SelectOptions{ + Options: presetOptions, + HideSearch: true, + }) + if err != nil { + return nil, xerrors.Errorf("failed to select preset: %w", err) + } + + return presetMap[selected], nil +} + +// displayAppliedPreset shows the user which preset was applied and its parameters +func displayAppliedPreset(inv *serpent.Invocation, preset *codersdk.Preset, parameters []codersdk.WorkspaceBuildParameter) { + label := fmt.Sprintf("Preset '%s'", preset.Name) + if preset.Default { + label += " (default)" + } + + _, _ = fmt.Fprintf(inv.Stdout, "%s applied:\n", cliui.Bold(label)) + for _, param := range parameters { + _, _ = fmt.Fprintf(inv.Stdout, " %s: '%s'\n", cliui.Bold(param.Name), param.Value) + } +} + // prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version. // Any missing params will be prompted to the user. It supports rich parameters. func prepWorkspaceBuild(inv *serpent.Invocation, client *codersdk.Client, args prepWorkspaceBuildArgs) ([]codersdk.WorkspaceBuildParameter, error) { @@ -411,6 +531,7 @@ func prepWorkspaceBuild(inv *serpent.Invocation, client *codersdk.Client, args p WithSourceWorkspaceParameters(args.SourceWorkspaceParameters). WithPromptEphemeralParameters(args.PromptEphemeralParameters). WithEphemeralParameters(args.EphemeralParameters). + WithPresetParameters(args.PresetParameters). WithPromptRichParameters(args.PromptRichParameters). WithRichParameters(args.RichParameters). WithRichParametersFile(parameterFile). diff --git a/cli/create_test.go b/cli/create_test.go index 668fd466d605c..9db2e328c6ce9 100644 --- a/cli/create_test.go +++ b/cli/create_test.go @@ -12,6 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/coder/coder/v2/cli" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/externalauth" @@ -298,7 +299,7 @@ func TestCreate(t *testing.T) { }) } -func prepareEchoResponses(parameters []*proto.RichParameter) *echo.Responses { +func prepareEchoResponses(parameters []*proto.RichParameter, presets ...*proto.Preset) *echo.Responses { return &echo.Responses{ Parse: echo.ParseComplete, ProvisionPlan: []*proto.Response{ @@ -306,6 +307,7 @@ func prepareEchoResponses(parameters []*proto.RichParameter) *echo.Responses { Type: &proto.Response_Plan{ Plan: &proto.PlanComplete{ Parameters: parameters, + Presets: presets, }, }, }, @@ -663,6 +665,641 @@ func TestCreateWithRichParameters(t *testing.T) { }) } +func TestCreateWithPreset(t *testing.T) { + t.Parallel() + + const ( + firstParameterName = "first_parameter" + firstParameterDisplayName = "First Parameter" + firstParameterDescription = "This is the first parameter" + firstParameterValue = "1" + + firstOptionalParameterName = "first_optional_parameter" + firstOptionalParameterDescription = "This is the first optional parameter" + firstOptionalParameterValue = "1" + secondOptionalParameterName = "second_optional_parameter" + secondOptionalParameterDescription = "This is the second optional parameter" + secondOptionalParameterValue = "2" + + thirdParameterName = "third_parameter" + thirdParameterDescription = "This is the third parameter" + thirdParameterValue = "3" + ) + + echoResponses := func(presets ...*proto.Preset) *echo.Responses { + return prepareEchoResponses([]*proto.RichParameter{ + { + Name: firstParameterName, + DisplayName: firstParameterDisplayName, + Description: firstParameterDescription, + Mutable: true, + DefaultValue: firstParameterValue, + Options: []*proto.RichParameterOption{ + { + Name: firstOptionalParameterName, + Description: firstOptionalParameterDescription, + Value: firstOptionalParameterValue, + }, + { + Name: secondOptionalParameterName, + Description: secondOptionalParameterDescription, + Value: secondOptionalParameterValue, + }, + }, + }, + { + Name: thirdParameterName, + Description: thirdParameterDescription, + DefaultValue: thirdParameterValue, + Mutable: true, + }, + }, presets...) + } + + // This test verifies that when a template has presets, + // including a default preset, and the user specifies a `--preset` flag, + // the CLI uses the specified preset instead of the default + t.Run("PresetFlag", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template and a template version with two presets, including a default + defaultPreset := proto.Preset{ + Name: "preset-default", + Default: true, + Parameters: []*proto.PresetParameter{ + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + } + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&defaultPreset, &preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: running the create command with the specified preset + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", "--preset", preset.Name) + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err := inv.Run() + require.NoError(t, err) + + // Should: display the selected preset as well as its parameters + presetName := fmt.Sprintf("Preset '%s' applied:", preset.Name) + pty.ExpectMatch(presetName) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", firstParameterName, secondOptionalParameterValue)) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", thirdParameterName, thirdParameterValue)) + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + tvPresets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, tvPresets, 2) + var selectedPreset *codersdk.Preset + for _, tvPreset := range tvPresets { + if tvPreset.Name == preset.Name { + selectedPreset = &tvPreset + } + } + require.NotNil(t, selectedPreset) + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: create a workspace using the expected template version and the preset-defined parameters + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Equal(t, selectedPreset.ID, *workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: secondOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that when a template has presets, + // including a default preset, and the user does not specify the `--preset` flag, + // the CLI automatically uses the default preset to create the workspace + t.Run("DefaultPreset", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template and a template version with two presets, including a default + defaultPreset := proto.Preset{ + Name: "preset-default", + Default: true, + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + } + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&defaultPreset, &preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: running the create command without a preset + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y") + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err := inv.Run() + require.NoError(t, err) + + // Should: display the default preset as well as its parameters + presetName := fmt.Sprintf("Preset '%s' (default) applied:", defaultPreset.Name) + pty.ExpectMatch(presetName) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", firstParameterName, secondOptionalParameterValue)) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", thirdParameterName, thirdParameterValue)) + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + tvPresets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, tvPresets, 2) + var selectedPreset *codersdk.Preset + for _, tvPreset := range tvPresets { + if tvPreset.Default { + selectedPreset = &tvPreset + } + } + require.NotNil(t, selectedPreset) + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: create a workspace using the expected template version and the default preset parameters + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Equal(t, selectedPreset.ID, *workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: secondOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that when a template has presets but no default preset, + // and the user does not provide the `--preset` flag, + // the CLI prompts the user to select a preset. + t.Run("NoDefaultPresetPromptUser", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template and a template version with two presets + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: running the create command without specifying a preset + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, + "--parameter", fmt.Sprintf("%s=%s", firstParameterName, firstOptionalParameterValue), + "--parameter", fmt.Sprintf("%s=%s", thirdParameterName, thirdParameterValue)) + clitest.SetupConfig(t, member, root) + doneChan := make(chan struct{}) + pty := ptytest.New(t).Attach(inv) + go func() { + defer close(doneChan) + err := inv.Run() + assert.NoError(t, err) + }() + + // Should: prompt the user for the preset + pty.ExpectMatch("Select a preset below:") + pty.WriteLine("\n") + pty.ExpectMatch("Preset 'preset-test' applied") + pty.ExpectMatch("Confirm create?") + pty.WriteLine("yes") + + <-doneChan + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + tvPresets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, tvPresets, 1) + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: create a workspace using the expected template version and the preset-defined parameters + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Equal(t, tvPresets[0].ID, *workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: secondOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that when a template version has no presets, + // the CLI does not prompt the user to select a preset and proceeds + // with workspace creation without applying any preset. + t.Run("TemplateVersionWithoutPresets", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template and a template version without presets + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses()) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: running the create command without a preset + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", + "--parameter", fmt.Sprintf("%s=%s", firstParameterName, firstOptionalParameterValue), + "--parameter", fmt.Sprintf("%s=%s", thirdParameterName, thirdParameterValue)) + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err := inv.Run() + require.NoError(t, err) + pty.ExpectMatch("No preset applied.") + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: create a workspace using the expected template version and no preset + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Nil(t, workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: firstOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that when the user provides `--preset none`, + // the CLI skips applying any preset, even if the template version has a default preset. + // The workspace should be created without using any preset-defined parameters. + t.Run("PresetFlagNone", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template and a template version with a default preset + preset := proto.Preset{ + Name: "preset-test", + Default: true, + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: running the create command with flag '--preset none' + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", "--preset", cli.PresetNone, + "--parameter", fmt.Sprintf("%s=%s", firstParameterName, firstOptionalParameterValue), + "--parameter", fmt.Sprintf("%s=%s", thirdParameterName, thirdParameterValue)) + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err := inv.Run() + require.NoError(t, err) + pty.ExpectMatch("No preset applied.") + + // Verify that the new workspace doesn't use the preset parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + tvPresets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, tvPresets, 1) + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: create a workspace using the expected template version and no preset + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Nil(t, workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: firstOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that the CLI returns an appropriate error + // when a user provides a `--preset` value that does not correspond + // to any existing preset in the template version. + t.Run("FailsWhenPresetDoesNotExist", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template and a template version where the preset defines values for all required parameters + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: running the create command with a non-existent preset + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", "--preset", "invalid-preset") + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err := inv.Run() + + // Should: fail with an error indicating the preset was not found + require.Contains(t, err.Error(), "preset \"invalid-preset\" not found") + }) + + // This test verifies that when both a preset and a user-provided + // `--parameter` flag define a value for the same parameter, + // the preset's value takes precedence over the user's. + // + // The preset defines one parameter (A), and two `--parameter` flags provide A and B. + // The workspace should be created using: + // - the value of parameter A from the preset (overriding the parameter flag's value), + // - and the value of parameter B from the parameter flag. + t.Run("PresetOverridesParameterFlagValues", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template version with a preset that defines one parameter + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: creating a workspace with a preset and passing overlapping and additional parameters via `--parameter` + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", + "--preset", preset.Name, + "--parameter", fmt.Sprintf("%s=%s", firstParameterName, firstOptionalParameterValue), + "--parameter", fmt.Sprintf("%s=%s", thirdParameterName, thirdParameterValue)) + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err := inv.Run() + require.NoError(t, err) + + // Should: display the selected preset as well as its parameter + presetName := fmt.Sprintf("Preset '%s' applied:", preset.Name) + pty.ExpectMatch(presetName) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", firstParameterName, secondOptionalParameterValue)) + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + tvPresets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, tvPresets, 1) + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: include both parameters, one from the preset and one from the `--parameter` flag + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Equal(t, tvPresets[0].ID, *workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: secondOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that when both a preset and a user-provided + // `--rich-parameter-file` define a value for the same parameter, + // the preset's value takes precedence over the one in the file. + // + // The preset defines one parameter (A), and the parameter file provides two parameters (A and B). + // The workspace should be created using: + // - the value of parameter A from the preset (overriding the file's value), + // - and the value of parameter B from the file. + t.Run("PresetOverridesParameterFileValues", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template version with a preset that defines one parameter + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: creating a workspace with the preset and passing the second required parameter via `--rich-parameter-file` + workspaceName := "my-workspace" + tempDir := t.TempDir() + removeTmpDirUntilSuccessAfterTest(t, tempDir) + parameterFile, _ := os.CreateTemp(tempDir, "testParameterFile*.yaml") + _, _ = parameterFile.WriteString( + firstParameterName + ": " + firstOptionalParameterValue + "\n" + + thirdParameterName + ": " + thirdParameterValue) + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", + "--preset", preset.Name, + "--rich-parameter-file", parameterFile.Name()) + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err := inv.Run() + require.NoError(t, err) + + // Should: display the selected preset as well as its parameter + presetName := fmt.Sprintf("Preset '%s' applied:", preset.Name) + pty.ExpectMatch(presetName) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", firstParameterName, secondOptionalParameterValue)) + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + tvPresets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, tvPresets, 1) + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: include both parameters, one from the preset and one from the `--rich-parameter-file` flag + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Equal(t, tvPresets[0].ID, *workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: secondOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that when a preset provides only some parameters, + // and the remaining ones are not provided via flags, + // the CLI prompts the user for input to fill in the missing parameters. + t.Run("PromptsForMissingParametersWhenPresetIsIncomplete", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: a template version with a preset that defines one parameter + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + }, + } + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + + // When: running the create command with the specified preset + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "--preset", preset.Name) + clitest.SetupConfig(t, member, root) + doneChan := make(chan struct{}) + pty := ptytest.New(t).Attach(inv) + go func() { + defer close(doneChan) + err := inv.Run() + assert.NoError(t, err) + }() + + // Should: display the selected preset as well as its parameters + presetName := fmt.Sprintf("Preset '%s' applied:", preset.Name) + pty.ExpectMatch(presetName) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", firstParameterName, secondOptionalParameterValue)) + + // Should: prompt for the missing parameter + pty.ExpectMatch(thirdParameterDescription) + pty.WriteLine(thirdParameterValue) + pty.ExpectMatch("Confirm create?") + pty.WriteLine("yes") + + <-doneChan + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + tvPresets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, tvPresets, 1) + + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + + // Should: create a workspace using the expected template version and the preset-defined parameters + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Equal(t, tvPresets[0].ID, *workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: secondOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) +} + func TestCreateValidateRichParameters(t *testing.T) { t.Parallel() diff --git a/cli/parameter.go b/cli/parameter.go index 97c551ffa5a7f..2b56c364faf23 100644 --- a/cli/parameter.go +++ b/cli/parameter.go @@ -100,6 +100,14 @@ func (wpf *workspaceParameterFlags) alwaysPrompt() serpent.Option { } } +func presetParameterAsWorkspaceBuildParameters(presetParameters []codersdk.PresetParameter) []codersdk.WorkspaceBuildParameter { + var params []codersdk.WorkspaceBuildParameter + for _, parameter := range presetParameters { + params = append(params, codersdk.WorkspaceBuildParameter(parameter)) + } + return params +} + func asWorkspaceBuildParameters(nameValuePairs []string) ([]codersdk.WorkspaceBuildParameter, error) { var params []codersdk.WorkspaceBuildParameter for _, nameValue := range nameValuePairs { diff --git a/cli/parameterresolver.go b/cli/parameterresolver.go index 40625331fa6aa..cbd00fb59623e 100644 --- a/cli/parameterresolver.go +++ b/cli/parameterresolver.go @@ -26,6 +26,7 @@ type ParameterResolver struct { lastBuildParameters []codersdk.WorkspaceBuildParameter sourceWorkspaceParameters []codersdk.WorkspaceBuildParameter + presetParameters []codersdk.WorkspaceBuildParameter richParameters []codersdk.WorkspaceBuildParameter richParametersDefaults map[string]string richParametersFile map[string]string @@ -45,6 +46,11 @@ func (pr *ParameterResolver) WithSourceWorkspaceParameters(params []codersdk.Wor return pr } +func (pr *ParameterResolver) WithPresetParameters(params []codersdk.WorkspaceBuildParameter) *ParameterResolver { + pr.presetParameters = params + return pr +} + func (pr *ParameterResolver) WithRichParameters(params []codersdk.WorkspaceBuildParameter) *ParameterResolver { pr.richParameters = params return pr @@ -80,6 +86,8 @@ func (pr *ParameterResolver) WithPromptEphemeralParameters(promptEphemeralParame return pr } +// Resolve gathers workspace build parameters in a layered fashion, applying values from various sources +// in order of precedence: parameter file < CLI/ENV < source build < last build < preset < user input. func (pr *ParameterResolver) Resolve(inv *serpent.Invocation, action WorkspaceCLIAction, templateVersionParameters []codersdk.TemplateVersionParameter) ([]codersdk.WorkspaceBuildParameter, error) { var staged []codersdk.WorkspaceBuildParameter var err error @@ -88,6 +96,7 @@ func (pr *ParameterResolver) Resolve(inv *serpent.Invocation, action WorkspaceCL staged = pr.resolveWithCommandLineOrEnv(staged) staged = pr.resolveWithSourceBuildParameters(staged, templateVersionParameters) staged = pr.resolveWithLastBuildParameters(staged, templateVersionParameters) + staged = pr.resolveWithPreset(staged) // Preset parameters take precedence from all other parameters if err = pr.verifyConstraints(staged, action, templateVersionParameters); err != nil { return nil, err } @@ -97,6 +106,21 @@ func (pr *ParameterResolver) Resolve(inv *serpent.Invocation, action WorkspaceCL return staged, nil } +func (pr *ParameterResolver) resolveWithPreset(resolved []codersdk.WorkspaceBuildParameter) []codersdk.WorkspaceBuildParameter { +next: + for _, presetParameter := range pr.presetParameters { + for i, r := range resolved { + if r.Name == presetParameter.Name { + resolved[i].Value = presetParameter.Value + continue next + } + } + resolved = append(resolved, presetParameter) + } + + return resolved +} + func (pr *ParameterResolver) resolveWithParametersMapFile(resolved []codersdk.WorkspaceBuildParameter) []codersdk.WorkspaceBuildParameter { next: for name, value := range pr.richParametersFile { diff --git a/cli/testdata/coder_create_--help.golden b/cli/testdata/coder_create_--help.golden index 8e8ea4a1701eb..47e809e8f5af6 100644 --- a/cli/testdata/coder_create_--help.golden +++ b/cli/testdata/coder_create_--help.golden @@ -26,6 +26,10 @@ OPTIONS: --parameter-default string-array, $CODER_RICH_PARAMETER_DEFAULT Rich parameter default values in the format "name=value". + --preset string, $CODER_PRESET_NAME + Specify the name of a template version preset. Use 'none' to + explicitly indicate that no preset should be used. + --rich-parameter-file string, $CODER_RICH_PARAMETER_FILE Specify a file path with values for rich parameters defined in the template. The file should be in YAML format, containing key-value diff --git a/docs/reference/cli/create.md b/docs/reference/cli/create.md index 58c0fad4a14e8..d18b4ea5c8e05 100644 --- a/docs/reference/cli/create.md +++ b/docs/reference/cli/create.md @@ -37,6 +37,15 @@ Specify a template name. Specify a template version name. +### --preset + +| | | +|-------------|---------------------------------| +| Type | string | +| Environment | $CODER_PRESET_NAME | + +Specify the name of a template version preset. Use 'none' to explicitly indicate that no preset should be used. + ### --start-at | | | diff --git a/enterprise/cli/create_test.go b/enterprise/cli/create_test.go index 040768473c55d..44218abb5a58d 100644 --- a/enterprise/cli/create_test.go +++ b/enterprise/cli/create_test.go @@ -2,14 +2,33 @@ package cli_test import ( "context" + "database/sql" "fmt" "sync" + "sync/atomic" "testing" + "time" + + "github.com/coder/coder/v2/cli" + + "github.com/coder/coder/v2/coderd/wsbuilder" "github.com/google/uuid" + "github.com/prometheus/client_golang/prometheus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbtestutil" + "github.com/coder/coder/v2/coderd/files" + "github.com/coder/coder/v2/coderd/notifications" + agplprebuilds "github.com/coder/coder/v2/coderd/prebuilds" + "github.com/coder/coder/v2/enterprise/coderd/prebuilds" + "github.com/coder/coder/v2/provisioner/echo" + "github.com/coder/coder/v2/provisionersdk/proto" + "github.com/coder/coder/v2/testutil" + "github.com/coder/quartz" + "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/rbac" @@ -202,3 +221,375 @@ func TestEnterpriseCreate(t *testing.T) { require.ErrorContains(t, err, fmt.Sprintf("--org=%q", "coder")) }) } + +func TestEnterpriseCreateWithPreset(t *testing.T) { + t.Parallel() + + const ( + firstParameterName = "first_parameter" + firstParameterDisplayName = "First Parameter" + firstParameterDescription = "This is the first parameter" + firstParameterValue = "1" + + firstOptionalParameterName = "first_optional_parameter" + firstOptionParameterDescription = "This is the first optional parameter" + firstOptionalParameterValue = "1" + secondOptionalParameterName = "second_optional_parameter" + secondOptionalParameterDescription = "This is the second optional parameter" + secondOptionalParameterValue = "2" + + thirdParameterName = "third_parameter" + thirdParameterDescription = "This is the third parameter" + thirdParameterValue = "3" + ) + + echoResponses := func(presets ...*proto.Preset) *echo.Responses { + return prepareEchoResponses([]*proto.RichParameter{ + { + Name: firstParameterName, + DisplayName: firstParameterDisplayName, + Description: firstParameterDescription, + Mutable: true, + DefaultValue: firstParameterValue, + Options: []*proto.RichParameterOption{ + { + Name: firstOptionalParameterName, + Description: firstOptionParameterDescription, + Value: firstOptionalParameterValue, + }, + { + Name: secondOptionalParameterName, + Description: secondOptionalParameterDescription, + Value: secondOptionalParameterValue, + }, + }, + }, + { + Name: thirdParameterName, + Description: thirdParameterDescription, + DefaultValue: thirdParameterValue, + Mutable: true, + }, + }, presets...) + } + + runReconciliationLoop := func( + t *testing.T, + ctx context.Context, + db database.Store, + reconciler *prebuilds.StoreReconciler, + presets []codersdk.Preset, + ) { + t.Helper() + + state, err := reconciler.SnapshotState(ctx, db) + require.NoError(t, err) + require.Len(t, presets, 1) + ps, err := state.FilterByPreset(presets[0].ID) + require.NoError(t, err) + require.NotNil(t, ps) + actions, err := reconciler.CalculateActions(ctx, *ps) + require.NoError(t, err) + require.NotNil(t, actions) + require.NoError(t, reconciler.ReconcilePreset(ctx, *ps)) + } + + getRunningPrebuilds := func( + t *testing.T, + ctx context.Context, + db database.Store, + prebuildInstances int, + ) []database.GetRunningPrebuiltWorkspacesRow { + t.Helper() + + var runningPrebuilds []database.GetRunningPrebuiltWorkspacesRow + testutil.Eventually(ctx, t, func(context.Context) bool { + runningPrebuilds = nil + rows, err := db.GetRunningPrebuiltWorkspaces(ctx) + if err != nil { + return false + } + + for _, row := range rows { + runningPrebuilds = append(runningPrebuilds, row) + + agents, err := db.GetWorkspaceAgentsInLatestBuildByWorkspaceID(ctx, row.ID) + if err != nil || len(agents) == 0 { + return false + } + + for _, agent := range agents { + err = db.UpdateWorkspaceAgentLifecycleStateByID(ctx, database.UpdateWorkspaceAgentLifecycleStateByIDParams{ + ID: agent.ID, + LifecycleState: database.WorkspaceAgentLifecycleStateReady, + StartedAt: sql.NullTime{Time: time.Now().Add(time.Hour), Valid: true}, + ReadyAt: sql.NullTime{Time: time.Now().Add(-1 * time.Hour), Valid: true}, + }) + if err != nil { + return false + } + } + } + + t.Logf("found %d running prebuilds so far, want %d", len(runningPrebuilds), prebuildInstances) + return len(runningPrebuilds) == prebuildInstances + }, testutil.IntervalSlow, "prebuilds not running") + + return runningPrebuilds + } + + // This test verifies that when the selected preset has running prebuilds, + // one of those prebuilds is claimed for the user upon workspace creation. + t.Run("PresetFlagClaimsPrebuiltWorkspace", func(t *testing.T) { + t.Parallel() + + // Setup + ctx := testutil.Context(t, testutil.WaitSuperLong) + db, pb := dbtestutil.NewDB(t, dbtestutil.WithDumpOnFailure()) + client, _, api, owner := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ + Options: &coderdtest.Options{ + Database: db, + Pubsub: pb, + IncludeProvisionerDaemon: true, + }, + }) + + // Setup Prebuild reconciler + cache := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{}) + newNoopUsageCheckerPtr := func() *atomic.Pointer[wsbuilder.UsageChecker] { + var noopUsageChecker wsbuilder.UsageChecker = wsbuilder.NoopUsageChecker{} + buildUsageChecker := atomic.Pointer[wsbuilder.UsageChecker]{} + buildUsageChecker.Store(&noopUsageChecker) + return &buildUsageChecker + } + reconciler := prebuilds.NewStoreReconciler( + db, pb, cache, + codersdk.PrebuildsConfig{}, + testutil.Logger(t), + quartz.NewMock(t), + prometheus.NewRegistry(), + notifications.NewNoopEnqueuer(), + newNoopUsageCheckerPtr(), + ) + var claimer agplprebuilds.Claimer = prebuilds.NewEnterpriseClaimer(db) + api.AGPL.PrebuildsClaimer.Store(&claimer) + + // Given: a template and a template version where the preset defines values for all required parameters, + // and is configured to have 1 prebuild instance + prebuildInstances := int32(1) + preset := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + Prebuild: &proto.Prebuild{ + Instances: prebuildInstances, + }, + } + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&preset)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + presets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, presets, 1) + require.Equal(t, preset.Name, presets[0].Name) + + // Given: Reconciliation loop runs and starts prebuilt workspaces + runReconciliationLoop(t, ctx, db, reconciler, presets) + runningPrebuilds := getRunningPrebuilds(t, ctx, db, int(prebuildInstances)) + require.Len(t, runningPrebuilds, int(prebuildInstances)) + require.Equal(t, presets[0].ID, runningPrebuilds[0].CurrentPresetID.UUID) + + // Given: a running prebuilt workspace, ready to be claimed + prebuild := coderdtest.MustWorkspace(t, client, runningPrebuilds[0].ID) + require.Equal(t, codersdk.WorkspaceTransitionStart, prebuild.LatestBuild.Transition) + require.Equal(t, template.ID, prebuild.TemplateID) + require.Equal(t, version.ID, prebuild.TemplateActiveVersionID) + require.Equal(t, presets[0].ID, *prebuild.LatestBuild.TemplateVersionPresetID) + + // When: running the create command with the specified preset + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", "--preset", preset.Name) + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err = inv.Run() + require.NoError(t, err) + + // Should: display the selected preset as well as its parameters + presetName := fmt.Sprintf("Preset '%s' applied:", preset.Name) + pty.ExpectMatch(presetName) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", firstParameterName, secondOptionalParameterValue)) + pty.ExpectMatch(fmt.Sprintf("%s: '%s'", thirdParameterName, thirdParameterValue)) + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + // Should: create the user's workspace by claiming the existing prebuilt workspace + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + require.Equal(t, prebuild.ID, workspaces.Workspaces[0].ID) + + // Should: create a workspace using the expected template version and the preset-defined parameters + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Equal(t, presets[0].ID, *workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: secondOptionalParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) + + // This test verifies that when the user provides `--preset None`, + // no preset is applied, no prebuilt workspace is claimed, and + // a new regular workspace is created instead. + t.Run("PresetNoneDoesNotClaimPrebuiltWorkspace", func(t *testing.T) { + t.Parallel() + + // Setup + ctx := testutil.Context(t, testutil.WaitSuperLong) + db, pb := dbtestutil.NewDB(t, dbtestutil.WithDumpOnFailure()) + client, _, api, owner := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ + Options: &coderdtest.Options{ + Database: db, + Pubsub: pb, + IncludeProvisionerDaemon: true, + }, + }) + + // Setup Prebuild reconciler + cache := files.New(prometheus.NewRegistry(), &coderdtest.FakeAuthorizer{}) + newNoopUsageCheckerPtr := func() *atomic.Pointer[wsbuilder.UsageChecker] { + var noopUsageChecker wsbuilder.UsageChecker = wsbuilder.NoopUsageChecker{} + buildUsageChecker := atomic.Pointer[wsbuilder.UsageChecker]{} + buildUsageChecker.Store(&noopUsageChecker) + return &buildUsageChecker + } + reconciler := prebuilds.NewStoreReconciler( + db, pb, cache, + codersdk.PrebuildsConfig{}, + testutil.Logger(t), + quartz.NewMock(t), + prometheus.NewRegistry(), + notifications.NewNoopEnqueuer(), + newNoopUsageCheckerPtr(), + ) + var claimer agplprebuilds.Claimer = prebuilds.NewEnterpriseClaimer(db) + api.AGPL.PrebuildsClaimer.Store(&claimer) + + // Given: a template and a template version where the preset defines values for all required parameters, + // and is configured to have 1 prebuild instance + prebuildInstances := int32(1) + presetWithPrebuild := proto.Preset{ + Name: "preset-test", + Parameters: []*proto.PresetParameter{ + {Name: firstParameterName, Value: secondOptionalParameterValue}, + {Name: thirdParameterName, Value: thirdParameterValue}, + }, + Prebuild: &proto.Prebuild{ + Instances: prebuildInstances, + }, + } + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses(&presetWithPrebuild)) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + presets, err := client.TemplateVersionPresets(ctx, version.ID) + require.NoError(t, err) + require.Len(t, presets, 1) + + // Given: Reconciliation loop runs and starts prebuilt workspaces + runReconciliationLoop(t, ctx, db, reconciler, presets) + runningPrebuilds := getRunningPrebuilds(t, ctx, db, int(prebuildInstances)) + require.Len(t, runningPrebuilds, int(prebuildInstances)) + require.Equal(t, presets[0].ID, runningPrebuilds[0].CurrentPresetID.UUID) + + // Given: a running prebuilt workspace, ready to be claimed + prebuild := coderdtest.MustWorkspace(t, client, runningPrebuilds[0].ID) + require.Equal(t, codersdk.WorkspaceTransitionStart, prebuild.LatestBuild.Transition) + require.Equal(t, template.ID, prebuild.TemplateID) + require.Equal(t, version.ID, prebuild.TemplateActiveVersionID) + require.Equal(t, presets[0].ID, *prebuild.LatestBuild.TemplateVersionPresetID) + + // When: running the create command without a preset flag + workspaceName := "my-workspace" + inv, root := clitest.New(t, "create", workspaceName, "--template", template.Name, "-y", + "--preset", cli.PresetNone, + "--parameter", fmt.Sprintf("%s=%s", firstParameterName, firstParameterValue), + "--parameter", fmt.Sprintf("%s=%s", thirdParameterName, thirdParameterValue)) + clitest.SetupConfig(t, member, root) + pty := ptytest.New(t).Attach(inv) + inv.Stdout = pty.Output() + inv.Stderr = pty.Output() + err = inv.Run() + require.NoError(t, err) + pty.ExpectMatch("No preset applied.") + + // Verify if the new workspace uses expected parameters. + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort) + defer cancel() + + // Should: create a new user's workspace without claiming the existing prebuilt workspace + workspaces, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ + Name: workspaceName, + }) + require.NoError(t, err) + require.Len(t, workspaces.Workspaces, 1) + require.NotEqual(t, prebuild.ID, workspaces.Workspaces[0].ID) + + // Should: create a workspace using the expected template version and the specified parameters + workspaceLatestBuild := workspaces.Workspaces[0].LatestBuild + require.Equal(t, version.ID, workspaceLatestBuild.TemplateVersionID) + require.Nil(t, workspaceLatestBuild.TemplateVersionPresetID) + buildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceLatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParameters, 2) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: firstParameterName, Value: firstParameterValue}) + require.Contains(t, buildParameters, codersdk.WorkspaceBuildParameter{Name: thirdParameterName, Value: thirdParameterValue}) + }) +} + +func prepareEchoResponses(parameters []*proto.RichParameter, presets ...*proto.Preset) *echo.Responses { + return &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionPlan: []*proto.Response{ + { + Type: &proto.Response_Plan{ + Plan: &proto.PlanComplete{ + Parameters: parameters, + Presets: presets, + }, + }, + }, + }, + ProvisionApply: []*proto.Response{ + { + Type: &proto.Response_Apply{ + Apply: &proto.ApplyComplete{ + Resources: []*proto.Resource{ + { + Type: "compute", + Name: "main", + Agents: []*proto.Agent{ + { + Name: "smith", + OperatingSystem: "linux", + Architecture: "i386", + }, + }, + }, + }, + }, + }, + }, + }, + } +} From 58123e17ca68e45f8360f8bf411fe718da2ee69e Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Mon, 28 Jul 2025 16:00:41 +0200 Subject: [PATCH 003/260] fix: fix to display tooltip on hover (#19058) --- site/src/components/Combobox/Combobox.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/site/src/components/Combobox/Combobox.tsx b/site/src/components/Combobox/Combobox.tsx index bc0fa73eb9653..e815ca601f0af 100644 --- a/site/src/components/Combobox/Combobox.tsx +++ b/site/src/components/Combobox/Combobox.tsx @@ -134,7 +134,12 @@ export const Combobox: FC = ({ - + e.stopPropagation()} + > + + {option.description} From 0672bf50841c69d1716465fee486eabdd11d19ce Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Mon, 28 Jul 2025 15:02:26 +0100 Subject: [PATCH 004/260] feat: support icon and description in preset (#18977) ## Description This PR adds support for `description` and `icon` fields to `template_version_presets`. These fields will allow displaying richer information for presets in the UI, improving the user experience when creating a workspace. Both fields are optional, non-nullable, and default to empty strings. ## Changes * Database migration with the addition of `description VARCHAR(128)` and `icon VARCHAR(256)` columns to the `template_version_presets` table. * Updated the `CreateWorkspacePageView` in the UI Note: UI changes will be addressed in a separate PR --- ...oder_provisioner_list_--output_json.golden | 2 +- coderd/apidoc/docs.go | 6 + coderd/apidoc/swagger.json | 6 + coderd/database/dbfake/dbfake.go | 2 + coderd/database/dbgen/dbgen.go | 2 + coderd/database/dump.sql | 8 +- ...cription_template_version_presets.down.sql | 3 + ...escription_template_version_presets.up.sql | 6 + coderd/database/models.go | 4 + coderd/database/queries.sql.go | 30 +- coderd/database/queries/presets.sql | 8 +- coderd/presets.go | 2 + .../provisionerdserver/provisionerdserver.go | 3 + codersdk/presets.go | 2 + docs/reference/api/schemas.md | 4 + docs/reference/api/templates.md | 4 + provisioner/terraform/resources.go | 4 +- provisionerd/proto/version.go | 5 +- provisionersdk/proto/provisioner.pb.go | 1147 +++++++++-------- provisionersdk/proto/provisioner.proto | 2 + site/e2e/provisionerGenerated.ts | 8 + site/src/api/typesGenerated.ts | 2 + .../CreateWorkspacePageView.stories.tsx | 10 + site/src/testHelpers/entities.ts | 10 + 24 files changed, 704 insertions(+), 576 deletions(-) create mode 100644 coderd/database/migrations/000351_add_icon_and_description_template_version_presets.down.sql create mode 100644 coderd/database/migrations/000351_add_icon_and_description_template_version_presets.up.sql diff --git a/cli/testdata/coder_provisioner_list_--output_json.golden b/cli/testdata/coder_provisioner_list_--output_json.golden index cfa777e99c3f9..b92794ab07e18 100644 --- a/cli/testdata/coder_provisioner_list_--output_json.golden +++ b/cli/testdata/coder_provisioner_list_--output_json.golden @@ -7,7 +7,7 @@ "last_seen_at": "====[timestamp]=====", "name": "test-daemon", "version": "v0.0.0-devel", - "api_version": "1.7", + "api_version": "1.8", "provisioners": [ "echo" ], diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 3192860d6a0ca..f0ea240042900 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -14880,9 +14880,15 @@ const docTemplate = `{ "default": { "type": "boolean" }, + "description": { + "type": "string" + }, "desiredPrebuildInstances": { "type": "integer" }, + "icon": { + "type": "string" + }, "id": { "type": "string" }, diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 26ee0c0cd05e4..38110555bf7cd 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -13487,9 +13487,15 @@ "default": { "type": "boolean" }, + "description": { + "type": "string" + }, "desiredPrebuildInstances": { "type": "integer" }, + "icon": { + "type": "string" + }, "id": { "type": "string" }, diff --git a/coderd/database/dbfake/dbfake.go b/coderd/database/dbfake/dbfake.go index 98e98122e74e5..99d3c72ab4be3 100644 --- a/coderd/database/dbfake/dbfake.go +++ b/coderd/database/dbfake/dbfake.go @@ -417,6 +417,8 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse { InvalidateAfterSecs: preset.InvalidateAfterSecs, SchedulingTimezone: preset.SchedulingTimezone, IsDefault: false, + Description: preset.Description, + Icon: preset.Icon, }) } diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index d5693afe98826..812d2e2576650 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -1392,6 +1392,8 @@ func Preset(t testing.TB, db database.Store, seed database.InsertPresetParams) d InvalidateAfterSecs: seed.InvalidateAfterSecs, SchedulingTimezone: seed.SchedulingTimezone, IsDefault: seed.IsDefault, + Description: seed.Description, + Icon: seed.Icon, }) require.NoError(t, err, "insert preset") return preset diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index eb07a5735088f..bbd6ca3ce5736 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1618,9 +1618,15 @@ CREATE TABLE template_version_presets ( invalidate_after_secs integer DEFAULT 0, prebuild_status prebuild_status DEFAULT 'healthy'::prebuild_status NOT NULL, scheduling_timezone text DEFAULT ''::text NOT NULL, - is_default boolean DEFAULT false NOT NULL + is_default boolean DEFAULT false NOT NULL, + description character varying(128) DEFAULT ''::character varying NOT NULL, + icon character varying(256) DEFAULT ''::character varying NOT NULL ); +COMMENT ON COLUMN template_version_presets.description IS 'Short text describing the preset (max 128 characters).'; + +COMMENT ON COLUMN template_version_presets.icon IS 'URL or path to an icon representing the preset (max 256 characters).'; + CREATE TABLE template_version_terraform_values ( template_version_id uuid NOT NULL, updated_at timestamp with time zone DEFAULT now() NOT NULL, diff --git a/coderd/database/migrations/000351_add_icon_and_description_template_version_presets.down.sql b/coderd/database/migrations/000351_add_icon_and_description_template_version_presets.down.sql new file mode 100644 index 0000000000000..ce626d3929226 --- /dev/null +++ b/coderd/database/migrations/000351_add_icon_and_description_template_version_presets.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE template_version_presets + DROP COLUMN IF EXISTS description, + DROP COLUMN IF EXISTS icon; diff --git a/coderd/database/migrations/000351_add_icon_and_description_template_version_presets.up.sql b/coderd/database/migrations/000351_add_icon_and_description_template_version_presets.up.sql new file mode 100644 index 0000000000000..dcbb2d3b3834c --- /dev/null +++ b/coderd/database/migrations/000351_add_icon_and_description_template_version_presets.up.sql @@ -0,0 +1,6 @@ +ALTER TABLE template_version_presets + ADD COLUMN IF NOT EXISTS description VARCHAR(128) NOT NULL DEFAULT '', + ADD COLUMN IF NOT EXISTS icon VARCHAR(256) NOT NULL DEFAULT ''; + +COMMENT ON COLUMN template_version_presets.description IS 'Short text describing the preset (max 128 characters).'; +COMMENT ON COLUMN template_version_presets.icon IS 'URL or path to an icon representing the preset (max 256 characters).'; diff --git a/coderd/database/models.go b/coderd/database/models.go index e23efe0de0521..094bc98c68373 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -3621,6 +3621,10 @@ type TemplateVersionPreset struct { PrebuildStatus PrebuildStatus `db:"prebuild_status" json:"prebuild_status"` SchedulingTimezone string `db:"scheduling_timezone" json:"scheduling_timezone"` IsDefault bool `db:"is_default" json:"is_default"` + // Short text describing the preset (max 128 characters). + Description string `db:"description" json:"description"` + // URL or path to an icon representing the preset (max 256 characters). + Icon string `db:"icon" json:"icon"` } type TemplateVersionPresetParameter struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 82ffd069b29f5..80357b3731874 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -7628,7 +7628,7 @@ func (q *sqlQuerier) GetActivePresetPrebuildSchedules(ctx context.Context) ([]Te } const getPresetByID = `-- name: GetPresetByID :one -SELECT tvp.id, tvp.template_version_id, tvp.name, tvp.created_at, tvp.desired_instances, tvp.invalidate_after_secs, tvp.prebuild_status, tvp.scheduling_timezone, tvp.is_default, tv.template_id, tv.organization_id FROM +SELECT tvp.id, tvp.template_version_id, tvp.name, tvp.created_at, tvp.desired_instances, tvp.invalidate_after_secs, tvp.prebuild_status, tvp.scheduling_timezone, tvp.is_default, tvp.description, tvp.icon, tv.template_id, tv.organization_id FROM template_version_presets tvp INNER JOIN template_versions tv ON tvp.template_version_id = tv.id WHERE tvp.id = $1 @@ -7644,6 +7644,8 @@ type GetPresetByIDRow struct { PrebuildStatus PrebuildStatus `db:"prebuild_status" json:"prebuild_status"` SchedulingTimezone string `db:"scheduling_timezone" json:"scheduling_timezone"` IsDefault bool `db:"is_default" json:"is_default"` + Description string `db:"description" json:"description"` + Icon string `db:"icon" json:"icon"` TemplateID uuid.NullUUID `db:"template_id" json:"template_id"` OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` } @@ -7661,6 +7663,8 @@ func (q *sqlQuerier) GetPresetByID(ctx context.Context, presetID uuid.UUID) (Get &i.PrebuildStatus, &i.SchedulingTimezone, &i.IsDefault, + &i.Description, + &i.Icon, &i.TemplateID, &i.OrganizationID, ) @@ -7669,7 +7673,7 @@ func (q *sqlQuerier) GetPresetByID(ctx context.Context, presetID uuid.UUID) (Get const getPresetByWorkspaceBuildID = `-- name: GetPresetByWorkspaceBuildID :one SELECT - template_version_presets.id, template_version_presets.template_version_id, template_version_presets.name, template_version_presets.created_at, template_version_presets.desired_instances, template_version_presets.invalidate_after_secs, template_version_presets.prebuild_status, template_version_presets.scheduling_timezone, template_version_presets.is_default + template_version_presets.id, template_version_presets.template_version_id, template_version_presets.name, template_version_presets.created_at, template_version_presets.desired_instances, template_version_presets.invalidate_after_secs, template_version_presets.prebuild_status, template_version_presets.scheduling_timezone, template_version_presets.is_default, template_version_presets.description, template_version_presets.icon FROM template_version_presets INNER JOIN workspace_builds ON workspace_builds.template_version_preset_id = template_version_presets.id @@ -7690,6 +7694,8 @@ func (q *sqlQuerier) GetPresetByWorkspaceBuildID(ctx context.Context, workspaceB &i.PrebuildStatus, &i.SchedulingTimezone, &i.IsDefault, + &i.Description, + &i.Icon, ) return i, err } @@ -7771,7 +7777,7 @@ func (q *sqlQuerier) GetPresetParametersByTemplateVersionID(ctx context.Context, const getPresetsByTemplateVersionID = `-- name: GetPresetsByTemplateVersionID :many SELECT - id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone, is_default + id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone, is_default, description, icon FROM template_version_presets WHERE @@ -7797,6 +7803,8 @@ func (q *sqlQuerier) GetPresetsByTemplateVersionID(ctx context.Context, template &i.PrebuildStatus, &i.SchedulingTimezone, &i.IsDefault, + &i.Description, + &i.Icon, ); err != nil { return nil, err } @@ -7820,7 +7828,9 @@ INSERT INTO template_version_presets ( desired_instances, invalidate_after_secs, scheduling_timezone, - is_default + is_default, + description, + icon ) VALUES ( $1, @@ -7830,8 +7840,10 @@ VALUES ( $5, $6, $7, - $8 -) RETURNING id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone, is_default + $8, + $9, + $10 +) RETURNING id, template_version_id, name, created_at, desired_instances, invalidate_after_secs, prebuild_status, scheduling_timezone, is_default, description, icon ` type InsertPresetParams struct { @@ -7843,6 +7855,8 @@ type InsertPresetParams struct { InvalidateAfterSecs sql.NullInt32 `db:"invalidate_after_secs" json:"invalidate_after_secs"` SchedulingTimezone string `db:"scheduling_timezone" json:"scheduling_timezone"` IsDefault bool `db:"is_default" json:"is_default"` + Description string `db:"description" json:"description"` + Icon string `db:"icon" json:"icon"` } func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) (TemplateVersionPreset, error) { @@ -7855,6 +7869,8 @@ func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) ( arg.InvalidateAfterSecs, arg.SchedulingTimezone, arg.IsDefault, + arg.Description, + arg.Icon, ) var i TemplateVersionPreset err := row.Scan( @@ -7867,6 +7883,8 @@ func (q *sqlQuerier) InsertPreset(ctx context.Context, arg InsertPresetParams) ( &i.PrebuildStatus, &i.SchedulingTimezone, &i.IsDefault, + &i.Description, + &i.Icon, ) return i, err } diff --git a/coderd/database/queries/presets.sql b/coderd/database/queries/presets.sql index d275e4744c729..e6edcb4c59c1f 100644 --- a/coderd/database/queries/presets.sql +++ b/coderd/database/queries/presets.sql @@ -7,7 +7,9 @@ INSERT INTO template_version_presets ( desired_instances, invalidate_after_secs, scheduling_timezone, - is_default + is_default, + description, + icon ) VALUES ( @id, @@ -17,7 +19,9 @@ VALUES ( @desired_instances, @invalidate_after_secs, @scheduling_timezone, - @is_default + @is_default, + @description, + @icon ) RETURNING *; -- name: InsertPresetParameters :many diff --git a/coderd/presets.go b/coderd/presets.go index c8d84baec4bf3..b002d6168f5ba 100644 --- a/coderd/presets.go +++ b/coderd/presets.go @@ -54,6 +54,8 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request) Name: preset.Name, Default: preset.IsDefault, DesiredPrebuildInstances: convertPrebuildInstances(preset.DesiredInstances), + Description: preset.Description, + Icon: preset.Icon, } for _, presetParam := range presetParams { if presetParam.TemplateVersionPresetID != preset.ID { diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index f545169c93b31..518b48d2fe04b 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -2264,6 +2264,7 @@ func InsertWorkspacePresetAndParameters(ctx context.Context, db database.Store, prebuildSchedules = protoPreset.Prebuild.Scheduling.Schedule } } + dbPreset, err := tx.InsertPreset(ctx, database.InsertPresetParams{ ID: uuid.New(), TemplateVersionID: templateVersionID, @@ -2273,6 +2274,8 @@ func InsertWorkspacePresetAndParameters(ctx context.Context, db database.Store, InvalidateAfterSecs: ttl, SchedulingTimezone: schedulingTimezone, IsDefault: protoPreset.GetDefault(), + Description: protoPreset.Description, + Icon: protoPreset.Icon, }) if err != nil { return xerrors.Errorf("insert preset: %w", err) diff --git a/codersdk/presets.go b/codersdk/presets.go index 2d94aa3baabb6..eba1b9216dd4b 100644 --- a/codersdk/presets.go +++ b/codersdk/presets.go @@ -16,6 +16,8 @@ type Preset struct { Parameters []PresetParameter Default bool DesiredPrebuildInstances *int + Description string + Icon string } type PresetParameter struct { diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index 8370233d2bdd5..e41c4c093cc4d 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -5513,7 +5513,9 @@ Only certain features set these fields: - FeatureManagedAgentLimit| ```json { "default": true, + "description": "string", "desiredPrebuildInstances": 0, + "icon": "string", "id": "string", "name": "string", "parameters": [ @@ -5530,7 +5532,9 @@ Only certain features set these fields: - FeatureManagedAgentLimit| | Name | Type | Required | Restrictions | Description | |----------------------------|---------------------------------------------------------------|----------|--------------|-------------| | `default` | boolean | false | | | +| `description` | string | false | | | | `desiredPrebuildInstances` | integer | false | | | +| `icon` | string | false | | | | `id` | string | false | | | | `name` | string | false | | | | `parameters` | array of [codersdk.PresetParameter](#codersdkpresetparameter) | false | | | diff --git a/docs/reference/api/templates.md b/docs/reference/api/templates.md index 8d84623a15c8e..d0c7082ef74aa 100644 --- a/docs/reference/api/templates.md +++ b/docs/reference/api/templates.md @@ -2914,7 +2914,9 @@ curl -X GET http://coder-server:8080/api/v2/templateversions/{templateversion}/p [ { "default": true, + "description": "string", "desiredPrebuildInstances": 0, + "icon": "string", "id": "string", "name": "string", "parameters": [ @@ -2941,7 +2943,9 @@ Status Code **200** |------------------------------|---------|----------|--------------|-------------| | `[array item]` | array | false | | | | `» default` | boolean | false | | | +| `» description` | string | false | | | | `» desiredPrebuildInstances` | integer | false | | | +| `» icon` | string | false | | | | `» id` | string | false | | | | `» name` | string | false | | | | `» parameters` | array | false | | | diff --git a/provisioner/terraform/resources.go b/provisioner/terraform/resources.go index 84174c90b435d..9642751e7466a 100644 --- a/provisioner/terraform/resources.go +++ b/provisioner/terraform/resources.go @@ -965,7 +965,9 @@ func ConvertState(ctx context.Context, modules []*tfjson.StateModule, rawGraph s ExpirationPolicy: expirationPolicy, Scheduling: scheduling, }, - Default: preset.Default, + Default: preset.Default, + Description: preset.Description, + Icon: preset.Icon, } if slice.Contains(duplicatedPresetNames, preset.Name) { diff --git a/provisionerd/proto/version.go b/provisionerd/proto/version.go index e61aac0c5abd8..10e73a3be176c 100644 --- a/provisionerd/proto/version.go +++ b/provisionerd/proto/version.go @@ -44,9 +44,12 @@ import "github.com/coder/coder/v2/apiversion" // -> `has_ai_tasks` in `CompleteJob.TemplateImport` // -> `has_ai_tasks` and `ai_tasks` in `PlanComplete` // -> new message types `AITaskSidebarApp` and `AITask` +// +// API v1.8: +// - Add new fields `description` and `icon` to `Preset`. const ( CurrentMajor = 1 - CurrentMinor = 7 + CurrentMinor = 8 ) // CurrentVersion is the current provisionerd API version. diff --git a/provisionersdk/proto/provisioner.pb.go b/provisionersdk/proto/provisioner.pb.go index 7412cb6155610..52d40ef87dd4d 100644 --- a/provisionersdk/proto/provisioner.pb.go +++ b/provisionersdk/proto/provisioner.pb.go @@ -1107,10 +1107,12 @@ type Preset struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Parameters []*PresetParameter `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty"` - Prebuild *Prebuild `protobuf:"bytes,3,opt,name=prebuild,proto3" json:"prebuild,omitempty"` - Default bool `protobuf:"varint,4,opt,name=default,proto3" json:"default,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Parameters []*PresetParameter `protobuf:"bytes,2,rep,name=parameters,proto3" json:"parameters,omitempty"` + Prebuild *Prebuild `protobuf:"bytes,3,opt,name=prebuild,proto3" json:"prebuild,omitempty"` + Default bool `protobuf:"varint,4,opt,name=default,proto3" json:"default,omitempty"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + Icon string `protobuf:"bytes,6,opt,name=icon,proto3" json:"icon,omitempty"` } func (x *Preset) Reset() { @@ -1173,6 +1175,20 @@ func (x *Preset) GetDefault() bool { return false } +func (x *Preset) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Preset) GetIcon() string { + if x != nil { + return x.Icon + } + return "" +} + type PresetParameter struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4449,7 +4465,7 @@ var file_provisionersdk_proto_provisioner_proto_rawDesc = []byte{ 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x69, 0x6e, 0x67, 0x22, 0xa7, 0x01, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x12, 0x12, + 0x69, 0x6e, 0x67, 0x22, 0xdd, 0x01, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, @@ -4459,569 +4475,572 @@ var file_provisionersdk_proto_provisioner_proto_rawDesc = []byte{ 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x08, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3b, 0x0a, - 0x0f, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x47, 0x0a, 0x13, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, - 0x74, 0x68, 0x73, 0x22, 0x57, 0x0a, 0x0d, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x4a, 0x0a, 0x03, - 0x4c, 0x6f, 0x67, 0x12, 0x2b, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x37, 0x0a, 0x14, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x41, 0x75, 0x74, 0x68, - 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x22, 0x4a, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, - 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x49, 0x0a, - 0x14, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xda, 0x08, 0x0a, 0x05, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x24, 0x0a, 0x04, 0x61, 0x70, 0x70, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, - 0x70, 0x70, 0x52, 0x04, 0x61, 0x70, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x74, 0x72, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x73, 0x68, 0x6f, 0x6f, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x74, 0x72, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x73, 0x68, 0x6f, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x55, - 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x6f, 0x74, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x74, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x41, 0x70, 0x70, 0x73, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x41, 0x70, 0x70, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, - 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x07, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x65, 0x6e, - 0x76, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, - 0x61, 0x45, 0x6e, 0x76, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, - 0x12, 0x3f, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x76, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x63, 0x6f, - 0x70, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, - 0x53, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0xa3, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, - 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x1a, 0x36, 0x0a, 0x08, 0x45, - 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x61, 0x75, 0x74, 0x68, 0x4a, 0x04, 0x08, 0x0e, 0x10, - 0x0f, 0x52, 0x12, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x8f, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, - 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x07, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x07, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x15, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x63, 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0xc6, 0x01, - 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x41, 0x70, 0x70, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x76, 0x73, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x76, - 0x73, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x73, 0x63, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x76, 0x73, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x77, 0x65, 0x62, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x65, 0x62, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x73, 0x68, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x73, 0x68, 0x48, 0x65, 0x6c, 0x70, 0x65, 0x72, - 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x48, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x22, 0x2f, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9f, 0x02, 0x0a, 0x06, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x72, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x63, 0x72, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x4c, 0x6f, - 0x67, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x5f, 0x6f, 0x6e, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x4f, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x5f, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x6f, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4f, - 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x19, - 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x22, 0x6e, 0x0a, 0x0c, 0x44, 0x65, 0x76, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x46, 0x6f, - 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xba, 0x03, 0x0a, 0x03, 0x41, 0x70, - 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x62, - 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x3a, 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0c, 0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, - 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, - 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, - 0x70, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x52, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x49, 0x6e, - 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x59, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x22, 0x92, 0x03, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, - 0x0a, 0x04, 0x68, 0x69, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x68, 0x69, - 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x64, - 0x61, 0x69, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x1a, 0x69, 0x0a, 0x08, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x17, 0x0a, - 0x07, 0x69, 0x73, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x69, 0x73, 0x4e, 0x75, 0x6c, 0x6c, 0x22, 0x5e, 0x0a, 0x06, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x22, 0x31, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x48, 0x0a, 0x15, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x22, 0x0a, 0x10, 0x41, 0x49, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x69, 0x64, - 0x65, 0x62, 0x61, 0x72, 0x41, 0x70, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x58, 0x0a, 0x06, 0x41, 0x49, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x69, 0x64, 0x65, 0x62, 0x61, 0x72, 0x5f, 0x61, 0x70, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x49, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x69, 0x64, 0x65, 0x62, - 0x61, 0x72, 0x41, 0x70, 0x70, 0x52, 0x0a, 0x73, 0x69, 0x64, 0x65, 0x62, 0x61, 0x72, 0x41, 0x70, - 0x70, 0x22, 0xca, 0x09, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, - 0x0a, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x53, 0x0a, 0x14, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x32, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x21, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x1d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, - 0x4f, 0x69, 0x64, 0x63, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x41, 0x0a, 0x1d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x42, 0x0a, 0x1e, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x73, - 0x73, 0x68, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, - 0x6e, 0x65, 0x72, 0x53, 0x73, 0x68, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, - 0x44, 0x0a, 0x1f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x53, 0x73, 0x68, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x4e, 0x0a, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x62, 0x61, 0x63, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x13, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x62, 0x61, 0x63, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x6d, 0x0a, 0x1e, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x73, 0x74, 0x61, - 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x52, 0x1b, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, - 0x5d, 0x0a, 0x19, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x16, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x8a, - 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x0e, 0x0a, 0x0c, 0x50, - 0x61, 0x72, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x02, 0x0a, 0x0d, - 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x12, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, - 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x11, - 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, - 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x1a, - 0x40, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xbe, 0x03, 0x0a, 0x0b, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x53, 0x0a, 0x15, 0x72, 0x69, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, - 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x72, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0f, 0x76, 0x61, 0x72, - 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, - 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x59, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x63, 0x6f, 0x6e, 0x22, 0x3b, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x47, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x57, 0x0a, 0x0d, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x22, 0x4a, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x2b, 0x0a, 0x05, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, + 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x37, + 0x0a, 0x14, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x22, 0x49, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, + 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xda, + 0x08, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x03, + 0x65, 0x6e, 0x76, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, + 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x29, 0x0a, 0x10, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x24, 0x0a, 0x04, 0x61, 0x70, 0x70, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x52, 0x04, 0x61, 0x70, 0x70, 0x73, 0x12, 0x16, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, + 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x74, 0x72, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x73, 0x68, 0x6f, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x72, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x73, 0x68, 0x6f, + 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x6f, 0x74, 0x64, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x74, + 0x64, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, + 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x61, 0x70, 0x70, 0x73, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x41, 0x70, 0x70, 0x73, 0x52, 0x0b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x41, 0x70, 0x70, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x52, 0x07, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x0a, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x5f, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, + 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x45, 0x6e, 0x76, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x12, 0x53, 0x0a, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x6d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x13, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x76, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x70, 0x69, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x1a, 0xa3, 0x01, 0x0a, 0x08, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x1a, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x76, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x61, 0x75, 0x74, + 0x68, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x52, 0x12, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x5f, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x8f, 0x01, 0x0a, 0x13, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, + 0x3c, 0x0a, 0x07, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x4f, 0x0a, + 0x15, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x63, + 0x0a, 0x15, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x22, 0xc6, 0x01, 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x41, + 0x70, 0x70, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x73, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x76, 0x73, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, + 0x73, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x76, 0x73, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x73, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x65, 0x62, 0x5f, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x65, 0x62, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x73, 0x68, 0x5f, 0x68, + 0x65, 0x6c, 0x70, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x73, 0x68, + 0x48, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x6c, 0x70, 0x65, 0x72, 0x22, 0x2f, 0x0a, 0x03, + 0x45, 0x6e, 0x76, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9f, 0x02, + 0x0a, 0x06, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, + 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, + 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x72, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x72, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x69, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x73, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x20, 0x0a, 0x0c, 0x72, 0x75, 0x6e, + 0x5f, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x72, 0x75, 0x6e, 0x4f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x72, + 0x75, 0x6e, 0x5f, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4f, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, + 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68, 0x22, + 0x6e, 0x0a, 0x0c, 0x44, 0x65, 0x76, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, + 0x29, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0xba, 0x03, 0x0a, 0x03, 0x41, 0x70, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x73, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x3a, 0x0a, 0x0b, + 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x0b, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x68, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, + 0x70, 0x53, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0c, 0x73, + 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x68, + 0x69, 0x64, 0x64, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x52, 0x06, + 0x6f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x59, 0x0a, 0x0b, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, + 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x92, 0x03, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x06, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x68, 0x69, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x1a, 0x69, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x6e, 0x75, 0x6c, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4e, 0x75, 0x6c, 0x6c, 0x22, 0x5e, 0x0a, 0x06, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x22, 0x31, 0x0a, 0x04, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, + 0x48, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, + 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x22, 0x0a, 0x10, 0x41, 0x49, 0x54, + 0x61, 0x73, 0x6b, 0x53, 0x69, 0x64, 0x65, 0x62, 0x61, 0x72, 0x41, 0x70, 0x70, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x58, 0x0a, + 0x06, 0x41, 0x49, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x0b, 0x73, 0x69, 0x64, 0x65, 0x62, + 0x61, 0x72, 0x5f, 0x61, 0x70, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x49, 0x54, 0x61, 0x73, + 0x6b, 0x53, 0x69, 0x64, 0x65, 0x62, 0x61, 0x72, 0x41, 0x70, 0x70, 0x52, 0x0a, 0x73, 0x69, 0x64, + 0x65, 0x62, 0x61, 0x72, 0x41, 0x70, 0x70, 0x22, 0xca, 0x09, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x55, 0x72, + 0x6c, 0x12, 0x53, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27, 0x0a, + 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x29, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x21, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6f, + 0x69, 0x64, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4f, 0x69, 0x64, 0x63, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x41, 0x0a, 0x1d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x73, 0x12, 0x42, 0x0a, 0x1e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x53, 0x73, 0x68, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x44, 0x0a, 0x1f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x53, 0x73, + 0x68, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, + 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4e, 0x0a, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x62, 0x61, 0x63, 0x5f, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x17, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x62, 0x61, + 0x63, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x1e, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, + 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x65, + 0x62, 0x75, 0x69, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x1b, 0x70, 0x72, 0x65, 0x62, 0x75, 0x69, + 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x5d, 0x0a, 0x19, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x16, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x36, 0x0a, 0x17, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x15, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, + 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x61, 0x72, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xa3, 0x02, 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x12, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x11, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x12, + 0x54, 0x0a, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x67, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x61, 0x67, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x54, 0x61, 0x67, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 0x03, 0x0a, 0x0b, 0x50, 0x6c, 0x61, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x53, 0x0a, 0x15, 0x72, 0x69, + 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x72, 0x69, 0x63, 0x68, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, + 0x43, 0x0a, 0x0f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x17, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x5b, 0x0a, 0x19, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x17, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, + 0x6f, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6f, 0x6d, 0x69, 0x74, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x91, 0x05, 0x0a, 0x0c, 0x50, 0x6c, 0x61, + 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x33, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x61, 0x0a, 0x17, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x15, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x70, 0x6c, 0x61, 0x6e, 0x12, 0x55, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, + 0x0a, 0x11, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x48, 0x61, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x61, + 0x73, 0x5f, 0x61, 0x69, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x68, 0x61, 0x73, 0x41, 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x08, + 0x61, 0x69, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x49, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x07, 0x61, 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x41, 0x0a, 0x0c, + 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, + 0xee, 0x02, 0x0a, 0x0d, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x33, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x78, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x5b, 0x0a, 0x19, 0x70, 0x72, 0x65, - 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x17, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x6d, 0x69, 0x74, 0x5f, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x6f, 0x6d, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x22, 0x91, 0x05, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, - 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, - 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x07, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x70, - 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x65, - 0x74, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6c, - 0x61, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x12, 0x55, - 0x0a, 0x15, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x14, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0c, 0x68, 0x61, 0x73, 0x5f, 0x61, 0x69, 0x5f, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x41, - 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x61, 0x69, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x49, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x07, 0x61, - 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x41, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xee, 0x02, 0x0a, 0x0d, 0x41, 0x70, - 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, - 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x15, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, - 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x74, - 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x15, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x2e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x2e, 0x0a, 0x08, 0x61, 0x69, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, + 0x2e, 0x41, 0x49, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x07, 0x61, 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0xfa, 0x01, 0x0a, 0x06, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, + 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x69, 0x6e, - 0x67, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x61, 0x69, - 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x49, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x07, 0x61, 0x69, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0xfa, 0x01, 0x0a, 0x06, 0x54, - 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8c, 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x0f, 0x0a, + 0x0d, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8c, + 0x02, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, + 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x31, 0x0a, 0x05, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, + 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x12, 0x31, 0x0a, 0x05, + 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, + 0x34, 0x0a, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc9, 0x02, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6c, 0x6f, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, + 0x12, 0x32, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, - 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, - 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xc9, 0x02, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, - 0x4c, 0x6f, 0x67, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x12, 0x32, 0x0a, 0x05, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x2f, - 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x43, - 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x12, - 0x32, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, - 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, - 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x3a, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x70, 0x69, 0x65, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, 0x65, 0x48, 0x00, 0x52, - 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, - 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, - 0x6b, 0x73, 0x22, 0x67, 0x0a, 0x0a, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x66, 0x75, - 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x69, - 0x65, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x70, 0x69, 0x65, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x2a, 0xa8, 0x01, 0x0a, 0x11, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x0e, - 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x09, - 0x0a, 0x05, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x52, 0x4f, - 0x50, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x50, 0x55, 0x54, - 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x45, 0x58, 0x54, 0x41, 0x52, 0x45, 0x41, 0x10, 0x05, - 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x4c, 0x49, 0x44, 0x45, 0x52, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, - 0x43, 0x48, 0x45, 0x43, 0x4b, 0x42, 0x4f, 0x58, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x57, - 0x49, 0x54, 0x43, 0x48, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x41, 0x47, 0x53, 0x45, 0x4c, - 0x45, 0x43, 0x54, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x53, 0x45, - 0x4c, 0x45, 0x43, 0x54, 0x10, 0x0a, 0x2a, 0x3f, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, - 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x2a, 0x3b, 0x0a, 0x0f, 0x41, 0x70, 0x70, 0x53, 0x68, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x57, - 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, - 0x49, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, - 0x49, 0x43, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x6e, 0x12, 0x0e, 0x0a, 0x06, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x10, 0x00, 0x1a, 0x02, 0x08, - 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4c, 0x49, 0x4d, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, - 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x42, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x13, 0x57, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, 0x54, 0x52, - 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x3e, 0x0a, 0x1b, 0x50, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x41, - 0x49, 0x4d, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x47, 0x0a, 0x0e, 0x44, - 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, - 0x13, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x5f, 0x46, 0x49, 0x4c, - 0x45, 0x53, 0x10, 0x01, 0x32, 0x49, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, - 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, - 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x00, 0x52, + 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x12, 0x32, 0x0a, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x2e, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x48, 0x00, 0x52, 0x05, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3a, 0x0a, 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x70, + 0x69, 0x65, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, + 0x65, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x50, 0x69, 0x65, 0x63, + 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0a, 0x44, 0x61, + 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x67, 0x0a, 0x0a, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x50, 0x69, 0x65, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x75, + 0x6c, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x66, 0x75, 0x6c, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x69, 0x65, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x69, 0x65, 0x63, 0x65, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x2a, 0xa8, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x46, + 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x41, 0x44, 0x49, 0x4f, 0x10, 0x02, 0x12, + 0x0c, 0x0a, 0x08, 0x44, 0x52, 0x4f, 0x50, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, + 0x05, 0x49, 0x4e, 0x50, 0x55, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x54, 0x45, 0x58, 0x54, + 0x41, 0x52, 0x45, 0x41, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x4c, 0x49, 0x44, 0x45, 0x52, + 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x42, 0x4f, 0x58, 0x10, 0x07, + 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, + 0x54, 0x41, 0x47, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, + 0x55, 0x4c, 0x54, 0x49, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x0a, 0x2a, 0x3f, 0x0a, 0x08, + 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x52, 0x41, 0x43, + 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x41, 0x52, 0x4e, + 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x2a, 0x3b, 0x0a, + 0x0f, 0x41, 0x70, 0x70, 0x53, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x41, + 0x55, 0x54, 0x48, 0x45, 0x4e, 0x54, 0x49, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, + 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x09, 0x41, 0x70, + 0x70, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x12, 0x0e, 0x0a, 0x06, 0x57, 0x49, 0x4e, 0x44, 0x4f, + 0x57, 0x10, 0x00, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4c, 0x49, 0x4d, 0x5f, + 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x42, 0x10, + 0x02, 0x2a, 0x37, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, + 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x02, 0x2a, 0x3e, 0x0a, 0x1b, 0x50, 0x72, + 0x65, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, + 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x0b, 0x54, 0x69, + 0x6d, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, + 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, + 0x02, 0x2a, 0x47, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, + 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x44, 0x55, + 0x4c, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x53, 0x10, 0x01, 0x32, 0x49, 0x0a, 0x0b, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x30, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, + 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x73, 0x64, + 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/provisionersdk/proto/provisioner.proto b/provisionersdk/proto/provisioner.proto index a57983c21ad9b..2d53d8598e7a6 100644 --- a/provisionersdk/proto/provisioner.proto +++ b/provisionersdk/proto/provisioner.proto @@ -101,6 +101,8 @@ message Preset { repeated PresetParameter parameters = 2; Prebuild prebuild = 3; bool default = 4; + string description = 5; + string icon = 6; } message PresetParameter { diff --git a/site/e2e/provisionerGenerated.ts b/site/e2e/provisionerGenerated.ts index 686dfb7031945..78a010f6c736f 100644 --- a/site/e2e/provisionerGenerated.ts +++ b/site/e2e/provisionerGenerated.ts @@ -162,6 +162,8 @@ export interface Preset { parameters: PresetParameter[]; prebuild: Prebuild | undefined; default: boolean; + description: string; + icon: string; } export interface PresetParameter { @@ -715,6 +717,12 @@ export const Preset = { if (message.default === true) { writer.uint32(32).bool(message.default); } + if (message.description !== "") { + writer.uint32(42).string(message.description); + } + if (message.icon !== "") { + writer.uint32(50).string(message.icon); + } return writer; }, }; diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 412fb1e7f0a8c..ecbbdc9024d65 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -1998,6 +1998,8 @@ export interface Preset { readonly Parameters: readonly PresetParameter[]; readonly Default: boolean; readonly DesiredPrebuildInstances: number | null; + readonly Description: string; + readonly Icon: string; } // From codersdk/presets.go diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx index 3e3f58f00f58c..907c5e6861f68 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx @@ -126,6 +126,8 @@ export const PresetsButNoneSelected: Story = { { ID: "preset-1", Name: "Preset 1", + Description: "", + Icon: "", Default: false, Parameters: [ { @@ -138,6 +140,9 @@ export const PresetsButNoneSelected: Story = { { ID: "preset-2", Name: "Preset 2", + Description: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse imperdiet ultricies massa, eu dapibus ex fermentum ac.", + Icon: "/emojis/1f60e.png", Default: false, Parameters: [ { @@ -252,6 +257,8 @@ export const PresetsWithDefault: Story = { { ID: "preset-1", Name: "Preset 1", + Icon: "", + Description: "", Default: false, Parameters: [ { @@ -264,6 +271,9 @@ export const PresetsWithDefault: Story = { { ID: "preset-2", Name: "Preset 2", + Icon: "/emojis/1f60e.png", + Description: + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse imperdiet ultricies massa, eu dapibus ex fermentum ac.", Default: true, Parameters: [ { diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 14fbb2d2913af..a80e3b623a211 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -4577,6 +4577,8 @@ export const MockPresets: TypesGen.Preset[] = [ { ID: "preset-1", Name: "Development", + Description: "", + Icon: "", Parameters: [ { Name: "cpu", Value: "4" }, { Name: "memory", Value: "8GB" }, @@ -4587,6 +4589,8 @@ export const MockPresets: TypesGen.Preset[] = [ { ID: "preset-2", Name: "Testing", + Description: "", + Icon: "", Parameters: [ { Name: "cpu", Value: "2" }, { Name: "memory", Value: "4GB" }, @@ -4597,6 +4601,8 @@ export const MockPresets: TypesGen.Preset[] = [ { ID: "preset-3", Name: "Production", + Description: "", + Icon: "", Parameters: [ { Name: "cpu", Value: "8" }, { Name: "memory", Value: "16GB" }, @@ -4610,6 +4616,8 @@ export const MockAIPromptPresets: TypesGen.Preset[] = [ { ID: "ai-preset-1", Name: "Code Review", + Description: "", + Icon: "", Parameters: [ { Name: "AI Prompt", Value: "Review the code for best practices" }, { Name: "cpu", Value: "4" }, @@ -4621,6 +4629,8 @@ export const MockAIPromptPresets: TypesGen.Preset[] = [ { ID: "ai-preset-2", Name: "Custom Prompt", + Description: "", + Icon: "", Parameters: [ { Name: "cpu", Value: "4" }, { Name: "memory", Value: "8GB" }, From 36d2e01471af4a1ec05f4305a4eed649c2f2ba9b Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Mon, 28 Jul 2025 20:27:49 +0200 Subject: [PATCH 005/260] chore: add managed ai usage consumption to license view (#18934) Customers with licenses not supporting managed AI agents will receive the following information: image Customers with active licenes for managed AI agents will see: image Closes https://github.com/coder/internal/issues/813 --------- Co-authored-by: McKayla Washburn --- .../LicensesSettingsPage.tsx | 3 + .../LicensesSettingsPageView.tsx | 9 +- .../ManagedAgentsConsumption.stories.tsx | 196 +++++++++++++++++ .../ManagedAgentsConsumption.tsx | 202 ++++++++++++++++++ 4 files changed, 409 insertions(+), 1 deletion(-) create mode 100644 site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx create mode 100644 site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx index 5f617412a0c04..4cc6f52523edf 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx @@ -85,6 +85,9 @@ const LicensesSettingsPage: FC = () => { isRemovingLicense={isRemovingLicense} removeLicense={(licenseId: number) => removeLicenseApi(licenseId)} activeUsers={userStatusCount?.active} + managedAgentFeature={ + entitlementsQuery.data?.features.managed_agent_limit + } refreshEntitlements={async () => { try { await refreshEntitlementsMutation.mutateAsync(); diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx index eb60361883b72..c631ed178b9a3 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx @@ -4,7 +4,7 @@ import MuiLink from "@mui/material/Link"; import Skeleton from "@mui/material/Skeleton"; import Tooltip from "@mui/material/Tooltip"; import type { GetLicensesResponse } from "api/api"; -import type { UserStatusChangeCount } from "api/typesGenerated"; +import type { Feature, UserStatusChangeCount } from "api/typesGenerated"; import { Button } from "components/Button/Button"; import { SettingsHeader, @@ -20,6 +20,7 @@ import Confetti from "react-confetti"; import { Link } from "react-router-dom"; import { LicenseCard } from "./LicenseCard"; import { LicenseSeatConsumptionChart } from "./LicenseSeatConsumptionChart"; +import { ManagedAgentsConsumption } from "./ManagedAgentsConsumption"; type Props = { showConfetti: boolean; @@ -32,6 +33,7 @@ type Props = { removeLicense: (licenseId: number) => void; refreshEntitlements: () => void; activeUsers: UserStatusChangeCount[] | undefined; + managedAgentFeature?: Feature; }; const LicensesSettingsPageView: FC = ({ @@ -45,6 +47,7 @@ const LicensesSettingsPageView: FC = ({ removeLicense, refreshEntitlements, activeUsers, + managedAgentFeature, }) => { const theme = useTheme(); const { width, height } = useWindowSize(); @@ -151,6 +154,10 @@ const LicensesSettingsPageView: FC = ({ }))} /> )} + + {licenses && licenses.length > 0 && ( + + )} ); diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx new file mode 100644 index 0000000000000..8b526914edd50 --- /dev/null +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx @@ -0,0 +1,196 @@ +import type { Meta, StoryObj } from "@storybook/react"; +import { ManagedAgentsConsumption } from "./ManagedAgentsConsumption"; + +const meta: Meta = { + title: + "pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption", + component: ManagedAgentsConsumption, + args: { + managedAgentFeature: { + enabled: true, + actual: 50000, + soft_limit: 60000, + limit: 120000, + usage_period: { + start: "February 27, 2025", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const NearLimit: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: 115000, + soft_limit: 60000, + limit: 120000, + usage_period: { + start: "February 27, 2025", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export const OverIncluded: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: 80000, + soft_limit: 60000, + limit: 120000, + usage_period: { + start: "February 27, 2025", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export const LowUsage: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: 25000, + soft_limit: 60000, + limit: 120000, + usage_period: { + start: "February 27, 2025", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export const IncludedAtLimit: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: 25000, + soft_limit: 30500, + limit: 30500, + usage_period: { + start: "February 27, 2025", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export const Disabled: Story = { + args: { + managedAgentFeature: { + enabled: false, + actual: undefined, + soft_limit: undefined, + limit: undefined, + usage_period: undefined, + entitlement: "not_entitled", + }, + }, +}; + +export const NoFeature: Story = { + args: { + managedAgentFeature: undefined, + }, +}; + +// Error States for Validation +export const ErrorMissingData: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: undefined, + soft_limit: undefined, + limit: undefined, + usage_period: undefined, + entitlement: "entitled", + }, + }, +}; + +export const ErrorNegativeValues: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: -100, + soft_limit: 60000, + limit: 120000, + usage_period: { + start: "February 27, 2025", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export const ErrorSoftLimitExceedsLimit: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: 50000, + soft_limit: 150000, + limit: 120000, + usage_period: { + start: "February 27, 2025", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export const ErrorInvalidDates: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: 50000, + soft_limit: 60000, + limit: 120000, + usage_period: { + start: "invalid-date", + end: "February 27, 2026", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; + +export const ErrorEndBeforeStart: Story = { + args: { + managedAgentFeature: { + enabled: true, + actual: 50000, + soft_limit: 60000, + limit: 120000, + usage_period: { + start: "February 27, 2026", + end: "February 27, 2025", + issued_at: "February 27, 2025", + }, + entitlement: "entitled", + }, + }, +}; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx new file mode 100644 index 0000000000000..e96d86b5a4c92 --- /dev/null +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.tsx @@ -0,0 +1,202 @@ +import MuiLink from "@mui/material/Link"; +import type { Feature } from "api/typesGenerated"; +import { ErrorAlert } from "components/Alert/ErrorAlert"; +import { Button } from "components/Button/Button"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "components/Collapsible/Collapsible"; +import { Stack } from "components/Stack/Stack"; +import dayjs from "dayjs"; +import { ChevronRightIcon } from "lucide-react"; +import type { FC } from "react"; +import { docs } from "utils/docs"; + +interface ManagedAgentsConsumptionProps { + managedAgentFeature?: Feature; +} + +export const ManagedAgentsConsumption: FC = ({ + managedAgentFeature, +}) => { + // If no feature is provided or it's disabled, show disabled state + if (!managedAgentFeature?.enabled) { + return ( +
+ + + Managed AI Agents Disabled + + Managed AI agents are not included in your current license. + Contact sales to + upgrade your license and unlock this feature. + + + +
+ ); + } + + const usage = managedAgentFeature.actual; + const included = managedAgentFeature.soft_limit; + const limit = managedAgentFeature.limit; + const startDate = managedAgentFeature.usage_period?.start; + const endDate = managedAgentFeature.usage_period?.end; + + if (!usage || usage < 0) { + return ; + } + + if (!included || included < 0 || !limit || limit < 0) { + return ; + } + + if (!startDate || !endDate) { + return ; + } + + const start = dayjs(startDate); + const end = dayjs(endDate); + if (!start.isValid() || !end.isValid() || !start.isBefore(end)) { + return ; + } + + const usagePercentage = Math.min((usage / limit) * 100, 100); + const includedPercentage = Math.min((included / limit) * 100, 100); + const remainingPercentage = Math.max(100 - includedPercentage, 0); + + return ( +
+
+ +
+

Managed AI Agents Usage

+ + + + +
+ + +

+ + Coder Tasks + {" "} + and upcoming managed AI features are included in Coder Premium + licenses during beta. Usage limits and pricing subject to change. +

+
    +
  • +
    + Amount of started workspaces with an AI agent. +
  • +
  • +
    + Included allowance from your current license plan. +
  • +
  • +
    +
    +
    + Total limit after which further AI workspace builds will be + blocked. +
  • +
+
+
+
+ +
+
+ + {startDate ? dayjs(startDate).format("MMMM D, YYYY") : ""} + + {endDate ? dayjs(endDate).format("MMMM D, YYYY") : ""} +
+ +
+
+ +
+
+ +
+
+ Actual: + {usage.toLocaleString()} +
+ +
+ Included: + {included.toLocaleString()} +
+ +
+ Limit: + {limit.toLocaleString()} +
+
+ +
+
+
+ Actual: + {usage.toLocaleString()} +
+
+ Included: + {included.toLocaleString()} +
+
+ Limit: + {limit.toLocaleString()} +
+
+
+
+
+ ); +}; From 72b8ab530ef2a757f98767b33719ec5dc33df2f4 Mon Sep 17 00:00:00 2001 From: Andrew Aquino Date: Mon, 28 Jul 2025 18:00:56 -0400 Subject: [PATCH 006/260] fix(docs): add missing GFM alert directives to blockquotes (#19042) I just added support for rendering GFM alerts inside of numbered lists in coder.com (see https://github.com/coder/coder.com/pull/328), and noticed that these plain blockquotes should probably be alerts. This should cover all the missing alerts. I found them by searching for the regex `^\s*>\s` within docs/**/*.md Is `[!NOTE]` the correct type for these? Or do we want to use tip/important/etc? - @mtojek CONTRIBUTING.md - @johnstcn support-bundle.md - @matifali gateway.md --- docs/about/contributing/CONTRIBUTING.md | 1 + docs/support/support-bundle.md | 1 + docs/user-guides/workspace-access/jetbrains/gateway.md | 1 + 3 files changed, 3 insertions(+) diff --git a/docs/about/contributing/CONTRIBUTING.md b/docs/about/contributing/CONTRIBUTING.md index 8f4eb518bae76..7eedebb146dc5 100644 --- a/docs/about/contributing/CONTRIBUTING.md +++ b/docs/about/contributing/CONTRIBUTING.md @@ -96,6 +96,7 @@ Use the following `make` commands and scripts in development: This should return an empty list of workspaces. If you encounter an error, review the output from the [develop.sh](https://github.com/coder/coder/blob/main/scripts/develop.sh) script for issues. + > [!NOTE] > `coder-dev.sh` is a helper script that behaves like the regular coder CLI, but uses the binary built from your local source and shares the same configuration directory set up by `develop.sh`. This ensures your local changes are reflected when testing. > > The default user is `admin@coder.com` and the default password is `SomeSecurePassword!` diff --git a/docs/support/support-bundle.md b/docs/support/support-bundle.md index 7cac0058f4812..1741dbfb663f3 100644 --- a/docs/support/support-bundle.md +++ b/docs/support/support-bundle.md @@ -73,6 +73,7 @@ A brief overview of all files contained in the bundle is provided below: prompt. The support bundle will be generated in the current directory with the filename `coder-support-$TIMESTAMP.zip`. + > [!NOTE] > While support bundles can be generated without a running workspace, it is > recommended to specify one to maximize troubleshooting information. diff --git a/docs/user-guides/workspace-access/jetbrains/gateway.md b/docs/user-guides/workspace-access/jetbrains/gateway.md index 09c54a10e854f..b7065b56a0729 100644 --- a/docs/user-guides/workspace-access/jetbrains/gateway.md +++ b/docs/user-guides/workspace-access/jetbrains/gateway.md @@ -10,6 +10,7 @@ manually configured SSH connection. ### How to use the plugin +> [!NOTE] > If you experience problems, please > [create a GitHub issue](https://github.com/coder/coder/issues) or share in > [our Discord channel](https://discord.gg/coder). From faac75389b2ca554536a809a0b0ac4f1d1292f82 Mon Sep 17 00:00:00 2001 From: Austen Bruhn Date: Mon, 28 Jul 2025 18:41:32 -0600 Subject: [PATCH 007/260] feat(helm): add pod-level securityContext support for certificate mounting (#19041) **Add pod-level securityContext support to Coder Helm chart** Adds `coder.podSecurityContext` field to enable pod-level security settings, primarily to solve TLS certificate mounting permission issues. **Problem**: When mounting TLS certificates from Kubernetes secrets, the Coder process (UID 1000) cannot read the files due to restrictive permissions. **Solution**: Setting `podSecurityContext.fsGroup: 1000` ensures Kubernetes sets group ownership of mounted volumes to GID 1000, allowing the Coder process to read certificate files. **Changes**: - Added `podSecurityContext` field to values.yaml with documentation - Updated `_coder.yaml` template to include pod-level security context - Added test case and golden files - Maintains backward compatibility (opt-in feature) **Usage**: ```yaml coder: podSecurityContext: fsGroup: 1000 # Enables TLS cert access ``` Fixes #19038 --- helm/coder/tests/chart_test.go | 4 + .../tests/testdata/pod_securitycontext.golden | 208 ++++++++++++++++++ .../tests/testdata/pod_securitycontext.yaml | 8 + .../testdata/pod_securitycontext_coder.golden | 208 ++++++++++++++++++ helm/coder/values.yaml | 36 +++ helm/libcoder/templates/_coder.yaml | 4 + 6 files changed, 468 insertions(+) create mode 100644 helm/coder/tests/testdata/pod_securitycontext.golden create mode 100644 helm/coder/tests/testdata/pod_securitycontext.yaml create mode 100644 helm/coder/tests/testdata/pod_securitycontext_coder.golden diff --git a/helm/coder/tests/chart_test.go b/helm/coder/tests/chart_test.go index a11d631a2f247..17678a85e0dec 100644 --- a/helm/coder/tests/chart_test.go +++ b/helm/coder/tests/chart_test.go @@ -125,6 +125,10 @@ var testCases = []testCase{ name: "partial_resources", expectedError: "", }, + { + name: "pod_securitycontext", + expectedError: "", + }, } type testCase struct { diff --git a/helm/coder/tests/testdata/pod_securitycontext.golden b/helm/coder/tests/testdata/pod_securitycontext.golden new file mode 100644 index 0000000000000..17f6272f3637b --- /dev/null +++ b/helm/coder/tests/testdata/pod_securitycontext.golden @@ -0,0 +1,208 @@ +--- +# Source: coder/templates/coder.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: default +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: coder-workspace-perms + namespace: default +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: "coder" + namespace: default +subjects: + - kind: ServiceAccount + name: "coder" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: coder-workspace-perms +--- +# Source: coder/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: coder + namespace: default + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: LoadBalancer + sessionAffinity: None + ports: + - name: "http" + port: 80 + targetPort: "http" + protocol: TCP + nodePort: + externalTrafficPolicy: "Cluster" + selector: + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name +--- +# Source: coder/templates/coder.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/name: coder + template: + metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - coder + topologyKey: kubernetes.io/hostname + weight: 1 + containers: + - args: + - server + command: + - /opt/coder + env: + - name: CODER_HTTP_ADDRESS + value: 0.0.0.0:8080 + - name: CODER_PROMETHEUS_ADDRESS + value: 0.0.0.0:2112 + - name: CODER_ACCESS_URL + value: http://coder.default.svc.cluster.local + - name: KUBE_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CODER_DERP_SERVER_RELAY_URL + value: http://$(KUBE_POD_IP):8080 + image: ghcr.io/coder/coder:latest + imagePullPolicy: IfNotPresent + lifecycle: {} + livenessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + name: coder + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + resources: + limits: + cpu: 2000m + memory: 4096Mi + requests: + cpu: 2000m + memory: 4096Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: null + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + volumeMounts: [] + restartPolicy: Always + securityContext: + fsgroup: 1000 + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + serviceAccountName: coder + terminationGracePeriodSeconds: 60 + volumes: [] diff --git a/helm/coder/tests/testdata/pod_securitycontext.yaml b/helm/coder/tests/testdata/pod_securitycontext.yaml new file mode 100644 index 0000000000000..ba0a2ba37f952 --- /dev/null +++ b/helm/coder/tests/testdata/pod_securitycontext.yaml @@ -0,0 +1,8 @@ +coder: + image: + tag: latest + podSecurityContext: + fsgroup: 1000 + runAsUser: 1000 + runAsGroup: 1000 + runAsNonRoot: true diff --git a/helm/coder/tests/testdata/pod_securitycontext_coder.golden b/helm/coder/tests/testdata/pod_securitycontext_coder.golden new file mode 100644 index 0000000000000..c8d1ced840fc3 --- /dev/null +++ b/helm/coder/tests/testdata/pod_securitycontext_coder.golden @@ -0,0 +1,208 @@ +--- +# Source: coder/templates/coder.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: coder +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: coder-workspace-perms + namespace: coder +rules: + - apiGroups: [""] + resources: ["pods"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + - apiGroups: + - apps + resources: + - deployments + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch +--- +# Source: coder/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: "coder" + namespace: coder +subjects: + - kind: ServiceAccount + name: "coder" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: coder-workspace-perms +--- +# Source: coder/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: coder + namespace: coder + labels: + helm.sh/chart: coder-0.1.0 + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: "0.1.0" + app.kubernetes.io/managed-by: Helm + annotations: + {} +spec: + type: LoadBalancer + sessionAffinity: None + ports: + - name: "http" + port: 80 + targetPort: "http" + protocol: TCP + nodePort: + externalTrafficPolicy: "Cluster" + selector: + app.kubernetes.io/name: coder + app.kubernetes.io/instance: release-name +--- +# Source: coder/templates/coder.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + name: coder + namespace: coder +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/name: coder + template: + metadata: + annotations: {} + labels: + app.kubernetes.io/instance: release-name + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: coder + app.kubernetes.io/part-of: coder + app.kubernetes.io/version: 0.1.0 + helm.sh/chart: coder-0.1.0 + spec: + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - coder + topologyKey: kubernetes.io/hostname + weight: 1 + containers: + - args: + - server + command: + - /opt/coder + env: + - name: CODER_HTTP_ADDRESS + value: 0.0.0.0:8080 + - name: CODER_PROMETHEUS_ADDRESS + value: 0.0.0.0:2112 + - name: CODER_ACCESS_URL + value: http://coder.coder.svc.cluster.local + - name: KUBE_POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: CODER_DERP_SERVER_RELAY_URL + value: http://$(KUBE_POD_IP):8080 + image: ghcr.io/coder/coder:latest + imagePullPolicy: IfNotPresent + lifecycle: {} + livenessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + name: coder + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + httpGet: + path: /healthz + port: http + scheme: HTTP + initialDelaySeconds: 0 + resources: + limits: + cpu: 2000m + memory: 4096Mi + requests: + cpu: 2000m + memory: 4096Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: null + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + seccompProfile: + type: RuntimeDefault + volumeMounts: [] + restartPolicy: Always + securityContext: + fsgroup: 1000 + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + serviceAccountName: coder + terminationGracePeriodSeconds: 60 + volumes: [] diff --git a/helm/coder/values.yaml b/helm/coder/values.yaml index fa6cb2c3622f8..fcc8f7746b0f1 100644 --- a/helm/coder/values.yaml +++ b/helm/coder/values.yaml @@ -142,6 +142,38 @@ coder: # root. It is recommended to leave this setting disabled in production. allowPrivilegeEscalation: false + # coder.podSecurityContext -- Pod-level security context settings that apply + # to all containers in the pod. This is useful for setting volume ownership + # (fsGroup) when mounting secrets like TLS certificates. These settings are + # applied at the pod level, while coder.securityContext applies at the + # container level. Container-level settings take precedence over pod-level + # settings for overlapping fields. This is opt-in and not set by default. + # Common use case: Set fsGroup to ensure mounted secret volumes have correct + # group ownership for the coder user to read certificate files. + podSecurityContext: {} + # Example configuration for certificate mounting: + # podSecurityContext: + # # Sets group ownership of mounted volumes (e.g., for certificate secrets) + # fsGroup: 1000 + # # Additional pod-level security settings (optional) + # runAsUser: 1000 + # runAsGroup: 1000 + # runAsNonRoot: true + # supplementalGroups: [4000] + # seccompProfile: + # type: RuntimeDefault + # # Note: Avoid conflicts with container-level securityContext settings + # # Container-level settings take precedence over pod-level settings + # + # IMPORTANT: OpenShift Compatibility + # On OpenShift, Security Context Constraints (SCCs) may restrict or override + # these values. If you encounter pod creation failures: + # 1. Check your namespace's assigned SCC with: oc describe scc + # 2. Ensure runAsUser/fsGroup values are within allowed UID/GID ranges + # 3. Consider using 'anyuid' SCC for more flexibility, or + # 4. Omit runAsUser/runAsGroup and only set fsGroup for volume ownership + # 5. OpenShift may automatically assign compatible values if left unset + # coder.volumes -- A list of extra volumes to add to the Coder pod. volumes: [] # - name: "my-volume" @@ -159,6 +191,10 @@ coder: # Helm deployment and should be of type "kubernetes.io/tls". The secrets # will be automatically mounted into the pod if specified, and the correct # "CODER_TLS_*" environment variables will be set for you. + + # Note: If you encounter permission issues reading mounted certificates, + # consider setting coder.podSecurityContext.fsGroup to match your container + # user (typically 1000) to ensure proper file ownership. secretNames: [] # coder.replicaCount -- The number of Kubernetes deployment replicas. This diff --git a/helm/libcoder/templates/_coder.yaml b/helm/libcoder/templates/_coder.yaml index b836bdf1df77f..6001df90d6580 100644 --- a/helm/libcoder/templates/_coder.yaml +++ b/helm/libcoder/templates/_coder.yaml @@ -26,6 +26,10 @@ spec: {{- toYaml .Values.coder.podAnnotations | nindent 8 }} spec: serviceAccountName: {{ .Values.coder.serviceAccount.name | quote }} + {{- with .Values.coder.podSecurityContext }} + securityContext: + {{- toYaml . | nindent 8 }} + {{- end }} restartPolicy: Always {{- with .Values.coder.image.pullSecrets }} imagePullSecrets: From 1320b8d5be0cabb2493608fa5cf5c3016d23db68 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Tue, 29 Jul 2025 03:41:49 +0200 Subject: [PATCH 008/260] feat: make dynamic parameters opt-in by default for new templates (#19006) resolves #18975 --------- Co-authored-by: Steven Masley Co-authored-by: blink-so[bot] <211532188+blink-so[bot]@users.noreply.github.com> --- cli/restart.go | 9 ++ cli/restart_test.go | 33 +++++- cli/start_test.go | 24 +++- cli/templatepush_test.go | 1 + cli/testdata/coder_list_--output_json.golden | 2 +- cli/update_test.go | 6 +- coderd/database/dbgen/dbgen.go | 2 +- coderd/database/dump.sql | 2 +- .../000352_default_dynamic_templates.down.sql | 1 + .../000352_default_dynamic_templates.up.sql | 1 + coderd/insights_test.go | 18 +-- coderd/parameters_test.go | 37 ++++++- coderd/templates.go | 4 +- coderd/templates_test.go | 4 +- coderd/templateversions.go | 2 +- coderd/templateversions_test.go | 59 ++++------ coderd/workspaces_test.go | 10 +- provisioner/echo/serve.go | 103 ++++++++++++++++++ site/e2e/helpers.ts | 33 ++++++ .../tests/workspaces/createWorkspace.spec.ts | 22 ++++ .../tests/workspaces/restartWorkspace.spec.ts | 4 + .../tests/workspaces/startWorkspace.spec.ts | 4 + .../tests/workspaces/updateWorkspace.spec.ts | 10 ++ ...icParameterFlowDeprecationWarning.test.tsx | 39 +++++++ ...ClassicParameterFlowDeprecationWarning.tsx | 38 +++++++ .../CreateWorkspacePage.tsx | 24 +++- .../CreateWorkspacePageView.stories.tsx | 3 + .../CreateWorkspacePageView.tsx | 12 ++ .../CreateWorkspacePageViewExperimental.tsx | 4 +- .../TemplateSettingsForm.tsx | 13 ++- .../WorkspaceParametersForm.tsx | 10 +- .../WorkspaceParametersPage.tsx | 23 ++++ .../WorkspaceParametersPageExperimental.tsx | 6 +- ...orkspaceParametersPageViewExperimental.tsx | 2 +- site/src/testHelpers/entities.ts | 2 +- 35 files changed, 476 insertions(+), 91 deletions(-) create mode 100644 coderd/database/migrations/000352_default_dynamic_templates.down.sql create mode 100644 coderd/database/migrations/000352_default_dynamic_templates.up.sql create mode 100644 site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx create mode 100644 site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx diff --git a/cli/restart.go b/cli/restart.go index 156f506105c5a..20ee0b9b9de9d 100644 --- a/cli/restart.go +++ b/cli/restart.go @@ -51,8 +51,17 @@ func (r *RootCmd) restart() *serpent.Command { return err } + stopParamValues, err := asWorkspaceBuildParameters(parameterFlags.ephemeralParameters) + if err != nil { + return xerrors.Errorf("parse ephemeral parameters: %w", err) + } wbr := codersdk.CreateWorkspaceBuildRequest{ Transition: codersdk.WorkspaceTransitionStop, + // Ephemeral parameters should be passed to both stop and start builds. + // TODO: maybe these values should be sourced from the previous build? + // It has to be manually sourced, as ephemeral parameters do not carry across + // builds. + RichParameterValues: stopParamValues, } if bflags.provisionerLogDebug { wbr.LogLevel = codersdk.ProvisionerLogLevelDebug diff --git a/cli/restart_test.go b/cli/restart_test.go index d69344435bf28..01be7e590cebf 100644 --- a/cli/restart_test.go +++ b/cli/restart_test.go @@ -10,6 +10,7 @@ import ( "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" + "github.com/coder/coder/v2/coderd/util/ptr" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" @@ -70,8 +71,14 @@ func TestRestart(t *testing.T) { member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses()) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, member, template.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID, func(request *codersdk.CreateTemplateRequest) { + request.UseClassicParameterFlow = ptr.Ref(true) // TODO: Remove when dynamic parameters prompt missing ephemeral parameters. + }) + workspace := coderdtest.CreateWorkspace(t, member, template.ID, func(request *codersdk.CreateWorkspaceRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "placeholder"}, + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) inv, root := clitest.New(t, "restart", workspace.Name, "--prompt-ephemeral-parameters") @@ -125,7 +132,11 @@ func TestRestart(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses()) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, member, template.ID) + workspace := coderdtest.CreateWorkspace(t, member, template.ID, func(request *codersdk.CreateWorkspaceRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "placeholder"}, + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) inv, root := clitest.New(t, "restart", workspace.Name, @@ -178,8 +189,14 @@ func TestRestart(t *testing.T) { member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses()) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, member, template.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID, func(request *codersdk.CreateTemplateRequest) { + request.UseClassicParameterFlow = ptr.Ref(true) // TODO: Remove when dynamic parameters prompts missing ephemeral parameters + }) + workspace := coderdtest.CreateWorkspace(t, member, template.ID, func(request *codersdk.CreateWorkspaceRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "placeholder"}, + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) inv, root := clitest.New(t, "restart", workspace.Name, "--build-options") @@ -233,7 +250,11 @@ func TestRestart(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses()) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, member, template.ID) + workspace := coderdtest.CreateWorkspace(t, member, template.ID, func(request *codersdk.CreateWorkspaceRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "placeholder"}, + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) inv, root := clitest.New(t, "restart", workspace.Name, diff --git a/cli/start_test.go b/cli/start_test.go index 85b7b88374f72..6e58b40e30778 100644 --- a/cli/start_test.go +++ b/cli/start_test.go @@ -113,10 +113,18 @@ func TestStart(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses()) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, member, template.ID) + workspace := coderdtest.CreateWorkspace(t, member, template.ID, func(request *codersdk.CreateWorkspaceRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "foo"}, // Value is required, set it to something + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) // Stop the workspace - workspaceBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop) + workspaceBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop, func(request *codersdk.CreateWorkspaceBuildRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "foo"}, // Value is required, set it to something + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspaceBuild.ID) inv, root := clitest.New(t, "start", workspace.Name, "--prompt-ephemeral-parameters") @@ -167,10 +175,18 @@ func TestStart(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, echoResponses()) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, member, template.ID) + workspace := coderdtest.CreateWorkspace(t, member, template.ID, func(request *codersdk.CreateWorkspaceRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "foo"}, // Value is required, set it to something + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) // Stop the workspace - workspaceBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop) + workspaceBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop, func(request *codersdk.CreateWorkspaceBuildRequest) { + request.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: ephemeralParameterName, Value: "foo"}, // Value is required, set it to something + } + }) coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspaceBuild.ID) inv, root := clitest.New(t, "start", workspace.Name, diff --git a/cli/templatepush_test.go b/cli/templatepush_test.go index f7a31d5e0c25f..732fdd5ee50b0 100644 --- a/cli/templatepush_test.go +++ b/cli/templatepush_test.go @@ -509,6 +509,7 @@ func TestTemplatePush(t *testing.T) { default = "1" } data "coder_parameter" "b" { + name = "b" type = string default = "2" } diff --git a/cli/testdata/coder_list_--output_json.golden b/cli/testdata/coder_list_--output_json.golden index 51c2887cd1e4a..822998329be5b 100644 --- a/cli/testdata/coder_list_--output_json.golden +++ b/cli/testdata/coder_list_--output_json.golden @@ -15,7 +15,7 @@ "template_allow_user_cancel_workspace_jobs": false, "template_active_version_id": "============[version ID]============", "template_require_active_version": false, - "template_use_classic_parameter_flow": true, + "template_use_classic_parameter_flow": false, "latest_build": { "id": "========[workspace build ID]========", "created_at": "====[timestamp]=====", diff --git a/cli/update_test.go b/cli/update_test.go index 7a7480353c01d..b80218f49ab45 100644 --- a/cli/update_test.go +++ b/cli/update_test.go @@ -182,7 +182,7 @@ func TestUpdateWithRichParameters(t *testing.T) { {Name: firstParameterName, Description: firstParameterDescription, Mutable: true}, {Name: immutableParameterName, Description: immutableParameterDescription, Mutable: false}, {Name: secondParameterName, Description: secondParameterDescription, Mutable: true}, - {Name: ephemeralParameterName, Description: ephemeralParameterDescription, Mutable: true, Ephemeral: true}, + {Name: ephemeralParameterName, Description: ephemeralParameterDescription, Mutable: true, Ephemeral: true, DefaultValue: "unset"}, }) } @@ -811,7 +811,9 @@ func TestUpdateValidateRichParameters(t *testing.T) { } version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, prepareEchoResponses(templateParameters)) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID, func(request *codersdk.CreateTemplateRequest) { + request.UseClassicParameterFlow = ptr.Ref(true) // TODO: Remove when dynamic parameters can pass this test + }) // Create new workspace inv, root := clitest.New(t, "create", "my-workspace", "--yes", "--template", template.Name, "--parameter", fmt.Sprintf("%s=%s", numberParameterName, tempVal)) diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index 812d2e2576650..0ccefff2c42a9 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -147,7 +147,7 @@ func Template(t testing.TB, db database.Store, seed database.Template) database. DisplayName: takeFirst(seed.DisplayName, testutil.GetRandomName(t)), AllowUserCancelWorkspaceJobs: seed.AllowUserCancelWorkspaceJobs, MaxPortSharingLevel: takeFirst(seed.MaxPortSharingLevel, database.AppSharingLevelOwner), - UseClassicParameterFlow: takeFirst(seed.UseClassicParameterFlow, true), + UseClassicParameterFlow: takeFirst(seed.UseClassicParameterFlow, false), }) require.NoError(t, err, "insert template") diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index bbd6ca3ce5736..67d58ad05c802 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1750,7 +1750,7 @@ CREATE TABLE templates ( deprecated text DEFAULT ''::text NOT NULL, activity_bump bigint DEFAULT '3600000000000'::bigint NOT NULL, max_port_sharing_level app_sharing_level DEFAULT 'owner'::app_sharing_level NOT NULL, - use_classic_parameter_flow boolean DEFAULT true NOT NULL + use_classic_parameter_flow boolean DEFAULT false NOT NULL ); COMMENT ON COLUMN templates.default_ttl IS 'The default duration for autostop for workspaces created from this template.'; diff --git a/coderd/database/migrations/000352_default_dynamic_templates.down.sql b/coderd/database/migrations/000352_default_dynamic_templates.down.sql new file mode 100644 index 0000000000000..548cd7e2c30b2 --- /dev/null +++ b/coderd/database/migrations/000352_default_dynamic_templates.down.sql @@ -0,0 +1 @@ +ALTER TABLE templates ALTER COLUMN use_classic_parameter_flow SET DEFAULT true; diff --git a/coderd/database/migrations/000352_default_dynamic_templates.up.sql b/coderd/database/migrations/000352_default_dynamic_templates.up.sql new file mode 100644 index 0000000000000..51bcab9f099f8 --- /dev/null +++ b/coderd/database/migrations/000352_default_dynamic_templates.up.sql @@ -0,0 +1 @@ +ALTER TABLE templates ALTER COLUMN use_classic_parameter_flow SET DEFAULT false; diff --git a/coderd/insights_test.go b/coderd/insights_test.go index ded030351a3b3..d916b20fea26e 100644 --- a/coderd/insights_test.go +++ b/coderd/insights_test.go @@ -665,10 +665,11 @@ func TestTemplateInsights_Golden(t *testing.T) { // where we can control the template ID. // createdTemplate := coderdtest.CreateTemplate(t, client, firstUser.OrganizationID, version.ID) createdTemplate := dbgen.Template(t, db, database.Template{ - ID: template.id, - ActiveVersionID: version.ID, - OrganizationID: firstUser.OrganizationID, - CreatedBy: firstUser.UserID, + ID: template.id, + ActiveVersionID: version.ID, + OrganizationID: firstUser.OrganizationID, + CreatedBy: firstUser.UserID, + UseClassicParameterFlow: true, // Required for testing classic parameter flow behavior GroupACL: database.TemplateACL{ firstUser.OrganizationID.String(): db2sdk.TemplateRoleActions(codersdk.TemplateRoleUse), }, @@ -1556,10 +1557,11 @@ func TestUserActivityInsights_Golden(t *testing.T) { // where we can control the template ID. // createdTemplate := coderdtest.CreateTemplate(t, client, firstUser.OrganizationID, version.ID) createdTemplate := dbgen.Template(t, db, database.Template{ - ID: template.id, - ActiveVersionID: version.ID, - OrganizationID: firstUser.OrganizationID, - CreatedBy: firstUser.UserID, + ID: template.id, + ActiveVersionID: version.ID, + OrganizationID: firstUser.OrganizationID, + CreatedBy: firstUser.UserID, + UseClassicParameterFlow: true, // Required for parameter usage tracking in this test GroupACL: database.TemplateACL{ firstUser.OrganizationID.String(): db2sdk.TemplateRoleActions(codersdk.TemplateRoleUse), }, diff --git a/coderd/parameters_test.go b/coderd/parameters_test.go index c00d6f9224bfb..07c00d2ef23e3 100644 --- a/coderd/parameters_test.go +++ b/coderd/parameters_test.go @@ -3,10 +3,12 @@ package coderd_test import ( "context" "os" + "sync" "testing" "github.com/google/uuid" "github.com/stretchr/testify/require" + "go.uber.org/atomic" "golang.org/x/xerrors" "github.com/coder/coder/v2/coderd" @@ -199,8 +201,15 @@ func TestDynamicParametersWithTerraformValues(t *testing.T) { modulesArchive, err := terraform.GetModulesArchive(os.DirFS("testdata/parameters/modules")) require.NoError(t, err) + c := atomic.NewInt32(0) + reject := &dbRejectGitSSHKey{Store: db, hook: func(d *dbRejectGitSSHKey) { + if c.Add(1) > 1 { + // Second call forward, reject + d.SetReject(true) + } + }} setup := setupDynamicParamsTest(t, setupDynamicParamsTestParams{ - db: &dbRejectGitSSHKey{Store: db}, + db: reject, ps: ps, provisionerDaemonVersion: provProto.CurrentVersion.String(), mainTF: dynamicParametersTerraformSource, @@ -444,8 +453,30 @@ func setupDynamicParamsTest(t *testing.T, args setupDynamicParamsTestParams) dyn // that is generally impossible to force an error. type dbRejectGitSSHKey struct { database.Store + rejectMu sync.RWMutex + reject bool + hook func(d *dbRejectGitSSHKey) +} + +// SetReject toggles whether GetGitSSHKey should return an error or passthrough to the underlying store. +func (d *dbRejectGitSSHKey) SetReject(reject bool) { + d.rejectMu.Lock() + defer d.rejectMu.Unlock() + d.reject = reject } -func (*dbRejectGitSSHKey) GetGitSSHKey(_ context.Context, _ uuid.UUID) (database.GitSSHKey, error) { - return database.GitSSHKey{}, xerrors.New("forcing a fake error") +func (d *dbRejectGitSSHKey) GetGitSSHKey(ctx context.Context, userID uuid.UUID) (database.GitSSHKey, error) { + if d.hook != nil { + d.hook(d) + } + + d.rejectMu.RLock() + reject := d.reject + d.rejectMu.RUnlock() + + if reject { + return database.GitSSHKey{}, xerrors.New("forcing a fake error") + } + + return d.Store.GetGitSSHKey(ctx, userID) } diff --git a/coderd/templates.go b/coderd/templates.go index bba38bb033614..60f94e5cd29cc 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -197,8 +197,8 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque return } - // Default is true until dynamic parameters are promoted to stable. - useClassicParameterFlow := ptr.NilToDefault(createTemplate.UseClassicParameterFlow, true) + // Default is false as dynamic parameters are now the preferred approach. + useClassicParameterFlow := ptr.NilToDefault(createTemplate.UseClassicParameterFlow, false) // Make a temporary struct to represent the template. This is used for // auditing if any of the following checks fail. It will be overwritten when diff --git a/coderd/templates_test.go b/coderd/templates_test.go index 5e7fcea75609d..0858ce83325cc 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -77,7 +77,7 @@ func TestPostTemplateByOrganization(t *testing.T) { assert.Equal(t, expected.Name, got.Name) assert.Equal(t, expected.Description, got.Description) assert.Equal(t, expected.ActivityBumpMillis, got.ActivityBumpMillis) - assert.Equal(t, expected.UseClassicParameterFlow, true) // Current default is true + assert.Equal(t, expected.UseClassicParameterFlow, false) // Current default is false require.Len(t, auditor.AuditLogs(), 3) assert.Equal(t, database.AuditActionCreate, auditor.AuditLogs()[0].Action) @@ -1551,7 +1551,7 @@ func TestPatchTemplateMeta(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - require.True(t, template.UseClassicParameterFlow, "default is true") + require.False(t, template.UseClassicParameterFlow, "default is false") bTrue := true bFalse := false diff --git a/coderd/templateversions.go b/coderd/templateversions.go index e787a6b813b18..cc106b390f73c 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -1471,7 +1471,7 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht return } - var dynamicTemplate bool + dynamicTemplate := true // Default to using dynamic templates if req.TemplateID != uuid.Nil { tpl, err := api.Database.GetTemplateByID(ctx, req.TemplateID) if httpapi.Is404Error(err) { diff --git a/coderd/templateversions_test.go b/coderd/templateversions_test.go index 1ad06bae38aee..912bca1c5fec1 100644 --- a/coderd/templateversions_test.go +++ b/coderd/templateversions_test.go @@ -275,6 +275,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { files map[string]string reqTags map[string]string wantTags map[string]string + variables []codersdk.VariableValue expectError string }{ { @@ -290,6 +291,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { default = "1" } data "coder_parameter" "b" { + name = "b" type = string default = "2" } @@ -311,6 +313,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { default = "1" } data "coder_parameter" "b" { + name = "b" type = string default = "2" } @@ -335,6 +338,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { default = "1" } data "coder_parameter" "b" { + name = "b" type = string default = "2" } @@ -365,6 +369,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { default = "1" } data "coder_parameter" "b" { + name = "b" type = string default = "2" } @@ -395,6 +400,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { default = "1" } data "coder_parameter" "b" { + name = "b" type = string default = "2" } @@ -429,11 +435,12 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { } }`, }, - reqTags: map[string]string{"a": "b"}, - wantTags: map[string]string{"owner": "", "scope": "organization", "a": "b"}, + reqTags: map[string]string{"a": "b"}, + wantTags: map[string]string{"owner": "", "scope": "organization", "a": "b"}, + variables: []codersdk.VariableValue{{Name: "a", Value: "b"}}, }, { - name: "main.tf with disallowed workspace tag value", + name: "main.tf with resource reference", files: map[string]string{ `main.tf`: ` variable "a" { @@ -441,6 +448,7 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { default = "1" } data "coder_parameter" "b" { + name = "b" type = string default = "2" } @@ -461,38 +469,8 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { } }`, }, - expectError: `Unknown variable; There is no variable named "null_resource".`, - }, - { - name: "main.tf with disallowed function in tag value", - files: map[string]string{ - `main.tf`: ` - variable "a" { - type = string - default = "1" - } - data "coder_parameter" "b" { - type = string - default = "2" - } - data "coder_parameter" "unrelated" { - name = "unrelated" - type = "list(string)" - default = jsonencode(["a", "b"]) - } - resource "null_resource" "test" { - name = "foo" - } - data "coder_workspace_tags" "tags" { - tags = { - "foo": "bar", - "a": var.a, - "b": data.coder_parameter.b.value, - "test": pathexpand("~/file.txt"), - } - }`, - }, - expectError: `function "pathexpand" may not be used here`, + reqTags: map[string]string{"foo": "bar", "a": "1", "b": "2", "test": "foo"}, + wantTags: map[string]string{"owner": "", "scope": "organization", "foo": "bar", "a": "1", "b": "2", "test": "foo"}, }, // We will allow coder_workspace_tags to set the scope on a template version import job // BUT the user ID will be ultimately determined by the API key in the scope. @@ -618,11 +596,12 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { // Create a template version from the archive tvName := testutil.GetRandomNameHyphenated(t) tv, err := templateAdmin.CreateTemplateVersion(ctx, owner.OrganizationID, codersdk.CreateTemplateVersionRequest{ - Name: tvName, - StorageMethod: codersdk.ProvisionerStorageMethodFile, - Provisioner: codersdk.ProvisionerTypeTerraform, - FileID: fi.ID, - ProvisionerTags: tt.reqTags, + Name: tvName, + StorageMethod: codersdk.ProvisionerStorageMethodFile, + Provisioner: codersdk.ProvisionerTypeTerraform, + FileID: fi.ID, + ProvisionerTags: tt.reqTags, + UserVariableValues: tt.variables, }) if tt.expectError == "" { diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 141c62ff3a4b3..9fe066aae6284 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -431,9 +431,9 @@ func TestWorkspace(t *testing.T) { // Test Utility variables templateVersionParameters := []*proto.RichParameter{ - {Name: "param1", Type: "string", Required: false}, - {Name: "param2", Type: "string", Required: false}, - {Name: "param3", Type: "string", Required: false}, + {Name: "param1", Type: "string", Required: false, DefaultValue: "default1"}, + {Name: "param2", Type: "string", Required: false, DefaultValue: "default2"}, + {Name: "param3", Type: "string", Required: false, DefaultValue: "default3"}, } presetParameters := []*proto.PresetParameter{ {Name: "param1", Value: "value1"}, @@ -3842,7 +3842,9 @@ func TestWorkspaceWithEphemeralRichParameters(t *testing.T) { }}, }) coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(request *codersdk.CreateTemplateRequest) { + request.UseClassicParameterFlow = ptr.Ref(true) // TODO: Remove this when dynamic parameters handles this case + }) // Create workspace with default values workspace := coderdtest.CreateWorkspace(t, client, template.ID) diff --git a/provisioner/echo/serve.go b/provisioner/echo/serve.go index 031af97317aca..4bb2a1dd6b78b 100644 --- a/provisioner/echo/serve.go +++ b/provisioner/echo/serve.go @@ -8,6 +8,7 @@ import ( "os" "path/filepath" "strings" + "text/template" "github.com/google/uuid" "golang.org/x/xerrors" @@ -377,6 +378,45 @@ func TarWithOptions(ctx context.Context, logger slog.Logger, responses *Response logger.Debug(context.Background(), "extra file written", slog.F("name", name), slog.F("bytes_written", n)) } + + // Write a main.tf with the appropriate parameters. This is to write terraform + // that matches the parameters defined in the responses. Dynamic parameters + // parsed these, even in the echo provisioner. + var mainTF bytes.Buffer + for _, respPlan := range responses.ProvisionPlan { + plan := respPlan.GetPlan() + if plan == nil { + continue + } + + for _, param := range plan.Parameters { + paramTF, err := ParameterTerraform(param) + if err != nil { + return nil, xerrors.Errorf("parameter terraform: %w", err) + } + _, _ = mainTF.WriteString(paramTF) + } + } + + if mainTF.Len() > 0 { + mainTFData := ` +terraform { + required_providers { + coder = { + source = "coder/coder" + } + } +} +` + mainTF.String() + + _ = writer.WriteHeader(&tar.Header{ + Name: `main.tf`, + Size: int64(len(mainTFData)), + Mode: 0o644, + }) + _, _ = writer.Write([]byte(mainTFData)) + } + // `writer.Close()` function flushes the writer buffer, and adds extra padding to create a legal tarball. err := writer.Close() if err != nil { @@ -385,6 +425,69 @@ func TarWithOptions(ctx context.Context, logger slog.Logger, responses *Response return buffer.Bytes(), nil } +// ParameterTerraform will create a Terraform data block for the provided parameter. +func ParameterTerraform(param *proto.RichParameter) (string, error) { + tmpl := template.Must(template.New("parameter").Funcs(map[string]any{ + "showValidation": func(v *proto.RichParameter) bool { + return v != nil && (v.ValidationMax != nil || v.ValidationMin != nil || + v.ValidationError != "" || v.ValidationRegex != "" || + v.ValidationMonotonic != "") + }, + "formType": func(v *proto.RichParameter) string { + s, _ := proto.ProviderFormType(v.FormType) + return string(s) + }, + }).Parse(` +data "coder_parameter" "{{ .Name }}" { + name = "{{ .Name }}" + display_name = "{{ .DisplayName }}" + description = "{{ .Description }}" + icon = "{{ .Icon }}" + mutable = {{ .Mutable }} + ephemeral = {{ .Ephemeral }} + order = {{ .Order }} +{{- if .DefaultValue }} + default = {{ .DefaultValue }} +{{- end }} +{{- if .Type }} + type = "{{ .Type }}" +{{- end }} +{{- if .FormType }} + form_type = "{{ formType . }}" +{{- end }} +{{- range .Options }} + option { + name = "{{ .Name }}" + value = "{{ .Value }}" + } +{{- end }} +{{- if showValidation .}} + validation { + {{- if .ValidationRegex }} + regex = "{{ .ValidationRegex }}" + {{- end }} + {{- if .ValidationError }} + error = "{{ .ValidationError }}" + {{- end }} + {{- if .ValidationMin }} + min = {{ .ValidationMin }} + {{- end }} + {{- if .ValidationMax }} + max = {{ .ValidationMax }} + {{- end }} + {{- if .ValidationMonotonic }} + monotonic = "{{ .ValidationMonotonic }}" + {{- end }} + } +{{- end }} +} +`)) + + var buf bytes.Buffer + err := tmpl.Execute(&buf, param) + return buf.String(), err +} + func WithResources(resources []*proto.Resource) *Responses { return &Responses{ Parse: ParseComplete, diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index a738899b25f2c..768a7d477f992 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -1203,3 +1203,36 @@ export async function addUserToOrganization( } await page.mouse.click(10, 10); // close the popover by clicking outside of it } + +/** + * disableDynamicParameters navigates to the template settings page and disables + * dynamic parameters by unchecking the "Enable dynamic parameters" checkbox. + */ +export const disableDynamicParameters = async ( + page: Page, + templateName: string, + orgName = defaultOrganizationName, +) => { + await page.goto(`/templates/${orgName}/${templateName}/settings`, { + waitUntil: "domcontentloaded", + }); + + // Find and uncheck the "Enable dynamic parameters" checkbox + const dynamicParamsCheckbox = page.getByRole("checkbox", { + name: /Enable dynamic parameters for workspace creation/, + }); + + // If the checkbox is checked, uncheck it + if (await dynamicParamsCheckbox.isChecked()) { + await dynamicParamsCheckbox.click(); + } + + // Save the changes + await page.getByRole("button", { name: /save/i }).click(); + + // Wait for the success message or page to update + await page.waitForSelector("text=Template updated successfully", { + state: "visible", + timeout: 10000, + }); +}; diff --git a/site/e2e/tests/workspaces/createWorkspace.spec.ts b/site/e2e/tests/workspaces/createWorkspace.spec.ts index 452c6e9969f37..e9d2d5efcca6f 100644 --- a/site/e2e/tests/workspaces/createWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/createWorkspace.spec.ts @@ -4,6 +4,7 @@ import { StarterTemplates, createTemplate, createWorkspace, + disableDynamicParameters, echoResponsesWithParameters, login, openTerminalWindow, @@ -35,6 +36,9 @@ test("create workspace", async ({ page }) => { apply: [{ apply: { resources: [{ name: "example" }] } }], }); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); await createWorkspace(page, template); }); @@ -51,6 +55,9 @@ test("create workspace with default immutable parameters", async ({ page }) => { echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); await verifyParameters(page, workspaceName, richParameters, [ @@ -68,6 +75,9 @@ test("create workspace with default mutable parameters", async ({ page }) => { echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); await verifyParameters(page, workspaceName, richParameters, [ @@ -95,6 +105,9 @@ test("create workspace with default and required parameters", async ({ echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template, { richParameters, @@ -127,6 +140,9 @@ test("create workspace and overwrite default parameters", async ({ page }) => { echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template, { richParameters, @@ -147,6 +163,9 @@ test("create workspace with disable_param search params", async ({ page }) => { echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, templateName); + await login(page, users.member); await page.goto( `/templates/${templateName}/workspace?disable_params=first_parameter,second_parameter`, @@ -165,6 +184,9 @@ test.skip("create docker workspace", async ({ context, page }) => { await login(page, users.templateAdmin); const template = await createTemplate(page, StarterTemplates.STARTER_DOCKER); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); diff --git a/site/e2e/tests/workspaces/restartWorkspace.spec.ts b/site/e2e/tests/workspaces/restartWorkspace.spec.ts index 444ff891f0fdc..2ec24c6d251bf 100644 --- a/site/e2e/tests/workspaces/restartWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/restartWorkspace.spec.ts @@ -4,6 +4,7 @@ import { buildWorkspaceWithParameters, createTemplate, createWorkspace, + disableDynamicParameters, echoResponsesWithParameters, verifyParameters, } from "../../helpers"; @@ -24,6 +25,9 @@ test("restart workspace with ephemeral parameters", async ({ page }) => { echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); diff --git a/site/e2e/tests/workspaces/startWorkspace.spec.ts b/site/e2e/tests/workspaces/startWorkspace.spec.ts index 90fac440046ea..ea8a5c21c88bd 100644 --- a/site/e2e/tests/workspaces/startWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/startWorkspace.spec.ts @@ -4,6 +4,7 @@ import { buildWorkspaceWithParameters, createTemplate, createWorkspace, + disableDynamicParameters, echoResponsesWithParameters, stopWorkspace, verifyParameters, @@ -25,6 +26,9 @@ test("start workspace with ephemeral parameters", async ({ page }) => { echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); diff --git a/site/e2e/tests/workspaces/updateWorkspace.spec.ts b/site/e2e/tests/workspaces/updateWorkspace.spec.ts index 48c341eb63956..8a242a2dc7238 100644 --- a/site/e2e/tests/workspaces/updateWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/updateWorkspace.spec.ts @@ -3,6 +3,7 @@ import { users } from "../../constants"; import { createTemplate, createWorkspace, + disableDynamicParameters, echoResponsesWithParameters, updateTemplate, updateWorkspace, @@ -34,6 +35,9 @@ test("update workspace, new optional, immutable parameter added", async ({ echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); @@ -77,6 +81,9 @@ test("update workspace, new required, mutable parameter added", async ({ echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); @@ -122,6 +129,9 @@ test("update workspace with ephemeral parameter enabled", async ({ page }) => { echoResponsesWithParameters(richParameters), ); + // Disable dynamic parameters to use classic parameter flow for this test + await disableDynamicParameters(page, template); + await login(page, users.member); const workspaceName = await createWorkspace(page, template); diff --git a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx new file mode 100644 index 0000000000000..f68bb273f26a0 --- /dev/null +++ b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx @@ -0,0 +1,39 @@ +import { render, screen } from "@testing-library/react"; +import { ClassicParameterFlowDeprecationWarning } from "./ClassicParameterFlowDeprecationWarning"; + +jest.mock("modules/navigation", () => ({ + useLinks: () => () => "/mock-link", + linkToTemplate: () => "/mock-template-link", +})); + +describe("ClassicParameterFlowDeprecationWarning", () => { + const defaultProps = { + organizationName: "test-org", + templateName: "test-template", + }; + + it("renders warning when enabled and user has template update permissions", () => { + render( + , + ); + + expect(screen.getByText("deprecated")).toBeInTheDocument(); + expect(screen.getByText("Go to Template Settings")).toBeInTheDocument(); + }); + + it("does not render when enabled is false", () => { + const { container } = render( + , + ); + + expect(container.firstChild).toBeNull(); + }); +}); diff --git a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx new file mode 100644 index 0000000000000..d6afd3be464bf --- /dev/null +++ b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.tsx @@ -0,0 +1,38 @@ +import { Alert } from "components/Alert/Alert"; +import { Link } from "components/Link/Link"; +import type { FC } from "react"; +import { docs } from "utils/docs"; + +interface ClassicParameterFlowDeprecationWarningProps { + templateSettingsLink: string; + isEnabled: boolean; +} + +export const ClassicParameterFlowDeprecationWarning: FC< + ClassicParameterFlowDeprecationWarningProps +> = ({ templateSettingsLink, isEnabled }) => { + if (!isEnabled) { + return null; + } + + return ( + +
+ This template is using the classic parameter flow, which will be{" "} + deprecated and removed in a future release. Please + migrate to{" "} + + dynamic parameters + {" "} + on template settings for improved functionality. +
+ + + Go to Template Settings + +
+ ); +}; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index 6d057a73d1a50..b4c4c281c1b0d 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -72,6 +72,20 @@ const CreateWorkspacePage: FC = () => { }), enabled: !!templateQuery.data, }); + const templatePermissionsQuery = useQuery({ + ...checkAuthorization({ + checks: { + canUpdateTemplate: { + object: { + resource_type: "template", + resource_id: templateQuery.data?.id ?? "", + }, + action: "update", + }, + }, + }), + enabled: !!templateQuery.data, + }); const realizedVersionId = customVersionId ?? templateQuery.data?.active_version_id; const organizationId = templateQuery.data?.organization_id; @@ -93,9 +107,13 @@ const CreateWorkspacePage: FC = () => { const isLoadingFormData = templateQuery.isLoading || permissionsQuery.isLoading || + templatePermissionsQuery.isLoading || richParametersQuery.isLoading; const loadFormDataError = - templateQuery.error ?? permissionsQuery.error ?? richParametersQuery.error; + templateQuery.error ?? + permissionsQuery.error ?? + templatePermissionsQuery.error ?? + richParametersQuery.error; const title = autoCreateWorkspaceMutation.isPending ? "Creating workspace..." @@ -211,7 +229,9 @@ const CreateWorkspacePage: FC = () => { startPollingExternalAuth={startPollingExternalAuth} hasAllRequiredExternalAuth={hasAllRequiredExternalAuth} permissions={permissionsQuery.data as CreateWorkspacePermissions} - canUpdateTemplate={permissionsQuery.data?.canUpdateTemplate} + templatePermissions={ + templatePermissionsQuery.data as { canUpdateTemplate: boolean } + } parameters={realizedParameters as TemplateVersionParameter[]} presets={templateVersionPresetsQuery.data ?? []} creatingWorkspace={createWorkspaceMutation.isPending} diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx index 907c5e6861f68..4d0e3ff81c95f 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx @@ -11,6 +11,7 @@ import { MockUserOwner, mockApiError, } from "testHelpers/entities"; +import { withDashboardProvider } from "testHelpers/storybook"; import { CreateWorkspacePageView } from "./CreateWorkspacePageView"; const meta: Meta = { @@ -31,7 +32,9 @@ const meta: Meta = { canUpdateTemplate: false, }, onCancel: action("onCancel"), + templatePermissions: { canUpdateTemplate: true }, }, + decorators: [withDashboardProvider], }; export default meta; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index ceac49988c0a5..bc31e1db42742 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -28,6 +28,8 @@ import { UserAutocomplete } from "components/UserAutocomplete/UserAutocomplete"; import { type FormikContextType, useFormik } from "formik"; import type { ExternalAuthPollingState } from "hooks/useExternalAuth"; import { ExternalLinkIcon } from "lucide-react"; +import { linkToTemplate, useLinks } from "modules/navigation"; +import { ClassicParameterFlowDeprecationWarning } from "modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning"; import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName"; import { type FC, useCallback, useEffect, useMemo, useState } from "react"; import { Link } from "react-router-dom"; @@ -68,6 +70,7 @@ interface CreateWorkspacePageViewProps { autofillParameters: AutofillBuildParameter[]; presets: TypesGen.Preset[]; permissions: CreateWorkspacePermissions; + templatePermissions: { canUpdateTemplate: boolean }; creatingWorkspace: boolean; canUpdateTemplate?: boolean; onCancel: () => void; @@ -94,11 +97,13 @@ export const CreateWorkspacePageView: FC = ({ autofillParameters, presets = [], permissions, + templatePermissions, creatingWorkspace, canUpdateTemplate, onSubmit, onCancel, }) => { + const getLink = useLinks(); const [owner, setOwner] = useState(defaultOwner); const [suggestedName, setSuggestedName] = useState(() => generateWorkspaceName(), @@ -261,6 +266,13 @@ export const CreateWorkspacePageView: FC = ({ + + View docs @@ -555,7 +555,7 @@ export const CreateWorkspacePageViewExperimental: FC< parameters cannot be modified once the workspace is created. View docs diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx index 677984e5e9e5a..359058f78761a 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx @@ -245,19 +245,20 @@ export const TemplateSettingsForm: FC = ({ label={ - Enable dynamic parameters for workspace creation + Enable dynamic parameters for workspace creation (recommended)
- The new workspace form allows you to design your template - with new form types and identity-aware conditional - parameters. The form will only present options that are - compatible and available. + The dynamic workspace form allows you to design your + template with additional form types and identity-aware + conditional parameters. This is the default option for new + templates. The classic workspace creation flow will be + deprecated in a future release.
Learn more diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx index 00b8c2ae8464b..68dc6e65b7595 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx @@ -14,6 +14,7 @@ import { import { RichParameterInput } from "components/RichParameterInput/RichParameterInput"; import { Spinner } from "components/Spinner/Spinner"; import { useFormik } from "formik"; +import { ClassicParameterFlowDeprecationWarning } from "modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning"; import type { FC } from "react"; import { getFormHelpers } from "utils/formUtils"; import { @@ -33,6 +34,7 @@ interface WorkspaceParameterFormProps { autofillParams: AutofillBuildParameter[]; isSubmitting: boolean; canChangeVersions: boolean; + templatePermissions: { canUpdateTemplate: boolean } | undefined; error: unknown; onCancel: () => void; onSubmit: (values: WorkspaceParametersFormValues) => void; @@ -46,6 +48,7 @@ export const WorkspaceParametersForm: FC = ({ autofillParams, error, canChangeVersions, + templatePermissions, isSubmitting, }) => { const form = useFormik({ @@ -81,12 +84,15 @@ export const WorkspaceParametersForm: FC = ({ return ( <> {disabled && ( - + The template for this workspace requires automatic updates. Update the workspace to edit parameters. )} - + {hasNonEphemeralParameters && ( { const permissions = permissionsQuery.data as WorkspacePermissions | undefined; const canChangeVersions = Boolean(permissions?.updateWorkspaceVersion); + const templatePermissionsQuery = useQuery({ + ...checkAuthorization({ + checks: { + canUpdateTemplate: { + object: { + resource_type: "template", + resource_id: workspace.template_id, + }, + action: "update", + }, + }, + }), + enabled: workspace !== undefined, + }); + + const templatePermissions = templatePermissionsQuery.data as + | { canUpdateTemplate: boolean } + | undefined; + return ( <> @@ -60,6 +79,7 @@ const WorkspaceParametersPage: FC = () => { { type WorkspaceParametersPageViewProps = { workspace: Workspace; canChangeVersions: boolean; + templatePermissions: { canUpdateTemplate: boolean } | undefined; data: Awaited> | undefined; submitError: unknown; isSubmitting: boolean; @@ -106,6 +127,7 @@ export const WorkspaceParametersPageView: FC< > = ({ workspace, canChangeVersions, + templatePermissions, data, submitError, onSubmit, @@ -129,6 +151,7 @@ export const WorkspaceParametersPageView: FC< ({ ...p, source: "active_build", diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx index 803dc4ff4fd48..1415b1b2bc5f1 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx @@ -226,7 +226,7 @@ const WorkspaceParametersPageExperimental: FC = () => {
View docs @@ -261,7 +261,9 @@ const WorkspaceParametersPageExperimental: FC = () => { message="This workspace has no parameters" cta={ Learn more about parameters diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx index 14253ad51f827..52228f19d9f40 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageViewExperimental.tsx @@ -210,7 +210,7 @@ export const WorkspaceParametersPageViewExperimental: FC< parameters cannot be modified once the workspace is created. View docs diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index a80e3b623a211..44e729e7f4d4f 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -826,7 +826,7 @@ export const MockTemplate: TypesGen.Template = { deprecated: false, deprecation_message: "", max_port_share_level: "public", - use_classic_parameter_flow: true, + use_classic_parameter_flow: false, }; const MockTemplateVersionFiles: TemplateVersionFiles = { From bf789662563924f010148accc5444f66277f1ad7 Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Tue, 29 Jul 2025 22:30:17 +1000 Subject: [PATCH 009/260] chore: remove soft isolation configurability (#19069) Undoes a lot of the changes in 5319d47dfa5c619951fbcda67b82ae7c7e0c9efc Keeps the `netns.SetCoderSoftIsolation()` call, but always sets it to `true` when using a TUN device. --- tailnet/conn.go | 20 ++--- vpn/client.go | 16 ++-- vpn/speaker_internal_test.go | 2 +- vpn/tunnel.go | 15 ++-- vpn/tunnel_internal_test.go | 99 ++++++--------------- vpn/version.go | 4 +- vpn/vpn.pb.go | 166 ++++++++++++++++------------------- vpn/vpn.proto | 1 - 8 files changed, 127 insertions(+), 196 deletions(-) diff --git a/tailnet/conn.go b/tailnet/conn.go index e23e0ae04b0d5..709d5b2958453 100644 --- a/tailnet/conn.go +++ b/tailnet/conn.go @@ -102,17 +102,6 @@ type Options struct { BlockEndpoints bool Logger slog.Logger ListenPort uint16 - // UseSoftNetIsolation enables our homemade soft isolation feature in the - // netns package. This option will only be considered if TUNDev is set. - // - // The Coder soft isolation mode is a workaround to allow Coder Connect to - // connect to Coder servers behind corporate VPNs, and relaxes some of the - // loop protections that come with Tailscale. - // - // When soft isolation is disabled, the netns package will function as - // normal and route all traffic through the default interface (and block all - // traffic to other VPN interfaces) on macOS and Windows. - UseSoftNetIsolation bool // CaptureHook is a callback that captures Disco packets and packets sent // into the tailnet tunnel. @@ -169,10 +158,13 @@ func NewConn(options *Options) (conn *Conn, err error) { } useNetNS := options.TUNDev != nil - useSoftIsolation := useNetNS && options.UseSoftNetIsolation - options.Logger.Debug(context.Background(), "network isolation configuration", slog.F("use_netns", useNetNS), slog.F("use_soft_isolation", useSoftIsolation)) + options.Logger.Debug(context.Background(), "network isolation configuration", slog.F("use_netns", useNetNS)) netns.SetEnabled(useNetNS) - netns.SetCoderSoftIsolation(useSoftIsolation) + // The Coder soft isolation mode is a workaround to allow Coder Connect to + // connect to Coder servers behind corporate VPNs, and relaxes some of the + // loop protections that come with Tailscale. + // See the comment above the netns function for more details. + netns.SetCoderSoftIsolation(useNetNS) var telemetryStore *TelemetryStore if options.TelemetrySink != nil { diff --git a/vpn/client.go b/vpn/client.go index 8d2115ec2839a..0411b209c24a8 100644 --- a/vpn/client.go +++ b/vpn/client.go @@ -69,14 +69,13 @@ func NewClient() Client { } type Options struct { - Headers http.Header - Logger slog.Logger - UseSoftNetIsolation bool - DNSConfigurator dns.OSConfigurator - Router router.Router - TUNDevice tun.Device - WireguardMonitor *netmon.Monitor - UpdateHandler tailnet.UpdatesHandler + Headers http.Header + Logger slog.Logger + DNSConfigurator dns.OSConfigurator + Router router.Router + TUNDevice tun.Device + WireguardMonitor *netmon.Monitor + UpdateHandler tailnet.UpdatesHandler } type derpMapRewriter struct { @@ -164,7 +163,6 @@ func (*client) NewConn(initCtx context.Context, serverURL *url.URL, token string DERPForceWebSockets: connInfo.DERPForceWebSockets, Logger: options.Logger, BlockEndpoints: connInfo.DisableDirectConnections, - UseSoftNetIsolation: options.UseSoftNetIsolation, DNSConfigurator: options.DNSConfigurator, Router: options.Router, TUNDev: options.TUNDevice, diff --git a/vpn/speaker_internal_test.go b/vpn/speaker_internal_test.go index 5ec5de4a3bf59..433868851a5bc 100644 --- a/vpn/speaker_internal_test.go +++ b/vpn/speaker_internal_test.go @@ -23,7 +23,7 @@ func TestMain(m *testing.M) { goleak.VerifyTestMain(m, testutil.GoleakOptions...) } -const expectedHandshake = "codervpn tunnel 1.3\n" +const expectedHandshake = "codervpn tunnel 1.2\n" // TestSpeaker_RawPeer tests the speaker with a peer that we simulate by directly making reads and // writes to the other end of the pipe. There should be at least one test that does this, rather diff --git a/vpn/tunnel.go b/vpn/tunnel.go index 38d474c33206b..30ee56c2396fa 100644 --- a/vpn/tunnel.go +++ b/vpn/tunnel.go @@ -265,14 +265,13 @@ func (t *Tunnel) start(req *StartRequest) error { svrURL, apiToken, &Options{ - Headers: header, - Logger: t.clientLogger, - UseSoftNetIsolation: req.GetTunnelUseSoftNetIsolation(), - DNSConfigurator: networkingStack.DNSConfigurator, - Router: networkingStack.Router, - TUNDevice: networkingStack.TUNDevice, - WireguardMonitor: networkingStack.WireguardMonitor, - UpdateHandler: t, + Headers: header, + Logger: t.clientLogger, + DNSConfigurator: networkingStack.DNSConfigurator, + Router: networkingStack.Router, + TUNDevice: networkingStack.TUNDevice, + WireguardMonitor: networkingStack.WireguardMonitor, + UpdateHandler: t, }, ) if err != nil { diff --git a/vpn/tunnel_internal_test.go b/vpn/tunnel_internal_test.go index b93b679de332c..c21fd20251282 100644 --- a/vpn/tunnel_internal_test.go +++ b/vpn/tunnel_internal_test.go @@ -2,10 +2,8 @@ package vpn import ( "context" - "encoding/json" "maps" "net" - "net/http" "net/netip" "net/url" "slices" @@ -24,7 +22,6 @@ import ( "github.com/coder/quartz" maputil "github.com/coder/coder/v2/coderd/util/maps" - "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/tailnet" "github.com/coder/coder/v2/tailnet/proto" "github.com/coder/coder/v2/testutil" @@ -32,43 +29,25 @@ import ( func newFakeClient(ctx context.Context, t *testing.T) *fakeClient { return &fakeClient{ - t: t, - ctx: ctx, - connCh: make(chan *fakeConn, 1), - } -} - -func newFakeClientWithOptsCh(ctx context.Context, t *testing.T) *fakeClient { - return &fakeClient{ - t: t, - ctx: ctx, - connCh: make(chan *fakeConn, 1), - optsCh: make(chan *Options, 1), + t: t, + ctx: ctx, + ch: make(chan *fakeConn, 1), } } type fakeClient struct { - t *testing.T - ctx context.Context - connCh chan *fakeConn - optsCh chan *Options // options will be written to this channel if it's not nil + t *testing.T + ctx context.Context + ch chan *fakeConn } var _ Client = (*fakeClient)(nil) -func (f *fakeClient) NewConn(_ context.Context, _ *url.URL, _ string, opts *Options) (Conn, error) { - if f.optsCh != nil { - select { - case <-f.ctx.Done(): - return nil, f.ctx.Err() - case f.optsCh <- opts: - } - } - +func (f *fakeClient) NewConn(context.Context, *url.URL, string, *Options) (Conn, error) { select { case <-f.ctx.Done(): return nil, f.ctx.Err() - case conn := <-f.connCh: + case conn := <-f.ch: return conn, nil } } @@ -155,7 +134,7 @@ func TestTunnel_StartStop(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitShort) - client := newFakeClientWithOptsCh(ctx, t) + client := newFakeClient(ctx, t) conn := newFakeConn(tailnet.WorkspaceUpdate{}, time.Time{}) _, mgr := setupTunnel(t, ctx, client, quartz.NewMock(t)) @@ -163,45 +142,29 @@ func TestTunnel_StartStop(t *testing.T) { errCh := make(chan error, 1) var resp *TunnelMessage // When: we start the tunnel - telemetry := codersdk.CoderDesktopTelemetry{ - DeviceID: "device001", - DeviceOS: "macOS", - CoderDesktopVersion: "0.24.8", - } - telemetryJSON, err := json.Marshal(telemetry) - require.NoError(t, err) go func() { r, err := mgr.unaryRPC(ctx, &ManagerMessage{ Msg: &ManagerMessage_Start{ Start: &StartRequest{ TunnelFileDescriptor: 2, - // Use default value for TunnelUseSoftNetIsolation - CoderUrl: "https://coder.example.com", - ApiToken: "fakeToken", + CoderUrl: "https://coder.example.com", + ApiToken: "fakeToken", Headers: []*StartRequest_Header{ {Name: "X-Test-Header", Value: "test"}, }, - DeviceOs: telemetry.DeviceOS, - DeviceId: telemetry.DeviceID, - CoderDesktopVersion: telemetry.CoderDesktopVersion, + DeviceOs: "macOS", + DeviceId: "device001", + CoderDesktopVersion: "0.24.8", }, }, }) resp = r errCh <- err }() - - // Then: `NewConn` is called - opts := testutil.RequireReceive(ctx, t, client.optsCh) - require.Equal(t, http.Header{ - "X-Test-Header": {"test"}, - codersdk.CoderDesktopTelemetryHeader: {string(telemetryJSON)}, - }, opts.Headers) - require.False(t, opts.UseSoftNetIsolation) // the default is false - testutil.RequireSend(ctx, t, client.connCh, conn) - + // Then: `NewConn` is called, + testutil.RequireSend(ctx, t, client.ch, conn) // And: a response is received - err = testutil.TryReceive(ctx, t, errCh) + err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) require.True(t, ok) @@ -234,7 +197,7 @@ func TestTunnel_PeerUpdate(t *testing.T) { wsID1 := uuid.UUID{1} wsID2 := uuid.UUID{2} - client := newFakeClientWithOptsCh(ctx, t) + client := newFakeClient(ctx, t) conn := newFakeConn(tailnet.WorkspaceUpdate{ UpsertedWorkspaces: []*tailnet.Workspace{ { @@ -248,28 +211,22 @@ func TestTunnel_PeerUpdate(t *testing.T) { tun, mgr := setupTunnel(t, ctx, client, quartz.NewMock(t)) - // When: we start the tunnel errCh := make(chan error, 1) var resp *TunnelMessage go func() { r, err := mgr.unaryRPC(ctx, &ManagerMessage{ Msg: &ManagerMessage_Start{ Start: &StartRequest{ - TunnelFileDescriptor: 2, - TunnelUseSoftNetIsolation: true, - CoderUrl: "https://coder.example.com", - ApiToken: "fakeToken", + TunnelFileDescriptor: 2, + CoderUrl: "https://coder.example.com", + ApiToken: "fakeToken", }, }, }) resp = r errCh <- err }() - - // Then: `NewConn` is called - opts := testutil.RequireReceive(ctx, t, client.optsCh) - require.True(t, opts.UseSoftNetIsolation) - testutil.RequireSend(ctx, t, client.connCh, conn) + testutil.RequireSend(ctx, t, client.ch, conn) err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) @@ -334,7 +291,7 @@ func TestTunnel_NetworkSettings(t *testing.T) { resp = r errCh <- err }() - testutil.RequireSend(ctx, t, client.connCh, conn) + testutil.RequireSend(ctx, t, client.ch, conn) err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) @@ -475,7 +432,7 @@ func TestTunnel_sendAgentUpdate(t *testing.T) { resp = r errCh <- err }() - testutil.RequireSend(ctx, t, client.connCh, conn) + testutil.RequireSend(ctx, t, client.ch, conn) err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) @@ -646,7 +603,7 @@ func TestTunnel_sendAgentUpdateReconnect(t *testing.T) { resp = r errCh <- err }() - testutil.RequireSend(ctx, t, client.connCh, conn) + testutil.RequireSend(ctx, t, client.ch, conn) err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) @@ -746,7 +703,7 @@ func TestTunnel_sendAgentUpdateWorkspaceReconnect(t *testing.T) { resp = r errCh <- err }() - testutil.RequireSend(ctx, t, client.connCh, conn) + testutil.RequireSend(ctx, t, client.ch, conn) err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) @@ -849,7 +806,7 @@ func TestTunnel_slowPing(t *testing.T) { resp = r errCh <- err }() - testutil.RequireSend(ctx, t, client.connCh, conn) + testutil.RequireSend(ctx, t, client.ch, conn) err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) @@ -938,7 +895,7 @@ func TestTunnel_stopMidPing(t *testing.T) { resp = r errCh <- err }() - testutil.RequireSend(ctx, t, client.connCh, conn) + testutil.RequireSend(ctx, t, client.ch, conn) err := testutil.TryReceive(ctx, t, errCh) require.NoError(t, err) _, ok := resp.Msg.(*TunnelMessage_Start) diff --git a/vpn/version.go b/vpn/version.go index b7bf1448a2c2e..2bf815e903e29 100644 --- a/vpn/version.go +++ b/vpn/version.go @@ -23,9 +23,7 @@ var CurrentSupportedVersions = RPCVersionList{ // - preferred_derp: The server that DERP relayed connections are // using, if they're not using P2P. // - preferred_derp_latency: The latency to the preferred DERP - // 1.3 adds: - // - tunnel_use_soft_net_isolation to the StartRequest - {Major: 1, Minor: 3}, + {Major: 1, Minor: 2}, }, } diff --git a/vpn/vpn.pb.go b/vpn/vpn.pb.go index 8e08a453acdc3..fbf5ce303fa35 100644 --- a/vpn/vpn.pb.go +++ b/vpn/vpn.pb.go @@ -1375,11 +1375,10 @@ type StartRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TunnelFileDescriptor int32 `protobuf:"varint,1,opt,name=tunnel_file_descriptor,json=tunnelFileDescriptor,proto3" json:"tunnel_file_descriptor,omitempty"` - TunnelUseSoftNetIsolation bool `protobuf:"varint,8,opt,name=tunnel_use_soft_net_isolation,json=tunnelUseSoftNetIsolation,proto3" json:"tunnel_use_soft_net_isolation,omitempty"` - CoderUrl string `protobuf:"bytes,2,opt,name=coder_url,json=coderUrl,proto3" json:"coder_url,omitempty"` - ApiToken string `protobuf:"bytes,3,opt,name=api_token,json=apiToken,proto3" json:"api_token,omitempty"` - Headers []*StartRequest_Header `protobuf:"bytes,4,rep,name=headers,proto3" json:"headers,omitempty"` + TunnelFileDescriptor int32 `protobuf:"varint,1,opt,name=tunnel_file_descriptor,json=tunnelFileDescriptor,proto3" json:"tunnel_file_descriptor,omitempty"` + CoderUrl string `protobuf:"bytes,2,opt,name=coder_url,json=coderUrl,proto3" json:"coder_url,omitempty"` + ApiToken string `protobuf:"bytes,3,opt,name=api_token,json=apiToken,proto3" json:"api_token,omitempty"` + Headers []*StartRequest_Header `protobuf:"bytes,4,rep,name=headers,proto3" json:"headers,omitempty"` // Device ID from Coder Desktop DeviceId string `protobuf:"bytes,5,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` // Device OS from Coder Desktop @@ -1427,13 +1426,6 @@ func (x *StartRequest) GetTunnelFileDescriptor() int32 { return 0 } -func (x *StartRequest) GetTunnelUseSoftNetIsolation() bool { - if x != nil { - return x.TunnelUseSoftNetIsolation - } - return false -} - func (x *StartRequest) GetCoderUrl() string { if x != nil { return x.CoderUrl @@ -2562,86 +2554,82 @@ var file_vpn_vpn_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x96, 0x03, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x67, 0x65, 0x22, 0xd4, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x40, 0x0a, 0x1d, 0x74, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6e, 0x65, 0x74, - 0x5f, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x19, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x55, 0x73, 0x65, 0x53, 0x6f, 0x66, 0x74, 0x4e, - 0x65, 0x74, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x4f, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x73, - 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x32, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4e, 0x0a, 0x0d, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x7a, 0x0a, 0x1d, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, - 0x6e, 0x12, 0x24, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xaa, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x64, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x10, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x4d, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, - 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0xe4, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, - 0x0a, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4c, - 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, - 0x63, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x0b, 0x70, 0x65, 0x65, 0x72, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x76, 0x70, 0x6e, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, - 0x70, 0x65, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x4e, 0x0a, 0x09, 0x4c, 0x69, - 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, - 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, - 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x47, 0x0a, 0x12, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, 0x67, - 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, - 0x67, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, - 0x67, 0x10, 0x02, 0x42, 0x39, 0x5a, 0x1d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x32, - 0x2f, 0x76, 0x70, 0x6e, 0xaa, 0x02, 0x17, 0x43, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x73, - 0x6b, 0x74, 0x6f, 0x70, 0x2e, 0x56, 0x70, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x70, 0x69, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x70, 0x69, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x07, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6f, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4f, + 0x73, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x13, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x32, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4e, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x7a, 0x0a, 0x1d, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x12, + 0x24, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0xaa, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x11, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x10, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x4d, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xe4, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x0a, 0x09, + 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x76, 0x70, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4c, 0x69, 0x66, + 0x65, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x63, 0x79, 0x63, 0x6c, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x0b, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x70, + 0x6e, 0x2e, 0x50, 0x65, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x70, 0x65, + 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x4e, 0x0a, 0x09, 0x4c, 0x69, 0x66, 0x65, + 0x63, 0x79, 0x63, 0x6c, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, + 0x08, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x53, + 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x10, + 0x0a, 0x0c, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x10, + 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x10, + 0x02, 0x42, 0x39, 0x5a, 0x1d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x32, 0x2f, 0x76, + 0x70, 0x6e, 0xaa, 0x02, 0x17, 0x43, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x2e, 0x56, 0x70, 0x6e, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vpn/vpn.proto b/vpn/vpn.proto index 61c9978cdcad6..357a2b91b12fb 100644 --- a/vpn/vpn.proto +++ b/vpn/vpn.proto @@ -214,7 +214,6 @@ message NetworkSettingsResponse { // StartResponse. message StartRequest { int32 tunnel_file_descriptor = 1; - bool tunnel_use_soft_net_isolation = 8; string coder_url = 2; string api_token = 3; // Additional HTTP headers added to all requests From b666d52171ddd29e41b09c1d3a6f91685843b425 Mon Sep 17 00:00:00 2001 From: Hugo Dutka Date: Tue, 29 Jul 2025 16:20:02 +0200 Subject: [PATCH 010/260] feat(codersdk/toolsdk): add MCP workspace bash background parameter (#19034) Addresses coder/internal#820 --------- Signed-off-by: Thomas Kosiewski Co-authored-by: Thomas Kosiewski --- codersdk/toolsdk/bash.go | 63 +++++++++---- codersdk/toolsdk/bash_test.go | 150 +++++++++++++++++++++++++++++-- codersdk/toolsdk/toolsdk_test.go | 24 ++--- 3 files changed, 202 insertions(+), 35 deletions(-) diff --git a/codersdk/toolsdk/bash.go b/codersdk/toolsdk/bash.go index 5fb15843f1bf1..037227337bfc9 100644 --- a/codersdk/toolsdk/bash.go +++ b/codersdk/toolsdk/bash.go @@ -21,9 +21,10 @@ import ( ) type WorkspaceBashArgs struct { - Workspace string `json:"workspace"` - Command string `json:"command"` - TimeoutMs int `json:"timeout_ms,omitempty"` + Workspace string `json:"workspace"` + Command string `json:"command"` + TimeoutMs int `json:"timeout_ms,omitempty"` + Background bool `json:"background,omitempty"` } type WorkspaceBashResult struct { @@ -50,9 +51,13 @@ The workspace parameter supports various formats: The timeout_ms parameter specifies the command timeout in milliseconds (defaults to 60000ms, maximum of 300000ms). If the command times out, all output captured up to that point is returned with a cancellation message. +For background commands (background: true), output is captured until the timeout is reached, then the command +continues running in the background. The captured output is returned as the result. + Examples: - workspace: "my-workspace", command: "ls -la" - workspace: "john/dev-env", command: "git status", timeout_ms: 30000 +- workspace: "my-workspace", command: "npm run dev", background: true, timeout_ms: 10000 - workspace: "my-workspace.main", command: "docker ps"`, Schema: aisdk.Schema{ Properties: map[string]any{ @@ -70,6 +75,10 @@ Examples: "default": 60000, "minimum": 1, }, + "background": map[string]any{ + "type": "boolean", + "description": "Whether to run the command in the background. Output is captured until timeout, then the command continues running in the background.", + }, }, Required: []string{"workspace", "command"}, }, @@ -137,23 +146,35 @@ Examples: // Set default timeout if not specified (60 seconds) timeoutMs := args.TimeoutMs + defaultTimeoutMs := 60000 if timeoutMs <= 0 { - timeoutMs = 60000 + timeoutMs = defaultTimeoutMs + } + command := args.Command + if args.Background { + // For background commands, use nohup directly to ensure they survive SSH session + // termination. This captures output normally but allows the process to continue + // running even after the SSH connection closes. + command = fmt.Sprintf("nohup %s &1", args.Command) } - // Create context with timeout - ctx, cancel = context.WithTimeout(ctx, time.Duration(timeoutMs)*time.Millisecond) - defer cancel() + // Create context with command timeout (replace the broader MCP timeout) + commandCtx, commandCancel := context.WithTimeout(ctx, time.Duration(timeoutMs)*time.Millisecond) + defer commandCancel() // Execute command with timeout handling - output, err := executeCommandWithTimeout(ctx, session, args.Command) + output, err := executeCommandWithTimeout(commandCtx, session, command) outputStr := strings.TrimSpace(string(output)) // Handle command execution results if err != nil { // Check if the command timed out - if errors.Is(context.Cause(ctx), context.DeadlineExceeded) { - outputStr += "\nCommand canceled due to timeout" + if errors.Is(context.Cause(commandCtx), context.DeadlineExceeded) { + if args.Background { + outputStr += "\nCommand continues running in background" + } else { + outputStr += "\nCommand canceled due to timeout" + } return WorkspaceBashResult{ Output: outputStr, ExitCode: 124, @@ -387,21 +408,27 @@ func executeCommandWithTimeout(ctx context.Context, session *gossh.Session, comm return safeWriter.Bytes(), err case <-ctx.Done(): // Context was canceled (timeout or other cancellation) - // Close the session to stop the command - _ = session.Close() + // Close the session to stop the command, but handle errors gracefully + closeErr := session.Close() - // Give a brief moment to collect any remaining output - timer := time.NewTimer(50 * time.Millisecond) + // Give a brief moment to collect any remaining output and for goroutines to finish + timer := time.NewTimer(100 * time.Millisecond) defer timer.Stop() select { case <-timer.C: // Timer expired, return what we have + break case err := <-done: // Command finished during grace period - return safeWriter.Bytes(), err + if closeErr == nil { + return safeWriter.Bytes(), err + } + // If session close failed, prioritize the context error + break } + // Return the collected output with the context error return safeWriter.Bytes(), context.Cause(ctx) } } @@ -421,5 +448,9 @@ func (sw *syncWriter) Write(p []byte) (n int, err error) { func (sw *syncWriter) Bytes() []byte { sw.mu.Lock() defer sw.mu.Unlock() - return sw.w.Bytes() + // Return a copy to prevent race conditions with the underlying buffer + b := sw.w.Bytes() + result := make([]byte, len(b)) + copy(result, b) + return result } diff --git a/codersdk/toolsdk/bash_test.go b/codersdk/toolsdk/bash_test.go index 53ac480039278..0656b2d8786e6 100644 --- a/codersdk/toolsdk/bash_test.go +++ b/codersdk/toolsdk/bash_test.go @@ -9,6 +9,7 @@ import ( "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk/toolsdk" + "github.com/coder/coder/v2/testutil" ) func TestWorkspaceBash(t *testing.T) { @@ -174,8 +175,6 @@ func TestWorkspaceBashTimeout(t *testing.T) { // Test that the TimeoutMs field can be set and read correctly args := toolsdk.WorkspaceBashArgs{ - Workspace: "test-workspace", - Command: "echo test", TimeoutMs: 0, // Should default to 60000 in handler } @@ -192,8 +191,6 @@ func TestWorkspaceBashTimeout(t *testing.T) { // Test that negative values can be set and will be handled by the default logic args := toolsdk.WorkspaceBashArgs{ - Workspace: "test-workspace", - Command: "echo test", TimeoutMs: -100, } @@ -279,7 +276,7 @@ func TestWorkspaceBashTimeoutIntegration(t *testing.T) { TimeoutMs: 2000, // 2 seconds timeout - should timeout after first echo } - result, err := toolsdk.WorkspaceBash.Handler(t.Context(), deps, args) + result, err := testTool(t, toolsdk.WorkspaceBash, deps, args) // Should not error (timeout is handled gracefully) require.NoError(t, err) @@ -313,7 +310,6 @@ func TestWorkspaceBashTimeoutIntegration(t *testing.T) { deps, err := toolsdk.NewDeps(client) require.NoError(t, err) - ctx := context.Background() args := toolsdk.WorkspaceBashArgs{ Workspace: workspace.Name, @@ -321,7 +317,8 @@ func TestWorkspaceBashTimeoutIntegration(t *testing.T) { TimeoutMs: 5000, // 5 second timeout - plenty of time } - result, err := toolsdk.WorkspaceBash.Handler(ctx, deps, args) + // Use testTool to register the tool as tested and satisfy coverage validation + result, err := testTool(t, toolsdk.WorkspaceBash, deps, args) // Should not error require.NoError(t, err) @@ -338,3 +335,142 @@ func TestWorkspaceBashTimeoutIntegration(t *testing.T) { require.NotContains(t, result.Output, "Command canceled due to timeout") }) } + +func TestWorkspaceBashBackgroundIntegration(t *testing.T) { + t.Parallel() + + t.Run("BackgroundCommandCapturesOutput", func(t *testing.T) { + t.Parallel() + + client, workspace, agentToken := setupWorkspaceForAgent(t) + + // Start the agent and wait for it to be fully ready + _ = agenttest.New(t, client.URL, agentToken) + + // Wait for workspace agents to be ready + coderdtest.NewWorkspaceAgentWaiter(t, client, workspace.ID).Wait() + + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + args := toolsdk.WorkspaceBashArgs{ + Workspace: workspace.Name, + Command: `echo "started" && sleep 60 && echo "completed"`, // Command that would take 60+ seconds + Background: true, // Run in background + TimeoutMs: 2000, // 2 second timeout + } + + result, err := testTool(t, toolsdk.WorkspaceBash, deps, args) + + // Should not error + require.NoError(t, err) + + t.Logf("Background result: exitCode=%d, output=%q", result.ExitCode, result.Output) + + // Should have exit code 124 (timeout) since command times out + require.Equal(t, 124, result.ExitCode) + + // Should capture output up to timeout point + require.Contains(t, result.Output, "started", "Should contain output captured before timeout") + + // Should NOT contain the second echo (it never executed due to timeout) + require.NotContains(t, result.Output, "completed", "Should not contain output after timeout") + + // Should contain background continuation message + require.Contains(t, result.Output, "Command continues running in background") + }) + + t.Run("BackgroundVsNormalExecution", func(t *testing.T) { + t.Parallel() + + client, workspace, agentToken := setupWorkspaceForAgent(t) + + // Start the agent and wait for it to be fully ready + _ = agenttest.New(t, client.URL, agentToken) + + // Wait for workspace agents to be ready + coderdtest.NewWorkspaceAgentWaiter(t, client, workspace.ID).Wait() + + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + // First run the same command in normal mode + normalArgs := toolsdk.WorkspaceBashArgs{ + Workspace: workspace.Name, + Command: `echo "hello world"`, + Background: false, + } + + normalResult, err := toolsdk.WorkspaceBash.Handler(t.Context(), deps, normalArgs) + require.NoError(t, err) + + // Normal mode should return the actual output + require.Equal(t, 0, normalResult.ExitCode) + require.Equal(t, "hello world", normalResult.Output) + + // Now run the same command in background mode + backgroundArgs := toolsdk.WorkspaceBashArgs{ + Workspace: workspace.Name, + Command: `echo "hello world"`, + Background: true, + } + + backgroundResult, err := testTool(t, toolsdk.WorkspaceBash, deps, backgroundArgs) + require.NoError(t, err) + + t.Logf("Normal result: %q", normalResult.Output) + t.Logf("Background result: %q", backgroundResult.Output) + + // Background mode should also return the actual output since command completes quickly + require.Equal(t, 0, backgroundResult.ExitCode) + require.Equal(t, "hello world", backgroundResult.Output) + }) + + t.Run("BackgroundCommandContinuesAfterTimeout", func(t *testing.T) { + t.Parallel() + + client, workspace, agentToken := setupWorkspaceForAgent(t) + + // Start the agent and wait for it to be fully ready + _ = agenttest.New(t, client.URL, agentToken) + + // Wait for workspace agents to be ready + coderdtest.NewWorkspaceAgentWaiter(t, client, workspace.ID).Wait() + + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + args := toolsdk.WorkspaceBashArgs{ + Workspace: workspace.Name, + Command: `echo "started" && sleep 4 && echo "done" > /tmp/bg-test-done`, // Command that will timeout but continue + TimeoutMs: 2000, // 2000ms timeout (shorter than command duration) + Background: true, // Run in background + } + + result, err := testTool(t, toolsdk.WorkspaceBash, deps, args) + + // Should not error but should timeout + require.NoError(t, err) + + t.Logf("Background with timeout result: exitCode=%d, output=%q", result.ExitCode, result.Output) + + // Should have timeout exit code + require.Equal(t, 124, result.ExitCode) + + // Should capture output before timeout + require.Contains(t, result.Output, "started", "Should contain output captured before timeout") + + // Should contain background continuation message + require.Contains(t, result.Output, "Command continues running in background") + + // Wait for the background command to complete (even though SSH session timed out) + require.Eventually(t, func() bool { + checkArgs := toolsdk.WorkspaceBashArgs{ + Workspace: workspace.Name, + Command: `cat /tmp/bg-test-done 2>/dev/null || echo "not found"`, + } + checkResult, err := toolsdk.WorkspaceBash.Handler(t.Context(), deps, checkArgs) + return err == nil && checkResult.Output == "done" + }, testutil.WaitMedium, testutil.IntervalMedium, "Background command should continue running and complete after timeout") + }) +} diff --git a/codersdk/toolsdk/toolsdk_test.go b/codersdk/toolsdk/toolsdk_test.go index c201190bd3456..13e475c80609a 100644 --- a/codersdk/toolsdk/toolsdk_test.go +++ b/codersdk/toolsdk/toolsdk_test.go @@ -456,7 +456,7 @@ var testedTools sync.Map // This is to mimic how we expect external callers to use the tool. func testTool[Arg, Ret any](t *testing.T, tool toolsdk.Tool[Arg, Ret], tb toolsdk.Deps, args Arg) (Ret, error) { t.Helper() - defer func() { testedTools.Store(tool.Tool.Name, true) }() + defer func() { testedTools.Store(tool.Name, true) }() toolArgs, err := json.Marshal(args) require.NoError(t, err, "failed to marshal args") result, err := tool.Generic().Handler(t.Context(), tb, toolArgs) @@ -625,23 +625,23 @@ func TestToolSchemaFields(t *testing.T) { // Test that all tools have the required Schema fields (Properties and Required) for _, tool := range toolsdk.All { - t.Run(tool.Tool.Name, func(t *testing.T) { + t.Run(tool.Name, func(t *testing.T) { t.Parallel() // Check that Properties is not nil - require.NotNil(t, tool.Tool.Schema.Properties, - "Tool %q missing Schema.Properties", tool.Tool.Name) + require.NotNil(t, tool.Schema.Properties, + "Tool %q missing Schema.Properties", tool.Name) // Check that Required is not nil - require.NotNil(t, tool.Tool.Schema.Required, - "Tool %q missing Schema.Required", tool.Tool.Name) + require.NotNil(t, tool.Schema.Required, + "Tool %q missing Schema.Required", tool.Name) // Ensure Properties has entries for all required fields - for _, requiredField := range tool.Tool.Schema.Required { - _, exists := tool.Tool.Schema.Properties[requiredField] + for _, requiredField := range tool.Schema.Required { + _, exists := tool.Schema.Properties[requiredField] require.True(t, exists, "Tool %q requires field %q but it is not defined in Properties", - tool.Tool.Name, requiredField) + tool.Name, requiredField) } }) } @@ -652,7 +652,7 @@ func TestToolSchemaFields(t *testing.T) { func TestMain(m *testing.M) { // Initialize testedTools for _, tool := range toolsdk.All { - testedTools.Store(tool.Tool.Name, false) + testedTools.Store(tool.Name, false) } code := m.Run() @@ -660,8 +660,8 @@ func TestMain(m *testing.M) { // Ensure all tools have been tested var untested []string for _, tool := range toolsdk.All { - if tested, ok := testedTools.Load(tool.Tool.Name); !ok || !tested.(bool) { - untested = append(untested, tool.Tool.Name) + if tested, ok := testedTools.Load(tool.Name); !ok || !tested.(bool) { + untested = append(untested, tool.Name) } } From 29486f9d4e146df282fabeca291867691a109310 Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Tue, 29 Jul 2025 16:23:57 +0200 Subject: [PATCH 011/260] fix: fix e2e tests (#19076) Closes https://github.com/coder/internal/issues/824 --- site/e2e/helpers.ts | 51 ++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index 768a7d477f992..e771adeab3813 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -127,6 +127,10 @@ export const createWorkspace = async ( const name = randomName(); await page.getByLabel("name").fill(name); + if (buildParameters.length > 0) { + await page.waitForSelector("form", { state: "visible" }); + } + await fillParameters(page, richParameters, buildParameters); if (useExternalAuth) { @@ -898,28 +902,29 @@ const fillParameters = async ( ); } - const parameterLabel = await page.waitForSelector( - `[data-testid='parameter-field-${richParameter.name}']`, - { state: "visible" }, + // Use modern locator approach instead of waitForSelector + const parameterLabel = page.getByTestId( + `parameter-field-${richParameter.name}`, ); + await expect(parameterLabel).toBeVisible(); if (richParameter.type === "bool") { - const parameterField = await parameterLabel.waitForSelector( - `[data-testid='parameter-field-bool'] .MuiRadio-root input[value='${buildParameter.value}']`, - ); + const parameterField = parameterLabel + .getByTestId("parameter-field-bool") + .locator(`.MuiRadio-root input[value='${buildParameter.value}']`); await parameterField.click(); } else if (richParameter.options.length > 0) { - const parameterField = await parameterLabel.waitForSelector( - `[data-testid='parameter-field-options'] .MuiRadio-root input[value='${buildParameter.value}']`, - ); + const parameterField = parameterLabel + .getByTestId("parameter-field-options") + .locator(`.MuiRadio-root input[value='${buildParameter.value}']`); await parameterField.click(); } else if (richParameter.type === "list(string)") { throw new Error("not implemented yet"); // FIXME } else { // text or number - const parameterField = await parameterLabel.waitForSelector( - "[data-testid='parameter-field-text'] input", - ); + const parameterField = parameterLabel + .getByTestId("parameter-field-text") + .locator("input"); await parameterField.fill(buildParameter.value); } } @@ -1217,22 +1222,34 @@ export const disableDynamicParameters = async ( waitUntil: "domcontentloaded", }); + await page.waitForSelector("form", { state: "visible" }); + // Find and uncheck the "Enable dynamic parameters" checkbox const dynamicParamsCheckbox = page.getByRole("checkbox", { name: /Enable dynamic parameters for workspace creation/, }); + await dynamicParamsCheckbox.waitFor({ state: "visible" }); + // If the checkbox is checked, uncheck it if (await dynamicParamsCheckbox.isChecked()) { await dynamicParamsCheckbox.click(); } // Save the changes - await page.getByRole("button", { name: /save/i }).click(); + const saveButton = page.getByRole("button", { name: /save/i }); + await saveButton.waitFor({ state: "visible" }); + await saveButton.click(); // Wait for the success message or page to update - await page.waitForSelector("text=Template updated successfully", { - state: "visible", - timeout: 10000, - }); + await page + .locator("[role='alert']:has-text('Template updated successfully')") + .first() + .waitFor({ + state: "visible", + timeout: 15000, + }); + + // Additional wait to ensure the changes are persisted + await page.waitForTimeout(500); }; From 812d72c5bb40965106c7f4c90bb2fd8204b6e8a0 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Tue, 29 Jul 2025 15:24:11 +0100 Subject: [PATCH 012/260] fix: sanitize app status summary (#19075) Fixes https://github.com/coder/coder/issues/18875 --- coderd/util/strings/strings.go | 40 +++++++++++++++++++++++++++++ coderd/util/strings/strings_test.go | 39 ++++++++++++++++++++++++++++ coderd/workspaceagents.go | 6 ++++- codersdk/toolsdk/toolsdk.go | 2 +- go.mod | 2 +- 5 files changed, 86 insertions(+), 3 deletions(-) diff --git a/coderd/util/strings/strings.go b/coderd/util/strings/strings.go index f416bba463bbf..49aad579e83f5 100644 --- a/coderd/util/strings/strings.go +++ b/coderd/util/strings/strings.go @@ -2,7 +2,12 @@ package strings import ( "fmt" + "strconv" "strings" + "unicode" + + "github.com/acarl005/stripansi" + "github.com/microcosm-cc/bluemonday" ) // JoinWithConjunction joins a slice of strings with commas except for the last @@ -28,3 +33,38 @@ func Truncate(s string, n int) string { } return s[:n] } + +var bmPolicy = bluemonday.StrictPolicy() + +// UISanitize sanitizes a string for display in the UI. +// The following transformations are applied, in order: +// - HTML tags are removed using bluemonday's strict policy. +// - ANSI escape codes are stripped using stripansi. +// - Consecutive backslashes are replaced with a single backslash. +// - Non-printable characters are removed. +// - Whitespace characters are replaced with spaces. +// - Multiple spaces are collapsed into a single space. +// - Leading and trailing whitespace is trimmed. +func UISanitize(in string) string { + if unq, err := strconv.Unquote(`"` + in + `"`); err == nil { + in = unq + } + in = bmPolicy.Sanitize(in) + in = stripansi.Strip(in) + var b strings.Builder + var spaceSeen bool + for _, r := range in { + if unicode.IsSpace(r) { + if !spaceSeen { + _, _ = b.WriteRune(' ') + spaceSeen = true + } + continue + } + spaceSeen = false + if unicode.IsPrint(r) { + _, _ = b.WriteRune(r) + } + } + return strings.TrimSpace(b.String()) +} diff --git a/coderd/util/strings/strings_test.go b/coderd/util/strings/strings_test.go index 5172fb08e1e69..7a20a06a25f28 100644 --- a/coderd/util/strings/strings_test.go +++ b/coderd/util/strings/strings_test.go @@ -3,6 +3,7 @@ package strings_test import ( "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/coder/coder/v2/coderd/util/strings" @@ -37,3 +38,41 @@ func TestTruncate(t *testing.T) { }) } } + +func TestUISanitize(t *testing.T) { + t.Parallel() + + for _, tt := range []struct { + s string + expected string + }{ + {"normal text", "normal text"}, + {"\tfoo \r\\nbar ", "foo bar"}, + {"通常のテキスト", "通常のテキスト"}, + {"foo\nbar", "foo bar"}, + {"foo\tbar", "foo bar"}, + {"foo\rbar", "foo bar"}, + {"foo\x00bar", "foobar"}, + {"\u202Eabc", "abc"}, + {"\u200Bzero width", "zero width"}, + {"foo\x1b[31mred\x1b[0mbar", "fooredbar"}, + {"foo\u0008bar", "foobar"}, + {"foo\x07bar", "foobar"}, + {"foo\uFEFFbar", "foobar"}, + {"link", "link"}, + {"", ""}, + {"HTML", "HTML"}, + {"
line break", "line break"}, + {"", ""}, + {"", ""}, + {"visible", "visible"}, + {"", ""}, + {"", ""}, + } { + t.Run(tt.expected, func(t *testing.T) { + t.Parallel() + actual := strings.UISanitize(tt.s) + assert.Equal(t, tt.expected, actual) + }) + } +} diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index 3ae57d8394d43..d600eff6ecfec 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -41,6 +41,7 @@ import ( "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/telemetry" maputil "github.com/coder/coder/v2/coderd/util/maps" + strutil "github.com/coder/coder/v2/coderd/util/strings" "github.com/coder/coder/v2/coderd/wspubsub" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/codersdk/agentsdk" @@ -383,6 +384,9 @@ func (api *API) patchWorkspaceAgentAppStatus(rw http.ResponseWriter, r *http.Req return } + // Treat the message as untrusted input. + cleaned := strutil.UISanitize(req.Message) + // nolint:gocritic // This is a system restricted operation. _, err = api.Database.InsertWorkspaceAppStatus(dbauthz.AsSystemRestricted(ctx), database.InsertWorkspaceAppStatusParams{ ID: uuid.New(), @@ -391,7 +395,7 @@ func (api *API) patchWorkspaceAgentAppStatus(rw http.ResponseWriter, r *http.Req AgentID: workspaceAgent.ID, AppID: app.ID, State: database.WorkspaceAppStatusState(req.State), - Message: req.Message, + Message: cleaned, Uri: sql.NullString{ String: req.URI, Valid: req.URI != "", diff --git a/codersdk/toolsdk/toolsdk.go b/codersdk/toolsdk/toolsdk.go index 862d0c34a5316..c6c37821e5234 100644 --- a/codersdk/toolsdk/toolsdk.go +++ b/codersdk/toolsdk/toolsdk.go @@ -229,7 +229,7 @@ ONLY report an "idle" or "failure" state if you have FULLY completed the task. Properties: map[string]any{ "summary": map[string]any{ "type": "string", - "description": "A concise summary of your current progress on the task. This must be less than 160 characters in length.", + "description": "A concise summary of your current progress on the task. This must be less than 160 characters in length and must not include newlines or other control characters.", }, "link": map[string]any{ "type": "string", diff --git a/go.mod b/go.mod index 8e48f67f65885..fcd76e07987e2 100644 --- a/go.mod +++ b/go.mod @@ -365,7 +365,7 @@ require ( github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/sdnotify v1.0.0 // indirect github.com/mdlayher/socket v0.5.0 // indirect - github.com/microcosm-cc/bluemonday v1.0.27 // indirect + github.com/microcosm-cc/bluemonday v1.0.27 github.com/miekg/dns v1.1.57 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect From 0ef7720f8c7d828563fc93295783f1b498bd180a Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Tue, 29 Jul 2025 20:19:17 +0530 Subject: [PATCH 013/260] feat: add tmux and gemini icons (#19031) Related PRs: #246 #229 --------- Co-authored-by: DevCats --- site/src/theme/icons.json | 2 ++ site/static/icon/gemini.svg | 1 + site/static/icon/tmux.svg | 1 + 3 files changed, 4 insertions(+) create mode 100644 site/static/icon/gemini.svg create mode 100644 site/static/icon/tmux.svg diff --git a/site/src/theme/icons.json b/site/src/theme/icons.json index ec79f1193040e..c3f6b1aac6b36 100644 --- a/site/src/theme/icons.json +++ b/site/src/theme/icons.json @@ -48,6 +48,7 @@ "folder.svg", "gateway.svg", "gcp.png", + "gemini.svg", "git.svg", "gitea.svg", "github.svg", @@ -104,6 +105,7 @@ "tensorflow.svg", "terminal.svg", "theia.svg", + "tmux.svg", "typescript.svg", "ubuntu.svg", "vault.svg", diff --git a/site/static/icon/gemini.svg b/site/static/icon/gemini.svg new file mode 100644 index 0000000000000..f1cf357573df0 --- /dev/null +++ b/site/static/icon/gemini.svg @@ -0,0 +1 @@ +Gemini \ No newline at end of file diff --git a/site/static/icon/tmux.svg b/site/static/icon/tmux.svg new file mode 100644 index 0000000000000..ac0174ed0784a --- /dev/null +++ b/site/static/icon/tmux.svg @@ -0,0 +1 @@ + \ No newline at end of file From 415273f648976dedbbcbe9d37875fd1172854d5f Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Wed, 30 Jul 2025 01:22:16 +1000 Subject: [PATCH 014/260] ci: sign macos slim binaries on dogfood builds (#19077) This will be necessary for future versions of Coder Desktop to connect to dogfood. --- .github/workflows/ci.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4ed72569402da..06efc8d5afd64 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1060,6 +1060,27 @@ jobs: - name: Setup Go uses: ./.github/actions/setup-go + - name: Install rcodesign + run: | + set -euo pipefail + wget -O /tmp/rcodesign.tar.gz https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz + sudo tar -xzf /tmp/rcodesign.tar.gz \ + -C /usr/bin \ + --strip-components=1 \ + apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign + rm /tmp/rcodesign.tar.gz + + - name: Setup Apple Developer certificate + run: | + set -euo pipefail + touch /tmp/{apple_cert.p12,apple_cert_password.txt} + chmod 600 /tmp/{apple_cert.p12,apple_cert_password.txt} + echo "$AC_CERTIFICATE_P12_BASE64" | base64 -d > /tmp/apple_cert.p12 + echo "$AC_CERTIFICATE_PASSWORD" > /tmp/apple_cert_password.txt + env: + AC_CERTIFICATE_P12_BASE64: ${{ secrets.AC_CERTIFICATE_P12_BASE64 }} + AC_CERTIFICATE_PASSWORD: ${{ secrets.AC_CERTIFICATE_PASSWORD }} + # Necessary for signing Windows binaries. - name: Setup Java uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 @@ -1138,6 +1159,9 @@ jobs: CODER_WINDOWS_RESOURCES: "1" CODER_SIGN_GPG: "1" CODER_GPG_RELEASE_KEY_BASE64: ${{ secrets.GPG_RELEASE_KEY_BASE64 }} + CODER_SIGN_DARWIN: "1" + AC_CERTIFICATE_FILE: /tmp/apple_cert.p12 + AC_CERTIFICATE_PASSWORD_FILE: /tmp/apple_cert_password.txt EV_KEY: ${{ secrets.EV_KEY }} EV_KEYSTORE: ${{ secrets.EV_KEYSTORE }} EV_TSA_URL: ${{ secrets.EV_TSA_URL }} From 4e7331a9c46b2a518166f5538eac893426ac2a16 Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Tue, 29 Jul 2025 16:59:26 +0100 Subject: [PATCH 015/260] feat(cli): support description in create and presets list CLI commands (#19079) ## Description This PR improves the `coder templates presets` and `coder create` CLI commands to include preset descriptions. ## Changes * Added a `description` column to the `coder templates presets list` CLI command. * Fixed the `-o json` output for `coder templates presets list` to correctly include and format data. * Updated the `coder create` CLI command to display the preset's description in the selection menu. Follow-up from: * https://github.com/coder/coder/pull/18910 * https://github.com/coder/coder/pull/18912 * https://github.com/coder/coder/pull/18977 --- cli/create.go | 7 +- cli/create_test.go | 3 +- cli/templatepresets.go | 29 ++++--- cli/templatepresets_test.go | 79 +++++++++++++++++-- ...coder_templates_presets_list_--help.golden | 2 +- docs/reference/cli/templates_presets_list.md | 8 +- 6 files changed, 105 insertions(+), 23 deletions(-) diff --git a/cli/create.go b/cli/create.go index 4e0e47b43eaa4..3f52e59e8ad90 100644 --- a/cli/create.go +++ b/cli/create.go @@ -472,7 +472,12 @@ func promptPresetSelection(inv *serpent.Invocation, presets []codersdk.Preset) ( var presetOptions []string for _, preset := range presets { - option := preset.Name + var option string + if preset.Description == "" { + option = preset.Name + } else { + option = fmt.Sprintf("%s: %s", preset.Name, preset.Description) + } presetOptions = append(presetOptions, option) presetMap[option] = &preset } diff --git a/cli/create_test.go b/cli/create_test.go index 9db2e328c6ce9..dd26e450d3916 100644 --- a/cli/create_test.go +++ b/cli/create_test.go @@ -882,7 +882,8 @@ func TestCreateWithPreset(t *testing.T) { // Given: a template and a template version with two presets preset := proto.Preset{ - Name: "preset-test", + Name: "preset-test", + Description: "Preset Test.", Parameters: []*proto.PresetParameter{ {Name: firstParameterName, Value: secondOptionalParameterValue}, {Name: thirdParameterName, Value: thirdParameterValue}, diff --git a/cli/templatepresets.go b/cli/templatepresets.go index ab0d49725b99a..240abec313a16 100644 --- a/cli/templatepresets.go +++ b/cli/templatepresets.go @@ -41,12 +41,13 @@ func (r *RootCmd) templatePresets() *serpent.Command { func (r *RootCmd) templatePresetsList() *serpent.Command { defaultColumns := []string{ "name", + "description", "parameters", "default", "desired prebuild instances", } formatter := cliui.NewOutputFormatter( - cliui.TableFormat([]templatePresetRow{}, defaultColumns), + cliui.TableFormat([]TemplatePresetRow{}, defaultColumns), cliui.JSONFormat(), ) client := new(codersdk.Client) @@ -108,10 +109,13 @@ func (r *RootCmd) templatePresetsList() *serpent.Command { return nil } - cliui.Infof( - inv.Stdout, - "Showing presets for template %q and template version %q.\n", template.Name, version.Name, - ) + // Only display info message for table output + if formatter.FormatID() == "table" { + cliui.Infof( + inv.Stdout, + "Showing presets for template %q and template version %q.\n", template.Name, version.Name, + ) + } rows := templatePresetsToRows(presets...) out, err := formatter.Format(inv.Context(), rows) if err != nil { @@ -128,12 +132,13 @@ func (r *RootCmd) templatePresetsList() *serpent.Command { return cmd } -type templatePresetRow struct { - // For json format: +type TemplatePresetRow struct { + // For json format TemplatePreset codersdk.Preset `table:"-"` // For table format: Name string `json:"-" table:"name,default_sort"` + Description string `json:"-" table:"description"` Parameters string `json:"-" table:"parameters"` Default bool `json:"-" table:"default"` DesiredPrebuildInstances string `json:"-" table:"desired prebuild instances"` @@ -149,15 +154,19 @@ func formatPresetParameters(params []codersdk.PresetParameter) string { // templatePresetsToRows converts a list of presets to a list of rows // for outputting. -func templatePresetsToRows(presets ...codersdk.Preset) []templatePresetRow { - rows := make([]templatePresetRow, len(presets)) +func templatePresetsToRows(presets ...codersdk.Preset) []TemplatePresetRow { + rows := make([]TemplatePresetRow, len(presets)) for i, preset := range presets { prebuildInstances := "-" if preset.DesiredPrebuildInstances != nil { prebuildInstances = strconv.Itoa(*preset.DesiredPrebuildInstances) } - rows[i] = templatePresetRow{ + rows[i] = TemplatePresetRow{ + // For json format + TemplatePreset: preset, + // For table format Name: preset.Name, + Description: preset.Description, Parameters: formatPresetParameters(preset.Parameters), Default: preset.Default, DesiredPrebuildInstances: prebuildInstances, diff --git a/cli/templatepresets_test.go b/cli/templatepresets_test.go index 47d34af2dcf2d..3a8c8c39f0211 100644 --- a/cli/templatepresets_test.go +++ b/cli/templatepresets_test.go @@ -1,11 +1,14 @@ package cli_test import ( + "bytes" + "encoding/json" "fmt" "testing" "github.com/stretchr/testify/require" + "github.com/coder/coder/v2/cli" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" @@ -84,8 +87,9 @@ func TestTemplatePresets(t *testing.T) { }, }, { - Name: "preset-prebuilds", - Parameters: []*proto.PresetParameter{}, + Name: "preset-prebuilds", + Description: "Preset without parameters and 2 prebuild instances.", + Parameters: []*proto.PresetParameter{}, Prebuild: &proto.Prebuild{ Instances: 2, }, @@ -117,7 +121,7 @@ func TestTemplatePresets(t *testing.T) { pty.ExpectRegexMatch(`preset-default\s+k1=v2\s+true\s+0`) // The parameter order is not guaranteed in the output, so we match both possible orders pty.ExpectRegexMatch(`preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`) - pty.ExpectRegexMatch(`preset-prebuilds\s+\s+false\s+2`) + pty.ExpectRegexMatch(`preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`) }) t.Run("ListsPresetsForSpecifiedTemplateVersion", func(t *testing.T) { @@ -158,8 +162,9 @@ func TestTemplatePresets(t *testing.T) { }, }, { - Name: "preset-prebuilds", - Parameters: []*proto.PresetParameter{}, + Name: "preset-prebuilds", + Description: "Preset without parameters and 2 prebuild instances.", + Parameters: []*proto.PresetParameter{}, Prebuild: &proto.Prebuild{ Instances: 2, }, @@ -208,7 +213,69 @@ func TestTemplatePresets(t *testing.T) { pty.ExpectRegexMatch(`preset-default\s+k1=v2\s+true\s+0`) // The parameter order is not guaranteed in the output, so we match both possible orders pty.ExpectRegexMatch(`preset-multiple-params\s+(k1=v1,k2=v2)|(k2=v2,k1=v1)\s+false\s+-`) - pty.ExpectRegexMatch(`preset-prebuilds\s+\s+false\s+2`) + pty.ExpectRegexMatch(`preset-prebuilds\s+Preset without parameters and 2 prebuild instances.\s+\s+false\s+2`) + }) + + t.Run("ListsPresetsJSON", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + owner := coderdtest.CreateFirstUser(t, client) + member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + + // Given: an active template version that includes presets + preset := proto.Preset{ + Name: "preset-default", + Description: "Preset with parameters and 2 prebuild instances.", + Icon: "/emojis/1f60e.png", + Default: true, + Parameters: []*proto.PresetParameter{ + { + Name: "k1", + Value: "v2", + }, + }, + Prebuild: &proto.Prebuild{ + Instances: 2, + }, + } + + version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, templateWithPresets([]*proto.Preset{&preset})) + _ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) + require.Equal(t, version.ID, template.ActiveVersionID) + + // When: listing presets for that template + inv, root := clitest.New(t, "templates", "presets", "list", template.Name, "-o", "json") + clitest.SetupConfig(t, member, root) + + buf := bytes.NewBuffer(nil) + inv.Stdout = buf + doneChan := make(chan struct{}) + var runErr error + go func() { + defer close(doneChan) + runErr = inv.Run() + }() + + <-doneChan + require.NoError(t, runErr) + + // Should: return the active version's preset + var jsonPresets []cli.TemplatePresetRow + err := json.Unmarshal(buf.Bytes(), &jsonPresets) + require.NoError(t, err, "unmarshal JSON output") + require.Len(t, jsonPresets, 1) + + jsonPreset := jsonPresets[0].TemplatePreset + require.Equal(t, preset.Name, jsonPreset.Name) + require.Equal(t, preset.Description, jsonPreset.Description) + require.Equal(t, preset.Icon, jsonPreset.Icon) + require.Equal(t, preset.Default, jsonPreset.Default) + require.Equal(t, len(preset.Parameters), len(jsonPreset.Parameters)) + require.Equal(t, preset.Parameters[0].Name, jsonPreset.Parameters[0].Name) + require.Equal(t, preset.Parameters[0].Value, jsonPreset.Parameters[0].Value) + require.Equal(t, int(preset.Prebuild.Instances), *jsonPreset.DesiredPrebuildInstances) }) } diff --git a/cli/testdata/coder_templates_presets_list_--help.golden b/cli/testdata/coder_templates_presets_list_--help.golden index 81445df03cc97..e64ef1ee36e96 100644 --- a/cli/testdata/coder_templates_presets_list_--help.golden +++ b/cli/testdata/coder_templates_presets_list_--help.golden @@ -10,7 +10,7 @@ OPTIONS: -O, --org string, $CODER_ORGANIZATION Select which organization (uuid or name) to use. - -c, --column [name|parameters|default|desired prebuild instances] (default: name,parameters,default,desired prebuild instances) + -c, --column [name|description|parameters|default|desired prebuild instances] (default: name,description,parameters,default,desired prebuild instances) Columns to display in table output. -o, --output table|json (default: table) diff --git a/docs/reference/cli/templates_presets_list.md b/docs/reference/cli/templates_presets_list.md index 69dd12faadc7b..5c2d26859f018 100644 --- a/docs/reference/cli/templates_presets_list.md +++ b/docs/reference/cli/templates_presets_list.md @@ -30,10 +30,10 @@ Select which organization (uuid or name) to use. ### -c, --column -| | | -|---------|----------------------------------------------------------------------| -| Type | [name\|parameters\|default\|desired prebuild instances] | -| Default | name,parameters,default,desired prebuild instances | +| | | +|---------|-----------------------------------------------------------------------------------| +| Type | [name\|description\|parameters\|default\|desired prebuild instances] | +| Default | name,description,parameters,default,desired prebuild instances | Columns to display in table output. From 6147da58ddc40bcdffbd1e84ec052bda056578af Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Wed, 30 Jul 2025 02:03:20 +1000 Subject: [PATCH 016/260] chore: add `vpn-daemon run` command for macos (#19080) Continues to address https://github.com/coder/coder-desktop-macos/issues/201 Identical to the windows command, except we don't write to stdio. We're retaining the system we have for logging on macOS, where we push logs over the tunnel and use the OS logger. I've tested that a build with this command works end-to-end with my new version of Coder Desktop macOS. Also brings in the soft net isolation changes from `main` of coder/tailscale. --- cli/vpndaemon_darwin.go | 73 +++++++++++++++++++++++++++++++++++++++++ cli/vpndaemon_other.go | 2 +- go.mod | 2 +- go.sum | 4 +-- 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 cli/vpndaemon_darwin.go diff --git a/cli/vpndaemon_darwin.go b/cli/vpndaemon_darwin.go new file mode 100644 index 0000000000000..a1b836dd6b0c3 --- /dev/null +++ b/cli/vpndaemon_darwin.go @@ -0,0 +1,73 @@ +//go:build darwin + +package cli + +import ( + "golang.org/x/xerrors" + + "cdr.dev/slog" + "github.com/coder/coder/v2/vpn" + "github.com/coder/serpent" +) + +func (r *RootCmd) vpnDaemonRun() *serpent.Command { + var ( + rpcReadFD int64 + rpcWriteFD int64 + ) + + cmd := &serpent.Command{ + Use: "run", + Short: "Run the VPN daemon on macOS.", + Middleware: serpent.Chain( + serpent.RequireNArgs(0), + ), + Options: serpent.OptionSet{ + { + Flag: "rpc-read-fd", + Env: "CODER_VPN_DAEMON_RPC_READ_FD", + Description: "The file descriptor for the pipe to read from the RPC connection.", + Value: serpent.Int64Of(&rpcReadFD), + Required: true, + }, + { + Flag: "rpc-write-fd", + Env: "CODER_VPN_DAEMON_RPC_WRITE_FD", + Description: "The file descriptor for the pipe to write to the RPC connection.", + Value: serpent.Int64Of(&rpcWriteFD), + Required: true, + }, + }, + Handler: func(inv *serpent.Invocation) error { + ctx := inv.Context() + + if rpcReadFD < 0 || rpcWriteFD < 0 { + return xerrors.Errorf("rpc-read-fd (%v) and rpc-write-fd (%v) must be positive", rpcReadFD, rpcWriteFD) + } + if rpcReadFD == rpcWriteFD { + return xerrors.Errorf("rpc-read-fd (%v) and rpc-write-fd (%v) must be different", rpcReadFD, rpcWriteFD) + } + + pipe, err := vpn.NewBidirectionalPipe(uintptr(rpcReadFD), uintptr(rpcWriteFD)) + if err != nil { + return xerrors.Errorf("create bidirectional RPC pipe: %w", err) + } + defer pipe.Close() + + tunnel, err := vpn.NewTunnel(ctx, slog.Make().Leveled(slog.LevelDebug), pipe, + vpn.NewClient(), + vpn.UseOSNetworkingStack(), + vpn.UseAsLogger(), + ) + if err != nil { + return xerrors.Errorf("create new tunnel for client: %w", err) + } + defer tunnel.Close() + + <-ctx.Done() + return nil + }, + } + + return cmd +} diff --git a/cli/vpndaemon_other.go b/cli/vpndaemon_other.go index 2e3e39b1b99ba..1526efb011889 100644 --- a/cli/vpndaemon_other.go +++ b/cli/vpndaemon_other.go @@ -1,4 +1,4 @@ -//go:build !windows +//go:build !windows && !darwin package cli diff --git a/go.mod b/go.mod index fcd76e07987e2..802b7aa1fda6a 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ replace github.com/tcnksm/go-httpstat => github.com/coder/go-httpstat v0.0.0-202 // There are a few minor changes we make to Tailscale that we're slowly upstreaming. Compare here: // https://github.com/tailscale/tailscale/compare/main...coder:tailscale:main -replace tailscale.com => github.com/coder/tailscale v1.1.1-0.20250724015444-494197765996 +replace tailscale.com => github.com/coder/tailscale v1.1.1-0.20250729141742-067f1e5d9716 // This is replaced to include // 1. a fix for a data race: c.f. https://github.com/tailscale/wireguard-go/pull/25 diff --git a/go.sum b/go.sum index 7371b07f7f973..812dc4fb08bc4 100644 --- a/go.sum +++ b/go.sum @@ -926,8 +926,8 @@ github.com/coder/serpent v0.10.0 h1:ofVk9FJXSek+SmL3yVE3GoArP83M+1tX+H7S4t8BSuM= github.com/coder/serpent v0.10.0/go.mod h1:cZFW6/fP+kE9nd/oRkEHJpG6sXCtQ+AX7WMMEHv0Y3Q= github.com/coder/ssh v0.0.0-20231128192721-70855dedb788 h1:YoUSJ19E8AtuUFVYBpXuOD6a/zVP3rcxezNsoDseTUw= github.com/coder/ssh v0.0.0-20231128192721-70855dedb788/go.mod h1:aGQbuCLyhRLMzZF067xc84Lh7JDs1FKwCmF1Crl9dxQ= -github.com/coder/tailscale v1.1.1-0.20250724015444-494197765996 h1:9x+ouDw9BKW1tdGzuQOWGMT2XkWLs+QQjeCrxYuU1lo= -github.com/coder/tailscale v1.1.1-0.20250724015444-494197765996/go.mod h1:l7ml5uu7lFh5hY28lGYM4b/oFSmuPHYX6uk4RAu23Lc= +github.com/coder/tailscale v1.1.1-0.20250729141742-067f1e5d9716 h1:hi7o0sA+RPBq8Rvvz+hNrC/OTL2897OKREMIRIuQeTs= +github.com/coder/tailscale v1.1.1-0.20250729141742-067f1e5d9716/go.mod h1:l7ml5uu7lFh5hY28lGYM4b/oFSmuPHYX6uk4RAu23Lc= github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e h1:JNLPDi2P73laR1oAclY6jWzAbucf70ASAvf5mh2cME0= github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e/go.mod h1:Gz/z9Hbn+4KSp8A2FBtNszfLSdT2Tn/uAKGuVqqWmDI= github.com/coder/terraform-provider-coder/v2 v2.9.0 h1:nd9d1/qHTdx5foBLZoy0SWCc0W13GQUbPTzeGsuLlU0= From 219d1b4101090bdb60f4cc593bd60adacf63fd88 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Tue, 29 Jul 2025 17:06:17 +0100 Subject: [PATCH 017/260] chore(agent/agentcontainers): skip part of test if on `darwin` (#19081) --- agent/agentcontainers/watcher/watcher_test.go | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/agent/agentcontainers/watcher/watcher_test.go b/agent/agentcontainers/watcher/watcher_test.go index 6cddfbdcee276..08222357d5fd0 100644 --- a/agent/agentcontainers/watcher/watcher_test.go +++ b/agent/agentcontainers/watcher/watcher_test.go @@ -4,6 +4,7 @@ import ( "context" "os" "path/filepath" + "runtime" "testing" "github.com/fsnotify/fsnotify" @@ -88,24 +89,34 @@ func TestFSNotifyWatcher(t *testing.T) { break } - err = os.WriteFile(testFile+".atomic", []byte(`{"test": "atomic"}`), 0o600) - require.NoError(t, err, "write new atomic test file failed") - - err = os.Rename(testFile+".atomic", testFile) - require.NoError(t, err, "rename atomic test file failed") - - // Verify that we receive the event we want. - for { - event, err := wut.Next(ctx) - require.NoError(t, err, "next event failed") - require.NotNil(t, event, "want non-nil event") - if !event.Has(fsnotify.Create) { - t.Logf("Ignoring event: %s", event) - continue + // TODO(DanielleMaywood): + // Unfortunately it appears this atomic-rename phase of the test is flakey on macOS. + // + // This test flake could be indicative of an issue that may present itself + // in a running environment. Fortunately, we only use this (as of 2025-07-29) + // for our dev container integration. We do not expect the host workspace + // (where this is used), to ever be run on macOS, as containers are a linux + // paradigm. + if runtime.GOOS != "darwin" { + err = os.WriteFile(testFile+".atomic", []byte(`{"test": "atomic"}`), 0o600) + require.NoError(t, err, "write new atomic test file failed") + + err = os.Rename(testFile+".atomic", testFile) + require.NoError(t, err, "rename atomic test file failed") + + // Verify that we receive the event we want. + for { + event, err := wut.Next(ctx) + require.NoError(t, err, "next event failed") + require.NotNil(t, event, "want non-nil event") + if !event.Has(fsnotify.Create) { + t.Logf("Ignoring event: %s", event) + continue + } + require.Truef(t, event.Has(fsnotify.Create), "want create event: %s", event.String()) + require.Equal(t, event.Name, testFile, "want event for test file") + break } - require.Truef(t, event.Has(fsnotify.Create), "want create event: %s", event.String()) - require.Equal(t, event.Name, testFile, "want event for test file") - break } // Test removing the file from the watcher. From 71738f6db985418a9a0295401d7a1425a76d41d6 Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Tue, 29 Jul 2025 17:45:32 +0100 Subject: [PATCH 018/260] feat(site): support icon and description in preset (#19063) ## Description This PR updates the `CreateWorkspacePageView` to use the `Combobox` React component instead of `SelectFilter` for the Preset selection. ## Changes * Updated `CreateWorkspacePageView` to use the `Combobox` component in place of `SelectFilter`. * Modified the `Combobox` component to render preset icons using `ExternalImage` instead of `Avatar`. Screenshot 2025-07-29 at 12 27 14 Screenshot 2025-07-29 at 12 27 21 Follow-up from: https://github.com/coder/coder/pull/18977 --------- Co-authored-by: Jaayden Halko --- .../components/Combobox/Combobox.stories.tsx | 9 ++- site/src/components/Combobox/Combobox.tsx | 39 ++++++------ .../CreateWorkspacePageView.stories.tsx | 59 ++++++++----------- .../CreateWorkspacePageView.tsx | 34 ++++++----- .../IdpOrgSyncPage/IdpOrgSyncPageView.tsx | 2 +- .../IdpSyncPage/IdpGroupSyncForm.tsx | 2 +- .../IdpSyncPage/IdpRoleSyncForm.tsx | 2 +- 7 files changed, 75 insertions(+), 72 deletions(-) diff --git a/site/src/components/Combobox/Combobox.stories.tsx b/site/src/components/Combobox/Combobox.stories.tsx index 2207f4e64686f..075a57261e536 100644 --- a/site/src/components/Combobox/Combobox.stories.tsx +++ b/site/src/components/Combobox/Combobox.stories.tsx @@ -103,7 +103,8 @@ export const SearchAndFilter: Story = { screen.queryByRole("option", { name: "Kotlin" }), ).not.toBeInTheDocument(); }); - await userEvent.click(screen.getByRole("option", { name: "Rust" })); + // Accessible name includes both image alt text and text content: "Rust Rust" + await userEvent.click(screen.getByRole("option", { name: "Rust Rust" })); }, }; @@ -137,9 +138,11 @@ export const ClearSelectedOption: Story = { await userEvent.click(canvas.getByRole("button")); // const goOption = screen.getByText("Go"); // First select an option - await userEvent.click(await screen.findByRole("option", { name: "Go" })); + // Accessible name includes both image alt text and text content: "Go Go" + await userEvent.click(await screen.findByRole("option", { name: "Go Go" })); // Then clear it by selecting it again - await userEvent.click(await screen.findByRole("option", { name: "Go" })); + // Accessible name includes both image alt text and text content: "Go Go" + await userEvent.click(await screen.findByRole("option", { name: "Go Go" })); await waitFor(() => expect(canvas.getByRole("button")).toHaveTextContent("Select option"), diff --git a/site/src/components/Combobox/Combobox.tsx b/site/src/components/Combobox/Combobox.tsx index e815ca601f0af..6ef29cade0390 100644 --- a/site/src/components/Combobox/Combobox.tsx +++ b/site/src/components/Combobox/Combobox.tsx @@ -1,4 +1,3 @@ -import { Avatar } from "components/Avatar/Avatar"; import { Button } from "components/Button/Button"; import { Command, @@ -23,6 +22,7 @@ import { Check, ChevronDown, CornerDownLeft } from "lucide-react"; import { Info } from "lucide-react"; import { type FC, type KeyboardEventHandler, useState } from "react"; import { cn } from "utils/cn"; +import { ExternalImage } from "../ExternalImage/ExternalImage"; interface ComboboxProps { value: string; @@ -69,19 +69,18 @@ export const Combobox: FC = ({ const isOpen = open ?? managedOpen; + const handleOpenChange = (newOpen: boolean) => { + setManagedOpen(newOpen); + onOpenChange?.(newOpen); + }; + return ( - { - setManagedOpen(newOpen); - onOpenChange?.(newOpen); - }} - > + - + = ({ keywords={[option.displayName]} onSelect={(currentValue) => { onSelect(currentValue === value ? "" : currentValue); + // Close the popover after selection + handleOpenChange(false); }} > - {showIcons && ( - - )} + {showIcons && + (option.icon ? ( + + ) : ( + /* Placeholder for missing icon to maintain layout consistency */ +
+ ))} {option.displayName}
{value === option.value && ( diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx index 4d0e3ff81c95f..44bc21951fcb9 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx @@ -1,5 +1,6 @@ import { action } from "@storybook/addon-actions"; import type { Meta, StoryObj } from "@storybook/react"; +import { expect, screen, waitFor } from "@storybook/test"; import { within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { chromatic } from "testHelpers/chromatic"; @@ -129,8 +130,8 @@ export const PresetsButNoneSelected: Story = { { ID: "preset-1", Name: "Preset 1", - Description: "", - Icon: "", + Description: "Preset 1 description", + Icon: "/emojis/0031-fe0f-20e3.png", Default: false, Parameters: [ { @@ -143,9 +144,8 @@ export const PresetsButNoneSelected: Story = { { ID: "preset-2", Name: "Preset 2", - Description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse imperdiet ultricies massa, eu dapibus ex fermentum ac.", - Icon: "/emojis/1f60e.png", + Description: "Preset 2 description", + Icon: "/emojis/0032-fe0f-20e3.png", Default: false, Parameters: [ { @@ -165,21 +165,12 @@ export const PresetsButNoneSelected: Story = { }; export const PresetSelected: Story = { - args: PresetsButNoneSelected.args, - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - await userEvent.click(canvas.getByLabelText("Preset")); - await userEvent.click(canvas.getByText("Preset 1")); - }, -}; - -export const PresetSelectedWithHiddenParameters: Story = { args: PresetsButNoneSelected.args, play: async ({ canvasElement }) => { const canvas = within(canvasElement); // Select a preset - await userEvent.click(canvas.getByLabelText("Preset")); - await userEvent.click(canvas.getByText("Preset 1")); + await userEvent.click(canvas.getByRole("button", { name: "None" })); + await userEvent.click(screen.getByText("Preset 1")); }, }; @@ -188,8 +179,8 @@ export const PresetSelectedWithVisibleParameters: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); // Select a preset - await userEvent.click(canvas.getByLabelText("Preset")); - await userEvent.click(canvas.getByText("Preset 1")); + await userEvent.click(canvas.getByRole("button", { name: "None" })); + await userEvent.click(screen.getByText("Preset 1")); // Toggle off the show preset parameters switch await userEvent.click(canvas.getByLabelText("Show preset parameters")); }, @@ -201,16 +192,12 @@ export const PresetReselected: Story = { const canvas = within(canvasElement); // First selection of Preset 1 - await userEvent.click(canvas.getByLabelText("Preset")); - await userEvent.click( - canvas.getByText("Preset 1", { selector: ".MuiMenuItem-root" }), - ); + await userEvent.click(canvas.getByRole("button", { name: "None" })); + await userEvent.click(screen.getByText("Preset 1")); // Reselect the same preset - await userEvent.click(canvas.getByLabelText("Preset")); - await userEvent.click( - canvas.getByText("Preset 1", { selector: ".MuiMenuItem-root" }), - ); + await userEvent.click(canvas.getByRole("button", { name: "Preset 1" })); + await userEvent.click(canvas.getByText("Preset 1")); }, }; @@ -230,12 +217,11 @@ export const PresetNoneSelected: Story = { const canvas = within(canvasElement); // First select a preset to set the field value - await userEvent.click(canvas.getByLabelText("Preset")); - await userEvent.click(canvas.getByText("Preset 1")); + await userEvent.click(canvas.getByRole("button", { name: "None" })); + await userEvent.click(screen.getByText("Preset 1")); // Then select "None" to unset the field value - await userEvent.click(canvas.getByLabelText("Preset")); - await userEvent.click(canvas.getByText("None")); + await userEvent.click(screen.getByText("None")); // Fill in required fields and submit to test the API call await userEvent.type( @@ -260,8 +246,8 @@ export const PresetsWithDefault: Story = { { ID: "preset-1", Name: "Preset 1", - Icon: "", - Description: "", + Description: "Preset 1 description", + Icon: "/emojis/0031-fe0f-20e3.png", Default: false, Parameters: [ { @@ -274,9 +260,8 @@ export const PresetsWithDefault: Story = { { ID: "preset-2", Name: "Preset 2", - Icon: "/emojis/1f60e.png", - Description: - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse imperdiet ultricies massa, eu dapibus ex fermentum ac.", + Description: "Preset 2 description", + Icon: "/emojis/0032-fe0f-20e3.png", Default: true, Parameters: [ { @@ -295,6 +280,10 @@ export const PresetsWithDefault: Story = { }, play: async ({ canvasElement }) => { const canvas = within(canvasElement); + // Should have the default preset listed first + await waitFor(() => + expect(canvas.getByRole("button", { name: "Preset 2 (Default)" })), + ); // Wait for the switch to be available since preset parameters are populated asynchronously await canvas.findByLabelText("Show preset parameters"); // Toggle off the show preset parameters switch diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index bc31e1db42742..8b5d4dabe675c 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -6,7 +6,7 @@ import { Alert } from "components/Alert/Alert"; import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Avatar } from "components/Avatar/Avatar"; import { Button } from "components/Button/Button"; -import { SelectFilter } from "components/Filter/SelectFilter"; +import { Combobox } from "components/Combobox/Combobox"; import { FormFields, FormFooter, @@ -158,16 +158,18 @@ export const CreateWorkspacePageView: FC = ({ ); const [presetOptions, setPresetOptions] = useState([ - { label: "None", value: "" }, + { displayName: "None", value: "undefined", icon: "", description: "" }, ]); const [selectedPresetIndex, setSelectedPresetIndex] = useState(0); // Build options and keep default label/value in sync useEffect(() => { const options = [ - { label: "None", value: "" }, - ...presets.map((p) => ({ - label: p.Default ? `${p.Name} (Default)` : p.Name, - value: p.ID, + { displayName: "None", value: "undefined", icon: "", description: "" }, + ...presets.map((preset) => ({ + displayName: preset.Default ? `${preset.Name} (Default)` : preset.Name, + value: preset.ID, + icon: preset.Icon, + description: preset.Description, })), ]; setPresetOptions(options); @@ -392,12 +394,15 @@ export const CreateWorkspacePageView: FC = ({ - { + placeholder="Select a preset" + onSelect={(value) => { const index = presetOptions.findIndex( - (preset) => preset.value === option?.value, + (preset) => preset.value === value, ); if (index === -1) { return; @@ -405,12 +410,13 @@ export const CreateWorkspacePageView: FC = ({ setSelectedPresetIndex(index); form.setFieldValue( "template_version_preset_id", - // Empty string is equivalent to using None - option?.value === "" ? undefined : option?.value, + // "undefined" string is equivalent to using None option + // Combobox requires a value in order to correctly highlight the None option + presetOptions[index].value === "undefined" + ? undefined + : presetOptions[index].value, ); }} - placeholder="Select a preset" - selectedOption={presetOptions[selectedPresetIndex]} /> {/* Only show the preset parameter visibility toggle if preset parameters are actually being modified, otherwise it has no effect. */} diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx index 3fb267fb9daac..1feb4a8707f9b 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.tsx @@ -215,7 +215,7 @@ export const IdpOrgSyncPageView: FC = ({ )}
-
+
diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx index 9282bd6bfd2b1..1be01567f6bb3 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpGroupSyncForm.tsx @@ -219,7 +219,7 @@ export const IdpGroupSyncForm: FC = ({
-
+
diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpRoleSyncForm.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpRoleSyncForm.tsx index 0825ab4217395..2efbf6f758393 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpRoleSyncForm.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpRoleSyncForm.tsx @@ -159,7 +159,7 @@ export const IdpRoleSyncForm: FC = ({

{form.errors.field}

)}
-
+
From 558e25d591a657473c3b49763ae8a087f601e8be Mon Sep 17 00:00:00 2001 From: Asher Date: Tue, 29 Jul 2025 09:27:11 -0800 Subject: [PATCH 019/260] feat: support shift+enter in terminal (#19021) It acts the same alt+enter, but is more familiar to users. Closes #18864 --- .../pages/TerminalPage/TerminalPage.test.tsx | 18 +++++++++++++++ site/src/pages/TerminalPage/TerminalPage.tsx | 22 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/site/src/pages/TerminalPage/TerminalPage.test.tsx b/site/src/pages/TerminalPage/TerminalPage.test.tsx index 4591190ad9904..7530a45914a85 100644 --- a/site/src/pages/TerminalPage/TerminalPage.test.tsx +++ b/site/src/pages/TerminalPage/TerminalPage.test.tsx @@ -1,5 +1,6 @@ import "jest-canvas-mock"; import { waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import { API } from "api/api"; import WS from "jest-websocket-mock"; import { http, HttpResponse } from "msw"; @@ -148,4 +149,21 @@ describe("TerminalPage", () => { ws.send(text); await expectTerminalText(container, text); }); + + it("supports shift+enter", async () => { + const ws = new WS( + `ws://localhost/api/v2/workspaceagents/${MockWorkspaceAgent.id}/pty`, + ); + + const { container } = await renderTerminal(); + // Ideally we could use ws.connected but that seems to pause React updates. + // For now, wait for the initial resize message instead. + await ws.nextMessage; + + const msg = ws.nextMessage; + const terminal = container.getElementsByClassName("xterm"); + await userEvent.type(terminal[0], "{Shift>}{Enter}{/Shift}"); + const req = JSON.parse(new TextDecoder().decode((await msg) as Uint8Array)); + expect(req.data).toBe("\x1b\r"); + }); }); diff --git a/site/src/pages/TerminalPage/TerminalPage.tsx b/site/src/pages/TerminalPage/TerminalPage.tsx index 5c13e89c30005..bde7517ef5d19 100644 --- a/site/src/pages/TerminalPage/TerminalPage.tsx +++ b/site/src/pages/TerminalPage/TerminalPage.tsx @@ -148,6 +148,25 @@ const TerminalPage: FC = () => { }), ); + // Make shift+enter send ^[^M (escaped carriage return). Applications + // typically take this to mean to insert a literal newline. There is no way + // to remove this handler, so we must attach it once and rely on a ref to + // send it to the current socket. + const escapedCarriageReturn = "\x1b\r"; + terminal.attachCustomKeyEventHandler((ev) => { + if (ev.shiftKey && ev.key === "Enter") { + if (ev.type === "keydown") { + websocketRef.current?.send( + new TextEncoder().encode( + JSON.stringify({ data: escapedCarriageReturn }), + ), + ); + } + return false; + } + return true; + }); + terminal.open(terminalWrapperRef.current); // We have to fit twice here. It's unknown why, but the first fit will @@ -190,6 +209,7 @@ const TerminalPage: FC = () => { }, [navigate, reconnectionToken, searchParams]); // Hook up the terminal through a web socket. + const websocketRef = useRef(); useEffect(() => { if (!terminal) { return; @@ -270,6 +290,7 @@ const TerminalPage: FC = () => { .withBackoff(new ExponentialBackoff(1000, 6)) .build(); websocket.binaryType = "arraybuffer"; + websocketRef.current = websocket; websocket.addEventListener(WebsocketEvent.open, () => { // Now that we are connected, allow user input. terminal.options = { @@ -333,6 +354,7 @@ const TerminalPage: FC = () => { d.dispose(); } websocket?.close(1000); + websocketRef.current = undefined; }; }, [ command, From 3a3972c44d0a079c0ebbcc30ba8a4a72f7e45a2d Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 29 Jul 2025 22:56:53 +0500 Subject: [PATCH 020/260] chore: add catalog-info.yaml for backstage integration (#19085) --- catalog-info.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 catalog-info.yaml diff --git a/catalog-info.yaml b/catalog-info.yaml new file mode 100644 index 0000000000000..91f59872a89ae --- /dev/null +++ b/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: coder + annotations: + github.com/project-slug: 'coder/coder' +spec: + type: service + lifecycle: production + owner: rd From 4bced62bf17c9081e8a9289405474861c4535ee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Tue, 29 Jul 2025 12:26:32 -0600 Subject: [PATCH 021/260] chore: add site/ CODEOWNERS (#19086) --- .gitattributes | 4 +++- CODEOWNERS | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 1da452829a70a..ed396ce0044eb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,6 +15,8 @@ provisionersdk/proto/*.go linguist-generated=true *.tfstate.json linguist-generated=true *.tfstate.dot linguist-generated=true *.tfplan.dot linguist-generated=true +site/e2e/google/protobuf/timestampGenerated.ts site/e2e/provisionerGenerated.ts linguist-generated=true +site/src/api/countriesGenerated.tsx linguist-generated=true +site/src/api/rbacresourcesGenerated.tsx linguist-generated=true site/src/api/typesGenerated.ts linguist-generated=true -site/src/pages/SetupPage/countries.tsx linguist-generated=true diff --git a/CODEOWNERS b/CODEOWNERS index 4152e5351a4fb..e571a160b12b7 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -17,3 +17,15 @@ coderd/rbac/ @Emyrk # Mainly dependent on coder/guts, which is maintained by @Emyrk scripts/apitypings/ @Emyrk +scripts/gensite/ @aslilac + +site/ @aslilac +site/src/hooks/ @Parkreiner +# These rules intentionally do not specify any owners. More specific rules +# override less specific rules, so these files are "ignored" by the site/ rule. +site/e2e/google/protobuf/timestampGenerated.ts +site/e2e/provisionerGenerated.ts +site/src/api/countriesGenerated.ts +site/src/api/rbacresourcesGenerated.ts +site/src/api/typesGenerated.ts +site/CLAUDE.md From 44d93569859fa9040bafe9583c1c12c6dfa7c84e Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Wed, 30 Jul 2025 09:54:43 +0100 Subject: [PATCH 022/260] fix(site): remove redundant alt text to prevent duplicated accessible names (#19087) ## Description Removes the redundant `alt` text in the `Combobox` component to prevent screen readers from announcing duplicated names (e.g. "Rust Rust"). ## Changes * Remove redundant `alt` text from `Combobox` `ExternalImage` * Update `Combobox` tests accordingly Related to: https://github.com/coder/coder/pull/19063#discussion_r2240459424 --- site/src/components/Combobox/Combobox.stories.tsx | 9 +++------ site/src/components/Combobox/Combobox.tsx | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/site/src/components/Combobox/Combobox.stories.tsx b/site/src/components/Combobox/Combobox.stories.tsx index 075a57261e536..2207f4e64686f 100644 --- a/site/src/components/Combobox/Combobox.stories.tsx +++ b/site/src/components/Combobox/Combobox.stories.tsx @@ -103,8 +103,7 @@ export const SearchAndFilter: Story = { screen.queryByRole("option", { name: "Kotlin" }), ).not.toBeInTheDocument(); }); - // Accessible name includes both image alt text and text content: "Rust Rust" - await userEvent.click(screen.getByRole("option", { name: "Rust Rust" })); + await userEvent.click(screen.getByRole("option", { name: "Rust" })); }, }; @@ -138,11 +137,9 @@ export const ClearSelectedOption: Story = { await userEvent.click(canvas.getByRole("button")); // const goOption = screen.getByText("Go"); // First select an option - // Accessible name includes both image alt text and text content: "Go Go" - await userEvent.click(await screen.findByRole("option", { name: "Go Go" })); + await userEvent.click(await screen.findByRole("option", { name: "Go" })); // Then clear it by selecting it again - // Accessible name includes both image alt text and text content: "Go Go" - await userEvent.click(await screen.findByRole("option", { name: "Go Go" })); + await userEvent.click(await screen.findByRole("option", { name: "Go" })); await waitFor(() => expect(canvas.getByRole("button")).toHaveTextContent("Select option"), diff --git a/site/src/components/Combobox/Combobox.tsx b/site/src/components/Combobox/Combobox.tsx index 6ef29cade0390..f2db25b1ef31c 100644 --- a/site/src/components/Combobox/Combobox.tsx +++ b/site/src/components/Combobox/Combobox.tsx @@ -124,7 +124,7 @@ export const Combobox: FC = ({ ) : ( /* Placeholder for missing icon to maintain layout consistency */ From 101351f50224f223b40d2100d106ab6a976404a2 Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Wed, 30 Jul 2025 11:00:33 +0100 Subject: [PATCH 023/260] chore: update dogfood coder template presets with description and icon (#19084) ## Description This PR updates the dogfood template presets to include a description and a icon. Requires [terraform-provider-coder v2.9.0](https://github.com/coder/terraform-provider-coder/releases/tag/v2.9.0). Related to: * https://github.com/coder/coder/pull/18977 * https://github.com/coder/coder/pull/19063 --- dogfood/coder/main.tf | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index b5c974efab1ad..3531257565f6b 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -2,7 +2,7 @@ terraform { required_providers { coder = { source = "coder/coder" - version = "~> 2.5" + version = "~> 2.9" } docker = { source = "kreuzwerker/docker" @@ -41,7 +41,9 @@ locals { } data "coder_workspace_preset" "cpt" { - name = "Cape Town" + name = "Cape Town" + description = "Development workspace hosted in South Africa with 1 prebuild instance" + icon = "/emojis/1f1ff-1f1e6.png" parameters = { (data.coder_parameter.region.name) = "za-cpt" (data.coder_parameter.image_type.name) = "codercom/oss-dogfood:latest" @@ -56,7 +58,9 @@ data "coder_workspace_preset" "cpt" { } data "coder_workspace_preset" "pittsburgh" { - name = "Pittsburgh" + name = "Pittsburgh" + description = "Development workspace hosted in United States with 2 prebuild instances" + icon = "/emojis/1f1fa-1f1f8.png" parameters = { (data.coder_parameter.region.name) = "us-pittsburgh" (data.coder_parameter.image_type.name) = "codercom/oss-dogfood:latest" @@ -71,7 +75,9 @@ data "coder_workspace_preset" "pittsburgh" { } data "coder_workspace_preset" "falkenstein" { - name = "Falkenstein" + name = "Falkenstein" + description = "Development workspace hosted in Europe with 1 prebuild instance" + icon = "/emojis/1f1ea-1f1fa.png" parameters = { (data.coder_parameter.region.name) = "eu-helsinki" (data.coder_parameter.image_type.name) = "codercom/oss-dogfood:latest" @@ -86,7 +92,9 @@ data "coder_workspace_preset" "falkenstein" { } data "coder_workspace_preset" "sydney" { - name = "Sydney" + name = "Sydney" + description = "Development workspace hosted in Australia with 1 prebuild instance" + icon = "/emojis/1f1e6-1f1fa.png" parameters = { (data.coder_parameter.region.name) = "ap-sydney" (data.coder_parameter.image_type.name) = "codercom/oss-dogfood:latest" @@ -101,7 +109,9 @@ data "coder_workspace_preset" "sydney" { } data "coder_workspace_preset" "saopaulo" { - name = "São Paulo" + name = "São Paulo" + description = "Development workspace hosted in Brazil with 1 prebuild instance" + icon = "/emojis/1f1e7-1f1f7.png" parameters = { (data.coder_parameter.region.name) = "sa-saopaulo" (data.coder_parameter.image_type.name) = "codercom/oss-dogfood:latest" From 26d232da6f23c37730fc06034680b52d13799b24 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Wed, 30 Jul 2025 11:18:12 +0100 Subject: [PATCH 024/260] fix(site): hide preset selector in TasksPage if no presets available (#19099) --- site/src/pages/TasksPage/TasksPage.tsx | 82 +++++++++++++------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/site/src/pages/TasksPage/TasksPage.tsx b/site/src/pages/TasksPage/TasksPage.tsx index 4866dbfb49222..68ec93e736fe7 100644 --- a/site/src/pages/TasksPage/TasksPage.tsx +++ b/site/src/pages/TasksPage/TasksPage.tsx @@ -386,55 +386,53 @@ const TaskForm: FC = ({ templates, onSuccess }) => {
-
- - {isLoadingPresets ? ( - - ) : ( - + setSelectedPresetId(value || null) + } + > + + + + + {sortedPresets(presetsData).map((preset) => ( {preset.Name} {preset.Default && "(Default)"} - )) - ) : ( - - - No presets available - - - )} - - - )} -
+ ))} + + +
+ ) + )}
From f256a23a773e235213f6fc53cf5dcf527c0601d8 Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Wed, 30 Jul 2025 15:28:56 +0200 Subject: [PATCH 025/260] feat: validate presets on template import (#18844) Typos and other errors often result in invalid presets in a template. Coder would import these broken templates and present them to users when they create workspaces. An unsuspecting user who chooses a broken preset would then experience a failed workspace build with no obvious error message. This PR adds additional validation beyond what is possible in the Terraform provider schema. Coder will now present a more helpful error message to template authors when they upload a new template version: Screenshot 2025-07-14 at 12 22 49 The frontend warning is less helpful right now, but I'd like to address that in a follow-up since I need frontend help: image closes https://github.com/coder/coder/issues/17333 ## Summary by CodeRabbit * **New Features** * Improved validation and error reporting for template presets, providing clearer feedback when presets cannot be parsed or reference undefined parameters. * **Bug Fixes** * Enhanced error handling during template version creation to better detect and report issues with presets. * **Tests** * Added new tests to verify validation of both valid and invalid Terraform presets during template version creation. * Improved test reliability by enabling dynamic control over error injection in database-related tests. * **Chores** * Updated a dependency to the latest version for improved stability and features. --- coderd/dynamicparameters/error.go | 8 ++ coderd/dynamicparameters/presets.go | 28 +++++++ coderd/dynamicparameters/tags.go | 4 + coderd/templateversions.go | 8 ++ coderd/templateversions_test.go | 113 ++++++++++++++++++++++++++++ 5 files changed, 161 insertions(+) create mode 100644 coderd/dynamicparameters/presets.go diff --git a/coderd/dynamicparameters/error.go b/coderd/dynamicparameters/error.go index 4c27905bfa832..ae2217936b9dd 100644 --- a/coderd/dynamicparameters/error.go +++ b/coderd/dynamicparameters/error.go @@ -26,6 +26,14 @@ func tagValidationError(diags hcl.Diagnostics) *DiagnosticError { } } +func presetValidationError(diags hcl.Diagnostics) *DiagnosticError { + return &DiagnosticError{ + Message: "Unable to validate presets", + Diagnostics: diags, + KeyedDiagnostics: make(map[string]hcl.Diagnostics), + } +} + type DiagnosticError struct { // Message is the human-readable message that will be returned to the user. Message string diff --git a/coderd/dynamicparameters/presets.go b/coderd/dynamicparameters/presets.go new file mode 100644 index 0000000000000..24974962e029f --- /dev/null +++ b/coderd/dynamicparameters/presets.go @@ -0,0 +1,28 @@ +package dynamicparameters + +import ( + "github.com/hashicorp/hcl/v2" + + "github.com/coder/preview" +) + +// CheckPresets extracts the preset related diagnostics from a template version preset +func CheckPresets(output *preview.Output, diags hcl.Diagnostics) *DiagnosticError { + de := presetValidationError(diags) + if output == nil { + return de + } + + presets := output.Presets + for _, preset := range presets { + if hcl.Diagnostics(preset.Diagnostics).HasErrors() { + de.Extend(preset.Name, hcl.Diagnostics(preset.Diagnostics)) + } + } + + if de.HasError() { + return de + } + + return nil +} diff --git a/coderd/dynamicparameters/tags.go b/coderd/dynamicparameters/tags.go index 38a9bf4691571..d9037db5dd909 100644 --- a/coderd/dynamicparameters/tags.go +++ b/coderd/dynamicparameters/tags.go @@ -11,6 +11,10 @@ import ( func CheckTags(output *preview.Output, diags hcl.Diagnostics) *DiagnosticError { de := tagValidationError(diags) + if output == nil { + return de + } + failedTags := output.WorkspaceTags.UnusableTags() if len(failedTags) == 0 && !de.HasError() { return nil // No errors, all is good! diff --git a/coderd/templateversions.go b/coderd/templateversions.go index cc106b390f73c..2a6e09d94978e 100644 --- a/coderd/templateversions.go +++ b/coderd/templateversions.go @@ -1822,6 +1822,14 @@ func (api *API) dynamicTemplateVersionTags(ctx context.Context, rw http.Response return nil, false } + // Fails early if presets are invalid to prevent downstream workspace creation errors + presetErr := dynamicparameters.CheckPresets(output, nil) + if presetErr != nil { + code, resp := presetErr.Response() + httpapi.Write(ctx, rw, code, resp) + return nil, false + } + return output.WorkspaceTags.Tags(), true } diff --git a/coderd/templateversions_test.go b/coderd/templateversions_test.go index 912bca1c5fec1..0b5bf6fcf2302 100644 --- a/coderd/templateversions_test.go +++ b/coderd/templateversions_test.go @@ -620,6 +620,119 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) { }) } }) + + t.Run("Presets", func(t *testing.T) { + t.Parallel() + store, ps := dbtestutil.NewDB(t) + client := coderdtest.New(t, &coderdtest.Options{ + Database: store, + Pubsub: ps, + }) + owner := coderdtest.CreateFirstUser(t, client) + templateAdmin, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) + + for _, tt := range []struct { + name string + files map[string]string + expectError string + }{ + { + name: "valid preset", + files: map[string]string{ + `main.tf`: ` + terraform { + required_providers { + coder = { + source = "coder/coder" + version = "2.8.0" + } + } + } + data "coder_parameter" "valid_parameter" { + name = "valid_parameter_name" + default = "valid_option_value" + option { + name = "valid_option_name" + value = "valid_option_value" + } + } + data "coder_workspace_preset" "valid_preset" { + name = "valid_preset" + parameters = { + "valid_parameter_name" = "valid_option_value" + } + } + `, + }, + }, + { + name: "invalid preset", + files: map[string]string{ + `main.tf`: ` + terraform { + required_providers { + coder = { + source = "coder/coder" + version = "2.8.0" + } + } + } + data "coder_parameter" "valid_parameter" { + name = "valid_parameter_name" + default = "valid_option_value" + option { + name = "valid_option_name" + value = "valid_option_value" + } + } + data "coder_workspace_preset" "invalid_parameter_name" { + name = "invalid_parameter_name" + parameters = { + "invalid_parameter_name" = "irrelevant_value" + } + } + `, + }, + expectError: "Undefined Parameter", + }, + } { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + ctx := testutil.Context(t, testutil.WaitShort) + + // Create an archive from the files provided in the test case. + tarFile := testutil.CreateTar(t, tt.files) + + // Post the archive file + fi, err := templateAdmin.Upload(ctx, "application/x-tar", bytes.NewReader(tarFile)) + require.NoError(t, err) + + // Create a template version from the archive + tvName := testutil.GetRandomNameHyphenated(t) + tv, err := templateAdmin.CreateTemplateVersion(ctx, owner.OrganizationID, codersdk.CreateTemplateVersionRequest{ + Name: tvName, + StorageMethod: codersdk.ProvisionerStorageMethodFile, + Provisioner: codersdk.ProvisionerTypeTerraform, + FileID: fi.ID, + }) + + if tt.expectError == "" { + require.NoError(t, err) + // Assert the expected provisioner job is created from the template version import + pj, err := store.GetProvisionerJobByID(ctx, tv.Job.ID) + require.NoError(t, err) + require.NotNil(t, pj) + // Also assert that we get the expected information back from the API endpoint + require.Zero(t, tv.MatchedProvisioners.Count) + require.Zero(t, tv.MatchedProvisioners.Available) + require.Zero(t, tv.MatchedProvisioners.MostRecentlySeen.Time) + } else { + require.ErrorContains(t, err, tt.expectError) + require.Equal(t, tv.Job.ID, uuid.Nil) + } + }) + } + }) } func TestPatchCancelTemplateVersion(t *testing.T) { From 428ec351fe8f959e9f9abb7a1d3b5c6070e65ac3 Mon Sep 17 00:00:00 2001 From: Edward Angert Date: Wed, 30 Jul 2025 12:35:27 -0400 Subject: [PATCH 026/260] docs: add code-server/vs code web comparison table (#19104) closes #18815 adds a doc with comparison table and links to main documentation for code-server [preview](https://coder.com/docs/@18815-code-server-vs/user-guides/workspace-access/code-server) --------- Co-authored-by: EdwardAngert <17991901+EdwardAngert@users.noreply.github.com> --- docs/manifest.json | 5 ++++ .../workspace-access/code-server.md | 29 +++++++++++++++++++ docs/user-guides/workspace-access/index.md | 9 +++--- docs/user-guides/workspace-access/vscode.md | 12 ++++---- 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 docs/user-guides/workspace-access/code-server.md diff --git a/docs/manifest.json b/docs/manifest.json index 0305105c029fd..04e10f4387949 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -251,6 +251,11 @@ "description": "Access your workspace with IDEs in the browser", "path": "./user-guides/workspace-access/web-ides.md" }, + { + "title": "code-server", + "description": "Access your workspace with code-server", + "path": "./user-guides/workspace-access/code-server.md" + }, { "title": "Zed", "description": "Access your workspace with Zed", diff --git a/docs/user-guides/workspace-access/code-server.md b/docs/user-guides/workspace-access/code-server.md new file mode 100644 index 0000000000000..baa36b010c0c0 --- /dev/null +++ b/docs/user-guides/workspace-access/code-server.md @@ -0,0 +1,29 @@ +# code-server + +[code-server](https://github.com/coder/code-server) is our supported method of running VS Code in the web browser. + +![code-server in a workspace](../../images/code-server-ide.png) + +## Differences between code-server and VS Code Web + +Some of the key differences between code-server and VS Code Web are: + +| Feature | code-server | VS Code Web | +|--------------------------|-----------------------------------------------------------------------------|-------------------------------------------------------------------| +| Authentication | Optional login form | No built-in auth | +| Built-in proxy | Includes development proxy (not needed with Coder) | No built-in development proxy | +| Clipboard integration | Supports piping text from terminal (similar to `xclip`) | More limited | +| Display languages | Supports language pack extensions | Limited language support | +| File operations | Options to disable downloads and uploads | No built-in restrictions | +| Health endpoint | Provides `/healthz` endpoint | Limited health monitoring | +| Marketplace | Open VSX by default, configurable via flags/env vars | Uses Microsoft marketplace; modify `product.json` to use your own | +| Path-based routing | Has fixes for state collisions when used path-based | May have issues with path-based routing in certain configurations | +| Proposed API | Always enabled for all extensions | Only Microsoft extensions without configuration | +| Proxy integration | Integrates with Coder's proxy for ports panel | Integration is more limited | +| Sourcemaps | Loads locally | Uses CDN | +| Telemetry | Configurable endpoint | Does not allow a configurable endpoint | +| Terminal access to files | You can use a terminal outside of the integrated one to interact with files | Limited to integrated terminal access | +| User settings | Stored on remote disk | Stored in browser | +| Web views | Self-contained | Uses Microsoft CDN | + +For more information about code-server, visit the [code-server FAQ](https://coder.com/docs/code-server/FAQ). diff --git a/docs/user-guides/workspace-access/index.md b/docs/user-guides/workspace-access/index.md index 1bf4d9d8c9927..266e76e94757f 100644 --- a/docs/user-guides/workspace-access/index.md +++ b/docs/user-guides/workspace-access/index.md @@ -78,12 +78,12 @@ Your workspace is now accessible via `ssh coder.` ## Visual Studio Code You can develop in your Coder workspace remotely with -[VSCode](https://code.visualstudio.com/download). We support connecting with the -desktop client and VSCode in the browser with [code-server](#code-server). +[VS Code](https://code.visualstudio.com/download). +We support connecting with the desktop client and VS Code in the browser with [code-server](#code-server). ![Demo](https://github.com/coder/vscode-coder/raw/main/demo.gif?raw=true) -Read more details on [using VSCode in your workspace](./vscode.md). +Read more details on [using VS Code in your workspace](./vscode.md). ## Cursor @@ -118,7 +118,8 @@ on connecting your JetBrains IDEs. ## code-server [code-server](https://github.com/coder/code-server) is our supported method of -running VS Code in the web browser. You can read more in our +running VS Code in the web browser. +Learn more about [what makes code-server different from VS Code web](./code-server.md) or visit the [documentation for code-server](https://coder.com/docs/code-server/latest). ![code-server in a workspace](../../images/code-server-ide.png) diff --git a/docs/user-guides/workspace-access/vscode.md b/docs/user-guides/workspace-access/vscode.md index cd67c2a775bbd..3f89ac8e258bb 100644 --- a/docs/user-guides/workspace-access/vscode.md +++ b/docs/user-guides/workspace-access/vscode.md @@ -1,13 +1,15 @@ # Visual Studio Code You can develop in your Coder workspace remotely with -[VSCode](https://code.visualstudio.com/download). We support connecting with the -desktop client and VSCode in the browser with +[VS Code](https://code.visualstudio.com/download). +We support connecting with the desktop client and VS Code in the browser with [code-server](https://github.com/coder/code-server). +Learn more about how VS Code Web and code-server compare in the +[code-server doc](./code-server.md). -## VSCode Desktop +## VS Code Desktop -VSCode desktop is a default app for workspaces. +VS Code desktop is a default app for workspaces. Click `VS Code Desktop` in the dashboard to one-click enter a workspace. This automatically installs the [Coder Remote](https://github.com/coder/vscode-coder) @@ -21,7 +23,7 @@ extension, authenticates with Coder, and connects to the workspace. ### Manual Installation -You can install our extension manually in VSCode using the command palette. +You can install our extension manually in VS Code using the command palette. Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter. From 998fbdfbb37828196bfa91a5f36e274582b7dd76 Mon Sep 17 00:00:00 2001 From: Edward Angert Date: Wed, 30 Jul 2025 12:35:45 -0400 Subject: [PATCH 027/260] docs: use CODER_LOG_FILTER instead of CODER_VERBOSE (#19105) closes #18833 replace suggestions to use the now-deprecated `CODER_VERBOSE` with more specific `CODER_LOG_FILTER` thanks @UnicornyRainbow! --------- Co-authored-by: EdwardAngert <17991901+EdwardAngert@users.noreply.github.com> --- docs/admin/monitoring/notifications/index.md | 2 +- docs/admin/users/idp-sync.md | 3 +-- docs/admin/users/oidc-auth/index.md | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/admin/monitoring/notifications/index.md b/docs/admin/monitoring/notifications/index.md index fc2bc41968d78..70279dcb16bf1 100644 --- a/docs/admin/monitoring/notifications/index.md +++ b/docs/admin/monitoring/notifications/index.md @@ -282,7 +282,7 @@ troubleshoot: 1. Review the logs. Search for the term `notifications` for diagnostic information. - If you do not see any relevant logs, set - `CODER_VERBOSE=true` or `--verbose` to output debug logs. + `CODER_LOG_FILTER=".*notifications.*"` to filter for notification-related logs. 1. If you are on version 2.15.x, notifications must be enabled using the `notifications` [experiment](../../../install/releases/feature-stages.md#early-access-features). diff --git a/docs/admin/users/idp-sync.md b/docs/admin/users/idp-sync.md index e893bf91bb8ef..3c7ec708be3f9 100644 --- a/docs/admin/users/idp-sync.md +++ b/docs/admin/users/idp-sync.md @@ -203,7 +203,7 @@ Visit the Coder UI to confirm these changes: ### Group allowlist You can limit which groups from your identity provider can log in to Coder with -[CODER_OIDC_ALLOWED_GROUPS](https://coder.com/docs/cli/server#--oidc-allowed-groups). +[CODER_OIDC_ALLOWED_GROUPS](../../reference/cli/server.md#--oidc-allowed-groups). Users who are not in a matching group will see the following error: Unauthorized group error @@ -419,7 +419,6 @@ If you are running into issues with a sync: 1. To reduce noise, you can filter for only logs related to group/role sync: ```sh - CODER_VERBOSE=true CODER_LOG_FILTER=".*userauth.*|.*groups returned.*" ``` diff --git a/docs/admin/users/oidc-auth/index.md b/docs/admin/users/oidc-auth/index.md index dd674d21606f5..ae225d66ca0be 100644 --- a/docs/admin/users/oidc-auth/index.md +++ b/docs/admin/users/oidc-auth/index.md @@ -27,7 +27,7 @@ claims from the ID token and the claims obtained from hitting the upstream provider's `userinfo` endpoint, and use the resulting data as a basis for creating a new user or looking up an existing user. -To troubleshoot claims, set `CODER_VERBOSE=true` and follow the logs while +To troubleshoot claims, set `CODER_LOG_FILTER=".*got oidc claims.*"` and follow the logs while signing in via OIDC as a new user. Coder will log the claim fields returned by the upstream identity provider in a message containing the string `got oidc claims`, as well as the user info returned. From 96e32d60a2ec90d6d96bf8e8f76b0dd33d719426 Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Wed, 30 Jul 2025 18:02:59 +0100 Subject: [PATCH 028/260] chore(site): add preset combobox to dynamic parameters page (#19100) ## Description This PR updates the `CreateWorkspacePageViewExperimental` page to use the `Combobox` React component for preset selection. This aligns it with the implementation used in the standard `CreateWorkspacePageView`, ensuring consistency in UI behavior and component usage across both pages. Screenshot 2025-07-30 at 13 58 23 Related to `CreateWorkspacePageView` changes: https://github.com/coder/coder/pull/19063 --- .../CreateWorkspacePageViewExperimental.tsx | 74 +++++++++---------- 1 file changed, 33 insertions(+), 41 deletions(-) diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index c478acd50ee14..b0298630776d2 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -5,16 +5,10 @@ import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Avatar } from "components/Avatar/Avatar"; import { Badge } from "components/Badge/Badge"; import { Button } from "components/Button/Button"; +import { Combobox } from "components/Combobox/Combobox"; import { Input } from "components/Input/Input"; import { Label } from "components/Label/Label"; import { Link } from "components/Link/Link"; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from "components/Select/Select"; import { Spinner } from "components/Spinner/Spinner"; import { Switch } from "components/Switch/Switch"; import { @@ -186,30 +180,31 @@ export const CreateWorkspacePageViewExperimental: FC< }, [form.submitCount, form.errors]); const [presetOptions, setPresetOptions] = useState([ - { label: "None", value: "None" }, + { displayName: "None", value: "undefined", icon: "", description: "" }, ]); + const [selectedPresetIndex, setSelectedPresetIndex] = useState(0); + // Build options and keep default label/value in sync useEffect(() => { - setPresetOptions([ - { label: "None", value: "None" }, + const options = [ + { displayName: "None", value: "undefined", icon: "", description: "" }, ...presets.map((preset) => ({ - label: preset.Default ? `${preset.Name} (Default)` : preset.Name, + displayName: preset.Default ? `${preset.Name} (Default)` : preset.Name, value: preset.ID, + icon: preset.Icon, + description: preset.Description, })), - ]); - }, [presets]); - - const [selectedPresetIndex, setSelectedPresetIndex] = useState(0); - - // Set default preset when presets are loaded - useEffect(() => { - const defaultPreset = presets.find((preset) => preset.Default); + ]; + setPresetOptions(options); + const defaultPreset = presets.find((p) => p.Default); if (defaultPreset) { - // +1 because "None" is at index 0 - const defaultIndex = - presets.findIndex((preset) => preset.ID === defaultPreset.ID) + 1; - setSelectedPresetIndex(defaultIndex); + const idx = presets.indexOf(defaultPreset) + 1; // +1 for "None" + setSelectedPresetIndex(idx); + form.setFieldValue("template_version_preset_id", defaultPreset.ID); + } else { + setSelectedPresetIndex(0); // Explicitly set to "None" + form.setFieldValue("template_version_preset_id", undefined); } - }, [presets]); + }, [presets, form.setFieldValue]); const [presetParameterNames, setPresetParameterNames] = useState( [], @@ -572,11 +567,15 @@ export const CreateWorkspacePageViewExperimental: FC<
- + />
{/* Only show the preset parameter visibility toggle if preset parameters are actually being modified, otherwise it is ineffectual */} {presetParameterNames.length > 0 && ( From ffbfaf2a6f3df72f51c2e417bb8c2bf2d745f7ea Mon Sep 17 00:00:00 2001 From: Callum Styan Date: Wed, 30 Jul 2025 13:42:39 -0700 Subject: [PATCH 029/260] feat: allow bypassing current CORS magic based on template config (#18706) Solves https://github.com/coder/coder/issues/15096 This is a slight rework/refactor of the earlier PRs from @dannykopping and @Emyrk: - https://github.com/coder/coder/pull/15669 - https://github.com/coder/coder/pull/15684 - https://github.com/coder/coder/pull/17596 Rather than having a per-app CORS behaviour setting and additionally a template level setting for ports, this PR adds a single template level CORS behaviour setting that is then used by all apps/ports for workspaces created from that template. The main changes are in `proxy.go` and `request.go` to: a) get the CORS behaviour setting from the template b) have `HandleSubdomain` bypass the CORS middleware handler if the selected behaviour is `passthru` c) in `proxyWorkspaceApp`, do not modify the response if the selected behaviour is `passthru` ## Summary by CodeRabbit * **New Features** * Added support for configuring CORS behavior ("simple" or "passthru") at the template level for all shared ports. * Introduced a new "CORS Behavior" setting in the template creation and settings forms. * API endpoints and responses now include the optional `cors_behavior` property for templates. * Workspace apps and proxy now honor the specified CORS behavior, enabling conditional CORS middleware application. * Enhanced workspace app tests with comprehensive scenarios covering CORS behaviors and authentication states. * **Bug Fixes** * None. * **Documentation** * Updated API and admin documentation to describe the new `cors_behavior` property and its usage. * Added examples and schema references for CORS behavior in relevant API docs. * **Tests** * Extended automated tests to cover different CORS behavior scenarios for templates and workspace apps. * **Chores** * Updated audit logging to track changes to the `cors_behavior` field on templates. --------- Signed-off-by: Callum Styan --- coderd/apidoc/docs.go | 22 + coderd/apidoc/swagger.json | 16 + coderd/database/dbauthz/dbauthz_test.go | 2 + coderd/database/dbgen/dbgen.go | 1 + coderd/database/dump.sql | 9 +- .../000353_template_level_cors.down.sql | 46 ++ .../000353_template_level_cors.up.sql | 52 ++ coderd/database/modelqueries.go | 1 + coderd/database/models.go | 62 +- coderd/database/queries.sql.go | 26 +- coderd/database/queries/templates.sql | 8 +- coderd/database/sqlc.yaml | 1 + .../prometheusmetrics_test.go | 2 + coderd/templates.go | 36 +- coderd/workspaceapps/apptest/apptest.go | 564 +++++++++++++++++- coderd/workspaceapps/apptest/setup.go | 127 +++- coderd/workspaceapps/cors/cors.go | 21 + coderd/workspaceapps/db.go | 1 + coderd/workspaceapps/db_test.go | 11 +- coderd/workspaceapps/proxy.go | 94 ++- coderd/workspaceapps/request.go | 11 + coderd/workspaceapps/token.go | 9 +- codersdk/cors_behavior.go | 8 + codersdk/organizations.go | 3 + codersdk/templates.go | 2 + docs/admin/security/audit-logs.md | 50 +- docs/reference/api/schemas.md | 19 + docs/reference/api/templates.md | 13 + enterprise/audit/table.go | 1 + enterprise/wsproxy/wsproxy.go | 2 +- .../templates/updateTemplateSchedule.spec.ts | 1 + site/src/api/typesGenerated.ts | 8 + site/src/pages/CreateTemplatePage/utils.ts | 1 + .../TemplateSettingsForm.tsx | 25 + .../TemplateSettingsPage.test.tsx | 1 + site/src/testHelpers/entities.ts | 1 + 36 files changed, 1149 insertions(+), 108 deletions(-) create mode 100644 coderd/database/migrations/000353_template_level_cors.down.sql create mode 100644 coderd/database/migrations/000353_template_level_cors.up.sql create mode 100644 coderd/workspaceapps/cors/cors.go create mode 100644 codersdk/cors_behavior.go diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index f0ea240042900..7c723994d38d2 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -11467,6 +11467,17 @@ const docTemplate = `{ "BuildReasonJetbrainsConnection" ] }, + "codersdk.CORSBehavior": { + "type": "string", + "enum": [ + "simple", + "passthru" + ], + "x-enum-varnames": [ + "CORSBehaviorSimple", + "CORSBehaviorPassthru" + ] + }, "codersdk.ChangePasswordWithOneTimePasscodeRequest": { "type": "object", "required": [ @@ -11808,6 +11819,14 @@ const docTemplate = `{ } ] }, + "cors_behavior": { + "description": "CORSBehavior allows optionally specifying the CORS behavior for all shared ports.", + "allOf": [ + { + "$ref": "#/definitions/codersdk.CORSBehavior" + } + ] + }, "default_ttl_ms": { "description": "DefaultTTLMillis allows optionally specifying the default TTL\nfor all workspaces created from this template.", "type": "integer" @@ -16215,6 +16234,9 @@ const docTemplate = `{ "build_time_stats": { "$ref": "#/definitions/codersdk.TemplateBuildTimeStats" }, + "cors_behavior": { + "$ref": "#/definitions/codersdk.CORSBehavior" + }, "created_at": { "type": "string", "format": "date-time" diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 38110555bf7cd..28a38ffd32d70 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -10202,6 +10202,11 @@ "BuildReasonJetbrainsConnection" ] }, + "codersdk.CORSBehavior": { + "type": "string", + "enum": ["simple", "passthru"], + "x-enum-varnames": ["CORSBehaviorSimple", "CORSBehaviorPassthru"] + }, "codersdk.ChangePasswordWithOneTimePasscodeRequest": { "type": "object", "required": ["email", "one_time_passcode", "password"], @@ -10525,6 +10530,14 @@ } ] }, + "cors_behavior": { + "description": "CORSBehavior allows optionally specifying the CORS behavior for all shared ports.", + "allOf": [ + { + "$ref": "#/definitions/codersdk.CORSBehavior" + } + ] + }, "default_ttl_ms": { "description": "DefaultTTLMillis allows optionally specifying the default TTL\nfor all workspaces created from this template.", "type": "integer" @@ -14774,6 +14787,9 @@ "build_time_stats": { "$ref": "#/definitions/codersdk.TemplateBuildTimeStats" }, + "cors_behavior": { + "$ref": "#/definitions/codersdk.CORSBehavior" + }, "created_at": { "type": "string", "format": "date-time" diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index bcf0caa95c365..dc86d598617fd 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -1462,6 +1462,7 @@ func (s *MethodTestSuite) TestTemplate() { Provisioner: "echo", OrganizationID: orgID, MaxPortSharingLevel: database.AppSharingLevelOwner, + CorsBehavior: database.CorsBehaviorSimple, }).Asserts(rbac.ResourceTemplate.InOrg(orgID), policy.ActionCreate) })) s.Run("InsertTemplateVersion", s.Subtest(func(db database.Store, check *expects) { @@ -1582,6 +1583,7 @@ func (s *MethodTestSuite) TestTemplate() { check.Args(database.UpdateTemplateMetaByIDParams{ ID: t1.ID, MaxPortSharingLevel: "owner", + CorsBehavior: database.CorsBehaviorSimple, }).Asserts(t1, policy.ActionUpdate) })) s.Run("UpdateTemplateVersionByID", s.Subtest(func(db database.Store, check *expects) { diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index 0ccefff2c42a9..71a86c329a5ad 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -148,6 +148,7 @@ func Template(t testing.TB, db database.Store, seed database.Template) database. AllowUserCancelWorkspaceJobs: seed.AllowUserCancelWorkspaceJobs, MaxPortSharingLevel: takeFirst(seed.MaxPortSharingLevel, database.AppSharingLevelOwner), UseClassicParameterFlow: takeFirst(seed.UseClassicParameterFlow, false), + CorsBehavior: takeFirst(seed.CorsBehavior, database.CorsBehaviorSimple), }) require.NoError(t, err, "insert template") diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 67d58ad05c802..49c12b123e998 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -73,6 +73,11 @@ CREATE TYPE connection_type AS ENUM ( 'port_forwarding' ); +CREATE TYPE cors_behavior AS ENUM ( + 'simple', + 'passthru' +); + CREATE TYPE crypto_key_feature AS ENUM ( 'workspace_apps_token', 'workspace_apps_api_key', @@ -1750,7 +1755,8 @@ CREATE TABLE templates ( deprecated text DEFAULT ''::text NOT NULL, activity_bump bigint DEFAULT '3600000000000'::bigint NOT NULL, max_port_sharing_level app_sharing_level DEFAULT 'owner'::app_sharing_level NOT NULL, - use_classic_parameter_flow boolean DEFAULT false NOT NULL + use_classic_parameter_flow boolean DEFAULT false NOT NULL, + cors_behavior cors_behavior DEFAULT 'simple'::cors_behavior NOT NULL ); COMMENT ON COLUMN templates.default_ttl IS 'The default duration for autostop for workspaces created from this template.'; @@ -1803,6 +1809,7 @@ CREATE VIEW template_with_names AS templates.activity_bump, templates.max_port_sharing_level, templates.use_classic_parameter_flow, + templates.cors_behavior, COALESCE(visible_users.avatar_url, ''::text) AS created_by_avatar_url, COALESCE(visible_users.username, ''::text) AS created_by_username, COALESCE(visible_users.name, ''::text) AS created_by_name, diff --git a/coderd/database/migrations/000353_template_level_cors.down.sql b/coderd/database/migrations/000353_template_level_cors.down.sql new file mode 100644 index 0000000000000..370e4bf36d9ed --- /dev/null +++ b/coderd/database/migrations/000353_template_level_cors.down.sql @@ -0,0 +1,46 @@ +DROP VIEW IF EXISTS template_with_names; +CREATE VIEW template_with_names AS + SELECT templates.id, + templates.created_at, + templates.updated_at, + templates.organization_id, + templates.deleted, + templates.name, + templates.provisioner, + templates.active_version_id, + templates.description, + templates.default_ttl, + templates.created_by, + templates.icon, + templates.user_acl, + templates.group_acl, + templates.display_name, + templates.allow_user_cancel_workspace_jobs, + templates.allow_user_autostart, + templates.allow_user_autostop, + templates.failure_ttl, + templates.time_til_dormant, + templates.time_til_dormant_autodelete, + templates.autostop_requirement_days_of_week, + templates.autostop_requirement_weeks, + templates.autostart_block_days_of_week, + templates.require_active_version, + templates.deprecated, + templates.activity_bump, + templates.max_port_sharing_level, + templates.use_classic_parameter_flow, + COALESCE(visible_users.avatar_url, ''::text) AS created_by_avatar_url, + COALESCE(visible_users.username, ''::text) AS created_by_username, + COALESCE(visible_users.name, ''::text) AS created_by_name, + COALESCE(organizations.name, ''::text) AS organization_name, + COALESCE(organizations.display_name, ''::text) AS organization_display_name, + COALESCE(organizations.icon, ''::text) AS organization_icon + FROM ((templates + LEFT JOIN visible_users ON ((templates.created_by = visible_users.id))) + LEFT JOIN organizations ON ((templates.organization_id = organizations.id))); + +COMMENT ON VIEW template_with_names IS 'Joins in the display name information such as username, avatar, and organization name.'; + +ALTER TABLE templates DROP COLUMN cors_behavior; + +DROP TYPE IF EXISTS cors_behavior; diff --git a/coderd/database/migrations/000353_template_level_cors.up.sql b/coderd/database/migrations/000353_template_level_cors.up.sql new file mode 100644 index 0000000000000..ddb5849fcb65a --- /dev/null +++ b/coderd/database/migrations/000353_template_level_cors.up.sql @@ -0,0 +1,52 @@ +CREATE TYPE cors_behavior AS ENUM ( + 'simple', + 'passthru' +); + +ALTER TABLE templates +ADD COLUMN cors_behavior cors_behavior NOT NULL DEFAULT 'simple'::cors_behavior; + +-- Update the template_with_users view by recreating it. +DROP VIEW IF EXISTS template_with_names; +CREATE VIEW template_with_names AS + SELECT templates.id, + templates.created_at, + templates.updated_at, + templates.organization_id, + templates.deleted, + templates.name, + templates.provisioner, + templates.active_version_id, + templates.description, + templates.default_ttl, + templates.created_by, + templates.icon, + templates.user_acl, + templates.group_acl, + templates.display_name, + templates.allow_user_cancel_workspace_jobs, + templates.allow_user_autostart, + templates.allow_user_autostop, + templates.failure_ttl, + templates.time_til_dormant, + templates.time_til_dormant_autodelete, + templates.autostop_requirement_days_of_week, + templates.autostop_requirement_weeks, + templates.autostart_block_days_of_week, + templates.require_active_version, + templates.deprecated, + templates.activity_bump, + templates.max_port_sharing_level, + templates.use_classic_parameter_flow, + templates.cors_behavior, -- <--- adding this column + COALESCE(visible_users.avatar_url, ''::text) AS created_by_avatar_url, + COALESCE(visible_users.username, ''::text) AS created_by_username, + COALESCE(visible_users.name, ''::text) AS created_by_name, + COALESCE(organizations.name, ''::text) AS organization_name, + COALESCE(organizations.display_name, ''::text) AS organization_display_name, + COALESCE(organizations.icon, ''::text) AS organization_icon + FROM ((templates + LEFT JOIN visible_users ON ((templates.created_by = visible_users.id))) + LEFT JOIN organizations ON ((templates.organization_id = organizations.id))); + +COMMENT ON VIEW template_with_names IS 'Joins in the display name information such as username, avatar, and organization name.'; diff --git a/coderd/database/modelqueries.go b/coderd/database/modelqueries.go index 6bb7483847a2e..fc7cda1a506e2 100644 --- a/coderd/database/modelqueries.go +++ b/coderd/database/modelqueries.go @@ -120,6 +120,7 @@ func (q *sqlQuerier) GetAuthorizedTemplates(ctx context.Context, arg GetTemplate &i.ActivityBump, &i.MaxPortSharingLevel, &i.UseClassicParameterFlow, + &i.CorsBehavior, &i.CreatedByAvatarURL, &i.CreatedByUsername, &i.CreatedByName, diff --git a/coderd/database/models.go b/coderd/database/models.go index 094bc98c68373..aad50e397950d 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -559,6 +559,64 @@ func AllConnectionTypeValues() []ConnectionType { } } +type CorsBehavior string + +const ( + CorsBehaviorSimple CorsBehavior = "simple" + CorsBehaviorPassthru CorsBehavior = "passthru" +) + +func (e *CorsBehavior) Scan(src interface{}) error { + switch s := src.(type) { + case []byte: + *e = CorsBehavior(s) + case string: + *e = CorsBehavior(s) + default: + return fmt.Errorf("unsupported scan type for CorsBehavior: %T", src) + } + return nil +} + +type NullCorsBehavior struct { + CorsBehavior CorsBehavior `json:"cors_behavior"` + Valid bool `json:"valid"` // Valid is true if CorsBehavior is not NULL +} + +// Scan implements the Scanner interface. +func (ns *NullCorsBehavior) Scan(value interface{}) error { + if value == nil { + ns.CorsBehavior, ns.Valid = "", false + return nil + } + ns.Valid = true + return ns.CorsBehavior.Scan(value) +} + +// Value implements the driver Valuer interface. +func (ns NullCorsBehavior) Value() (driver.Value, error) { + if !ns.Valid { + return nil, nil + } + return string(ns.CorsBehavior), nil +} + +func (e CorsBehavior) Valid() bool { + switch e { + case CorsBehaviorSimple, + CorsBehaviorPassthru: + return true + } + return false +} + +func AllCorsBehaviorValues() []CorsBehavior { + return []CorsBehavior{ + CorsBehaviorSimple, + CorsBehaviorPassthru, + } +} + type CryptoKeyFeature string const ( @@ -3474,6 +3532,7 @@ type Template struct { ActivityBump int64 `db:"activity_bump" json:"activity_bump"` MaxPortSharingLevel AppSharingLevel `db:"max_port_sharing_level" json:"max_port_sharing_level"` UseClassicParameterFlow bool `db:"use_classic_parameter_flow" json:"use_classic_parameter_flow"` + CorsBehavior CorsBehavior `db:"cors_behavior" json:"cors_behavior"` CreatedByAvatarURL string `db:"created_by_avatar_url" json:"created_by_avatar_url"` CreatedByUsername string `db:"created_by_username" json:"created_by_username"` CreatedByName string `db:"created_by_name" json:"created_by_name"` @@ -3521,7 +3580,8 @@ type TemplateTable struct { ActivityBump int64 `db:"activity_bump" json:"activity_bump"` MaxPortSharingLevel AppSharingLevel `db:"max_port_sharing_level" json:"max_port_sharing_level"` // Determines whether to default to the dynamic parameter creation flow for this template or continue using the legacy classic parameter creation flow.This is a template wide setting, the template admin can revert to the classic flow if there are any issues. An escape hatch is required, as workspace creation is a core workflow and cannot break. This column will be removed when the dynamic parameter creation flow is stable. - UseClassicParameterFlow bool `db:"use_classic_parameter_flow" json:"use_classic_parameter_flow"` + UseClassicParameterFlow bool `db:"use_classic_parameter_flow" json:"use_classic_parameter_flow"` + CorsBehavior CorsBehavior `db:"cors_behavior" json:"cors_behavior"` } // Records aggregated usage statistics for templates/users. All usage is rounded up to the nearest minute. diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 80357b3731874..0fff220bb2ba2 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -11768,7 +11768,7 @@ func (q *sqlQuerier) GetTemplateAverageBuildTime(ctx context.Context, arg GetTem const getTemplateByID = `-- name: GetTemplateByID :one SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, cors_behavior, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names WHERE @@ -11810,6 +11810,7 @@ func (q *sqlQuerier) GetTemplateByID(ctx context.Context, id uuid.UUID) (Templat &i.ActivityBump, &i.MaxPortSharingLevel, &i.UseClassicParameterFlow, + &i.CorsBehavior, &i.CreatedByAvatarURL, &i.CreatedByUsername, &i.CreatedByName, @@ -11822,7 +11823,7 @@ func (q *sqlQuerier) GetTemplateByID(ctx context.Context, id uuid.UUID) (Templat const getTemplateByOrganizationAndName = `-- name: GetTemplateByOrganizationAndName :one SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, cors_behavior, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names AS templates WHERE @@ -11872,6 +11873,7 @@ func (q *sqlQuerier) GetTemplateByOrganizationAndName(ctx context.Context, arg G &i.ActivityBump, &i.MaxPortSharingLevel, &i.UseClassicParameterFlow, + &i.CorsBehavior, &i.CreatedByAvatarURL, &i.CreatedByUsername, &i.CreatedByName, @@ -11883,7 +11885,7 @@ func (q *sqlQuerier) GetTemplateByOrganizationAndName(ctx context.Context, arg G } const getTemplates = `-- name: GetTemplates :many -SELECT id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names AS templates +SELECT id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, cors_behavior, created_by_avatar_url, created_by_username, created_by_name, organization_name, organization_display_name, organization_icon FROM template_with_names AS templates ORDER BY (name, id) ASC ` @@ -11926,6 +11928,7 @@ func (q *sqlQuerier) GetTemplates(ctx context.Context) ([]Template, error) { &i.ActivityBump, &i.MaxPortSharingLevel, &i.UseClassicParameterFlow, + &i.CorsBehavior, &i.CreatedByAvatarURL, &i.CreatedByUsername, &i.CreatedByName, @@ -11948,7 +11951,7 @@ func (q *sqlQuerier) GetTemplates(ctx context.Context) ([]Template, error) { const getTemplatesWithFilter = `-- name: GetTemplatesWithFilter :many SELECT - t.id, t.created_at, t.updated_at, t.organization_id, t.deleted, t.name, t.provisioner, t.active_version_id, t.description, t.default_ttl, t.created_by, t.icon, t.user_acl, t.group_acl, t.display_name, t.allow_user_cancel_workspace_jobs, t.allow_user_autostart, t.allow_user_autostop, t.failure_ttl, t.time_til_dormant, t.time_til_dormant_autodelete, t.autostop_requirement_days_of_week, t.autostop_requirement_weeks, t.autostart_block_days_of_week, t.require_active_version, t.deprecated, t.activity_bump, t.max_port_sharing_level, t.use_classic_parameter_flow, t.created_by_avatar_url, t.created_by_username, t.created_by_name, t.organization_name, t.organization_display_name, t.organization_icon + t.id, t.created_at, t.updated_at, t.organization_id, t.deleted, t.name, t.provisioner, t.active_version_id, t.description, t.default_ttl, t.created_by, t.icon, t.user_acl, t.group_acl, t.display_name, t.allow_user_cancel_workspace_jobs, t.allow_user_autostart, t.allow_user_autostop, t.failure_ttl, t.time_til_dormant, t.time_til_dormant_autodelete, t.autostop_requirement_days_of_week, t.autostop_requirement_weeks, t.autostart_block_days_of_week, t.require_active_version, t.deprecated, t.activity_bump, t.max_port_sharing_level, t.use_classic_parameter_flow, t.cors_behavior, t.created_by_avatar_url, t.created_by_username, t.created_by_name, t.organization_name, t.organization_display_name, t.organization_icon FROM template_with_names AS t LEFT JOIN @@ -12059,6 +12062,7 @@ func (q *sqlQuerier) GetTemplatesWithFilter(ctx context.Context, arg GetTemplate &i.ActivityBump, &i.MaxPortSharingLevel, &i.UseClassicParameterFlow, + &i.CorsBehavior, &i.CreatedByAvatarURL, &i.CreatedByUsername, &i.CreatedByName, @@ -12097,10 +12101,11 @@ INSERT INTO display_name, allow_user_cancel_workspace_jobs, max_port_sharing_level, - use_classic_parameter_flow + use_classic_parameter_flow, + cors_behavior ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16) + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17) ` type InsertTemplateParams struct { @@ -12120,6 +12125,7 @@ type InsertTemplateParams struct { AllowUserCancelWorkspaceJobs bool `db:"allow_user_cancel_workspace_jobs" json:"allow_user_cancel_workspace_jobs"` MaxPortSharingLevel AppSharingLevel `db:"max_port_sharing_level" json:"max_port_sharing_level"` UseClassicParameterFlow bool `db:"use_classic_parameter_flow" json:"use_classic_parameter_flow"` + CorsBehavior CorsBehavior `db:"cors_behavior" json:"cors_behavior"` } func (q *sqlQuerier) InsertTemplate(ctx context.Context, arg InsertTemplateParams) error { @@ -12140,6 +12146,7 @@ func (q *sqlQuerier) InsertTemplate(ctx context.Context, arg InsertTemplateParam arg.AllowUserCancelWorkspaceJobs, arg.MaxPortSharingLevel, arg.UseClassicParameterFlow, + arg.CorsBehavior, ) return err } @@ -12240,7 +12247,8 @@ SET allow_user_cancel_workspace_jobs = $7, group_acl = $8, max_port_sharing_level = $9, - use_classic_parameter_flow = $10 + use_classic_parameter_flow = $10, + cors_behavior = $11 WHERE id = $1 ` @@ -12256,6 +12264,7 @@ type UpdateTemplateMetaByIDParams struct { GroupACL TemplateACL `db:"group_acl" json:"group_acl"` MaxPortSharingLevel AppSharingLevel `db:"max_port_sharing_level" json:"max_port_sharing_level"` UseClassicParameterFlow bool `db:"use_classic_parameter_flow" json:"use_classic_parameter_flow"` + CorsBehavior CorsBehavior `db:"cors_behavior" json:"cors_behavior"` } func (q *sqlQuerier) UpdateTemplateMetaByID(ctx context.Context, arg UpdateTemplateMetaByIDParams) error { @@ -12270,6 +12279,7 @@ func (q *sqlQuerier) UpdateTemplateMetaByID(ctx context.Context, arg UpdateTempl arg.GroupACL, arg.MaxPortSharingLevel, arg.UseClassicParameterFlow, + arg.CorsBehavior, ) return err } @@ -19911,7 +19921,7 @@ LEFT JOIN LATERAL ( ) latest_build ON TRUE LEFT JOIN LATERAL ( SELECT - id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow + id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, default_ttl, created_by, icon, user_acl, group_acl, display_name, allow_user_cancel_workspace_jobs, allow_user_autostart, allow_user_autostop, failure_ttl, time_til_dormant, time_til_dormant_autodelete, autostop_requirement_days_of_week, autostop_requirement_weeks, autostart_block_days_of_week, require_active_version, deprecated, activity_bump, max_port_sharing_level, use_classic_parameter_flow, cors_behavior FROM templates WHERE diff --git a/coderd/database/queries/templates.sql b/coderd/database/queries/templates.sql index d10d09daaf6ea..4a37bd2d1058b 100644 --- a/coderd/database/queries/templates.sql +++ b/coderd/database/queries/templates.sql @@ -99,10 +99,11 @@ INSERT INTO display_name, allow_user_cancel_workspace_jobs, max_port_sharing_level, - use_classic_parameter_flow + use_classic_parameter_flow, + cors_behavior ) VALUES - ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16); + ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17); -- name: UpdateTemplateActiveVersionByID :exec UPDATE @@ -134,7 +135,8 @@ SET allow_user_cancel_workspace_jobs = $7, group_acl = $8, max_port_sharing_level = $9, - use_classic_parameter_flow = $10 + use_classic_parameter_flow = $10, + cors_behavior = $11 WHERE id = $1 ; diff --git a/coderd/database/sqlc.yaml b/coderd/database/sqlc.yaml index b96dabd1fc187..c8e83e9f859b9 100644 --- a/coderd/database/sqlc.yaml +++ b/coderd/database/sqlc.yaml @@ -150,6 +150,7 @@ sql: has_ai_task: HasAITask ai_task_sidebar_app_id: AITaskSidebarAppID latest_build_has_ai_task: LatestBuildHasAITask + cors_behavior: CorsBehavior rules: - name: do-not-use-public-schema-in-queries message: "do not use public schema in queries" diff --git a/coderd/prometheusmetrics/prometheusmetrics_test.go b/coderd/prometheusmetrics/prometheusmetrics_test.go index 1ce6b72347999..473dbf46bd958 100644 --- a/coderd/prometheusmetrics/prometheusmetrics_test.go +++ b/coderd/prometheusmetrics/prometheusmetrics_test.go @@ -744,6 +744,7 @@ func insertTemplates(t *testing.T, db database.Store, u database.User, org datab MaxPortSharingLevel: database.AppSharingLevelAuthenticated, CreatedBy: u.ID, OrganizationID: org.ID, + CorsBehavior: database.CorsBehaviorSimple, })) pj := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) @@ -763,6 +764,7 @@ func insertTemplates(t *testing.T, db database.Store, u database.User, org datab MaxPortSharingLevel: database.AppSharingLevelAuthenticated, CreatedBy: u.ID, OrganizationID: org.ID, + CorsBehavior: database.CorsBehaviorSimple, })) require.NoError(t, db.InsertTemplateVersion(context.Background(), database.InsertTemplateVersionParams{ diff --git a/coderd/templates.go b/coderd/templates.go index 60f94e5cd29cc..694bb90b86a4d 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -7,6 +7,7 @@ import ( "fmt" "net/http" "sort" + "strings" "time" "github.com/go-chi/chi/v5" @@ -29,6 +30,7 @@ import ( "github.com/coder/coder/v2/coderd/searchquery" "github.com/coder/coder/v2/coderd/telemetry" "github.com/coder/coder/v2/coderd/util/ptr" + "github.com/coder/coder/v2/coderd/util/slice" "github.com/coder/coder/v2/coderd/workspacestats" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/examples" @@ -322,6 +324,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque autostopRequirementDaysOfWeekParsed uint8 autostartRequirementDaysOfWeekParsed uint8 maxPortShareLevel = database.AppSharingLevelOwner // default + corsBehavior = database.CorsBehaviorSimple // default ) if defaultTTL < 0 { validErrs = append(validErrs, codersdk.ValidationError{Field: "default_ttl_ms", Detail: "Must be a positive integer."}) @@ -351,6 +354,20 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque } } + // Default the CORS behavior here to Simple so we don't break all existing templates. + val := database.CorsBehaviorSimple + if createTemplate.CORSBehavior != nil { + val = database.CorsBehavior(*createTemplate.CORSBehavior) + } + if !val.Valid() { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: "cors_behavior", + Detail: fmt.Sprintf("Invalid CORS behavior %q. Must be one of [%s]", *createTemplate.CORSBehavior, strings.Join(slice.ToStrings(database.AllCorsBehaviorValues()), ", ")), + }) + } else { + corsBehavior = val + } + if autostopRequirementWeeks < 0 { validErrs = append(validErrs, codersdk.ValidationError{Field: "autostop_requirement.weeks", Detail: "Must be a positive integer."}) } @@ -409,6 +426,7 @@ func (api *API) postTemplateByOrganization(rw http.ResponseWriter, r *http.Reque AllowUserCancelWorkspaceJobs: allowUserCancelWorkspaceJobs, MaxPortSharingLevel: maxPortShareLevel, UseClassicParameterFlow: useClassicParameterFlow, + CorsBehavior: corsBehavior, }) if err != nil { return xerrors.Errorf("insert template: %s", err) @@ -725,6 +743,19 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) { } } + corsBehavior := template.CorsBehavior + if req.CORSBehavior != nil && *req.CORSBehavior != "" { + val := database.CorsBehavior(*req.CORSBehavior) + if !val.Valid() { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: "cors_behavior", + Detail: fmt.Sprintf("Invalid CORS behavior %q. Must be one of [%s]", *req.CORSBehavior, strings.Join(slice.ToStrings(database.AllCorsBehaviorValues()), ", ")), + }) + } else { + corsBehavior = val + } + } + if len(validErrs) > 0 { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ Message: "Invalid request to update template metadata!", @@ -759,7 +790,8 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) { req.RequireActiveVersion == template.RequireActiveVersion && (deprecationMessage == template.Deprecated) && (classicTemplateFlow == template.UseClassicParameterFlow) && - maxPortShareLevel == template.MaxPortSharingLevel { + maxPortShareLevel == template.MaxPortSharingLevel && + corsBehavior == template.CorsBehavior { return nil } @@ -801,6 +833,7 @@ func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) { GroupACL: groupACL, MaxPortSharingLevel: maxPortShareLevel, UseClassicParameterFlow: classicTemplateFlow, + CorsBehavior: corsBehavior, }) if err != nil { return xerrors.Errorf("update template metadata: %w", err) @@ -1084,6 +1117,7 @@ func (api *API) convertTemplate( DeprecationMessage: templateAccessControl.Deprecated, MaxPortShareLevel: maxPortShareLevel, UseClassicParameterFlow: template.UseClassicParameterFlow, + CORSBehavior: codersdk.CORSBehavior(template.CorsBehavior), } } diff --git a/coderd/workspaceapps/apptest/apptest.go b/coderd/workspaceapps/apptest/apptest.go index d0f3acda77278..eab91de30df97 100644 --- a/coderd/workspaceapps/apptest/apptest.go +++ b/coderd/workspaceapps/apptest/apptest.go @@ -472,6 +472,409 @@ func Run(t *testing.T, appHostIsPrimary bool, factory DeploymentFactory) { }) }) + t.Run("WorkspaceApplicationCORS", func(t *testing.T) { + t.Parallel() + + const external = "https://example.com" + + unauthenticatedClient := func(t *testing.T, appDetails *Details) *codersdk.Client { + c := appDetails.AppClient(t) + c.SetSessionToken("") + return c + } + + authenticatedClient := func(t *testing.T, appDetails *Details) *codersdk.Client { + uc, _ := coderdtest.CreateAnotherUser(t, appDetails.SDKClient, appDetails.FirstUser.OrganizationID, rbac.RoleMember()) + c := appDetails.AppClient(t) + c.SetSessionToken(uc.SessionToken()) + return c + } + + ownSubdomain := func(details *Details, app App) string { + url := details.SubdomainAppURL(app) + return url.Scheme + "://" + url.Host + } + + externalOrigin := func(*Details, App) string { + return external + } + + tests := []struct { + name string + app func(details *Details) App + client func(t *testing.T, appDetails *Details) *codersdk.Client + behavior codersdk.CORSBehavior + httpMethod string + origin func(details *Details, app App) string + expectedStatusCode int + checkRequestHeaders func(t *testing.T, origin string, req http.Header) + checkResponseHeaders func(t *testing.T, origin string, resp http.Header) + }{ + // Public + { // fails + // The default behavior is to accept preflight requests from the request origin if it matches the app's own subdomain. + name: "Default/Public/Preflight/Subdomain", + app: func(details *Details) App { return details.Apps.PublicCORSDefault }, + behavior: codersdk.CORSBehaviorSimple, + client: unauthenticatedClient, + httpMethod: http.MethodOptions, + origin: ownSubdomain, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Contains(t, resp.Get("Access-Control-Allow-Methods"), http.MethodGet) + assert.Equal(t, "true", resp.Get("Access-Control-Allow-Credentials")) + }, + }, + { // passes + // The default behavior is to reject preflight requests from origins other than the app's own subdomain. + name: "Default/Public/Preflight/External", + app: func(details *Details) App { return details.Apps.PublicCORSDefault }, + behavior: codersdk.CORSBehaviorSimple, + client: unauthenticatedClient, + httpMethod: http.MethodOptions, + origin: externalOrigin, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + // We don't add a valid Allow-Origin header for requests we won't proxy. + assert.Empty(t, resp.Get("Access-Control-Allow-Origin")) + }, + }, + { // fails + // A request without an Origin header would be rejected by an actual browser since it lacks CORS headers. + name: "Default/Public/GET/NoOrigin", + app: func(details *Details) App { return details.Apps.PublicCORSDefault }, + behavior: codersdk.CORSBehaviorSimple, + client: unauthenticatedClient, + origin: func(*Details, App) string { return "" }, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Empty(t, resp.Get("Access-Control-Allow-Origin")) + assert.Empty(t, resp.Get("Access-Control-Allow-Headers")) + assert.Empty(t, resp.Get("Access-Control-Allow-Credentials")) + // Added by the app handler. + assert.Equal(t, "simple", resp.Get("X-CORS-Handler")) + }, + }, + { // fails + // The passthru behavior will pass through the request headers to the upstream app. + name: "Passthru/Public/Preflight/Subdomain", + app: func(details *Details) App { return details.Apps.PublicCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: unauthenticatedClient, + origin: ownSubdomain, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusOK, + checkRequestHeaders: func(t *testing.T, origin string, req http.Header) { + assert.Equal(t, origin, req.Get("Origin")) + assert.Equal(t, "GET", req.Get("Access-Control-Request-Method")) + }, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Equal(t, http.MethodGet, resp.Get("Access-Control-Allow-Methods")) + // Added by the app handler. + assert.Equal(t, "passthru", resp.Get("X-CORS-Handler")) + }, + }, + { // fails + // Identical to the previous test, but the origin is different. + name: "Passthru/Public/PreflightOther", + app: func(details *Details) App { return details.Apps.PublicCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: unauthenticatedClient, + origin: externalOrigin, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusOK, + checkRequestHeaders: func(t *testing.T, origin string, req http.Header) { + assert.Equal(t, origin, req.Get("Origin")) + assert.Equal(t, "GET", req.Get("Access-Control-Request-Method")) + assert.Equal(t, "X-Got-Host", req.Get("Access-Control-Request-Headers")) + }, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Equal(t, http.MethodGet, resp.Get("Access-Control-Allow-Methods")) + // Added by the app handler. + assert.Equal(t, "passthru", resp.Get("X-CORS-Handler")) + }, + }, + { + // A request without an Origin header would be rejected by an actual browser since it lacks CORS headers. + name: "Passthru/Public/GET/NoOrigin", + app: func(details *Details) App { return details.Apps.PublicCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: unauthenticatedClient, + origin: func(*Details, App) string { return "" }, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Empty(t, resp.Get("Access-Control-Allow-Origin")) + assert.Empty(t, resp.Get("Access-Control-Allow-Headers")) + assert.Empty(t, resp.Get("Access-Control-Allow-Credentials")) + // Added by the app handler. + assert.Equal(t, "passthru", resp.Get("X-CORS-Handler")) + }, + }, + // Authenticated + { + // Same behavior as Default/Public/Preflight/Subdomain. + name: "Default/Authenticated/Preflight/Subdomain", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSDefault }, + behavior: codersdk.CORSBehaviorSimple, + client: authenticatedClient, + origin: ownSubdomain, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Contains(t, resp.Get("Access-Control-Allow-Methods"), http.MethodGet) + assert.Equal(t, "true", resp.Get("Access-Control-Allow-Credentials")) + assert.Equal(t, "X-Got-Host", resp.Get("Access-Control-Allow-Headers")) + }, + }, + { + // Same behavior as Default/Public/Preflight/External. + name: "Default/Authenticated/Preflight/External", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSDefault }, + behavior: codersdk.CORSBehaviorSimple, + client: authenticatedClient, + origin: externalOrigin, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Empty(t, resp.Get("Access-Control-Allow-Origin")) + }, + }, + { + // An authenticated request to the app is allowed from its own subdomain. + name: "Default/Authenticated/GET/Subdomain", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSDefault }, + behavior: codersdk.CORSBehaviorSimple, + client: authenticatedClient, + origin: ownSubdomain, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Equal(t, "true", resp.Get("Access-Control-Allow-Credentials")) + // Added by the app handler. + assert.Equal(t, "simple", resp.Get("X-CORS-Handler")) + }, + }, + { + // An authenticated request to the app is allowed from an external origin. + // The origin doesn't match the app's own subdomain, so the CORS headers are not added. + name: "Default/Authenticated/GET/External", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSDefault }, + behavior: codersdk.CORSBehaviorSimple, + client: authenticatedClient, + origin: externalOrigin, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Empty(t, resp.Get("Access-Control-Allow-Origin")) + assert.Empty(t, resp.Get("Access-Control-Allow-Headers")) + assert.Empty(t, resp.Get("Access-Control-Allow-Credentials")) + // Added by the app handler. + assert.Equal(t, "simple", resp.Get("X-CORS-Handler")) + }, + }, + { + // The request is rejected because the client is unauthenticated. + name: "Passthru/Unauthenticated/Preflight/Subdomain", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: unauthenticatedClient, + origin: ownSubdomain, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusSeeOther, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.NotEmpty(t, resp.Get("Location")) + }, + }, + { + // Same behavior as the above test, but the origin is different. + name: "Passthru/Unauthenticated/Preflight/External", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: unauthenticatedClient, + origin: externalOrigin, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusSeeOther, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.NotEmpty(t, resp.Get("Location")) + }, + }, + { + // The request is rejected because the client is unauthenticated. + name: "Passthru/Unauthenticated/GET/Subdomain", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: unauthenticatedClient, + origin: ownSubdomain, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusSeeOther, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.NotEmpty(t, resp.Get("Location")) + }, + }, + { + // Same behavior as the above test, but the origin is different. + name: "Passthru/Unauthenticated/GET/External", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: unauthenticatedClient, + origin: externalOrigin, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusSeeOther, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.NotEmpty(t, resp.Get("Location")) + }, + }, + { + // The request is allowed because the client is authenticated. + name: "Passthru/Authenticated/Preflight/Subdomain", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: authenticatedClient, + origin: ownSubdomain, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Equal(t, http.MethodGet, resp.Get("Access-Control-Allow-Methods")) + // Added by the app handler. + assert.Equal(t, "passthru", resp.Get("X-CORS-Handler")) + }, + }, + { + // Same behavior as the above test, but the origin is different. + name: "Passthru/Authenticated/Preflight/External", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: authenticatedClient, + origin: externalOrigin, + httpMethod: http.MethodOptions, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Equal(t, http.MethodGet, resp.Get("Access-Control-Allow-Methods")) + // Added by the app handler. + assert.Equal(t, "passthru", resp.Get("X-CORS-Handler")) + }, + }, + { + // The request is allowed because the client is authenticated. + name: "Passthru/Authenticated/GET/Subdomain", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: authenticatedClient, + origin: ownSubdomain, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Equal(t, http.MethodGet, resp.Get("Access-Control-Allow-Methods")) + // Added by the app handler. + assert.Equal(t, "passthru", resp.Get("X-CORS-Handler")) + }, + }, + { + // Same behavior as the above test, but the origin is different. + name: "Passthru/Authenticated/GET/External", + app: func(details *Details) App { return details.Apps.AuthenticatedCORSPassthru }, + behavior: codersdk.CORSBehaviorPassthru, + client: authenticatedClient, + origin: externalOrigin, + httpMethod: http.MethodGet, + expectedStatusCode: http.StatusOK, + checkResponseHeaders: func(t *testing.T, origin string, resp http.Header) { + assert.Equal(t, origin, resp.Get("Access-Control-Allow-Origin")) + assert.Equal(t, http.MethodGet, resp.Get("Access-Control-Allow-Methods")) + // Added by the app handler. + assert.Equal(t, "passthru", resp.Get("X-CORS-Handler")) + }, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ctx := testutil.Context(t, testutil.WaitLong) + + var reqHeaders http.Header + // Setup an HTTP handler which is the "app"; this handler conditionally responds + // to requests based on the CORS behavior + appDetails := setupProxyTest(t, &DeploymentOptions{ + handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + _, err := r.Cookie(codersdk.SessionTokenCookie) + assert.ErrorIs(t, err, http.ErrNoCookie) + + // Store the request headers for later assertions + reqHeaders = r.Header + + switch tc.behavior { + case codersdk.CORSBehaviorPassthru: + w.Header().Set("X-CORS-Handler", "passthru") + + // Only allow GET and OPTIONS requests + if r.Method != http.MethodGet && r.Method != http.MethodOptions { + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + // If the Origin header is present, add the CORS headers. + if origin := r.Header.Get("Origin"); origin != "" { + w.Header().Set("Access-Control-Allow-Credentials", "true") + w.Header().Set("Access-Control-Allow-Origin", origin) + w.Header().Set("Access-Control-Allow-Methods", http.MethodGet) + } + + w.WriteHeader(http.StatusOK) + case codersdk.CORSBehaviorSimple: + w.Header().Set("X-CORS-Handler", "simple") + } + }), + }) + + // Update the template CORS behavior. + b := tc.behavior + template, err := appDetails.SDKClient.UpdateTemplateMeta(ctx, appDetails.Workspace.TemplateID, codersdk.UpdateTemplateMeta{ + CORSBehavior: &b, + }) + require.NoError(t, err) + require.Equal(t, tc.behavior, template.CORSBehavior) + + // Given: a client and a workspace app + client := tc.client(t, appDetails) + path := appDetails.SubdomainAppURL(tc.app(appDetails)).String() + origin := tc.origin(appDetails, tc.app(appDetails)) + + fmt.Println("method: ", tc.httpMethod) + // When: a preflight request is made to an app with a specified CORS behavior + resp, err := requestWithRetries(ctx, t, client, tc.httpMethod, path, nil, func(r *http.Request) { + // Mimic non-browser clients that don't send the Origin header. + if origin != "" { + r.Header.Set("Origin", origin) + } + r.Header.Set("Access-Control-Request-Method", "GET") + r.Header.Set("Access-Control-Request-Headers", "X-Got-Host") + }) + require.NoError(t, err) + defer resp.Body.Close() + + // Then: the request & response must match expectations + assert.Equal(t, tc.expectedStatusCode, resp.StatusCode) + assert.NoError(t, err) + if tc.checkRequestHeaders != nil { + tc.checkRequestHeaders(t, origin, reqHeaders) + } + tc.checkResponseHeaders(t, origin, resp.Header) + }) + } + }) + t.Run("WorkspaceApplicationAuth", func(t *testing.T) { t.Parallel() @@ -1340,6 +1743,153 @@ func Run(t *testing.T, appHostIsPrimary bool, factory DeploymentFactory) { }) }) + t.Run("CORS", func(t *testing.T) { + t.Parallel() + + // Set up test headers that should be returned by the app + testHeaders := http.Header{ + "Access-Control-Allow-Origin": []string{"*"}, + "Access-Control-Allow-Methods": []string{"GET, POST, OPTIONS"}, + } + + unauthenticatedClient := func(t *testing.T, appDetails *Details) *codersdk.Client { + c := appDetails.AppClient(t) + c.SetSessionToken("") + return c + } + + authenticatedClient := func(t *testing.T, appDetails *Details) *codersdk.Client { + uc, _ := coderdtest.CreateAnotherUser(t, appDetails.SDKClient, appDetails.FirstUser.OrganizationID, rbac.RoleMember()) + c := appDetails.AppClient(t) + c.SetSessionToken(uc.SessionToken()) + return c + } + + ownerClient := func(t *testing.T, appDetails *Details) *codersdk.Client { + c := appDetails.AppClient(t) // <-- Use same server as others + c.SetSessionToken(appDetails.SDKClient.SessionToken()) // But with owner auth + return c + } + + tests := []struct { + name string + shareLevel codersdk.WorkspaceAgentPortShareLevel + behavior codersdk.CORSBehavior + client func(t *testing.T, appDetails *Details) *codersdk.Client + expectedStatusCode int + expectedCORSHeaders bool + }{ + // Public + { + name: "Default/Public", + shareLevel: codersdk.WorkspaceAgentPortShareLevelPublic, + behavior: codersdk.CORSBehaviorSimple, + expectedCORSHeaders: false, + client: unauthenticatedClient, + expectedStatusCode: http.StatusOK, + }, + { // fails + name: "Passthru/Public", + shareLevel: codersdk.WorkspaceAgentPortShareLevelPublic, + behavior: codersdk.CORSBehaviorPassthru, + expectedCORSHeaders: true, + client: unauthenticatedClient, + expectedStatusCode: http.StatusOK, + }, + // Authenticated + { + name: "Default/Authenticated", + shareLevel: codersdk.WorkspaceAgentPortShareLevelAuthenticated, + behavior: codersdk.CORSBehaviorSimple, + expectedCORSHeaders: false, + client: authenticatedClient, + expectedStatusCode: http.StatusOK, + }, + { + name: "Passthru/Authenticated", + shareLevel: codersdk.WorkspaceAgentPortShareLevelAuthenticated, + behavior: codersdk.CORSBehaviorPassthru, + expectedCORSHeaders: true, + client: authenticatedClient, + expectedStatusCode: http.StatusOK, + }, + { + // The CORS behavior will not affect unauthenticated requests. + // The request will be redirected to the login page. + name: "Passthru/Unauthenticated", + shareLevel: codersdk.WorkspaceAgentPortShareLevelAuthenticated, + behavior: codersdk.CORSBehaviorPassthru, + expectedCORSHeaders: false, + client: unauthenticatedClient, + expectedStatusCode: http.StatusSeeOther, + }, + // Owner + { + name: "Default/Owner", + shareLevel: codersdk.WorkspaceAgentPortShareLevelAuthenticated, // Owner is not a valid share level for ports. + behavior: codersdk.CORSBehaviorSimple, + expectedCORSHeaders: false, + client: ownerClient, + expectedStatusCode: http.StatusOK, + }, + { // fails + name: "Passthru/Owner", + shareLevel: codersdk.WorkspaceAgentPortShareLevelAuthenticated, // Owner is not a valid share level for ports. + behavior: codersdk.CORSBehaviorPassthru, + expectedCORSHeaders: true, + client: ownerClient, + expectedStatusCode: http.StatusOK, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + appDetails := setupProxyTest(t, &DeploymentOptions{ + headers: testHeaders, + }) + port, err := strconv.ParseInt(appDetails.Apps.Port.AppSlugOrPort, 10, 32) + require.NoError(t, err) + + // Update the template CORS behavior. + b := tc.behavior + template, err := appDetails.SDKClient.UpdateTemplateMeta(ctx, appDetails.Workspace.TemplateID, codersdk.UpdateTemplateMeta{ + CORSBehavior: &b, + }) + require.NoError(t, err) + require.Equal(t, tc.behavior, template.CORSBehavior) + + // Set the port we have to be shared. + _, err = appDetails.SDKClient.UpsertWorkspaceAgentPortShare(ctx, appDetails.Workspace.ID, codersdk.UpsertWorkspaceAgentPortShareRequest{ + AgentName: proxyTestAgentName, + Port: int32(port), + ShareLevel: tc.shareLevel, + Protocol: codersdk.WorkspaceAgentPortShareProtocolHTTP, + }) + require.NoError(t, err) + + client := tc.client(t, appDetails) + + resp, err := requestWithRetries(ctx, t, client, http.MethodGet, appDetails.SubdomainAppURL(appDetails.Apps.Port).String(), nil) + require.NoError(t, err) + defer resp.Body.Close() + require.Equal(t, tc.expectedStatusCode, resp.StatusCode) + + if tc.expectedCORSHeaders { + require.Equal(t, testHeaders.Get("Access-Control-Allow-Origin"), resp.Header.Get("Access-Control-Allow-Origin"), "allow origin did not match") + require.Equal(t, testHeaders.Get("Access-Control-Allow-Methods"), resp.Header.Get("Access-Control-Allow-Methods"), "allow methods did not match") + } else { + require.Empty(t, resp.Header.Get("Access-Control-Allow-Origin")) + require.Empty(t, resp.Header.Get("Access-Control-Allow-Methods")) + } + }) + } + }) + t.Run("AppSharing", func(t *testing.T) { t.Parallel() @@ -1386,7 +1936,7 @@ func Run(t *testing.T, appHostIsPrimary bool, factory DeploymentFactory) { forceURLTransport(t, client) // Create workspace. - port := appServer(t, nil, false) + port := appServer(t, nil, false, nil) workspace, _ = createWorkspaceWithApps(t, client, user.OrganizationIDs[0], user, port, false) // Verify that the apps have the correct sharing levels set. @@ -1397,10 +1947,14 @@ func Run(t *testing.T, appHostIsPrimary bool, factory DeploymentFactory) { agnt = workspaceBuild.Resources[0].Agents[0] found := map[string]codersdk.WorkspaceAppSharingLevel{} expected := map[string]codersdk.WorkspaceAppSharingLevel{ - proxyTestAppNameFake: codersdk.WorkspaceAppSharingLevelOwner, - proxyTestAppNameOwner: codersdk.WorkspaceAppSharingLevelOwner, - proxyTestAppNameAuthenticated: codersdk.WorkspaceAppSharingLevelAuthenticated, - proxyTestAppNamePublic: codersdk.WorkspaceAppSharingLevelPublic, + proxyTestAppNameFake: codersdk.WorkspaceAppSharingLevelOwner, + proxyTestAppNameOwner: codersdk.WorkspaceAppSharingLevelOwner, + proxyTestAppNameAuthenticated: codersdk.WorkspaceAppSharingLevelAuthenticated, + proxyTestAppNamePublic: codersdk.WorkspaceAppSharingLevelPublic, + proxyTestAppNameAuthenticatedCORSPassthru: codersdk.WorkspaceAppSharingLevelAuthenticated, + proxyTestAppNamePublicCORSPassthru: codersdk.WorkspaceAppSharingLevelPublic, + proxyTestAppNameAuthenticatedCORSDefault: codersdk.WorkspaceAppSharingLevelAuthenticated, + proxyTestAppNamePublicCORSDefault: codersdk.WorkspaceAppSharingLevelPublic, } for _, app := range agnt.Apps { found[app.DisplayName] = app.SharingLevel diff --git a/coderd/workspaceapps/apptest/setup.go b/coderd/workspaceapps/apptest/setup.go index 9d1df9e7fe09d..296934591e873 100644 --- a/coderd/workspaceapps/apptest/setup.go +++ b/coderd/workspaceapps/apptest/setup.go @@ -36,8 +36,13 @@ const ( proxyTestAppNameOwner = "test-app-owner" proxyTestAppNameAuthenticated = "test-app-authenticated" proxyTestAppNamePublic = "test-app-public" - proxyTestAppQuery = "query=true" - proxyTestAppBody = "hello world from apps test" + // nolint:gosec // Not a secret + proxyTestAppNameAuthenticatedCORSPassthru = "test-app-authenticated-cors-passthru" + proxyTestAppNamePublicCORSPassthru = "test-app-public-cors-passthru" + proxyTestAppNameAuthenticatedCORSDefault = "test-app-authenticated-cors-default" + proxyTestAppNamePublicCORSDefault = "test-app-public-cors-default" + proxyTestAppQuery = "query=true" + proxyTestAppBody = "hello world from apps test" proxyTestSubdomainRaw = "*.test.coder.com" proxyTestSubdomain = "test.coder.com" @@ -60,6 +65,7 @@ type DeploymentOptions struct { noWorkspace bool port uint16 headers http.Header + handler http.Handler } // Deployment is a license-agnostic deployment with all the fields that apps @@ -93,6 +99,9 @@ type App struct { // Prefix should have ---. Prefix string Query string + + // Control the behavior of CORS handling. + CORSBehavior codersdk.CORSBehavior } // Details are the full test details returned from setupProxyTestWithFactory. @@ -109,12 +118,16 @@ type Details struct { AppPort uint16 Apps struct { - Fake App - Owner App - Authenticated App - Public App - Port App - PortHTTPS App + Fake App + Owner App + Authenticated App + Public App + Port App + PortHTTPS App + PublicCORSPassthru App + AuthenticatedCORSPassthru App + PublicCORSDefault App + AuthenticatedCORSDefault App } } @@ -201,7 +214,7 @@ func setupProxyTestWithFactory(t *testing.T, factory DeploymentFactory, opts *De } if opts.port == 0 { - opts.port = appServer(t, opts.headers, opts.ServeHTTPS) + opts.port = appServer(t, opts.headers, opts.ServeHTTPS, opts.handler) } workspace, agnt := createWorkspaceWithApps(t, deployment.SDKClient, deployment.FirstUser.OrganizationID, me, opts.port, opts.ServeHTTPS) @@ -252,30 +265,64 @@ func setupProxyTestWithFactory(t *testing.T, factory DeploymentFactory, opts *De AgentName: agnt.Name, AppSlugOrPort: strconv.Itoa(int(opts.port)) + "s", } + details.Apps.PublicCORSPassthru = App{ + Username: me.Username, + WorkspaceName: workspace.Name, + AgentName: agnt.Name, + AppSlugOrPort: proxyTestAppNamePublicCORSPassthru, + CORSBehavior: codersdk.CORSBehaviorPassthru, + Query: proxyTestAppQuery, + } + details.Apps.AuthenticatedCORSPassthru = App{ + Username: me.Username, + WorkspaceName: workspace.Name, + AgentName: agnt.Name, + AppSlugOrPort: proxyTestAppNameAuthenticatedCORSPassthru, + CORSBehavior: codersdk.CORSBehaviorPassthru, + Query: proxyTestAppQuery, + } + details.Apps.PublicCORSDefault = App{ + Username: me.Username, + WorkspaceName: workspace.Name, + AgentName: agnt.Name, + AppSlugOrPort: proxyTestAppNamePublicCORSDefault, + Query: proxyTestAppQuery, + } + details.Apps.AuthenticatedCORSDefault = App{ + Username: me.Username, + WorkspaceName: workspace.Name, + AgentName: agnt.Name, + AppSlugOrPort: proxyTestAppNameAuthenticatedCORSDefault, + Query: proxyTestAppQuery, + } return details } //nolint:revive -func appServer(t *testing.T, headers http.Header, isHTTPS bool) uint16 { - server := httptest.NewUnstartedServer( - http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { - _, err := r.Cookie(codersdk.SessionTokenCookie) - assert.ErrorIs(t, err, http.ErrNoCookie) - w.Header().Set("X-Forwarded-For", r.Header.Get("X-Forwarded-For")) - w.Header().Set("X-Got-Host", r.Host) - for name, values := range headers { - for _, value := range values { - w.Header().Add(name, value) - } +func appServer(t *testing.T, headers http.Header, isHTTPS bool, handler http.Handler) uint16 { + defaultHandler := http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + _, err := r.Cookie(codersdk.SessionTokenCookie) + assert.ErrorIs(t, err, http.ErrNoCookie) + w.Header().Set("X-Forwarded-For", r.Header.Get("X-Forwarded-For")) + w.Header().Set("X-Got-Host", r.Host) + for name, values := range headers { + for _, value := range values { + w.Header().Add(name, value) } - w.WriteHeader(http.StatusOK) - _, _ = w.Write([]byte(proxyTestAppBody)) - }, - ), + } + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte(proxyTestAppBody)) + }, ) + if handler == nil { + handler = defaultHandler + } + + server := httptest.NewUnstartedServer(handler) + server.Config.ReadHeaderTimeout = time.Minute if isHTTPS { server.StartTLS() @@ -361,6 +408,36 @@ func createWorkspaceWithApps(t *testing.T, client *codersdk.Client, orgID uuid.U Url: appURL, Subdomain: true, }, + { + Slug: proxyTestAppNamePublicCORSPassthru, + DisplayName: proxyTestAppNamePublicCORSPassthru, + SharingLevel: proto.AppSharingLevel_PUBLIC, + Url: appURL, + Subdomain: true, + // CorsBehavior: proto.AppCORSBehavior_PASSTHRU, + }, + { + Slug: proxyTestAppNameAuthenticatedCORSPassthru, + DisplayName: proxyTestAppNameAuthenticatedCORSPassthru, + SharingLevel: proto.AppSharingLevel_AUTHENTICATED, + Url: appURL, + Subdomain: true, + // CorsBehavior: proto.AppCORSBehavior_PASSTHRU, + }, + { + Slug: proxyTestAppNamePublicCORSDefault, + DisplayName: proxyTestAppNamePublicCORSDefault, + SharingLevel: proto.AppSharingLevel_PUBLIC, + Url: appURL, + Subdomain: true, + }, + { + Slug: proxyTestAppNameAuthenticatedCORSDefault, + DisplayName: proxyTestAppNameAuthenticatedCORSDefault, + SharingLevel: proto.AppSharingLevel_AUTHENTICATED, + Url: appURL, + Subdomain: true, + }, } version := coderdtest.CreateTemplateVersion(t, client, orgID, &echo.Responses{ Parse: echo.ParseComplete, diff --git a/coderd/workspaceapps/cors/cors.go b/coderd/workspaceapps/cors/cors.go new file mode 100644 index 0000000000000..5ab07f74e02b3 --- /dev/null +++ b/coderd/workspaceapps/cors/cors.go @@ -0,0 +1,21 @@ +package cors + +import ( + "context" + + "github.com/coder/coder/v2/codersdk" +) + +type contextKeyBehavior struct{} + +// WithBehavior sets the CORS behavior for the given context. +func WithBehavior(ctx context.Context, behavior codersdk.CORSBehavior) context.Context { + return context.WithValue(ctx, contextKeyBehavior{}, behavior) +} + +// HasBehavior returns true if the given context has the specified CORS behavior. +func HasBehavior(ctx context.Context, behavior codersdk.CORSBehavior) bool { + val := ctx.Value(contextKeyBehavior{}) + b, ok := val.(codersdk.CORSBehavior) + return ok && b == behavior +} diff --git a/coderd/workspaceapps/db.go b/coderd/workspaceapps/db.go index 61a9e218edc7f..9e26a28c71370 100644 --- a/coderd/workspaceapps/db.go +++ b/coderd/workspaceapps/db.go @@ -151,6 +151,7 @@ func (p *DBTokenProvider) Issue(ctx context.Context, rw http.ResponseWriter, r * if dbReq.AppURL != nil { token.AppURL = dbReq.AppURL.String() } + token.CORSBehavior = codersdk.CORSBehavior(dbReq.CorsBehavior) // Verify the user has access to the app. authed, warnings, err := p.authorizeRequest(r.Context(), authz, dbReq) diff --git a/coderd/workspaceapps/db_test.go b/coderd/workspaceapps/db_test.go index e78762c035565..d9862ab1f9db9 100644 --- a/coderd/workspaceapps/db_test.go +++ b/coderd/workspaceapps/db_test.go @@ -301,11 +301,12 @@ func Test_ResolveRequest(t *testing.T) { RegisteredClaims: jwtutils.RegisteredClaims{ Expiry: jwt.NewNumericDate(token.Expiry.Time()), }, - Request: req, - UserID: me.ID, - WorkspaceID: workspace.ID, - AgentID: agentID, - AppURL: appURL, + Request: req, + UserID: me.ID, + WorkspaceID: workspace.ID, + AgentID: agentID, + AppURL: appURL, + CORSBehavior: codersdk.CORSBehaviorSimple, }, token) require.NotZero(t, token.Expiry) require.WithinDuration(t, time.Now().Add(workspaceapps.DefaultTokenExpiry), token.Expiry.Time(), time.Minute) diff --git a/coderd/workspaceapps/proxy.go b/coderd/workspaceapps/proxy.go index bc8d32ed2ead9..2f1294558f67a 100644 --- a/coderd/workspaceapps/proxy.go +++ b/coderd/workspaceapps/proxy.go @@ -28,6 +28,7 @@ import ( "github.com/coder/coder/v2/coderd/tracing" "github.com/coder/coder/v2/coderd/util/slice" "github.com/coder/coder/v2/coderd/workspaceapps/appurl" + "github.com/coder/coder/v2/coderd/workspaceapps/cors" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/codersdk/workspacesdk" "github.com/coder/coder/v2/site" @@ -323,6 +324,37 @@ func (s *Server) workspaceAppsProxyPath(rw http.ResponseWriter, r *http.Request) s.proxyWorkspaceApp(rw, r, *token, chiPath, appurl.ApplicationURL{}) } +// determineCORSBehavior examines the given token and conditionally applies +// CORS middleware if the token specifies that behavior. +func (s *Server) determineCORSBehavior(token *SignedToken, app appurl.ApplicationURL) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + // Create the CORS middleware handler upfront. + corsHandler := httpmw.WorkspaceAppCors(s.HostnameRegex, app)(next) + + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + var behavior codersdk.CORSBehavior + if token != nil { + behavior = token.CORSBehavior + } + + // Add behavior to context regardless of which handler we use, + // since we will use this later on to determine if we should strip + // CORS headers in the response. + r = r.WithContext(cors.WithBehavior(r.Context(), behavior)) + + switch behavior { + case codersdk.CORSBehaviorPassthru: + // Bypass the CORS middleware. + next.ServeHTTP(rw, r) + return + default: + // Apply the CORS middleware. + corsHandler.ServeHTTP(rw, r) + } + }) + } +} + // HandleSubdomain handles subdomain-based application proxy requests (aka. // DevURLs in Coder V1). // @@ -394,36 +426,36 @@ func (s *Server) HandleSubdomain(middlewares ...func(http.Handler) http.Handler) return } - // Use the passed in app middlewares before checking authentication and - // passing to the proxy app. - mws := chi.Middlewares(append(middlewares, httpmw.WorkspaceAppCors(s.HostnameRegex, app))) - mws.Handler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - if !s.handleAPIKeySmuggling(rw, r, AccessMethodSubdomain) { - return - } + if !s.handleAPIKeySmuggling(rw, r, AccessMethodSubdomain) { + return + } - token, ok := ResolveRequest(rw, r, ResolveRequestOptions{ - Logger: s.Logger, - CookieCfg: s.Cookies, - SignedTokenProvider: s.SignedTokenProvider, - DashboardURL: s.DashboardURL, - PathAppBaseURL: s.AccessURL, - AppHostname: s.Hostname, - AppRequest: Request{ - AccessMethod: AccessMethodSubdomain, - BasePath: "/", - Prefix: app.Prefix, - UsernameOrID: app.Username, - WorkspaceNameOrID: app.WorkspaceName, - AgentNameOrID: app.AgentName, - AppSlugOrPort: app.AppSlugOrPort, - }, - AppPath: r.URL.Path, - AppQuery: r.URL.RawQuery, - }) - if !ok { - return - } + // Generate a signed token for the request. + token, ok := ResolveRequest(rw, r, ResolveRequestOptions{ + Logger: s.Logger, + SignedTokenProvider: s.SignedTokenProvider, + DashboardURL: s.DashboardURL, + PathAppBaseURL: s.AccessURL, + AppHostname: s.Hostname, + AppRequest: Request{ + AccessMethod: AccessMethodSubdomain, + BasePath: "/", + Prefix: app.Prefix, + UsernameOrID: app.Username, + WorkspaceNameOrID: app.WorkspaceName, + AgentNameOrID: app.AgentName, + AppSlugOrPort: app.AppSlugOrPort, + }, + AppPath: r.URL.Path, + AppQuery: r.URL.RawQuery, + }) + if !ok { + return + } + + // Proxy the request (possibly with the CORS middleware). + mws := chi.Middlewares(append(middlewares, s.determineCORSBehavior(token, app))) + mws.Handler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { s.proxyWorkspaceApp(rw, r, *token, r.URL.Path, app) })).ServeHTTP(rw, r.WithContext(ctx)) }) @@ -560,6 +592,10 @@ func (s *Server) proxyWorkspaceApp(rw http.ResponseWriter, r *http.Request, appT proxy := s.AgentProvider.ReverseProxy(appURL, s.DashboardURL, appToken.AgentID, app, s.Hostname) proxy.ModifyResponse = func(r *http.Response) error { + // If passthru behavior is set, disable our CORS header stripping. + if cors.HasBehavior(r.Request.Context(), codersdk.CORSBehaviorPassthru) { + return nil + } r.Header.Del(httpmw.AccessControlAllowOriginHeader) r.Header.Del(httpmw.AccessControlAllowCredentialsHeader) r.Header.Del(httpmw.AccessControlAllowMethodsHeader) diff --git a/coderd/workspaceapps/request.go b/coderd/workspaceapps/request.go index 0e6a43cb4cbe4..aa90ead2cdd29 100644 --- a/coderd/workspaceapps/request.go +++ b/coderd/workspaceapps/request.go @@ -204,6 +204,9 @@ type databaseRequest struct { // AppSharingLevel is the sharing level of the app. This is forced to be set // to AppSharingLevelOwner if the access method is terminal. AppSharingLevel database.AppSharingLevel + // CorsBehavior is set at the template level for all apps/ports in a workspace, and can + // either be the current CORS middleware 'simple' or bypass the cors middleware with 'passthru'. + CorsBehavior database.CorsBehavior } // getDatabase does queries to get the owner user, workspace and agent @@ -296,7 +299,14 @@ func (r Request) getDatabase(ctx context.Context, db database.Store) (*databaseR // First check if it's a port-based URL with an optional "s" suffix for HTTPS. potentialPortStr = strings.TrimSuffix(r.AppSlugOrPort, "s") portUint, portUintErr = strconv.ParseUint(potentialPortStr, 10, 16) + corsBehavior database.CorsBehavior ) + + tmpl, err := db.GetTemplateByID(ctx, workspace.TemplateID) + if err != nil { + return nil, xerrors.Errorf("get template %q: %w", workspace.TemplateID, err) + } + corsBehavior = tmpl.CorsBehavior //nolint:nestif if portUintErr == nil { protocol := "http" @@ -417,6 +427,7 @@ func (r Request) getDatabase(ctx context.Context, db database.Store) (*databaseR App: app, AppURL: appURLParsed, AppSharingLevel: appSharingLevel, + CorsBehavior: corsBehavior, }, nil } diff --git a/coderd/workspaceapps/token.go b/coderd/workspaceapps/token.go index dcd8c5a0e5c34..a3dbc02b61ddd 100644 --- a/coderd/workspaceapps/token.go +++ b/coderd/workspaceapps/token.go @@ -22,10 +22,11 @@ type SignedToken struct { // Request details. Request `json:"request"` - UserID uuid.UUID `json:"user_id"` - WorkspaceID uuid.UUID `json:"workspace_id"` - AgentID uuid.UUID `json:"agent_id"` - AppURL string `json:"app_url"` + UserID uuid.UUID `json:"user_id"` + WorkspaceID uuid.UUID `json:"workspace_id"` + AgentID uuid.UUID `json:"agent_id"` + AppURL string `json:"app_url"` + CORSBehavior codersdk.CORSBehavior `json:"cors_behavior"` } // MatchesRequest returns true if the token matches the request. Any token that diff --git a/codersdk/cors_behavior.go b/codersdk/cors_behavior.go new file mode 100644 index 0000000000000..8de84b000994e --- /dev/null +++ b/codersdk/cors_behavior.go @@ -0,0 +1,8 @@ +package codersdk + +type CORSBehavior string + +const ( + CORSBehaviorSimple CORSBehavior = "simple" + CORSBehaviorPassthru CORSBehavior = "passthru" +) diff --git a/codersdk/organizations.go b/codersdk/organizations.go index 35a1e0be0a426..86bc47bce2375 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -206,6 +206,9 @@ type CreateTemplateRequest struct { // true, and is why `*bool` is used here. When dynamic parameters becomes // the default, this will default to false. UseClassicParameterFlow *bool `json:"template_use_classic_parameter_flow,omitempty"` + + // CORSBehavior allows optionally specifying the CORS behavior for all shared ports. + CORSBehavior *CORSBehavior `json:"cors_behavior"` } // CreateWorkspaceRequest provides options for creating a new workspace. diff --git a/codersdk/templates.go b/codersdk/templates.go index a7d983bc1cc6f..2e77d999003ed 100644 --- a/codersdk/templates.go +++ b/codersdk/templates.go @@ -61,6 +61,7 @@ type Template struct { // template version. RequireActiveVersion bool `json:"require_active_version"` MaxPortShareLevel WorkspaceAgentPortShareLevel `json:"max_port_share_level"` + CORSBehavior CORSBehavior `json:"cors_behavior"` UseClassicParameterFlow bool `json:"use_classic_parameter_flow"` } @@ -252,6 +253,7 @@ type UpdateTemplateMeta struct { // of the template. DisableEveryoneGroupAccess bool `json:"disable_everyone_group_access"` MaxPortShareLevel *WorkspaceAgentPortShareLevel `json:"max_port_share_level,omitempty"` + CORSBehavior *CORSBehavior `json:"cors_behavior,omitempty"` // UseClassicParameterFlow is a flag that switches the default behavior to use the classic // parameter flow when creating a workspace. This only affects deployments with the experiment // "dynamic-parameters" enabled. This setting will live for a period after the experiment is diff --git a/docs/admin/security/audit-logs.md b/docs/admin/security/audit-logs.md index 9aca854e46b85..0a4b21a915315 100644 --- a/docs/admin/security/audit-logs.md +++ b/docs/admin/security/audit-logs.md @@ -13,31 +13,31 @@ We track the following resources: -| Resource | | | -|----------------------------------------------------------|----------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| APIKey
login, logout, register, create, delete | |
FieldTracked
created_attrue
expires_attrue
hashed_secretfalse
idfalse
ip_addressfalse
last_usedtrue
lifetime_secondsfalse
login_typefalse
scopefalse
token_namefalse
updated_atfalse
user_idtrue
| -| AuditOAuthConvertState
| |
FieldTracked
created_attrue
expires_attrue
from_login_typetrue
to_login_typetrue
user_idtrue
| -| Group
create, write, delete | |
FieldTracked
avatar_urltrue
display_nametrue
idtrue
memberstrue
nametrue
organization_idfalse
quota_allowancetrue
sourcefalse
| -| AuditableOrganizationMember
| |
FieldTracked
created_attrue
organization_idfalse
rolestrue
updated_attrue
user_idtrue
usernametrue
| -| CustomRole
| |
FieldTracked
created_atfalse
display_nametrue
idfalse
nametrue
org_permissionstrue
organization_idfalse
site_permissionstrue
updated_atfalse
user_permissionstrue
| -| GitSSHKey
create | |
FieldTracked
created_atfalse
private_keytrue
public_keytrue
updated_atfalse
user_idtrue
| -| GroupSyncSettings
| |
FieldTracked
auto_create_missing_groupstrue
fieldtrue
legacy_group_name_mappingfalse
mappingtrue
regex_filtertrue
| -| HealthSettings
| |
FieldTracked
dismissed_healthcheckstrue
idfalse
| -| License
create, delete | |
FieldTracked
exptrue
idfalse
jwtfalse
uploaded_attrue
uuidtrue
| -| NotificationTemplate
| |
FieldTracked
actionstrue
body_templatetrue
enabled_by_defaulttrue
grouptrue
idfalse
kindtrue
methodtrue
nametrue
title_templatetrue
| -| NotificationsSettings
| |
FieldTracked
idfalse
notifier_pausedtrue
| -| OAuth2ProviderApp
| |
FieldTracked
callback_urltrue
client_id_issued_atfalse
client_secret_expires_attrue
client_typetrue
client_uritrue
contactstrue
created_atfalse
dynamically_registeredtrue
grant_typestrue
icontrue
idfalse
jwkstrue
jwks_uritrue
logo_uritrue
nametrue
policy_uritrue
redirect_uristrue
registration_access_tokentrue
registration_client_uritrue
response_typestrue
scopetrue
software_idtrue
software_versiontrue
token_endpoint_auth_methodtrue
tos_uritrue
updated_atfalse
| -| OAuth2ProviderAppSecret
| |
FieldTracked
app_idfalse
created_atfalse
display_secretfalse
hashed_secretfalse
idfalse
last_used_atfalse
secret_prefixfalse
| -| Organization
| |
FieldTracked
created_atfalse
deletedtrue
descriptiontrue
display_nametrue
icontrue
idfalse
is_defaulttrue
nametrue
updated_attrue
| -| OrganizationSyncSettings
| |
FieldTracked
assign_defaulttrue
fieldtrue
mappingtrue
| -| PrebuildsSettings
| |
FieldTracked
idfalse
reconciliation_pausedtrue
| -| RoleSyncSettings
| |
FieldTracked
fieldtrue
mappingtrue
| -| Template
write, delete | |
FieldTracked
active_version_idtrue
activity_bumptrue
allow_user_autostarttrue
allow_user_autostoptrue
allow_user_cancel_workspace_jobstrue
autostart_block_days_of_weektrue
autostop_requirement_days_of_weektrue
autostop_requirement_weekstrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_namefalse
created_by_usernamefalse
default_ttltrue
deletedfalse
deprecatedtrue
descriptiontrue
display_nametrue
failure_ttltrue
group_acltrue
icontrue
idtrue
max_port_sharing_leveltrue
nametrue
organization_display_namefalse
organization_iconfalse
organization_idfalse
organization_namefalse
provisionertrue
require_active_versiontrue
time_til_dormanttrue
time_til_dormant_autodeletetrue
updated_atfalse
use_classic_parameter_flowtrue
user_acltrue
| -| TemplateVersion
create, write | |
FieldTracked
archivedtrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_namefalse
created_by_usernamefalse
external_auth_providersfalse
has_ai_taskfalse
idtrue
job_idfalse
messagefalse
nametrue
organization_idfalse
readmetrue
source_example_idfalse
template_idtrue
updated_atfalse
| -| User
create, write, delete | |
FieldTracked
avatar_urlfalse
created_atfalse
deletedtrue
emailtrue
github_com_user_idfalse
hashed_one_time_passcodefalse
hashed_passwordtrue
idtrue
is_systemtrue
last_seen_atfalse
login_typetrue
nametrue
one_time_passcode_expires_attrue
quiet_hours_scheduletrue
rbac_rolestrue
statustrue
updated_atfalse
usernametrue
| -| WorkspaceBuild
start, stop | |
FieldTracked
ai_task_sidebar_app_idfalse
build_numberfalse
created_atfalse
daily_costfalse
deadlinefalse
has_ai_taskfalse
idfalse
initiator_by_avatar_urlfalse
initiator_by_namefalse
initiator_by_usernamefalse
initiator_idfalse
job_idfalse
max_deadlinefalse
provisioner_statefalse
reasonfalse
template_version_idtrue
template_version_preset_idfalse
transitionfalse
updated_atfalse
workspace_idfalse
| -| WorkspaceProxy
| |
FieldTracked
created_attrue
deletedfalse
derp_enabledtrue
derp_onlytrue
display_nametrue
icontrue
idtrue
nametrue
region_idtrue
token_hashed_secrettrue
updated_atfalse
urltrue
versiontrue
wildcard_hostnametrue
| -| WorkspaceTable
| |
FieldTracked
automatic_updatestrue
autostart_scheduletrue
created_atfalse
deletedfalse
deleting_attrue
dormant_attrue
favoritetrue
idtrue
last_used_atfalse
nametrue
next_start_attrue
organization_idfalse
owner_idtrue
template_idtrue
ttltrue
updated_atfalse
| +| Resource | | | +|----------------------------------------------------------|----------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| APIKey
login, logout, register, create, delete | |
FieldTracked
created_attrue
expires_attrue
hashed_secretfalse
idfalse
ip_addressfalse
last_usedtrue
lifetime_secondsfalse
login_typefalse
scopefalse
token_namefalse
updated_atfalse
user_idtrue
| +| AuditOAuthConvertState
| |
FieldTracked
created_attrue
expires_attrue
from_login_typetrue
to_login_typetrue
user_idtrue
| +| Group
create, write, delete | |
FieldTracked
avatar_urltrue
display_nametrue
idtrue
memberstrue
nametrue
organization_idfalse
quota_allowancetrue
sourcefalse
| +| AuditableOrganizationMember
| |
FieldTracked
created_attrue
organization_idfalse
rolestrue
updated_attrue
user_idtrue
usernametrue
| +| CustomRole
| |
FieldTracked
created_atfalse
display_nametrue
idfalse
nametrue
org_permissionstrue
organization_idfalse
site_permissionstrue
updated_atfalse
user_permissionstrue
| +| GitSSHKey
create | |
FieldTracked
created_atfalse
private_keytrue
public_keytrue
updated_atfalse
user_idtrue
| +| GroupSyncSettings
| |
FieldTracked
auto_create_missing_groupstrue
fieldtrue
legacy_group_name_mappingfalse
mappingtrue
regex_filtertrue
| +| HealthSettings
| |
FieldTracked
dismissed_healthcheckstrue
idfalse
| +| License
create, delete | |
FieldTracked
exptrue
idfalse
jwtfalse
uploaded_attrue
uuidtrue
| +| NotificationTemplate
| |
FieldTracked
actionstrue
body_templatetrue
enabled_by_defaulttrue
grouptrue
idfalse
kindtrue
methodtrue
nametrue
title_templatetrue
| +| NotificationsSettings
| |
FieldTracked
idfalse
notifier_pausedtrue
| +| OAuth2ProviderApp
| |
FieldTracked
callback_urltrue
client_id_issued_atfalse
client_secret_expires_attrue
client_typetrue
client_uritrue
contactstrue
created_atfalse
dynamically_registeredtrue
grant_typestrue
icontrue
idfalse
jwkstrue
jwks_uritrue
logo_uritrue
nametrue
policy_uritrue
redirect_uristrue
registration_access_tokentrue
registration_client_uritrue
response_typestrue
scopetrue
software_idtrue
software_versiontrue
token_endpoint_auth_methodtrue
tos_uritrue
updated_atfalse
| +| OAuth2ProviderAppSecret
| |
FieldTracked
app_idfalse
created_atfalse
display_secretfalse
hashed_secretfalse
idfalse
last_used_atfalse
secret_prefixfalse
| +| Organization
| |
FieldTracked
created_atfalse
deletedtrue
descriptiontrue
display_nametrue
icontrue
idfalse
is_defaulttrue
nametrue
updated_attrue
| +| OrganizationSyncSettings
| |
FieldTracked
assign_defaulttrue
fieldtrue
mappingtrue
| +| PrebuildsSettings
| |
FieldTracked
idfalse
reconciliation_pausedtrue
| +| RoleSyncSettings
| |
FieldTracked
fieldtrue
mappingtrue
| +| Template
write, delete | |
FieldTracked
active_version_idtrue
activity_bumptrue
allow_user_autostarttrue
allow_user_autostoptrue
allow_user_cancel_workspace_jobstrue
autostart_block_days_of_weektrue
autostop_requirement_days_of_weektrue
autostop_requirement_weekstrue
cors_behaviortrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_namefalse
created_by_usernamefalse
default_ttltrue
deletedfalse
deprecatedtrue
descriptiontrue
display_nametrue
failure_ttltrue
group_acltrue
icontrue
idtrue
max_port_sharing_leveltrue
nametrue
organization_display_namefalse
organization_iconfalse
organization_idfalse
organization_namefalse
provisionertrue
require_active_versiontrue
time_til_dormanttrue
time_til_dormant_autodeletetrue
updated_atfalse
use_classic_parameter_flowtrue
user_acltrue
| +| TemplateVersion
create, write | |
FieldTracked
archivedtrue
created_atfalse
created_bytrue
created_by_avatar_urlfalse
created_by_namefalse
created_by_usernamefalse
external_auth_providersfalse
has_ai_taskfalse
idtrue
job_idfalse
messagefalse
nametrue
organization_idfalse
readmetrue
source_example_idfalse
template_idtrue
updated_atfalse
| +| User
create, write, delete | |
FieldTracked
avatar_urlfalse
created_atfalse
deletedtrue
emailtrue
github_com_user_idfalse
hashed_one_time_passcodefalse
hashed_passwordtrue
idtrue
is_systemtrue
last_seen_atfalse
login_typetrue
nametrue
one_time_passcode_expires_attrue
quiet_hours_scheduletrue
rbac_rolestrue
statustrue
updated_atfalse
usernametrue
| +| WorkspaceBuild
start, stop | |
FieldTracked
ai_task_sidebar_app_idfalse
build_numberfalse
created_atfalse
daily_costfalse
deadlinefalse
has_ai_taskfalse
idfalse
initiator_by_avatar_urlfalse
initiator_by_namefalse
initiator_by_usernamefalse
initiator_idfalse
job_idfalse
max_deadlinefalse
provisioner_statefalse
reasonfalse
template_version_idtrue
template_version_preset_idfalse
transitionfalse
updated_atfalse
workspace_idfalse
| +| WorkspaceProxy
| |
FieldTracked
created_attrue
deletedfalse
derp_enabledtrue
derp_onlytrue
display_nametrue
icontrue
idtrue
nametrue
region_idtrue
token_hashed_secrettrue
updated_atfalse
urltrue
versiontrue
wildcard_hostnametrue
| +| WorkspaceTable
| |
FieldTracked
automatic_updatestrue
autostart_scheduletrue
created_atfalse
deletedfalse
deleting_attrue
dormant_attrue
favoritetrue
idtrue
last_used_atfalse
nametrue
next_start_attrue
organization_idfalse
owner_idtrue
template_idtrue
ttltrue
updated_atfalse
| diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index e41c4c093cc4d..033ef6e196972 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -1056,6 +1056,21 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in | `vscode_connection` | | `jetbrains_connection` | +## codersdk.CORSBehavior + +```json +"simple" +``` + +### Properties + +#### Enumerated Values + +| Value | +|------------| +| `simple` | +| `passthru` | + ## codersdk.ChangePasswordWithOneTimePasscodeRequest ```json @@ -1475,6 +1490,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in ], "weeks": 0 }, + "cors_behavior": "simple", "default_ttl_ms": 0, "delete_ttl_ms": 0, "description": "string", @@ -1501,6 +1517,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in | `allow_user_cancel_workspace_jobs` | boolean | false | | Allow users to cancel in-progress workspace jobs. *bool as the default value is "true". | | `autostart_requirement` | [codersdk.TemplateAutostartRequirement](#codersdktemplateautostartrequirement) | false | | Autostart requirement allows optionally specifying the autostart allowed days for workspaces created from this template. This is an enterprise feature. | | `autostop_requirement` | [codersdk.TemplateAutostopRequirement](#codersdktemplateautostoprequirement) | false | | Autostop requirement allows optionally specifying the autostop requirement for workspaces created from this template. This is an enterprise feature. | +| `cors_behavior` | [codersdk.CORSBehavior](#codersdkcorsbehavior) | false | | Cors behavior allows optionally specifying the CORS behavior for all shared ports. | | `default_ttl_ms` | integer | false | | Default ttl ms allows optionally specifying the default TTL for all workspaces created from this template. | | `delete_ttl_ms` | integer | false | | Delete ttl ms allows optionally specifying the max lifetime before Coder permanently deletes dormant workspaces created from this template. | | `description` | string | false | | Description is a description of what the template contains. It must be less than 128 bytes. | @@ -6970,6 +6987,7 @@ Only certain features set these fields: - FeatureManagedAgentLimit| "p95": 146 } }, + "cors_behavior": "simple", "created_at": "2019-08-24T14:15:22Z", "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f", "created_by_name": "string", @@ -7009,6 +7027,7 @@ Only certain features set these fields: - FeatureManagedAgentLimit| | `autostart_requirement` | [codersdk.TemplateAutostartRequirement](#codersdktemplateautostartrequirement) | false | | | | `autostop_requirement` | [codersdk.TemplateAutostopRequirement](#codersdktemplateautostoprequirement) | false | | Autostop requirement and AutostartRequirement are enterprise features. Its value is only used if your license is entitled to use the advanced template scheduling feature. | | `build_time_stats` | [codersdk.TemplateBuildTimeStats](#codersdktemplatebuildtimestats) | false | | | +| `cors_behavior` | [codersdk.CORSBehavior](#codersdkcorsbehavior) | false | | | | `created_at` | string | false | | | | `created_by_id` | string | false | | | | `created_by_name` | string | false | | | diff --git a/docs/reference/api/templates.md b/docs/reference/api/templates.md index d0c7082ef74aa..0db4ef8d04879 100644 --- a/docs/reference/api/templates.md +++ b/docs/reference/api/templates.md @@ -57,6 +57,7 @@ To include deprecated templates, specify `deprecated:true` in the search query. "p95": 146 } }, + "cors_behavior": "simple", "created_at": "2019-08-24T14:15:22Z", "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f", "created_by_name": "string", @@ -113,6 +114,7 @@ Restarts will only happen on weekdays in this list on weeks which line up with W |`»» [any property]`|[codersdk.TransitionStats](schemas.md#codersdktransitionstats)|false||| |`»»» p50`|integer|false||| |`»»» p95`|integer|false||| +|`» cors_behavior`|[codersdk.CORSBehavior](schemas.md#codersdkcorsbehavior)|false||| |`» created_at`|string(date-time)|false||| |`» created_by_id`|string(uuid)|false||| |`» created_by_name`|string|false||| @@ -141,6 +143,8 @@ Restarts will only happen on weekdays in this list on weeks which line up with W | Property | Value | |------------------------|-----------------| +| `cors_behavior` | `simple` | +| `cors_behavior` | `passthru` | | `max_port_share_level` | `owner` | | `max_port_share_level` | `authenticated` | | `max_port_share_level` | `organization` | @@ -182,6 +186,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations/{organization}/templa ], "weeks": 0 }, + "cors_behavior": "simple", "default_ttl_ms": 0, "delete_ttl_ms": 0, "description": "string", @@ -238,6 +243,7 @@ curl -X POST http://coder-server:8080/api/v2/organizations/{organization}/templa "p95": 146 } }, + "cors_behavior": "simple", "created_at": "2019-08-24T14:15:22Z", "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f", "created_by_name": "string", @@ -387,6 +393,7 @@ curl -X GET http://coder-server:8080/api/v2/organizations/{organization}/templat "p95": 146 } }, + "cors_behavior": "simple", "created_at": "2019-08-24T14:15:22Z", "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f", "created_by_name": "string", @@ -790,6 +797,7 @@ To include deprecated templates, specify `deprecated:true` in the search query. "p95": 146 } }, + "cors_behavior": "simple", "created_at": "2019-08-24T14:15:22Z", "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f", "created_by_name": "string", @@ -846,6 +854,7 @@ Restarts will only happen on weekdays in this list on weeks which line up with W |`»» [any property]`|[codersdk.TransitionStats](schemas.md#codersdktransitionstats)|false||| |`»»» p50`|integer|false||| |`»»» p95`|integer|false||| +|`» cors_behavior`|[codersdk.CORSBehavior](schemas.md#codersdkcorsbehavior)|false||| |`» created_at`|string(date-time)|false||| |`» created_by_id`|string(uuid)|false||| |`» created_by_name`|string|false||| @@ -874,6 +883,8 @@ Restarts will only happen on weekdays in this list on weeks which line up with W | Property | Value | |------------------------|-----------------| +| `cors_behavior` | `simple` | +| `cors_behavior` | `passthru` | | `max_port_share_level` | `owner` | | `max_port_share_level` | `authenticated` | | `max_port_share_level` | `organization` | @@ -990,6 +1001,7 @@ curl -X GET http://coder-server:8080/api/v2/templates/{template} \ "p95": 146 } }, + "cors_behavior": "simple", "created_at": "2019-08-24T14:15:22Z", "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f", "created_by_name": "string", @@ -1120,6 +1132,7 @@ curl -X PATCH http://coder-server:8080/api/v2/templates/{template} \ "p95": 146 } }, + "cors_behavior": "simple", "created_at": "2019-08-24T14:15:22Z", "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f", "created_by_name": "string", diff --git a/enterprise/audit/table.go b/enterprise/audit/table.go index 6c1f907abfa00..c767e06e228dd 100644 --- a/enterprise/audit/table.go +++ b/enterprise/audit/table.go @@ -115,6 +115,7 @@ var auditableResourcesTypes = map[any]map[string]Action{ "max_port_sharing_level": ActionTrack, "activity_bump": ActionTrack, "use_classic_parameter_flow": ActionTrack, + "cors_behavior": ActionTrack, }, &database.TemplateVersion{}: { "id": ActionTrack, diff --git a/enterprise/wsproxy/wsproxy.go b/enterprise/wsproxy/wsproxy.go index bce49417fcd35..69241d8aa1c17 100644 --- a/enterprise/wsproxy/wsproxy.go +++ b/enterprise/wsproxy/wsproxy.go @@ -339,11 +339,11 @@ func New(ctx context.Context, opts *Options) (*Server, error) { httpmw.ExtractRealIP(s.Options.RealIPConfig), loggermw.Logger(s.Logger), prometheusMW, - corsMW, // HandleSubdomain is a middleware that handles all requests to the // subdomain-based workspace apps. s.AppServer.HandleSubdomain(apiRateLimiter), + corsMW, // Build-Version is helpful for debugging. func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/site/e2e/tests/templates/updateTemplateSchedule.spec.ts b/site/e2e/tests/templates/updateTemplateSchedule.spec.ts index 42c758df5db16..b9552f85aea2b 100644 --- a/site/e2e/tests/templates/updateTemplateSchedule.spec.ts +++ b/site/e2e/tests/templates/updateTemplateSchedule.spec.ts @@ -30,6 +30,7 @@ test("update template schedule settings without override other settings", async disable_everyone_group_access: false, require_active_version: true, max_port_share_level: null, + cors_behavior: null, allow_user_cancel_workspace_jobs: null, }); diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index ecbbdc9024d65..6165198c6fa23 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -307,6 +307,11 @@ export const BypassRatelimitHeader = "X-Coder-Bypass-Ratelimit"; // From codersdk/client.go export const CLITelemetryHeader = "Coder-CLI-Telemetry"; +// From codersdk/cors_behavior.go +export type CORSBehavior = "passthru" | "simple"; + +export const CORSBehaviors: CORSBehavior[] = ["passthru", "simple"]; + // From codersdk/workspacebuilds.go export interface CancelWorkspaceBuildParams { readonly expect_status?: CancelWorkspaceBuildStatus; @@ -492,6 +497,7 @@ export interface CreateTemplateRequest { readonly require_active_version: boolean; readonly max_port_share_level: WorkspaceAgentPortShareLevel | null; readonly template_use_classic_parameter_flow?: boolean; + readonly cors_behavior: CORSBehavior | null; } // From codersdk/templateversions.go @@ -2816,6 +2822,7 @@ export interface Template { readonly time_til_dormant_autodelete_ms: number; readonly require_active_version: boolean; readonly max_port_share_level: WorkspaceAgentPortShareLevel; + readonly cors_behavior: CORSBehavior; readonly use_classic_parameter_flow: boolean; } @@ -3188,6 +3195,7 @@ export interface UpdateTemplateMeta { readonly deprecation_message?: string; readonly disable_everyone_group_access: boolean; readonly max_port_share_level?: WorkspaceAgentPortShareLevel; + readonly cors_behavior?: CORSBehavior; readonly use_classic_parameter_flow?: boolean; } diff --git a/site/src/pages/CreateTemplatePage/utils.ts b/site/src/pages/CreateTemplatePage/utils.ts index a10c52a70c16a..ab0336ef120e4 100644 --- a/site/src/pages/CreateTemplatePage/utils.ts +++ b/site/src/pages/CreateTemplatePage/utils.ts @@ -18,6 +18,7 @@ export const newTemplate = ( const safeTemplateData = { name: formData.name, max_port_share_level: null, + cors_behavior: null, display_name: formData.display_name, description: formData.description, icon: formData.icon, diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx index 359058f78761a..5b35b5ba26f14 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx @@ -4,6 +4,7 @@ import FormHelperText from "@mui/material/FormHelperText"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { + CORSBehaviors, type Template, type UpdateTemplateMeta, WorkspaceAppSharingLevels, @@ -52,6 +53,7 @@ export const validationSchema = Yup.object({ use_classic_parameter_flow: Yup.boolean(), deprecation_message: Yup.string(), max_port_sharing_level: Yup.string().oneOf(WorkspaceAppSharingLevels), + cors_behavior: Yup.string().oneOf(Object.values(CORSBehaviors)), }); export interface TemplateSettingsForm { @@ -93,6 +95,7 @@ export const TemplateSettingsForm: FC = ({ disable_everyone_group_access: false, max_port_share_level: template.max_port_share_level, use_classic_parameter_flow: template.use_classic_parameter_flow, + cors_behavior: template.cors_behavior, }, validationSchema, onSubmit, @@ -338,6 +341,28 @@ export const TemplateSettingsForm: FC = ({ + + + + Simple (recommended) + Passthru + + + + + ); +}; + +export default WorkspaceSharingPage; diff --git a/site/src/router.tsx b/site/src/router.tsx index 90a8bda22c1f3..9f92c80f35f0f 100644 --- a/site/src/router.tsx +++ b/site/src/router.tsx @@ -86,6 +86,12 @@ const WorkspaceParametersExperimentRouter = lazy( "./pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersExperimentRouter" ), ); +const WorkspaceSharingPage = lazy( + () => + import( + "./pages/WorkspaceSettingsPage/WorkspaceSharingPage/WorkspaceSharingPage" + ), +); const TerminalPage = lazy(() => import("./pages/TerminalPage/TerminalPage")); const TemplatePermissionsPage = lazy( () => @@ -547,6 +553,7 @@ export const router = createBrowserRouter( element={} /> } /> + } /> diff --git a/site/static/kirby.gif b/site/static/kirby.gif new file mode 100644 index 0000000000000000000000000000000000000000..b6fe7e93e1fa1f22d1dd85c3d8da48eb49365752 GIT binary patch literal 32512 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 Date: Thu, 31 Jul 2025 18:46:39 +0100 Subject: [PATCH 037/260] docs: remove deprecated JFrog Xray integration documentation (#19113) --- docs/admin/integrations/jfrog-xray.md | 68 ------------------ .../guides/xray-integration/example.png | Bin 116060 -> 0 bytes docs/manifest.json | 10 --- 3 files changed, 78 deletions(-) delete mode 100644 docs/admin/integrations/jfrog-xray.md delete mode 100644 docs/images/guides/xray-integration/example.png diff --git a/docs/admin/integrations/jfrog-xray.md b/docs/admin/integrations/jfrog-xray.md deleted file mode 100644 index 194ea25bf8b6b..0000000000000 --- a/docs/admin/integrations/jfrog-xray.md +++ /dev/null @@ -1,68 +0,0 @@ -# Integrating JFrog Xray with Coder Kubernetes Workspaces - - -March 17, 2024 - ---- - -This guide describes the process of integrating [JFrog Xray](https://jfrog.com/xray/) to Coder Kubernetes-backed -workspaces using Coder's [JFrog Xray Integration](https://github.com/coder/coder-xray). - -## Prerequisites - -- A self-hosted JFrog Platform instance. -- Kubernetes workspaces running on Coder. - -## Deploy the **Coder - JFrog Xray** Integration - -1. Create a JFrog Platform [Access Token](https://jfrog.com/help/r/jfrog-platform-administration-documentation/access-tokens) with a user that has the `read` [permission](https://jfrog.com/help/r/jfrog-platform-administration-documentation/permissions) - for the repositories you want to scan. - -1. Create a Coder [token](../../reference/cli/tokens_create.md#tokens-create) with a user that has the [`owner`](../users/index.md#roles) role. - -1. Create Kubernetes secrets for the JFrog Xray and Coder tokens. - - ```bash - kubectl create secret generic coder-token \ - --from-literal=coder-token='' - ``` - - ```bash - kubectl create secret generic jfrog-token \ - --from-literal=user='' \ - --from-literal=token='' - ``` - -1. Deploy the **Coder - JFrog Xray** integration. - - ```bash - helm repo add coder-xray https://helm.coder.com/coder-xray - ``` - - ```bash - helm upgrade --install coder-xray coder-xray/coder-xray \ - --namespace coder-xray \ - --create-namespace \ - --set namespace="" \ - --set coder.url="https://" \ - --set coder.secretName="coder-token" \ - --set artifactory.url="https://" \ - --set artifactory.secretName="jfrog-token" - ``` - -> [!IMPORTANT] -> To authenticate with the Artifactory registry, you may need to -> create a [Docker config](https://jfrog.com/help/r/jfrog-artifactory-documentation/docker-advanced-topics) and use it in the -> `imagePullSecrets` field of the Kubernetes Pod. -> See the [Defining ImagePullSecrets for Coder workspaces](../../tutorials/image-pull-secret.md) guide for more information. - -## Validate your installation - -Once installed, configured workspaces will now have a banner appear on any -workspace with vulnerabilities reported by JFrog Xray. - -JFrog Xray Integration diff --git a/docs/images/guides/xray-integration/example.png b/docs/images/guides/xray-integration/example.png deleted file mode 100644 index 58c28d332feb5d84a454a4815092fb4d57c8aca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116060 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 diff --git a/docs/manifest.json b/docs/manifest.json index 04e10f4387949..189614f9191d1 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -699,11 +699,6 @@ "description": "Integrate Coder with JFrog Artifactory", "path": "./admin/integrations/jfrog-artifactory.md" }, - { - "title": "JFrog Xray", - "description": "Integrate Coder with JFrog Xray", - "path": "./admin/integrations/jfrog-xray.md" - }, { "title": "Island Secure Browser", "description": "Integrate Coder with Island's Secure Browser", @@ -954,11 +949,6 @@ "description": "Deploy Coder on Azure with an Application Gateway", "path": "./install/kubernetes/kubernetes-azure-app-gateway.md" }, - { - "title": "Scanning Workspaces with JFrog Xray", - "description": "Integrate Coder with JFrog Xray", - "path": "./admin/integrations/jfrog-xray.md" - }, { "title": "Cloning Git Repositories", "description": "Learn how to clone Git repositories in Coder", From a185d3a2c339f2b66fb6f79e7b7c046a2887b110 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Thu, 31 Jul 2025 21:20:27 +0100 Subject: [PATCH 038/260] fix(site): ensure notification settings page follows RBAC correctly (#19097) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensure template admin and user admins are able to see the correct notification groups on the notification settings page. --------- Co-authored-by: ケイラ --- .../NotificationsPage.stories.tsx | 16 ++++++++-- .../NotificationsPage/NotificationsPage.tsx | 31 +++++++++++++------ site/src/testHelpers/entities.ts | 26 ++++++++++++++++ 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx index e2ac02e773d2d..72f26f791e960 100644 --- a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx +++ b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx @@ -40,7 +40,7 @@ const meta = { }, ], user: MockUserOwner, - permissions: { viewDeploymentConfig: true }, + permissions: { createTemplates: true, createUser: true }, }, decorators: [withGlobalSnackbar, withAuthProvider, withDashboardProvider], } satisfies Meta; @@ -74,7 +74,19 @@ export const ToggleNotification: Story = { export const NonAdmin: Story = { parameters: { - permissions: { viewDeploymentConfig: false }, + permissions: { createTemplates: false, createUser: false }, + }, +}; + +export const TemplateAdmin: Story = { + parameters: { + permissions: { createTemplates: true, createUser: false }, + }, +}; + +export const UserAdmin: Story = { + parameters: { + permissions: { createTemplates: false, createUser: true }, }, }; diff --git a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx index 1a89c2240c8d1..4e4b1e6bc61bd 100644 --- a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx +++ b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx @@ -28,6 +28,7 @@ import { methodIcons, methodLabels, } from "modules/notifications/utils"; +import type { Permissions } from "modules/permissions"; import { type FC, Fragment } from "react"; import { useEffect } from "react"; import { Helmet } from "react-helmet-async"; @@ -46,15 +47,7 @@ const NotificationsPage: FC = () => { }, { ...systemNotificationTemplates(), - select: (data: NotificationTemplate[]) => { - const groups = selectTemplatesByGroup(data); - return permissions.viewDeploymentConfig - ? groups - : { - // Members only have access to the "Workspace Notifications" group - "Workspace Events": groups["Workspace Events"], - }; - }, + select: (data: NotificationTemplate[]) => selectTemplatesByGroup(data), }, notificationDispatchMethods(), ], @@ -103,6 +96,10 @@ const NotificationsPage: FC = () => { {ready ? ( {Object.entries(templatesByGroup.data).map(([group, templates]) => { + if (!canSeeNotificationGroup(group, permissions)) { + return null; + } + const allDisabled = templates.some((tpl) => { return notificationIsDisabled(disabledPreferences.data, tpl); }); @@ -211,6 +208,22 @@ const NotificationsPage: FC = () => { export default NotificationsPage; +function canSeeNotificationGroup( + group: string, + permissions: Permissions, +): boolean { + switch (group) { + case "Workspace Events": + return true; + case "Template Events": + return permissions.createTemplates; + case "User Events": + return permissions.createUser; + default: + return false; + } +} + function notificationIsDisabled( disabledPreferences: Record, tmpl: NotificationTemplate, diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 78dd9e4e8687a..f3f40e18bac27 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -4404,6 +4404,32 @@ export const MockNotificationTemplates: TypesGen.NotificationTemplate[] = [ kind: "system", enabled_by_default: true, }, + { + id: "template-event-1", + name: "Template Version Created", + title_template: 'Template version "{{.Labels.version_name}}" created', + body_template: + 'Hi {{.UserName}}\nA new version of template "{{.Labels.template_name}}" has been created.', + actions: + '[{"url": "{{ base_url }}/templates/{{.Labels.template_name}}", "label": "View template"}]', + group: "Template Events", + method: "smtp", + kind: "system", + enabled_by_default: true, + }, + { + id: "template-event-2", + name: "Template Updated", + title_template: 'Template "{{.Labels.template_name}}" updated', + body_template: + 'Hi {{.UserName}}\nTemplate "{{.Labels.template_name}}" has been updated.', + actions: + '[{"url": "{{ base_url }}/templates/{{.Labels.template_name}}", "label": "View template"}]', + group: "Template Events", + method: "webhook", + kind: "system", + enabled_by_default: true, + }, ]; export const MockNotificationMethodsResponse: TypesGen.NotificationMethodsResponse = From 6ba4b5bbc95e2e528d7f5b1e31fffa200ae1a6db Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Fri, 1 Aug 2025 18:03:15 -0700 Subject: [PATCH 039/260] docs: update module registry URLs to correct path structure (#18681) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Updated documentation references to use the correct registry path structure - Changed URLs from incorrect paths to the correct format: - Modules main page: registry.coder.com/modules - Specific modules: registry.coder.com/modules/coder/{module-name} ## Test plan - Verify that all documentation links to modules point to the correct URL structure 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude Co-authored-by: Edward Angert --- .../templates/extending-templates/modules.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/admin/templates/extending-templates/modules.md b/docs/admin/templates/extending-templates/modules.md index d7ed472831662..1495dfce1f2da 100644 --- a/docs/admin/templates/extending-templates/modules.md +++ b/docs/admin/templates/extending-templates/modules.md @@ -40,14 +40,14 @@ in the Terraform documentation. Coder publishes plenty of modules that can be used to simplify some common tasks across templates. Some of the modules we publish are, -1. [`code-server`](https://registry.coder.com/modules/code-server) and - [`vscode-web`](https://registry.coder.com/modules/vscode-web) -2. [`git-clone`](https://registry.coder.com/modules/git-clone) -3. [`dotfiles`](https://registry.coder.com/modules/dotfiles) -4. [`jetbrains-gateway`](https://registry.coder.com/modules/jetbrains-gateway) -5. [`jfrog-oauth`](https://registry.coder.com/modules/jfrog-oauth) and - [`jfrog-token`](https://registry.coder.com/modules/jfrog-token) -6. [`vault-github`](https://registry.coder.com/modules/vault-github) +1. [`code-server`](https://registry.coder.com/modules/coder/code-server) and + [`vscode-web`](https://registry.coder.com/modules/coder/vscode-web) +2. [`git-clone`](https://registry.coder.com/modules/coder/git-clone) +3. [`dotfiles`](https://registry.coder.com/modules/coder/dotfiles) +4. [`jetbrains-gateway`](https://registry.coder.com/modules/coder/jetbrains-gateway) +5. [`jfrog-oauth`](https://registry.coder.com/modules/coder/jfrog-oauth) and + [`jfrog-token`](https://registry.coder.com/modules/coder/jfrog-token) +6. [`vault-github`](https://registry.coder.com/modules/coder/vault-github) For a full list of available modules please check [Coder module registry](https://registry.coder.com/modules). From 6a35400f67679578283def7fe8f906d3454041a2 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Sat, 2 Aug 2025 18:23:46 +0100 Subject: [PATCH 040/260] ci: conditionally disable spotlight indexing (#19124) Work around for following issue: ``` Run sudo mdutil -a -i off sudo mdutil -a -i off sudo mdutil -X / sudo launchctl bootout system /System/Library/LaunchDaemons/com.apple.metadata.mds.plist shell: /bin/bash -e {0} 4 files/directories removed Boot-out failed: 5: Input/output error ``` This can happen if spotlight has already been disabled. --- .github/workflows/ci.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 06efc8d5afd64..a55bd137f7994 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -340,6 +340,11 @@ jobs: - name: Disable Spotlight Indexing if: runner.os == 'macOS' run: | + enabled=$(sudo mdutil -a -s | grep "Indexing enabled" | wc -l) + if [ $enabled -eq 0 ]; then + echo "Spotlight indexing is already disabled" + exit 0 + fi sudo mdutil -a -i off sudo mdutil -X / sudo launchctl bootout system /System/Library/LaunchDaemons/com.apple.metadata.mds.plist From 0d7cc5c1569a5e3f1fe9463c1fbe60b0e7d61d2e Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Sun, 3 Aug 2025 20:53:04 +0100 Subject: [PATCH 041/260] ci: bump xcode version to 16.1.0 (#19125) --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a55bd137f7994..fbc34b0dfb6ec 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -964,7 +964,7 @@ jobs: - name: Switch XCode Version uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 with: - xcode-version: "16.0.0" + xcode-version: "16.1.0" - name: Setup Go uses: ./.github/actions/setup-go From c9ed0dd927edbfbbf3c46f25ffac8eccebc41758 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Sun, 3 Aug 2025 18:26:41 -0400 Subject: [PATCH 042/260] chore: pin dependencies in Dockerfiles (#19129) --- .devcontainer/filebrowser/install.sh | 10 +++++++++- .devcontainer/scripts/post_create.sh | 2 +- dogfood/coder/Dockerfile | 7 ++++--- scripts/Dockerfile.base | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) mode change 100644 => 100755 .devcontainer/filebrowser/install.sh diff --git a/.devcontainer/filebrowser/install.sh b/.devcontainer/filebrowser/install.sh old mode 100644 new mode 100755 index 48158a38cd782..6e8d58a14bf80 --- a/.devcontainer/filebrowser/install.sh +++ b/.devcontainer/filebrowser/install.sh @@ -8,7 +8,15 @@ printf "%sInstalling filebrowser\n\n" "${BOLD}" # Check if filebrowser is installed. if ! command -v filebrowser &>/dev/null; then - curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash + VERSION="v2.42.1" + EXPECTED_HASH="7d83c0f077df10a8ec9bfd9bf6e745da5d172c3c768a322b0e50583a6bc1d3cc" + + curl -fsSL "https://github.com/filebrowser/filebrowser/releases/download/${VERSION}/linux-amd64-filebrowser.tar.gz" -o /tmp/filebrowser.tar.gz + echo "${EXPECTED_HASH} /tmp/filebrowser.tar.gz" | sha256sum -c + tar -xzf /tmp/filebrowser.tar.gz -C /tmp + sudo mv /tmp/filebrowser /usr/local/bin/ + sudo chmod +x /usr/local/bin/filebrowser + rm /tmp/filebrowser.tar.gz fi # Create entrypoint. diff --git a/.devcontainer/scripts/post_create.sh b/.devcontainer/scripts/post_create.sh index 8799908311431..50acf3b577b57 100755 --- a/.devcontainer/scripts/post_create.sh +++ b/.devcontainer/scripts/post_create.sh @@ -1,7 +1,7 @@ #!/bin/sh install_devcontainer_cli() { - npm install -g @devcontainers/cli + npm install -g @devcontainers/cli@0.80.0 --integrity=sha512-w2EaxgjyeVGyzfA/KUEZBhyXqu/5PyWNXcnrXsZOBrt3aN2zyGiHrXoG54TF6K0b5DSCF01Rt5fnIyrCeFzFKw== } install_ssh_config() { diff --git a/dogfood/coder/Dockerfile b/dogfood/coder/Dockerfile index dbafcd7add427..4e86b9e7ddf8c 100644 --- a/dogfood/coder/Dockerfile +++ b/dogfood/coder/Dockerfile @@ -29,6 +29,7 @@ RUN apt-get update && \ mkdir --parents /usr/local/go && \ tar --extract --gzip --directory=/usr/local/go --file=/usr/local/go.tar.gz --strip-components=1 && \ mkdir --parents "$GOPATH" && \ + go env -w GOSUMDB=sum.golang.org && \ # moq for Go tests. go install github.com/matryer/moq@v0.2.3 && \ # swag for Swagger doc generation @@ -252,9 +253,9 @@ RUN source $NVM_DIR/nvm.sh && \ nvm install $NODE_VERSION && \ nvm use $NODE_VERSION ENV PATH=$NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH -# Allow patch updates for npm and pnpm -RUN npm install -g npm@10.8.1 --integrity=sha512-Dp1C6SvSMYQI7YHq/y2l94uvI+59Eqbu1EpuKQHQ8p16txXRuRit5gH3Lnaagk2aXDIjg/Iru9pd05bnneKgdw== -RUN npm install -g pnpm@9.15.1 --integrity=sha512-GstWXmGT7769p3JwKVBGkVDPErzHZCYudYfnHRncmKQj3/lTblfqRMSb33kP9pToPCe+X6oj1n4MAztYO+S/zw== +RUN corepack enable && \ + corepack prepare npm@10.8.1 --activate && \ + corepack prepare pnpm@9.15.1 --activate RUN pnpx playwright@1.47.0 install --with-deps chromium diff --git a/scripts/Dockerfile.base b/scripts/Dockerfile.base index 8bcb59c325b19..f5e89f8a048fa 100644 --- a/scripts/Dockerfile.base +++ b/scripts/Dockerfile.base @@ -1,7 +1,7 @@ # This is the base image used for Coder images. It's a multi-arch image that is # built in depot.dev for all supported architectures. Since it's built on real # hardware and not cross-compiled, it can have "RUN" commands. -FROM alpine:3.21.3 +FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c # We use a single RUN command to reduce the number of layers in the image. # NOTE: Keep the Terraform version in sync with minTerraformVersion and From 0c761792aec37aa1ea0b97075600370f06210279 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:05:17 +0000 Subject: [PATCH 043/260] chore: bump coder/personalize/coder from 1.0.30 to 1.0.31 in /dogfood/coder (#19132) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/personalize/coder&package-manager=terraform&previous-version=1.0.30&new-version=1.0.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---

Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index 3531257565f6b..f031273770a75 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -288,7 +288,7 @@ module "git-clone" { module "personalize" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/personalize/coder" - version = "1.0.30" + version = "1.0.31" agent_id = coder_agent.dev.id } From 9626a2bafec09c74e8bedd2d49d03e6cefc3cfd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:06:14 +0000 Subject: [PATCH 044/260] chore: bump coder/personalize/coder from 1.0.30 to 1.0.31 in /dogfood/coder-envbuilder (#19133) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/personalize/coder&package-manager=terraform&previous-version=1.0.30&new-version=1.0.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder-envbuilder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder-envbuilder/main.tf b/dogfood/coder-envbuilder/main.tf index fb57bebffa9a1..b6318c7b1408b 100644 --- a/dogfood/coder-envbuilder/main.tf +++ b/dogfood/coder-envbuilder/main.tf @@ -123,7 +123,7 @@ module "dotfiles" { module "personalize" { source = "dev.registry.coder.com/coder/personalize/coder" - version = "1.0.30" + version = "1.0.31" agent_id = coder_agent.dev.id } From 369a74a566d84223ee64f4c421d76d21d73f8a4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:06:53 +0000 Subject: [PATCH 045/260] chore: bump coder/coder-login/coder from 1.0.30 to 1.0.31 in /dogfood/coder (#19134) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/coder-login/coder&package-manager=terraform&previous-version=1.0.30&new-version=1.0.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index f031273770a75..bba7ae49e4cc6 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -335,7 +335,7 @@ module "filebrowser" { module "coder-login" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/coder-login/coder" - version = "1.0.30" + version = "1.0.31" agent_id = coder_agent.dev.id } From e8ca4f8cf49094933502f63d1af0e12bba234894 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:07:55 +0000 Subject: [PATCH 046/260] chore: bump coder/zed/coder from 1.0.0 to 1.0.1 in /dogfood/coder (#19135) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/zed/coder&package-manager=terraform&previous-version=1.0.0&new-version=1.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index bba7ae49e4cc6..3834009818efe 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -358,7 +358,7 @@ module "windsurf" { module "zed" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/zed/coder" - version = "1.0.0" + version = "1.0.1" agent_id = coder_agent.dev.id agent_name = "dev" folder = local.repo_dir From 206b5683f9694d7a068af01ac63e0d14315d886c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:10:31 +0000 Subject: [PATCH 047/260] chore: bump coder/coder-login/coder from 1.0.30 to 1.0.31 in /dogfood/coder-envbuilder (#19137) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/coder-login/coder&package-manager=terraform&previous-version=1.0.30&new-version=1.0.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder-envbuilder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder-envbuilder/main.tf b/dogfood/coder-envbuilder/main.tf index b6318c7b1408b..d4597cfc32a7b 100644 --- a/dogfood/coder-envbuilder/main.tf +++ b/dogfood/coder-envbuilder/main.tf @@ -154,7 +154,7 @@ module "filebrowser" { module "coder-login" { source = "dev.registry.coder.com/coder/coder-login/coder" - version = "1.0.30" + version = "1.0.31" agent_id = coder_agent.dev.id } From b605569929c06404c0e7bc1d4802bbce43924f24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:10:46 +0000 Subject: [PATCH 048/260] chore: bump coder/slackme/coder from 1.0.30 to 1.0.31 in /dogfood/coder (#19136) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/slackme/coder&package-manager=terraform&previous-version=1.0.30&new-version=1.0.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index 3834009818efe..6fb1bb6c0be64 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -264,7 +264,7 @@ data "coder_workspace_tags" "tags" { module "slackme" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/slackme/coder" - version = "1.0.30" + version = "1.0.31" agent_id = coder_agent.dev.id auth_provider_id = "slack" } From a512f1a055cc532bfe08e70870c1801dabda1e5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:14:00 +0000 Subject: [PATCH 049/260] chore: bump coder/dotfiles/coder from 1.2.0 to 1.2.1 in /dogfood/coder (#19138) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/dotfiles/coder&package-manager=terraform&previous-version=1.2.0&new-version=1.2.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index 6fb1bb6c0be64..9be53657958eb 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -272,7 +272,7 @@ module "slackme" { module "dotfiles" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/dotfiles/coder" - version = "1.2.0" + version = "1.2.1" agent_id = coder_agent.dev.id } From c849a9579d3dd2f2ea43ad631174347c134307f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:14:08 +0000 Subject: [PATCH 050/260] chore: bump coder/filebrowser/coder from 1.1.1 to 1.1.2 in /dogfood/coder (#19139) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/filebrowser/coder&package-manager=terraform&previous-version=1.1.1&new-version=1.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index 9be53657958eb..c9bd9cb9633c0 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -327,7 +327,7 @@ module "jetbrains" { module "filebrowser" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/filebrowser/coder" - version = "1.1.1" + version = "1.1.2" agent_id = coder_agent.dev.id agent_name = "dev" } From 719c9cc4096f1a5d65b0b3496be5e9b9569e6ca5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 01:22:36 +0000 Subject: [PATCH 051/260] chore: bump coder/filebrowser/coder from 1.1.1 to 1.1.2 in /dogfood/coder-envbuilder (#19140) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/filebrowser/coder&package-manager=terraform&previous-version=1.1.1&new-version=1.1.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder-envbuilder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder-envbuilder/main.tf b/dogfood/coder-envbuilder/main.tf index d4597cfc32a7b..da2e70b1fef51 100644 --- a/dogfood/coder-envbuilder/main.tf +++ b/dogfood/coder-envbuilder/main.tf @@ -148,7 +148,7 @@ module "jetbrains_gateway" { module "filebrowser" { source = "dev.registry.coder.com/coder/filebrowser/coder" - version = "1.1.1" + version = "1.1.2" agent_id = coder_agent.dev.id } From decd9b7818da094a4ca18ae6428060289a1e2595 Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:01:01 +1000 Subject: [PATCH 052/260] ci: conditionally disable spotlight indexing on nightly gauntlet (#19142) Same as #19124 --- .github/workflows/nightly-gauntlet.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/nightly-gauntlet.yaml b/.github/workflows/nightly-gauntlet.yaml index a8e8fc957ee37..6fb353de9b258 100644 --- a/.github/workflows/nightly-gauntlet.yaml +++ b/.github/workflows/nightly-gauntlet.yaml @@ -37,6 +37,11 @@ jobs: - name: Disable Spotlight Indexing if: runner.os == 'macOS' run: | + enabled=$(sudo mdutil -a -s | grep "Indexing enabled" | wc -l) + if [ $enabled -eq 0 ]; then + echo "Spotlight indexing is already disabled" + exit 0 + fi sudo mdutil -a -i off sudo mdutil -X / sudo launchctl bootout system /System/Library/LaunchDaemons/com.apple.metadata.mds.plist From b95cf47f9998e21f8d97c913424f5ec052c4ab19 Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:01:24 +1000 Subject: [PATCH 053/260] ci: set valid xcode version in release script (#19143) 16.0.0 was yanked from the macOS runners, so this will likely need cherry picking into the upcoming release branch. We've already checked everything builds fine on #19125. In a few releases we'll stop building the dylib and also therefore remove xcode as a dependency on coder/coder altogether. --- .github/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 9feaf72b938ff..6ea28ad87a90c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -60,7 +60,7 @@ jobs: - name: Switch XCode Version uses: maxim-lobanov/setup-xcode@60606e260d2fc5762a71e64e74b2174e8ea3c8bd # v1.6.0 with: - xcode-version: "16.0.0" + xcode-version: "16.1.0" - name: Setup Go uses: ./.github/actions/setup-go @@ -655,7 +655,7 @@ jobs: detached_signature="${binary}.asc" gcloud storage cp "./site/out/bin/${binary}" "gs://releases.coder.com/coder-cli/${version}/${binary}" gcloud storage cp "./site/out/bin/${detached_signature}" "gs://releases.coder.com/coder-cli/${version}/${detached_signature}" - done + done - name: Publish release run: | From e80f91e900b72715b73651ed94189f1d64f8a9fb Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Mon, 4 Aug 2025 10:04:44 +0400 Subject: [PATCH 054/260] chore: add small scenario to scaletest (#19110) Relaxes the `terraform` version constraint to be at least 1.9, since 1.12 is installed in our Dogfood image Adds a `small` scenario to keep costs down while we continue to develop capabilities. --- scaletest/terraform/action/.gitignore | 1 + scaletest/terraform/action/main.tf | 4 +-- scaletest/terraform/action/scenarios.tf | 35 +++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 scaletest/terraform/action/.gitignore diff --git a/scaletest/terraform/action/.gitignore b/scaletest/terraform/action/.gitignore new file mode 100644 index 0000000000000..c45cf41694258 --- /dev/null +++ b/scaletest/terraform/action/.gitignore @@ -0,0 +1 @@ +*.tfvars diff --git a/scaletest/terraform/action/main.tf b/scaletest/terraform/action/main.tf index 57a294710c5b5..c5e22ff9f03ad 100644 --- a/scaletest/terraform/action/main.tf +++ b/scaletest/terraform/action/main.tf @@ -16,7 +16,7 @@ terraform { } // We use the kubectl provider to apply Custom Resources. - // The kubernetes provider requires the CRD is already present + // The kubernetes provider requires the CRD is already present // and would require a separate apply step beforehand. // https://github.com/hashicorp/terraform-provider-kubernetes/issues/1367 kubectl = { @@ -40,7 +40,7 @@ terraform { } } - required_version = "~> 1.9.0" + required_version = ">= 1.9.0" } provider "google" { diff --git a/scaletest/terraform/action/scenarios.tf b/scaletest/terraform/action/scenarios.tf index bd22fa7c5b54f..b135b977047de 100644 --- a/scaletest/terraform/action/scenarios.tf +++ b/scaletest/terraform/action/scenarios.tf @@ -35,5 +35,40 @@ locals { max_connections = 500 } } + small = { + coder = { + nodepool_size = 3 + machine_type = "c2d-standard-8" + replicas = 3 + cpu_request = "4000m" + mem_request = "12Gi" + cpu_limit = "4000m" + mem_limit = "12Gi" + } + provisionerd = { + replicas = 5 + cpu_request = "100m" + mem_request = "256Mi" + cpu_limit = "1000m" + mem_limit = "1Gi" + } + workspaces = { + count_per_deployment = 10 + nodepool_size = 3 + machine_type = "c2d-standard-8" + cpu_request = "100m" + mem_request = "128Mi" + cpu_limit = "100m" + mem_limit = "128Mi" + } + misc = { + nodepool_size = 1 + machine_type = "c2d-standard-8" + } + cloudsql = { + tier = "db-custom-2-7680" + max_connections = 100 + } + } } } From d4b44185da636dfbc1527aac59ff245efb3c3705 Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Mon, 4 Aug 2025 13:22:04 +0400 Subject: [PATCH 055/260] chore: add database dump and dbfake logging (#19144) relates to #778 Somehow in `TestWorkspaceAgent` the agent with the test instance identifier is not being added to the database, or is getting deleted. I'm adding some additional logging to `dbfake` and setting the affected tests to dump postgres on error, to see if we can get to the bottom of the issue. --- .github/workflows/ci.yaml | 6 +++ cli/agent_test.go | 22 +++++++++-- coderd/database/dbfake/dbfake.go | 66 +++++++++++++++++++++++++++++--- coderd/database/dbtestutil/db.go | 2 +- 4 files changed, 86 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fbc34b0dfb6ec..571e7ce15580c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -490,6 +490,12 @@ jobs: gotestsum --format standard-quiet --packages "$PACKAGES" \ -- -timeout=20m -v -p $NUM_PARALLEL_PACKAGES -parallel=$NUM_PARALLEL_TESTS $TESTCOUNT + - name: Upload failed test db dumps + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: failed-test-db-dump-${{matrix.os}} + path: "**/*.test.sql" + - name: Upload Go Build Cache uses: ./.github/actions/test-cache/upload with: diff --git a/cli/agent_test.go b/cli/agent_test.go index 0a948c0c84e9a..1592235babaef 100644 --- a/cli/agent_test.go +++ b/cli/agent_test.go @@ -21,6 +21,7 @@ import ( "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbfake" + "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/codersdk/workspacesdk" "github.com/coder/coder/v2/provisionersdk/proto" @@ -67,7 +68,12 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() instanceID := "instanceidentifier" certificates, metadataClient := coderdtest.NewAzureInstanceIdentity(t, instanceID) - client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ + db, ps := dbtestutil.NewDB(t, + dbtestutil.WithDumpOnFailure(), + ) + client := coderdtest.New(t, &coderdtest.Options{ + Database: db, + Pubsub: ps, AzureCertificates: certificates, }) user := coderdtest.CreateFirstUser(t, client) @@ -106,7 +112,12 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() instanceID := "instanceidentifier" certificates, metadataClient := coderdtest.NewAWSInstanceIdentity(t, instanceID) - client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ + db, ps := dbtestutil.NewDB(t, + dbtestutil.WithDumpOnFailure(), + ) + client := coderdtest.New(t, &coderdtest.Options{ + Database: db, + Pubsub: ps, AWSCertificates: certificates, }) user := coderdtest.CreateFirstUser(t, client) @@ -146,7 +157,12 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() instanceID := "instanceidentifier" validator, metadataClient := coderdtest.NewGoogleInstanceIdentity(t, instanceID, false) - client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ + db, ps := dbtestutil.NewDB(t, + dbtestutil.WithDumpOnFailure(), + ) + client := coderdtest.New(t, &coderdtest.Options{ + Database: db, + Pubsub: ps, GoogleTokenValidator: validator, }) owner := coderdtest.CreateFirstUser(t, client) diff --git a/coderd/database/dbfake/dbfake.go b/coderd/database/dbfake/dbfake.go index e7c00255d47c2..6d99005fb3334 100644 --- a/coderd/database/dbfake/dbfake.go +++ b/coderd/database/dbfake/dbfake.go @@ -12,6 +12,9 @@ import ( "github.com/sqlc-dev/pqtype" "github.com/stretchr/testify/require" + "cdr.dev/slog" + "cdr.dev/slog/sloggers/slogtest" + "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/database/dbgen" @@ -43,6 +46,7 @@ type WorkspaceResponse struct { // resources. type WorkspaceBuildBuilder struct { t testing.TB + logger slog.Logger db database.Store ps pubsub.Pubsub ws database.WorkspaceTable @@ -62,7 +66,10 @@ type workspaceBuildDisposition struct { // Omitting the template ID on a workspace will also generate a new template // with a template version. func WorkspaceBuild(t testing.TB, db database.Store, ws database.WorkspaceTable) WorkspaceBuildBuilder { - return WorkspaceBuildBuilder{t: t, db: db, ws: ws} + return WorkspaceBuildBuilder{ + t: t, db: db, ws: ws, + logger: slogtest.Make(t, &slogtest.Options{}).Named("dbfake").Leveled(slog.LevelDebug), + } } func (b WorkspaceBuildBuilder) Pubsub(ps pubsub.Pubsub) WorkspaceBuildBuilder { @@ -131,6 +138,7 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { AgentToken: b.agentToken, } if b.ws.TemplateID == uuid.Nil { + b.logger.Debug(context.Background(), "creating template and version") resp.TemplateVersionResponse = TemplateVersion(b.t, b.db). Resources(b.resources...). Pubsub(b.ps). @@ -145,6 +153,7 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { // If no template version is set assume the active version. if b.seed.TemplateVersionID == uuid.Nil { + b.logger.Debug(context.Background(), "assuming active template version") template, err := b.db.GetTemplateByID(ownerCtx, b.ws.TemplateID) require.NoError(b.t, err) require.NotNil(b.t, template.ActiveVersionID, "active version ID unexpectedly nil") @@ -156,6 +165,9 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { // nolint: revive b.ws = dbgen.Workspace(b.t, b.db, b.ws) resp.Workspace = b.ws + b.logger.Debug(context.Background(), "created workspace", + slog.F("name", resp.Workspace.Name), + slog.F("workspace_id", resp.Workspace.ID)) } b.seed.WorkspaceID = b.ws.ID b.seed.InitiatorID = takeFirst(b.seed.InitiatorID, b.ws.OwnerID) @@ -182,10 +194,12 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { LogsOverflowed: false, }) require.NoError(b.t, err, "insert job") + b.logger.Debug(context.Background(), "inserted provisioner job", slog.F("job_id", job.ID)) if b.dispo.starting { // might need to do this multiple times if we got a template version // import job as well + b.logger.Debug(context.Background(), "looping to acquire provisioner job") for { j, err := b.db.AcquireProvisionerJob(ownerCtx, database.AcquireProvisionerJobParams{ OrganizationID: job.OrganizationID, @@ -202,10 +216,12 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { }) require.NoError(b.t, err, "acquire starting job") if j.ID == job.ID { + b.logger.Debug(context.Background(), "acquired provisioner job", slog.F("job_id", job.ID)) break } } } else { + b.logger.Debug(context.Background(), "completing the provisioner job") err = b.db.UpdateProvisionerJobWithCompleteByID(ownerCtx, database.UpdateProvisionerJobWithCompleteByIDParams{ ID: job.ID, UpdatedAt: dbtime.Now(), @@ -221,11 +237,16 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { } resp.Build = dbgen.WorkspaceBuild(b.t, b.db, b.seed) + b.logger.Debug(context.Background(), "created workspace build", + slog.F("build_id", resp.Build.ID), + slog.F("workspace_id", resp.Workspace.ID), + slog.F("build_number", resp.Build.BuildNumber)) for i := range b.params { b.params[i].WorkspaceBuildID = resp.Build.ID } - _ = dbgen.WorkspaceBuildParameters(b.t, b.db, b.params) + params := dbgen.WorkspaceBuildParameters(b.t, b.db, b.params) + b.logger.Debug(context.Background(), "created workspace build parameters", slog.F("count", len(params))) if b.ws.Deleted { err = b.db.UpdateWorkspaceDeletedByID(ownerCtx, database.UpdateWorkspaceDeletedByIDParams{ @@ -233,6 +254,7 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { Deleted: true, }) require.NoError(b.t, err) + b.logger.Debug(context.Background(), "deleted workspace", slog.F("workspace_id", resp.Workspace.ID)) } if b.ps != nil { @@ -243,6 +265,9 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { require.NoError(b.t, err) err = b.ps.Publish(wspubsub.WorkspaceEventChannel(resp.Workspace.OwnerID), msg) require.NoError(b.t, err) + b.logger.Debug(context.Background(), "published workspace event", + slog.F("owner_id", resp.Workspace.ID), + slog.F("owner_id", resp.Workspace.OwnerID)) } agents, err := b.db.GetWorkspaceAgentsByWorkspaceAndBuildNumber(ownerCtx, database.GetWorkspaceAgentsByWorkspaceAndBuildNumberParams{ @@ -260,7 +285,12 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { err = b.db.DeleteWorkspaceSubAgentByID(ownerCtx, subAgent.ID) require.NoError(b.t, err, "delete workspace agent subagent antagonist") - b.t.Logf("inserted deleted subagent antagonist %s (%v) for workspace agent %s (%v)", subAgent.Name, subAgent.ID, agent.Name, agent.ID) + b.logger.Debug(context.Background(), "inserted deleted subagent antagonist", + slog.F("subagent_name", subAgent.Name), + slog.F("subagent_id", subAgent.ID), + slog.F("agent_name", agent.Name), + slog.F("agent_id", agent.ID), + ) } } @@ -269,6 +299,7 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse { type ProvisionerJobResourcesBuilder struct { t testing.TB + logger slog.Logger db database.Store jobID uuid.UUID transition database.WorkspaceTransition @@ -281,6 +312,7 @@ func ProvisionerJobResources( ) ProvisionerJobResourcesBuilder { return ProvisionerJobResourcesBuilder{ t: t, + logger: slogtest.Make(t, &slogtest.Options{}).Named("dbfake").Leveled(slog.LevelDebug).With(slog.F("job_id", jobID)), db: db, jobID: jobID, transition: transition, @@ -292,13 +324,17 @@ func (b ProvisionerJobResourcesBuilder) Do() { b.t.Helper() transition := b.transition if transition == "" { - // Default to start! + b.logger.Debug(context.Background(), "setting default transition to start") transition = database.WorkspaceTransitionStart } for _, resource := range b.resources { //nolint:gocritic // This is only used by tests. err := provisionerdserver.InsertWorkspaceResource(ownerCtx, b.db, b.jobID, transition, resource, &telemetry.Snapshot{}) require.NoError(b.t, err) + b.logger.Debug(context.Background(), "created workspace resource", + slog.F("resource_name", resource.Name), + slog.F("agent_count", len(resource.Agents)), + ) } } @@ -309,6 +345,7 @@ type TemplateVersionResponse struct { type TemplateVersionBuilder struct { t testing.TB + logger slog.Logger db database.Store seed database.TemplateVersion fileID uuid.UUID @@ -326,6 +363,7 @@ type TemplateVersionBuilder struct { func TemplateVersion(t testing.TB, db database.Store) TemplateVersionBuilder { return TemplateVersionBuilder{ t: t, + logger: slogtest.Make(t, &slogtest.Options{}).Named("dbfake").Leveled(slog.LevelDebug), db: db, promote: true, autoCreateTemplate: true, @@ -396,9 +434,16 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse { Valid: true, UUID: resp.Template.ID, } + t.logger.Debug(context.Background(), "created template", + slog.F("organization_id", resp.Template.OrganizationID), + slog.F("template_id", resp.Template.CreatedBy), + ) } version := dbgen.TemplateVersion(t.t, t.db, t.seed) + t.logger.Debug(context.Background(), "created template version", + slog.F("template_version_id", version.ID), + ) if t.promote { err := t.db.UpdateTemplateActiveVersionByID(ownerCtx, database.UpdateTemplateActiveVersionByIDParams{ ID: t.seed.TemplateID.UUID, @@ -406,10 +451,13 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse { UpdatedAt: dbtime.Now(), }) require.NoError(t.t, err) + t.logger.Debug(context.Background(), "promoted template version", + slog.F("template_version_id", t.seed.ID), + ) } for _, preset := range t.presets { - dbgen.Preset(t.t, t.db, database.InsertPresetParams{ + prst := dbgen.Preset(t.t, t.db, database.InsertPresetParams{ ID: preset.ID, TemplateVersionID: version.ID, Name: preset.Name, @@ -421,14 +469,19 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse { Description: preset.Description, Icon: preset.Icon, }) + t.logger.Debug(context.Background(), "added preset", + slog.F("preset_id", prst.ID), + slog.F("preset_name", prst.Name), + ) } for _, presetParam := range t.presetParams { - dbgen.PresetParameter(t.t, t.db, database.InsertPresetParametersParams{ + prm := dbgen.PresetParameter(t.t, t.db, database.InsertPresetParametersParams{ TemplateVersionPresetID: presetParam.TemplateVersionPresetID, Names: []string{presetParam.Name}, Values: []string{presetParam.Value}, }) + t.logger.Debug(context.Background(), "added preset parameter", slog.F("param_name", prm[0].Name)) } payload, err := json.Marshal(provisionerdserver.TemplateVersionImportJob{ @@ -448,6 +501,7 @@ func (t TemplateVersionBuilder) Do() TemplateVersionResponse { }, FileID: t.fileID, }) + t.logger.Debug(context.Background(), "added template version import job", slog.F("job_id", job.ID)) t.seed.JobID = job.ID diff --git a/coderd/database/dbtestutil/db.go b/coderd/database/dbtestutil/db.go index f67e3206b09d1..4c7d7dcbf230e 100644 --- a/coderd/database/dbtestutil/db.go +++ b/coderd/database/dbtestutil/db.go @@ -206,7 +206,7 @@ func DumpOnFailure(t testing.TB, connectionURL string) { outPath := filepath.Join(cwd, snakeCaseName+"."+timeSuffix+".test.sql") dump, err := PGDump(connectionURL) if err != nil { - t.Errorf("dump on failure: failed to run pg_dump") + t.Errorf("dump on failure: failed to run pg_dump: %s", err.Error()) return } if err := os.WriteFile(outPath, normalizeDump(dump), 0o600); err != nil { From 79cd80e5ca0ab9a7937533c2efe91add3e67e9f7 Mon Sep 17 00:00:00 2001 From: Hugo Dutka Date: Mon, 4 Aug 2025 14:11:22 +0200 Subject: [PATCH 056/260] feat: add MCP tools for ChatGPT (#19102) Addresses https://github.com/coder/internal/issues/772. Adds the toolset query parameter to the `/api/experimental/mcp/http` endpoint, which, when set to "chatgpt", exposes new `fetch` and `search` tools compatible with ChatGPT, as described in the [ChatGPT docs](https://platform.openai.com/docs/mcp). These tools are exposed in isolation because in my usage I found that ChatGPT refuses to connect to Coder if it sees additional MCP tools. Screenshot 2025-07-30 at 16 36 56 --- coderd/mcp/mcp.go | 36 +- coderd/mcp/mcp_e2e_test.go | 149 ++++++++ coderd/mcp_http.go | 33 +- codersdk/toolsdk/chatgpt.go | 436 ++++++++++++++++++++++++ codersdk/toolsdk/chatgpt_test.go | 566 +++++++++++++++++++++++++++++++ codersdk/toolsdk/toolsdk.go | 11 + 6 files changed, 1223 insertions(+), 8 deletions(-) create mode 100644 codersdk/toolsdk/chatgpt.go create mode 100644 codersdk/toolsdk/chatgpt_test.go diff --git a/coderd/mcp/mcp.go b/coderd/mcp/mcp.go index f17ab5ae7cd93..3696beff500a1 100644 --- a/coderd/mcp/mcp.go +++ b/coderd/mcp/mcp.go @@ -67,7 +67,9 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { s.streamableServer.ServeHTTP(w, r) } -// RegisterTools registers all available MCP tools with the server +// Register all available MCP tools with the server excluding: +// - ReportTask - which requires dependencies not available in the remote MCP context +// - ChatGPT search and fetch tools, which are redundant with the standard tools. func (s *Server) RegisterTools(client *codersdk.Client) error { if client == nil { return xerrors.New("client cannot be nil: MCP HTTP server requires authenticated client") @@ -79,10 +81,36 @@ func (s *Server) RegisterTools(client *codersdk.Client) error { return xerrors.Errorf("failed to initialize tool dependencies: %w", err) } - // Register all available tools, but exclude tools that require dependencies not available in the - // remote MCP context for _, tool := range toolsdk.All { - if tool.Name == toolsdk.ToolNameReportTask { + // the ReportTask tool requires dependencies not available in the remote MCP context + // the ChatGPT search and fetch tools are redundant with the standard tools. + if tool.Name == toolsdk.ToolNameReportTask || + tool.Name == toolsdk.ToolNameChatGPTSearch || tool.Name == toolsdk.ToolNameChatGPTFetch { + continue + } + + s.mcpServer.AddTools(mcpFromSDK(tool, toolDeps)) + } + return nil +} + +// ChatGPT tools are the search and fetch tools as defined in https://platform.openai.com/docs/mcp. +// We do not expose any extra ones because ChatGPT has an undocumented "Safety Scan" feature. +// In my experiments, if I included extra tools in the MCP server, ChatGPT would often - but not always - +// refuse to add Coder as a connector. +func (s *Server) RegisterChatGPTTools(client *codersdk.Client) error { + if client == nil { + return xerrors.New("client cannot be nil: MCP HTTP server requires authenticated client") + } + + // Create tool dependencies + toolDeps, err := toolsdk.NewDeps(client) + if err != nil { + return xerrors.Errorf("failed to initialize tool dependencies: %w", err) + } + + for _, tool := range toolsdk.All { + if tool.Name != toolsdk.ToolNameChatGPTSearch && tool.Name != toolsdk.ToolNameChatGPTFetch { continue } diff --git a/coderd/mcp/mcp_e2e_test.go b/coderd/mcp/mcp_e2e_test.go index 248786405fda9..b831d150c2c0d 100644 --- a/coderd/mcp/mcp_e2e_test.go +++ b/coderd/mcp/mcp_e2e_test.go @@ -1215,6 +1215,155 @@ func TestMCPHTTP_E2E_OAuth2_EndToEnd(t *testing.T) { }) } +func TestMCPHTTP_E2E_ChatGPTEndpoint(t *testing.T) { + t.Parallel() + + // Setup Coder server with authentication + coderClient, closer, api := coderdtest.NewWithAPI(t, &coderdtest.Options{ + IncludeProvisionerDaemon: true, + }) + defer closer.Close() + + user := coderdtest.CreateFirstUser(t, coderClient) + + // Create template and workspace for testing search functionality + version := coderdtest.CreateTemplateVersion(t, coderClient, user.OrganizationID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, coderClient, version.ID) + template := coderdtest.CreateTemplate(t, coderClient, user.OrganizationID, version.ID) + + // Create MCP client pointing to the ChatGPT endpoint + mcpURL := api.AccessURL.String() + "/api/experimental/mcp/http?toolset=chatgpt" + + // Configure client with authentication headers using RFC 6750 Bearer token + mcpClient, err := mcpclient.NewStreamableHttpClient(mcpURL, + transport.WithHTTPHeaders(map[string]string{ + "Authorization": "Bearer " + coderClient.SessionToken(), + })) + require.NoError(t, err) + t.Cleanup(func() { + if closeErr := mcpClient.Close(); closeErr != nil { + t.Logf("Failed to close MCP client: %v", closeErr) + } + }) + + ctx, cancel := context.WithTimeout(t.Context(), testutil.WaitLong) + defer cancel() + + // Start client + err = mcpClient.Start(ctx) + require.NoError(t, err) + + // Initialize connection + initReq := mcp.InitializeRequest{ + Params: mcp.InitializeParams{ + ProtocolVersion: mcp.LATEST_PROTOCOL_VERSION, + ClientInfo: mcp.Implementation{ + Name: "test-chatgpt-client", + Version: "1.0.0", + }, + }, + } + + result, err := mcpClient.Initialize(ctx, initReq) + require.NoError(t, err) + require.Equal(t, mcpserver.MCPServerName, result.ServerInfo.Name) + require.Equal(t, mcp.LATEST_PROTOCOL_VERSION, result.ProtocolVersion) + require.NotNil(t, result.Capabilities) + + // Test tool listing - should only have search and fetch tools for ChatGPT + tools, err := mcpClient.ListTools(ctx, mcp.ListToolsRequest{}) + require.NoError(t, err) + require.NotEmpty(t, tools.Tools) + + // Verify we have exactly the ChatGPT tools and no others + var foundTools []string + for _, tool := range tools.Tools { + foundTools = append(foundTools, tool.Name) + } + + // ChatGPT endpoint should only expose search and fetch tools + assert.Contains(t, foundTools, toolsdk.ToolNameChatGPTSearch, "Should have ChatGPT search tool") + assert.Contains(t, foundTools, toolsdk.ToolNameChatGPTFetch, "Should have ChatGPT fetch tool") + assert.Len(t, foundTools, 2, "ChatGPT endpoint should only expose search and fetch tools") + + // Should NOT have other tools that are available in the standard endpoint + assert.NotContains(t, foundTools, toolsdk.ToolNameGetAuthenticatedUser, "Should not have authenticated user tool") + assert.NotContains(t, foundTools, toolsdk.ToolNameListWorkspaces, "Should not have list workspaces tool") + + t.Logf("ChatGPT endpoint tools: %v", foundTools) + + // Test search tool - search for templates + var searchTool *mcp.Tool + for _, tool := range tools.Tools { + if tool.Name == toolsdk.ToolNameChatGPTSearch { + searchTool = &tool + break + } + } + require.NotNil(t, searchTool, "Expected to find search tool") + + // Execute search for templates + searchReq := mcp.CallToolRequest{ + Params: mcp.CallToolParams{ + Name: searchTool.Name, + Arguments: map[string]any{ + "query": "templates", + }, + }, + } + + searchResult, err := mcpClient.CallTool(ctx, searchReq) + require.NoError(t, err) + require.NotEmpty(t, searchResult.Content) + + // Verify the search result contains our template + assert.Len(t, searchResult.Content, 1) + if textContent, ok := searchResult.Content[0].(mcp.TextContent); ok { + assert.Equal(t, "text", textContent.Type) + assert.Contains(t, textContent.Text, template.ID.String(), "Search result should contain our test template") + t.Logf("Search result: %s", textContent.Text) + } else { + t.Errorf("Expected TextContent type, got %T", searchResult.Content[0]) + } + + // Test fetch tool + var fetchTool *mcp.Tool + for _, tool := range tools.Tools { + if tool.Name == toolsdk.ToolNameChatGPTFetch { + fetchTool = &tool + break + } + } + require.NotNil(t, fetchTool, "Expected to find fetch tool") + + // Execute fetch for the template + fetchReq := mcp.CallToolRequest{ + Params: mcp.CallToolParams{ + Name: fetchTool.Name, + Arguments: map[string]any{ + "id": fmt.Sprintf("template:%s", template.ID.String()), + }, + }, + } + + fetchResult, err := mcpClient.CallTool(ctx, fetchReq) + require.NoError(t, err) + require.NotEmpty(t, fetchResult.Content) + + // Verify the fetch result contains template details + assert.Len(t, fetchResult.Content, 1) + if textContent, ok := fetchResult.Content[0].(mcp.TextContent); ok { + assert.Equal(t, "text", textContent.Type) + assert.Contains(t, textContent.Text, template.Name, "Fetch result should contain template name") + assert.Contains(t, textContent.Text, template.ID.String(), "Fetch result should contain template ID") + t.Logf("Fetch result contains template data") + } else { + t.Errorf("Expected TextContent type, got %T", fetchResult.Content[0]) + } + + t.Logf("ChatGPT endpoint E2E test successful: search and fetch tools working correctly") +} + // Helper function to parse URL safely in tests func mustParseURL(t *testing.T, rawURL string) *url.URL { u, err := url.Parse(rawURL) diff --git a/coderd/mcp_http.go b/coderd/mcp_http.go index 40aaaa1c40dd5..51082858fe55e 100644 --- a/coderd/mcp_http.go +++ b/coderd/mcp_http.go @@ -1,6 +1,7 @@ package coderd import ( + "fmt" "net/http" "cdr.dev/slog" @@ -11,7 +12,15 @@ import ( "github.com/coder/coder/v2/codersdk" ) +type MCPToolset string + +const ( + MCPToolsetStandard MCPToolset = "standard" + MCPToolsetChatGPT MCPToolset = "chatgpt" +) + // mcpHTTPHandler creates the MCP HTTP transport handler +// It supports a "toolset" query parameter to select the set of tools to register. func (api *API) mcpHTTPHandler() http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Create MCP server instance for each request @@ -23,14 +32,30 @@ func (api *API) mcpHTTPHandler() http.Handler { }) return } - authenticatedClient := codersdk.New(api.AccessURL) // Extract the original session token from the request authenticatedClient.SetSessionToken(httpmw.APITokenFromRequest(r)) - // Register tools with authenticated client - if err := mcpServer.RegisterTools(authenticatedClient); err != nil { - api.Logger.Warn(r.Context(), "failed to register MCP tools", slog.Error(err)) + toolset := MCPToolset(r.URL.Query().Get("toolset")) + // Default to standard toolset if no toolset is specified. + if toolset == "" { + toolset = MCPToolsetStandard + } + + switch toolset { + case MCPToolsetStandard: + if err := mcpServer.RegisterTools(authenticatedClient); err != nil { + api.Logger.Warn(r.Context(), "failed to register MCP tools", slog.Error(err)) + } + case MCPToolsetChatGPT: + if err := mcpServer.RegisterChatGPTTools(authenticatedClient); err != nil { + api.Logger.Warn(r.Context(), "failed to register MCP tools", slog.Error(err)) + } + default: + httpapi.Write(r.Context(), w, http.StatusBadRequest, codersdk.Response{ + Message: fmt.Sprintf("Invalid toolset: %s", toolset), + }) + return } // Handle the MCP request diff --git a/codersdk/toolsdk/chatgpt.go b/codersdk/toolsdk/chatgpt.go new file mode 100644 index 0000000000000..c4bf5b5d4c174 --- /dev/null +++ b/codersdk/toolsdk/chatgpt.go @@ -0,0 +1,436 @@ +package toolsdk + +import ( + "context" + "encoding/json" + "fmt" + "strings" + + "golang.org/x/xerrors" + + "github.com/google/uuid" + + "github.com/coder/aisdk-go" + "github.com/coder/coder/v2/codersdk" +) + +type ObjectType string + +const ( + ObjectTypeTemplate ObjectType = "template" + ObjectTypeWorkspace ObjectType = "workspace" +) + +type ObjectID struct { + Type ObjectType + ID string +} + +func (o ObjectID) String() string { + return fmt.Sprintf("%s:%s", o.Type, o.ID) +} + +func parseObjectID(id string) (ObjectID, error) { + parts := strings.Split(id, ":") + if len(parts) != 2 || (parts[0] != "template" && parts[0] != "workspace") { + return ObjectID{}, xerrors.Errorf("invalid ID: %s", id) + } + return ObjectID{ + Type: ObjectType(parts[0]), + ID: parts[1], + }, nil +} + +func createObjectID(objectType ObjectType, id string) ObjectID { + return ObjectID{ + Type: objectType, + ID: id, + } +} + +func searchTemplates(ctx context.Context, deps Deps, query string) ([]SearchResultItem, error) { + serverURL := deps.ServerURL() + templates, err := deps.coderClient.Templates(ctx, codersdk.TemplateFilter{ + SearchQuery: query, + }) + if err != nil { + return nil, err + } + results := make([]SearchResultItem, len(templates)) + for i, template := range templates { + results[i] = SearchResultItem{ + ID: createObjectID(ObjectTypeTemplate, template.ID.String()).String(), + Title: template.DisplayName, + Text: template.Description, + URL: fmt.Sprintf("%s/templates/%s/%s", serverURL, template.OrganizationName, template.Name), + } + } + return results, nil +} + +func searchWorkspaces(ctx context.Context, deps Deps, query string) ([]SearchResultItem, error) { + serverURL := deps.ServerURL() + workspaces, err := deps.coderClient.Workspaces(ctx, codersdk.WorkspaceFilter{ + FilterQuery: query, + }) + if err != nil { + return nil, err + } + results := make([]SearchResultItem, len(workspaces.Workspaces)) + for i, workspace := range workspaces.Workspaces { + results[i] = SearchResultItem{ + ID: createObjectID(ObjectTypeWorkspace, workspace.ID.String()).String(), + Title: workspace.Name, + Text: fmt.Sprintf("Owner: %s\nTemplate: %s\nLatest transition: %s", workspace.OwnerName, workspace.TemplateDisplayName, workspace.LatestBuild.Transition), + URL: fmt.Sprintf("%s/%s/%s", serverURL, workspace.OwnerName, workspace.Name), + } + } + return results, nil +} + +type SearchQueryType string + +const ( + SearchQueryTypeTemplates SearchQueryType = "templates" + SearchQueryTypeWorkspaces SearchQueryType = "workspaces" +) + +type SearchQuery struct { + Type SearchQueryType + Query string +} + +func parseSearchQuery(query string) (SearchQuery, error) { + parts := strings.Split(query, "/") + queryType := SearchQueryType(parts[0]) + if !(queryType == SearchQueryTypeTemplates || queryType == SearchQueryTypeWorkspaces) { + return SearchQuery{}, xerrors.Errorf("invalid query: %s", query) + } + queryString := "" + if len(parts) > 1 { + queryString = strings.Join(parts[1:], "/") + } + return SearchQuery{ + Type: queryType, + Query: queryString, + }, nil +} + +type SearchArgs struct { + Query string `json:"query"` +} + +type SearchResultItem struct { + ID string `json:"id"` + Title string `json:"title"` + Text string `json:"text"` + URL string `json:"url"` +} + +type SearchResult struct { + Results []SearchResultItem `json:"results"` +} + +// Implements the "search" tool as described in https://platform.openai.com/docs/mcp#search-tool. +// From my experiments with ChatGPT, it has access to the description that is provided in the +// tool definition. This is in contrast to the "fetch" tool, where ChatGPT does not have access +// to the description. +var ChatGPTSearch = Tool[SearchArgs, SearchResult]{ + Tool: aisdk.Tool{ + Name: ToolNameChatGPTSearch, + // Note: the queries are passed directly to the list workspaces and list templates + // endpoints. The list of accepted parameters below is not exhaustive - some are omitted + // because they are not as useful in ChatGPT. + Description: `Search for templates, workspaces, and files in workspaces. + +To pick what you want to search for, use the following query formats: + +- ` + "`" + `templates/` + "`" + `: List templates. The query accepts the following, optional parameters delineated by whitespace: + - "name:" - Fuzzy search by template name (substring matching). Example: "name:docker" + - "organization:" - Filter by organization ID or name. Example: "organization:coder" + - "deprecated:" - Filter by deprecated status. Example: "deprecated:true" + - "deleted:" - Filter by deleted status. Example: "deleted:true" + - "has-ai-task:" - Filter by whether the template has an AI task. Example: "has-ai-task:true" +- ` + "`" + `workspaces/` + "`" + `: List workspaces. The query accepts the following, optional parameters delineated by whitespace: + - "owner:" - Filter by workspace owner (username or "me"). Example: "owner:alice" or "owner:me" + - "template:" - Filter by template name. Example: "template:web-development" + - "name:" - Filter by workspace name (substring matching). Example: "name:project" + - "organization:" - Filter by organization ID or name. Example: "organization:engineering" + - "status:" - Filter by workspace/build status. Values: starting, stopping, deleting, deleted, stopped, started, running, pending, canceling, canceled, failed. Example: "status:running" + - "has-agent:" - Filter by agent connectivity status. Values: connecting, connected, disconnected, timeout. Example: "has-agent:connected" + - "dormant:" - Filter dormant workspaces. Example: "dormant:true" + - "outdated:" - Filter workspaces using outdated template versions. Example: "outdated:true" + - "last_used_after:" - Filter workspaces last used after a specific date. Example: "last_used_after:2023-12-01T00:00:00Z" + - "last_used_before:" - Filter workspaces last used before a specific date. Example: "last_used_before:2023-12-31T23:59:59Z" + - "has-ai-task:" - Filter workspaces with AI tasks. Example: "has-ai-task:true" + - "param:" or "param:=" - Match workspaces by build parameters. Example: "param:environment=production" or "param:gpu" + +# Examples + +## Listing templates + +List all templates without any filters. + +` + "```" + `json +{ + "query": "templates" +} +` + "```" + ` + +List all templates with a "docker" substring in the name. + +` + "```" + `json +{ + "query": "templates/name:docker" +} +` + "```" + ` + +List templates in a specific organization. + +` + "```" + `json +{ + "query": "templates/organization:engineering" +} +` + "```" + ` + +List deprecated templates. + +` + "```" + `json +{ + "query": "templates/deprecated:true" +} +` + "```" + ` + +List templates that have AI tasks. + +` + "```" + `json +{ + "query": "templates/has-ai-task:true" +} +` + "```" + ` + +List templates with multiple filters - non-deprecated templates with "web" in the name. + +` + "```" + `json +{ + "query": "templates/name:web deprecated:false" +} +` + "```" + ` + +List deleted templates (requires appropriate permissions). + +` + "```" + `json +{ + "query": "templates/deleted:true" +} +` + "```" + ` + +## Listing workspaces + +List all workspaces belonging to the current user. + +` + "```" + `json +{ + "query": "workspaces/owner:me" +} +` + "```" + ` + +or + +` + "```" + `json +{ + "query": "workspaces" +} +` + "```" + ` + +List all workspaces belonging to a user with username "josh". + +` + "```" + `json +{ + "query": "workspaces/owner:josh" +} +` + "```" + ` + +List all running workspaces. + +` + "```" + `json +{ + "query": "workspaces/status:running" +} +` + "```" + ` + +List workspaces using a specific template. + +` + "```" + `json +{ + "query": "workspaces/template:web-development" +} +` + "```" + ` + +List dormant workspaces. + +` + "```" + `json +{ + "query": "workspaces/dormant:true" +} +` + "```" + ` + +List workspaces with connected agents. + +` + "```" + `json +{ + "query": "workspaces/has-agent:connected" +} +` + "```" + ` + +List workspaces with multiple filters - running workspaces owned by "alice". + +` + "```" + `json +{ + "query": "workspaces/owner:alice status:running" +} +` + "```" + ` +`, + Schema: aisdk.Schema{ + Properties: map[string]any{ + "query": map[string]any{ + "type": "string", + }, + }, + Required: []string{"query"}, + }, + }, + Handler: func(ctx context.Context, deps Deps, args SearchArgs) (SearchResult, error) { + query, err := parseSearchQuery(args.Query) + if err != nil { + return SearchResult{}, err + } + switch query.Type { + case SearchQueryTypeTemplates: + results, err := searchTemplates(ctx, deps, query.Query) + if err != nil { + return SearchResult{}, err + } + return SearchResult{Results: results}, nil + case SearchQueryTypeWorkspaces: + searchQuery := query.Query + if searchQuery == "" { + searchQuery = "owner:me" + } + results, err := searchWorkspaces(ctx, deps, searchQuery) + if err != nil { + return SearchResult{}, err + } + return SearchResult{Results: results}, nil + } + return SearchResult{}, xerrors.Errorf("reached unreachable code with query: %s", args.Query) + }, +} + +func fetchWorkspace(ctx context.Context, deps Deps, workspaceID string) (FetchResult, error) { + parsedID, err := uuid.Parse(workspaceID) + if err != nil { + return FetchResult{}, xerrors.Errorf("invalid workspace ID, must be a valid UUID: %w", err) + } + workspace, err := deps.coderClient.Workspace(ctx, parsedID) + if err != nil { + return FetchResult{}, err + } + workspaceJSON, err := json.Marshal(workspace) + if err != nil { + return FetchResult{}, xerrors.Errorf("failed to marshal workspace: %w", err) + } + return FetchResult{ + ID: workspace.ID.String(), + Title: workspace.Name, + Text: string(workspaceJSON), + URL: fmt.Sprintf("%s/%s/%s", deps.ServerURL(), workspace.OwnerName, workspace.Name), + }, nil +} + +func fetchTemplate(ctx context.Context, deps Deps, templateID string) (FetchResult, error) { + parsedID, err := uuid.Parse(templateID) + if err != nil { + return FetchResult{}, xerrors.Errorf("invalid template ID, must be a valid UUID: %w", err) + } + template, err := deps.coderClient.Template(ctx, parsedID) + if err != nil { + return FetchResult{}, err + } + templateJSON, err := json.Marshal(template) + if err != nil { + return FetchResult{}, xerrors.Errorf("failed to marshal template: %w", err) + } + return FetchResult{ + ID: template.ID.String(), + Title: template.DisplayName, + Text: string(templateJSON), + URL: fmt.Sprintf("%s/templates/%s/%s", deps.ServerURL(), template.OrganizationName, template.Name), + }, nil +} + +type FetchArgs struct { + ID string `json:"id"` +} + +type FetchResult struct { + ID string `json:"id"` + Title string `json:"title"` + Text string `json:"text"` + URL string `json:"url"` + Metadata map[string]string `json:"metadata,omitempty"` +} + +// Implements the "fetch" tool as described in https://platform.openai.com/docs/mcp#fetch-tool. +// From my experiments with ChatGPT, it seems that it does not see the description that is +// provided in the tool definition. ChatGPT sees "fetch" as a very simple tool that can take +// an ID returned by the "search" tool and return the full details of the object. +var ChatGPTFetch = Tool[FetchArgs, FetchResult]{ + Tool: aisdk.Tool{ + Name: ToolNameChatGPTFetch, + Description: `Fetch a template or workspace. + + ID is a unique identifier for the template or workspace. It is a combination of the type and the ID. + + # Examples + + Fetch a template with ID "56f13b5e-be0f-4a17-bdb2-aaacc3353ea7". + + ` + "```" + `json + { + "id": "template:56f13b5e-be0f-4a17-bdb2-aaacc3353ea7" + } + ` + "```" + ` + + Fetch a workspace with ID "fcb6fc42-ba88-4175-9508-88e6a554a61a". + + ` + "```" + `json + { + "id": "workspace:fcb6fc42-ba88-4175-9508-88e6a554a61a" + } + ` + "```" + ` + `, + + Schema: aisdk.Schema{ + Properties: map[string]any{ + "id": map[string]any{ + "type": "string", + }, + }, + Required: []string{"id"}, + }, + }, + Handler: func(ctx context.Context, deps Deps, args FetchArgs) (FetchResult, error) { + objectID, err := parseObjectID(args.ID) + if err != nil { + return FetchResult{}, err + } + switch objectID.Type { + case ObjectTypeTemplate: + return fetchTemplate(ctx, deps, objectID.ID) + case ObjectTypeWorkspace: + return fetchWorkspace(ctx, deps, objectID.ID) + } + return FetchResult{}, xerrors.Errorf("reached unreachable code with object ID: %s", args.ID) + }, +} diff --git a/codersdk/toolsdk/chatgpt_test.go b/codersdk/toolsdk/chatgpt_test.go new file mode 100644 index 0000000000000..c8a05ba41411b --- /dev/null +++ b/codersdk/toolsdk/chatgpt_test.go @@ -0,0 +1,566 @@ +// nolint:gocritic // This is a test package, so database types do not end up in the build +package toolsdk_test + +import ( + "encoding/json" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" + + "github.com/coder/coder/v2/coderd/coderdtest" + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbfake" + "github.com/coder/coder/v2/coderd/database/dbgen" + "github.com/coder/coder/v2/codersdk" + "github.com/coder/coder/v2/codersdk/toolsdk" +) + +func TestChatGPTSearch_TemplateSearch(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + query string + setupTemplates int + expectError bool + errorContains string + }{ + { + name: "ValidTemplatesQuery_MultipleTemplates", + query: "templates", + setupTemplates: 3, + expectError: false, + }, + { + name: "ValidTemplatesQuery_NoTemplates", + query: "templates", + setupTemplates: 0, + expectError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + // Setup + client, store := coderdtest.NewWithDatabase(t, nil) + owner := coderdtest.CreateFirstUser(t, client) + + // Create templates as needed + var expectedTemplates []database.Template + for i := 0; i < tt.setupTemplates; i++ { + template := dbfake.TemplateVersion(t, store). + Seed(database.TemplateVersion{ + OrganizationID: owner.OrganizationID, + CreatedBy: owner.UserID, + }).Do() + expectedTemplates = append(expectedTemplates, template.Template) + } + + // Create tool dependencies + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + // Execute tool + args := toolsdk.SearchArgs{Query: tt.query} + result, err := testTool(t, toolsdk.ChatGPTSearch, deps, args) + + // Verify results + if tt.expectError { + require.Error(t, err) + if tt.errorContains != "" { + require.Contains(t, err.Error(), tt.errorContains) + } + return + } + + require.NoError(t, err) + require.Len(t, result.Results, tt.setupTemplates) + + // Validate result format for each template + templateIDsFound := make(map[string]bool) + for _, item := range result.Results { + require.NotEmpty(t, item.ID) + require.Contains(t, item.ID, "template:") + require.NotEmpty(t, item.Title) + require.Contains(t, item.URL, "/templates/") + + // Track that we found this template ID + templateIDsFound[item.ID] = true + } + + // Verify all expected templates are present + for _, expectedTemplate := range expectedTemplates { + expectedID := "template:" + expectedTemplate.ID.String() + require.True(t, templateIDsFound[expectedID], "Expected template %s not found in results", expectedID) + } + }) + } +} + +func TestChatGPTSearch_TemplateMultipleFilters(t *testing.T) { + t.Parallel() + + // Setup + client, store := coderdtest.NewWithDatabase(t, nil) + owner := coderdtest.CreateFirstUser(t, client) + org2 := dbgen.Organization(t, store, database.Organization{ + Name: "org2", + }) + + dbgen.Template(t, store, database.Template{ + OrganizationID: owner.OrganizationID, + CreatedBy: owner.UserID, + Name: "docker-development", // Name contains "docker" + DisplayName: "Docker Development", + Description: "A Docker-based development template", + }) + + // Create another template that doesn't contain "docker" + dbgen.Template(t, store, database.Template{ + OrganizationID: org2.ID, + CreatedBy: owner.UserID, + Name: "python-web", // Name doesn't contain "docker" + DisplayName: "Python Web", + Description: "A Python web development template", + }) + + // Create third template with "docker" in name + dockerTemplate2 := dbgen.Template(t, store, database.Template{ + OrganizationID: org2.ID, + CreatedBy: owner.UserID, + Name: "old-docker-template", // Name contains "docker" + DisplayName: "Old Docker Template", + Description: "An old Docker template", + }) + + // Create tool dependencies + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + args := toolsdk.SearchArgs{Query: "templates/name:docker organization:org2"} + result, err := testTool(t, toolsdk.ChatGPTSearch, deps, args) + + // Verify results + require.NoError(t, err) + require.Len(t, result.Results, 1, "Should match only the docker template in org2") + + expectedID := "template:" + dockerTemplate2.ID.String() + require.Equal(t, expectedID, result.Results[0].ID, "Should match the docker template in org2") +} + +func TestChatGPTSearch_WorkspaceSearch(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + query string + setupOwner string // "self" or "other" + setupWorkspace bool + expectError bool + errorContains string + }{ + { + name: "ValidWorkspacesQuery_CurrentUser", + query: "workspaces", + setupOwner: "self", + setupWorkspace: true, + expectError: false, + }, + { + name: "ValidWorkspacesQuery_CurrentUserMe", + query: "workspaces/owner:me", + setupOwner: "self", + setupWorkspace: true, + expectError: false, + }, + { + name: "ValidWorkspacesQuery_NoWorkspaces", + query: "workspaces", + setupOwner: "self", + setupWorkspace: false, + expectError: false, + }, + { + name: "ValidWorkspacesQuery_SpecificUser", + query: "workspaces/owner:otheruser", + setupOwner: "other", + setupWorkspace: true, + expectError: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + // Setup + client, store := coderdtest.NewWithDatabase(t, nil) + owner := coderdtest.CreateFirstUser(t, client) + + var workspaceOwnerID uuid.UUID + var workspaceClient *codersdk.Client + if tt.setupOwner == "self" { + workspaceOwnerID = owner.UserID + workspaceClient = client + } else { + var workspaceOwner codersdk.User + workspaceClient, workspaceOwner = coderdtest.CreateAnotherUserMutators(t, client, owner.OrganizationID, nil, func(r *codersdk.CreateUserRequestWithOrgs) { + r.Username = "otheruser" + }) + workspaceOwnerID = workspaceOwner.ID + } + + // Create workspace if needed + var expectedWorkspace database.WorkspaceTable + if tt.setupWorkspace { + workspace := dbfake.WorkspaceBuild(t, store, database.WorkspaceTable{ + Name: "test-workspace", + OrganizationID: owner.OrganizationID, + OwnerID: workspaceOwnerID, + }).Do() + expectedWorkspace = workspace.Workspace + } + + // Create tool dependencies + deps, err := toolsdk.NewDeps(workspaceClient) + require.NoError(t, err) + + // Execute tool + args := toolsdk.SearchArgs{Query: tt.query} + result, err := testTool(t, toolsdk.ChatGPTSearch, deps, args) + + // Verify results + if tt.expectError { + require.Error(t, err) + if tt.errorContains != "" { + require.Contains(t, err.Error(), tt.errorContains) + } + return + } + + require.NoError(t, err) + + if tt.setupWorkspace { + require.Len(t, result.Results, 1) + item := result.Results[0] + require.NotEmpty(t, item.ID) + require.Contains(t, item.ID, "workspace:") + require.Equal(t, expectedWorkspace.Name, item.Title) + require.Contains(t, item.Text, "Owner:") + require.Contains(t, item.Text, "Template:") + require.Contains(t, item.Text, "Latest transition:") + require.Contains(t, item.URL, expectedWorkspace.Name) + } else { + require.Len(t, result.Results, 0) + } + }) + } +} + +func TestChatGPTSearch_QueryParsing(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + query string + expectError bool + errorMsg string + }{ + { + name: "ValidTemplatesQuery", + query: "templates", + expectError: false, + }, + { + name: "ValidWorkspacesQuery", + query: "workspaces", + expectError: false, + }, + { + name: "ValidWorkspacesMeQuery", + query: "workspaces/owner:me", + expectError: false, + }, + { + name: "ValidWorkspacesUserQuery", + query: "workspaces/owner:testuser", + expectError: false, + }, + { + name: "InvalidQueryType", + query: "users", + expectError: true, + errorMsg: "invalid query", + }, + { + name: "EmptyQuery", + query: "", + expectError: true, + errorMsg: "invalid query", + }, + { + name: "MalformedQuery", + query: "invalidtype/somequery", + expectError: true, + errorMsg: "invalid query", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + // Setup minimal environment + client, _ := coderdtest.NewWithDatabase(t, nil) + coderdtest.CreateFirstUser(t, client) + + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + // Execute tool + args := toolsdk.SearchArgs{Query: tt.query} + _, err = testTool(t, toolsdk.ChatGPTSearch, deps, args) + + // Verify results + if tt.expectError { + require.Error(t, err) + require.Contains(t, err.Error(), tt.errorMsg) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestChatGPTFetch_TemplateFetch(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + setupTemplate bool + objectID string // if empty, will use real template ID + expectError bool + errorContains string + }{ + { + name: "ValidTemplateFetch", + setupTemplate: true, + expectError: false, + }, + { + name: "NonExistentTemplateID", + setupTemplate: false, + objectID: "template:" + uuid.NewString(), + expectError: true, + errorContains: "Resource not found", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + // Setup + client, store := coderdtest.NewWithDatabase(t, nil) + owner := coderdtest.CreateFirstUser(t, client) + + var templateID string + var expectedTemplate database.Template + if tt.setupTemplate { + template := dbfake.TemplateVersion(t, store). + Seed(database.TemplateVersion{ + OrganizationID: owner.OrganizationID, + CreatedBy: owner.UserID, + }).Do() + expectedTemplate = template.Template + templateID = "template:" + template.Template.ID.String() + } else if tt.objectID != "" { + templateID = tt.objectID + } + + // Create tool dependencies + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + // Execute tool + args := toolsdk.FetchArgs{ID: templateID} + result, err := testTool(t, toolsdk.ChatGPTFetch, deps, args) + + // Verify results + if tt.expectError { + require.Error(t, err) + if tt.errorContains != "" { + require.Contains(t, err.Error(), tt.errorContains) + } + return + } + + require.NoError(t, err) + require.Equal(t, expectedTemplate.ID.String(), result.ID) + require.Equal(t, expectedTemplate.DisplayName, result.Title) + require.NotEmpty(t, result.Text) + require.Contains(t, result.URL, "/templates/") + require.Contains(t, result.URL, expectedTemplate.Name) + + // Validate JSON marshaling + var templateData codersdk.Template + err = json.Unmarshal([]byte(result.Text), &templateData) + require.NoError(t, err) + require.Equal(t, expectedTemplate.ID, templateData.ID) + }) + } +} + +func TestChatGPTFetch_WorkspaceFetch(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + setupWorkspace bool + objectID string // if empty, will use real workspace ID + expectError bool + errorContains string + }{ + { + name: "ValidWorkspaceFetch", + setupWorkspace: true, + expectError: false, + }, + { + name: "NonExistentWorkspaceID", + setupWorkspace: false, + objectID: "workspace:" + uuid.NewString(), + expectError: true, + errorContains: "Resource not found", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + // Setup + client, store := coderdtest.NewWithDatabase(t, nil) + owner := coderdtest.CreateFirstUser(t, client) + + var workspaceID string + var expectedWorkspace database.WorkspaceTable + if tt.setupWorkspace { + workspace := dbfake.WorkspaceBuild(t, store, database.WorkspaceTable{ + OrganizationID: owner.OrganizationID, + OwnerID: owner.UserID, + }).Do() + expectedWorkspace = workspace.Workspace + workspaceID = "workspace:" + workspace.Workspace.ID.String() + } else if tt.objectID != "" { + workspaceID = tt.objectID + } + + // Create tool dependencies + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + // Execute tool + args := toolsdk.FetchArgs{ID: workspaceID} + result, err := testTool(t, toolsdk.ChatGPTFetch, deps, args) + + // Verify results + if tt.expectError { + require.Error(t, err) + if tt.errorContains != "" { + require.Contains(t, err.Error(), tt.errorContains) + } + return + } + + require.NoError(t, err) + require.Equal(t, expectedWorkspace.ID.String(), result.ID) + require.Equal(t, expectedWorkspace.Name, result.Title) + require.NotEmpty(t, result.Text) + require.Contains(t, result.URL, expectedWorkspace.Name) + + // Validate JSON marshaling + var workspaceData codersdk.Workspace + err = json.Unmarshal([]byte(result.Text), &workspaceData) + require.NoError(t, err) + require.Equal(t, expectedWorkspace.ID, workspaceData.ID) + }) + } +} + +func TestChatGPTFetch_ObjectIDParsing(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + objectID string + expectError bool + errorMsg string + }{ + { + name: "ValidTemplateID", + objectID: "template:" + uuid.NewString(), + expectError: false, + }, + { + name: "ValidWorkspaceID", + objectID: "workspace:" + uuid.NewString(), + expectError: false, + }, + { + name: "MissingColon", + objectID: "template" + uuid.NewString(), + expectError: true, + errorMsg: "invalid ID", + }, + { + name: "InvalidUUID", + objectID: "template:invalid-uuid", + expectError: true, + errorMsg: "invalid template ID, must be a valid UUID", + }, + { + name: "UnsupportedType", + objectID: "user:" + uuid.NewString(), + expectError: true, + errorMsg: "invalid ID", + }, + { + name: "EmptyID", + objectID: "", + expectError: true, + errorMsg: "invalid ID", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + // Setup minimal environment + client, _ := coderdtest.NewWithDatabase(t, nil) + coderdtest.CreateFirstUser(t, client) + + deps, err := toolsdk.NewDeps(client) + require.NoError(t, err) + + // Execute tool + args := toolsdk.FetchArgs{ID: tt.objectID} + _, err = testTool(t, toolsdk.ChatGPTFetch, deps, args) + + // Verify results + if tt.expectError { + require.Error(t, err) + require.Contains(t, err.Error(), tt.errorMsg) + } else { + // For valid formats, we expect it to fail on API call since IDs don't exist + // but parsing should succeed + require.Error(t, err) + require.Contains(t, err.Error(), "Resource not found") + } + }) + } +} diff --git a/codersdk/toolsdk/toolsdk.go b/codersdk/toolsdk/toolsdk.go index c6c37821e5234..7cb8cecb25234 100644 --- a/codersdk/toolsdk/toolsdk.go +++ b/codersdk/toolsdk/toolsdk.go @@ -36,6 +36,8 @@ const ( ToolNameCreateTemplate = "coder_create_template" ToolNameDeleteTemplate = "coder_delete_template" ToolNameWorkspaceBash = "coder_workspace_bash" + ToolNameChatGPTSearch = "search" + ToolNameChatGPTFetch = "fetch" ) func NewDeps(client *codersdk.Client, opts ...func(*Deps)) (Deps, error) { @@ -56,6 +58,13 @@ type Deps struct { report func(ReportTaskArgs) error } +func (d Deps) ServerURL() string { + serverURLCopy := *d.coderClient.URL + serverURLCopy.Path = "" + serverURLCopy.RawQuery = "" + return serverURLCopy.String() +} + func WithTaskReporter(fn func(ReportTaskArgs) error) func(*Deps) { return func(d *Deps) { d.report = fn @@ -194,6 +203,8 @@ var All = []GenericTool{ UploadTarFile.Generic(), UpdateTemplateActiveVersion.Generic(), WorkspaceBash.Generic(), + ChatGPTSearch.Generic(), + ChatGPTFetch.Generic(), } type ReportTaskArgs struct { From 40dbc557bd47a63cf38672a181c2fef72291bfa5 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Mon, 4 Aug 2025 08:26:56 -0400 Subject: [PATCH 057/260] fix: ignore goroutine leak for protocol lookup on windows (#19131) --- testutil/goleak.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/testutil/goleak.go b/testutil/goleak.go index e93c46a04c5f0..ae4ad3e273425 100644 --- a/testutil/goleak.go +++ b/testutil/goleak.go @@ -5,6 +5,9 @@ import "go.uber.org/goleak" // GoleakOptions is a common list of options to pass to goleak. This is useful if there is a known // leaky function we want to exclude from goleak. var GoleakOptions []goleak.Option = []goleak.Option{ + // Go spawns a goroutine to lookup the protocol when run on + // windows. See https://go.dev/src/net/lookup_windows.go#L56 + goleak.IgnoreAnyFunction("net.lookupProtocol.func1"), // seelog (indirect dependency of dd-trace-go) has a known goroutine leak (https://github.com/cihub/seelog/issues/182) // When https://github.com/DataDog/dd-trace-go/issues/2987 is resolved, this can be removed. goleak.IgnoreAnyFunction("github.com/cihub/seelog.(*asyncLoopLogger).processQueue"), From 2a2851e494e94fd7e790796946215a7f136f485b Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Mon, 4 Aug 2025 08:27:27 -0400 Subject: [PATCH 058/260] chore: check integrity of Go in Dockefile (#19130) --- dogfood/coder/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dogfood/coder/Dockerfile b/dogfood/coder/Dockerfile index 4e86b9e7ddf8c..4820eec56989b 100644 --- a/dogfood/coder/Dockerfile +++ b/dogfood/coder/Dockerfile @@ -12,6 +12,7 @@ FROM ubuntu:jammy@sha256:0e5e4a57c2499249aafc3b40fcd541e9a456aab7296681a3994d631 # Install Go manually, so that we can control the version ARG GO_VERSION=1.24.4 +ARG GO_CHECKSUM="77e5da33bb72aeaef1ba4418b6fe511bc4d041873cbf82e5aa6318740df98717" # Boring Go is needed to build FIPS-compliant binaries. RUN apt-get update && \ @@ -19,6 +20,7 @@ RUN apt-get update && \ curl --silent --show-error --location \ "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz" \ -o /usr/local/go.tar.gz && \ + echo "$GO_CHECKSUM /usr/local/go.tar.gz" | sha256sum -c && \ rm -rf /var/lib/apt/lists/* ENV PATH=$PATH:/usr/local/go/bin From 5df3bf713c7610b6330e0e058844afcb00c89b56 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 14:57:47 +0000 Subject: [PATCH 059/260] ci: bump the github-actions group with 6 updates (#19149) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the github-actions group with 6 updates: | Package | From | To | | --- | --- | --- | | [step-security/harden-runner](https://github.com/step-security/harden-runner) | `2.12.2` | `2.13.0` | | [chromaui/action](https://github.com/chromaui/action) | `13.1.2` | `13.1.3` | | [google-github-actions/auth](https://github.com/google-github-actions/auth) | `2.1.11` | `2.1.12` | | [tj-actions/changed-files](https://github.com/tj-actions/changed-files) | `055970845dd036d7345da7399b7e89f2e10f2b04` | `c2ca2493190021783138cb8aac49bcee14b4bb89` | | [tj-actions/branch-names](https://github.com/tj-actions/branch-names) | `8.2.1` | `9.0.2` | | [github/codeql-action](https://github.com/github/codeql-action) | `3.29.3` | `3.29.5` | Updates `step-security/harden-runner` from 2.12.2 to 2.13.0
Commits

Updates `chromaui/action` from 13.1.2 to 13.1.3
Commits

Updates `google-github-actions/auth` from 2.1.11 to 2.1.12
Release notes

Sourced from google-github-actions/auth's releases.

v2.1.12

What's Changed

Full Changelog: https://github.com/google-github-actions/auth/compare/v2.1.11...v2.1.12

Commits

Updates `tj-actions/changed-files` from 055970845dd036d7345da7399b7e89f2e10f2b04 to c2ca2493190021783138cb8aac49bcee14b4bb89
Changelog

Sourced from tj-actions/changed-files's changelog.

Changelog

46.0.5 - (2025-04-09)

⚙️ Miscellaneous Tasks

  • deps: Bump yaml from 2.7.0 to 2.7.1 (#2520) (ed68ef8) - (dependabot[bot])
  • deps-dev: Bump typescript from 5.8.2 to 5.8.3 (#2516) (a7bc14b) - (dependabot[bot])
  • deps-dev: Bump @​types/node from 22.13.11 to 22.14.0 (#2517) (3d751f6) - (dependabot[bot])
  • deps-dev: Bump eslint-plugin-prettier from 5.2.3 to 5.2.6 (#2519) (e2fda4e) - (dependabot[bot])
  • deps-dev: Bump ts-jest from 29.2.6 to 29.3.1 (#2518) (0bed1b1) - (dependabot[bot])
  • deps: Bump github/codeql-action from 3.28.12 to 3.28.15 (#2530) (6802458) - (dependabot[bot])
  • deps: Bump tj-actions/branch-names from 8.0.1 to 8.1.0 (#2521) (cf2e39e) - (dependabot[bot])
  • deps: Bump tj-actions/verify-changed-files from 20.0.1 to 20.0.4 (#2523) (6abeaa5) - (dependabot[bot])

⬆️ Upgrades

  • Upgraded to v46.0.4 (#2511)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (6f67ee9) - (github-actions[bot])

46.0.4 - (2025-04-03)

🐛 Bug Fixes

  • Bug modified_keys and changed_key outputs not set when no changes detected (#2509) (6cb76d0) - (Tonye Jack)

📚 Documentation

⬆️ Upgrades

  • Upgraded to v46.0.3 (#2506)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> Co-authored-by: Tonye Jack jtonye@ymail.com (27ae6b3) - (github-actions[bot])

46.0.3 - (2025-03-23)

🔄 Update

  • Updated README.md (#2501)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (41e0de5) - (github-actions[bot])

  • Updated README.md (#2499)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (9457878) - (github-actions[bot])

📚 Documentation

... (truncated)

Commits
  • c2ca249 test: manual triggered workflows (#2637)
  • 94d97fe chore(deps): bump tj-actions/branch-names from 9.0.1 to 9.0.2 (#2636)
  • 18b05b9 chore(deps): bump github/codeql-action from 3.29.4 to 3.29.5 (#2635)
  • db8d0bf chore(deps): bump tj-actions/git-cliff from 1.5.0 to 2.0.2 (#2632)
  • 0e2e8f7 chore(deps): bump tj-actions/branch-names from 8.2.1 to 9.0.1 (#2633)
  • 5f2e971 chore(deps-dev): bump @​types/node from 24.0.15 to 24.1.0 (#2626)
  • 498cf3f chore(deps-dev): bump jest from 30.0.4 to 30.0.5 (#2627)
  • 8378ac8 chore(deps): bump github/codeql-action from 3.29.3 to 3.29.4 (#2628)
  • 4bfe3cb chore(deps): bump nrwl/nx-set-shas from 4.3.0 to 4.3.3 (#2630)
  • a0370f6 chore(deps): bump github/codeql-action from 3.29.2 to 3.29.3 (#2625)
  • Additional commits viewable in compare view

Updates `tj-actions/branch-names` from 8.2.1 to 9.0.2
Release notes

Sourced from tj-actions/branch-names's releases.

v9.0.2

What's Changed

Full Changelog: https://github.com/tj-actions/branch-names/compare/v9...v9.0.2

v9.0.1

What's Changed

Full Changelog: https://github.com/tj-actions/branch-names/compare/v9.0.0...v9.0.1

v9.0.0

What's Changed

Full Changelog: https://github.com/tj-actions/branch-names/compare/v8...v9.0.0

v9

Changes in v9.0.2

What's Changed

Full Changelog: https://github.com/tj-actions/branch-names/compare/v9...v9.0.2


Changes in v9.0.1

What's Changed

Full Changelog: https://github.com/tj-actions/branch-names/compare/v9.0.0...v9.0.1


Changes in v9.0.0

What's Changed

... (truncated)

Changelog

Sourced from tj-actions/branch-names's changelog.

Changelog

9.0.2 - (2025-07-31)

🔄 Update

  • Update update-readme.yml (5250492) - (Tonye Jack)
  • Update update-readme.yml (a2bc495) - (Tonye Jack)
  • Update README.md (169ddc1) - (Tonye Jack)
  • Update README.md (4d35052) - (Tonye Jack)
  • Updated README.md (#423)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (6be34a8) - (github-actions[bot])

⬆️ Upgrades

  • Upgraded from v9.0.0 -> v9.0.1 (#424)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (c0714e7) - (github-actions[bot])

9.0.1 - (2025-07-26)

👷 CI/CD

  • deps: Bump codacy/codacy-analysis-cli-action from 4.4.5 to 4.4.7 (#421) (386e117) - (dependabot[bot])
  • deps: Bump tj-actions/git-cliff from 1.5.0 to 2.0.2 (#422) (2114174) - (dependabot[bot])

9.0.0 - (2025-07-25)

🔄 Update

  • Updated README.md (#419)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (f904073) - (github-actions[bot])

⚙️ Miscellaneous Tasks

🛡️ Security

⬆️ Upgrades

  • Upgraded from v8.2.0 -> v8.2.1 (#417)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (46ae71d) - (github-actions[bot])

8.2.1 - (2025-04-11)

... (truncated)

Commits

Updates `github/codeql-action` from 3.29.3 to 3.29.5
Release notes

Sourced from github/codeql-action's releases.

v3.29.5

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

3.29.5 - 29 Jul 2025

  • Update default CodeQL bundle version to 2.22.2. #2986

See the full CHANGELOG.md for more information.

v3.29.4

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

3.29.4 - 23 Jul 2025

No user facing changes.

See the full CHANGELOG.md for more information.

Changelog

Sourced from github/codeql-action's changelog.

CodeQL Action Changelog

See the releases page for the relevant changes to the CodeQL CLI and language packs.

[UNRELEASED]

No user facing changes.

3.29.5 - 29 Jul 2025

  • Update default CodeQL bundle version to 2.22.2. #2986

3.29.4 - 23 Jul 2025

No user facing changes.

3.29.3 - 21 Jul 2025

No user facing changes.

3.29.2 - 30 Jun 2025

  • Experimental: When the quality-queries input for the init action is provided with an argument, separate .quality.sarif files are produced and uploaded for each language with the results of the specified queries. Do not use this in production as it is part of an internal experiment and subject to change at any time. #2935

3.29.1 - 27 Jun 2025

  • Fix bug in PR analysis where user-provided include query filter fails to exclude non-included queries. #2938
  • Update default CodeQL bundle version to 2.22.1. #2950

3.29.0 - 11 Jun 2025

  • Update default CodeQL bundle version to 2.22.0. #2925
  • Bump minimum CodeQL bundle version to 2.16.6. #2912

3.28.21 - 28 July 2025

No user facing changes.

3.28.20 - 21 July 2025

3.28.19 - 03 Jun 2025

  • The CodeQL Action no longer includes its own copy of the extractor for the actions language, which is currently in public preview. The actions extractor has been included in the CodeQL CLI since v2.20.6. If your workflow has enabled the actions language and you have pinned your tools: property to a specific version of the CodeQL CLI earlier than v2.20.6, you will need to update to at least CodeQL v2.20.6 or disable actions analysis.
  • Update default CodeQL bundle version to 2.21.4. #2910

... (truncated)

Commits
  • 51f7732 Merge pull request #2997 from github/update-v3.29.5-80a09d7b0
  • 8e90243 Update changelog for v3.29.5
  • 80a09d7 Merge pull request #2996 from github/dependabot/npm_and_yarn/npm-240ab9fad0
  • 8388115 Merge pull request #2994 from github/mergeback/changelog/v3.28.21
  • 401ecaf Merge branch 'main' into mergeback/changelog/v3.28.21
  • ab5c0c5 Merge branch 'main' into dependabot/npm_and_yarn/npm-240ab9fad0
  • cd264d4 Merge pull request #2986 from github/update-bundle/codeql-bundle-v2.22.2
  • 4599055 Merge branch 'main' into update-bundle/codeql-bundle-v2.22.2
  • fd7ad51 Merge pull request #2971 from github/update-supported-enterprise-server-versions
  • ac0c9bf Merge branch 'main' into update-supported-enterprise-server-versions
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 8 ++++---- .github/workflows/docs-ci.yaml | 2 +- .github/workflows/dogfood.yaml | 4 ++-- .github/workflows/nightly-gauntlet.yaml | 2 +- .github/workflows/release.yaml | 4 ++-- .github/workflows/scorecard.yml | 2 +- .github/workflows/security.yaml | 6 +++--- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 571e7ce15580c..0f0a4056eea5f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -794,7 +794,7 @@ jobs: # the check to pass. This is desired in PRs, but not in mainline. - name: Publish to Chromatic (non-mainline) if: github.ref != 'refs/heads/main' && github.repository_owner == 'coder' - uses: chromaui/action@4d8ebd13658d795114f8051e25c28d66f14886c6 # v13.1.2 + uses: chromaui/action@58d9ffb36c90c97a02d061544ecc849cc4a242a9 # v13.1.3 env: NODE_OPTIONS: "--max_old_space_size=4096" STORYBOOK: true @@ -826,7 +826,7 @@ jobs: # infinitely "in progress" in mainline unless we re-review each build. - name: Publish to Chromatic (mainline) if: github.ref == 'refs/heads/main' && github.repository_owner == 'coder' - uses: chromaui/action@4d8ebd13658d795114f8051e25c28d66f14886c6 # v13.1.2 + uses: chromaui/action@58d9ffb36c90c97a02d061544ecc849cc4a242a9 # v13.1.3 env: NODE_OPTIONS: "--max_old_space_size=4096" STORYBOOK: true @@ -1127,7 +1127,7 @@ jobs: # Setup GCloud for signing Windows binaries. - name: Authenticate to Google Cloud id: gcloud_auth - uses: google-github-actions/auth@140bb5113ffb6b65a7e9b937a81fa96cf5064462 # v2.1.11 + uses: google-github-actions/auth@b7593ed2efd1c1617e1b0254da33b86225adb2a5 # v2.1.12 with: workload_identity_provider: ${{ secrets.GCP_CODE_SIGNING_WORKLOAD_ID_PROVIDER }} service_account: ${{ secrets.GCP_CODE_SIGNING_SERVICE_ACCOUNT }} @@ -1431,7 +1431,7 @@ jobs: fetch-depth: 0 - name: Authenticate to Google Cloud - uses: google-github-actions/auth@140bb5113ffb6b65a7e9b937a81fa96cf5064462 # v2.1.11 + uses: google-github-actions/auth@b7593ed2efd1c1617e1b0254da33b86225adb2a5 # v2.1.12 with: workload_identity_provider: projects/573722524737/locations/global/workloadIdentityPools/github/providers/github service_account: coder-ci@coder-dogfood.iam.gserviceaccount.com diff --git a/.github/workflows/docs-ci.yaml b/.github/workflows/docs-ci.yaml index 39954783f1ba8..294485637e528 100644 --- a/.github/workflows/docs-ci.yaml +++ b/.github/workflows/docs-ci.yaml @@ -28,7 +28,7 @@ jobs: - name: Setup Node uses: ./.github/actions/setup-node - - uses: tj-actions/changed-files@055970845dd036d7345da7399b7e89f2e10f2b04 # v45.0.7 + - uses: tj-actions/changed-files@c2ca2493190021783138cb8aac49bcee14b4bb89 # v45.0.7 id: changed-files with: files: | diff --git a/.github/workflows/dogfood.yaml b/.github/workflows/dogfood.yaml index bafdb5fb19767..b05bdc87c7419 100644 --- a/.github/workflows/dogfood.yaml +++ b/.github/workflows/dogfood.yaml @@ -62,7 +62,7 @@ jobs: - name: Get branch name id: branch-name - uses: tj-actions/branch-names@dde14ac574a8b9b1cedc59a1cf312788af43d8d8 # v8.2.1 + uses: tj-actions/branch-names@5250492686b253f06fa55861556d1027b067aeb5 # v9.0.2 - name: "Branch name to Docker tag name" id: docker-tag-name @@ -129,7 +129,7 @@ jobs: uses: ./.github/actions/setup-tf - name: Authenticate to Google Cloud - uses: google-github-actions/auth@140bb5113ffb6b65a7e9b937a81fa96cf5064462 # v2.1.11 + uses: google-github-actions/auth@b7593ed2efd1c1617e1b0254da33b86225adb2a5 # v2.1.12 with: workload_identity_provider: projects/573722524737/locations/global/workloadIdentityPools/github/providers/github service_account: coder-ci@coder-dogfood.iam.gserviceaccount.com diff --git a/.github/workflows/nightly-gauntlet.yaml b/.github/workflows/nightly-gauntlet.yaml index 6fb353de9b258..e06da40098b6c 100644 --- a/.github/workflows/nightly-gauntlet.yaml +++ b/.github/workflows/nightly-gauntlet.yaml @@ -27,7 +27,7 @@ jobs: - windows-2022 steps: - name: Harden Runner - uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2 + uses: step-security/harden-runner@ec9f2d5744a09debf3a187a3f4f675c53b671911 # v2.13.0 with: egress-policy: audit diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6ea28ad87a90c..0fa2d17e0aac4 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -286,7 +286,7 @@ jobs: # Setup GCloud for signing Windows binaries. - name: Authenticate to Google Cloud id: gcloud_auth - uses: google-github-actions/auth@140bb5113ffb6b65a7e9b937a81fa96cf5064462 # v2.1.11 + uses: google-github-actions/auth@b7593ed2efd1c1617e1b0254da33b86225adb2a5 # v2.1.12 with: workload_identity_provider: ${{ secrets.GCP_CODE_SIGNING_WORKLOAD_ID_PROVIDER }} service_account: ${{ secrets.GCP_CODE_SIGNING_SERVICE_ACCOUNT }} @@ -696,7 +696,7 @@ jobs: CODER_GPG_RELEASE_KEY_BASE64: ${{ secrets.GPG_RELEASE_KEY_BASE64 }} - name: Authenticate to Google Cloud - uses: google-github-actions/auth@140bb5113ffb6b65a7e9b937a81fa96cf5064462 # v2.1.11 + uses: google-github-actions/auth@b7593ed2efd1c1617e1b0254da33b86225adb2a5 # v2.1.12 with: workload_identity_provider: ${{ secrets.GCP_WORKLOAD_ID_PROVIDER }} service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }} diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 1e5104310e085..8713fce1ddfe9 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@d6bbdef45e766d081b84a2def353b0055f728d3e # v3.29.3 + uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 with: sarif_file: results.sarif diff --git a/.github/workflows/security.yaml b/.github/workflows/security.yaml index d31595c3a8465..f49bd66ff2d95 100644 --- a/.github/workflows/security.yaml +++ b/.github/workflows/security.yaml @@ -38,7 +38,7 @@ jobs: uses: ./.github/actions/setup-go - name: Initialize CodeQL - uses: github/codeql-action/init@d6bbdef45e766d081b84a2def353b0055f728d3e # v3.29.3 + uses: github/codeql-action/init@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 with: languages: go, javascript @@ -48,7 +48,7 @@ jobs: rm Makefile - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@d6bbdef45e766d081b84a2def353b0055f728d3e # v3.29.3 + uses: github/codeql-action/analyze@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 - name: Send Slack notification on failure if: ${{ failure() }} @@ -150,7 +150,7 @@ jobs: severity: "CRITICAL,HIGH" - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@d6bbdef45e766d081b84a2def353b0055f728d3e # v3.29.3 + uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 with: sarif_file: trivy-results.sarif category: "Trivy" From 8f538d4412f98f2017a448faee1eefbfc33a0377 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:21:04 +0000 Subject: [PATCH 060/260] chore: bump github.com/mark3labs/mcp-go from 0.34.0 to 0.36.0 (#19152) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/mark3labs/mcp-go](https://github.com/mark3labs/mcp-go) from 0.34.0 to 0.36.0.
Release notes

Sourced from github.com/mark3labs/mcp-go's releases.

Release v0.36.0

What's Changed

New Contributors

Full Changelog: https://github.com/mark3labs/mcp-go/compare/v0.35.0...v0.36.0

Release v0.35.0

What's Changed

New Contributors

Full Changelog: https://github.com/mark3labs/mcp-go/compare/v0.34.0...v0.35.0

Commits
  • cf35264 Merge pull request #517 from dgageot/remote-context-cancelled-log
  • 8f9d538 feat: support structured content and output schema (#460)
  • a43b104 chore: remove comments related to JSON-Batching (#514)
  • e327695 Hide error when it's not useful
  • 617fcf1 Remove sampling_server binary file (#512)
  • 5ad6c8d Add defs field to ToolsInputSchema (#488)
  • 3964d51 feat: implement protocol version negotiation (#502)
  • 38ac77c Get rid of binary file. (#505)
  • 722d954 enhc(server): allow adding multiple resource templates at once (#483)
  • cc3f765 Embed client capabilities into the Session (#491)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/mark3labs/mcp-go&package-manager=go_modules&previous-version=0.34.0&new-version=0.36.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++++- go.sum | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 802b7aa1fda6a..2a79ebde74c2f 100644 --- a/go.mod +++ b/go.mod @@ -482,7 +482,7 @@ require ( github.com/coder/preview v1.0.3-0.20250714153828-a737d4750448 github.com/fsnotify/fsnotify v1.9.0 github.com/go-git/go-git/v5 v5.16.2 - github.com/mark3labs/mcp-go v0.34.0 + github.com/mark3labs/mcp-go v0.36.0 ) require ( @@ -503,7 +503,9 @@ require ( github.com/aquasecurity/go-version v0.0.1 // indirect github.com/aquasecurity/trivy v0.58.2 // indirect github.com/aws/aws-sdk-go v1.55.7 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/buger/jsonparser v1.1.1 // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da // indirect @@ -515,6 +517,7 @@ require ( github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/hashicorp/go-getter v1.7.8 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackmordaunt/icns/v3 v3.0.1 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/klauspost/cpuid/v2 v2.2.10 // indirect @@ -530,6 +533,7 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/tmaxmax/go-sse v0.10.0 // indirect github.com/ulikunitz/xz v0.5.12 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect diff --git a/go.sum b/go.sum index 812dc4fb08bc4..485a035129e67 100644 --- a/go.sum +++ b/go.sum @@ -790,6 +790,8 @@ github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWp github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bep/clocks v0.5.0 h1:hhvKVGLPQWRVsBP/UB7ErrHYIO42gINVbvqxvYTPVps= @@ -828,6 +830,8 @@ github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bramvdbogaerde/go-scp v1.5.0 h1:a9BinAjTfQh273eh7vd3qUgmBC+bx+3TRDtkZWmIpzM= github.com/bramvdbogaerde/go-scp v1.5.0/go.mod h1:on2aH5AxaFb2G0N5Vsdy6B0Ml7k9HuHSwfo1y0QzAbQ= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q= github.com/cakturk/go-netstat v0.0.0-20200220111822-e5b49efee7a5 h1:BjkPE3785EwPhhyuFkbINB+2a1xATwk8SNDWnJiD41g= @@ -1413,6 +1417,8 @@ github.com/illarion/gonotify v1.0.1 h1:F1d+0Fgbq/sDWjj/r66ekjDG+IDeecQKUFH4wNwso github.com/illarion/gonotify v1.0.1/go.mod h1:zt5pmDofZpU1f8aqlK0+95eQhoEAn/d4G4B/FjVW4jE= github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2 h1:9K06NfxkBh25x56yVhWWlKFE8YpicaSfHwoV8SFbueA= github.com/insomniacslk/dhcp v0.0.0-20231206064809-8c70d406f6d2/go.mod h1:3A9PQ1cunSDF/1rbTq99Ts4pVnycWg+vlPkfeD2NLFI= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackmordaunt/icns/v3 v3.0.1 h1:xxot6aNuGrU+lNgxz5I5H0qSeCjNKp8uTXB1j8D4S3o= github.com/jackmordaunt/icns/v3 v3.0.1/go.mod h1:5sHL59nqTd2ynTnowxB/MDQFhKNqkK8X687uKNygaSQ= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -1503,8 +1509,8 @@ github.com/makeworld-the-better-one/dither/v2 v2.4.0 h1:Az/dYXiTcwcRSe59Hzw4RI1r github.com/makeworld-the-better-one/dither/v2 v2.4.0/go.mod h1:VBtN8DXO7SNtyGmLiGA7IsFeKrBkQPze1/iAeM95arc= github.com/marekm4/color-extractor v1.2.1 h1:3Zb2tQsn6bITZ8MBVhc33Qn1k5/SEuZ18mrXGUqIwn0= github.com/marekm4/color-extractor v1.2.1/go.mod h1:90VjmiHI6M8ez9eYUaXLdcKnS+BAOp7w+NpwBdkJmpA= -github.com/mark3labs/mcp-go v0.34.0 h1:eWy7WBGvhk6EyAAyVzivTCprE52iXJwNtvHV6Cv3bR0= -github.com/mark3labs/mcp-go v0.34.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= +github.com/mark3labs/mcp-go v0.36.0 h1:rIZaijrRYPeSbJG8/qNDe0hWlGrCJ7FWHNMz2SQpTis= +github.com/mark3labs/mcp-go v0.36.0/go.mod h1:T7tUa2jO6MavG+3P25Oy/jR7iCeJPHImCZHRymCn39g= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -1852,6 +1858,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/wagslane/go-password-validator v0.3.0 h1:vfxOPzGHkz5S146HDpavl0cw1DSVP061Ry2PX0/ON6I= github.com/wagslane/go-password-validator v0.3.0/go.mod h1:TI1XJ6T5fRdRnHqHt14pvy1tNVnrwe7m3/f1f2fDphQ= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= From b8e2344ef54b1f88af33935f1afb588f566f42a6 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Mon, 4 Aug 2025 16:21:13 +0100 Subject: [PATCH 061/260] chore(agent/agentcontainers): disable project autostart by default (#19114) We disable the logic that allows autostarting discovered devcontainers by default. We want this behavior to be opt-in rather than opt-out. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- agent/agentcontainers/api.go | 26 +++++++--- agent/agentcontainers/api_test.go | 70 ++++++++++++++++++++++++++ cli/agent.go | 43 +++++++++------- cli/testdata/coder_agent_--help.golden | 4 ++ 4 files changed, 119 insertions(+), 24 deletions(-) diff --git a/agent/agentcontainers/api.go b/agent/agentcontainers/api.go index 48ade4bb195f4..fb459804646ae 100644 --- a/agent/agentcontainers/api.go +++ b/agent/agentcontainers/api.go @@ -77,7 +77,8 @@ type API struct { subAgentURL string subAgentEnv []string - projectDiscovery bool // If we should perform project discovery or not. + projectDiscovery bool // If we should perform project discovery or not. + discoveryAutostart bool // If we should autostart discovered projects. ownerName string workspaceName string @@ -144,7 +145,8 @@ func WithCommandEnv(ce CommandEnv) Option { strings.HasPrefix(s, "CODER_AGENT_TOKEN=") || strings.HasPrefix(s, "CODER_AGENT_AUTH=") || strings.HasPrefix(s, "CODER_AGENT_DEVCONTAINERS_ENABLE=") || - strings.HasPrefix(s, "CODER_AGENT_DEVCONTAINERS_PROJECT_DISCOVERY_ENABLE=") + strings.HasPrefix(s, "CODER_AGENT_DEVCONTAINERS_PROJECT_DISCOVERY_ENABLE=") || + strings.HasPrefix(s, "CODER_AGENT_DEVCONTAINERS_DISCOVERY_AUTOSTART_ENABLE=") }) return shell, dir, env, nil } @@ -287,6 +289,14 @@ func WithProjectDiscovery(projectDiscovery bool) Option { } } +// WithDiscoveryAutostart sets if the API should attempt to autostart +// projects that have been discovered +func WithDiscoveryAutostart(discoveryAutostart bool) Option { + return func(api *API) { + api.discoveryAutostart = discoveryAutostart + } +} + // ScriptLogger is an interface for sending devcontainer logs to the // controlplane. type ScriptLogger interface { @@ -542,11 +552,13 @@ func (api *API) discoverDevcontainersInProject(projectPath string) error { Container: nil, } - config, err := api.dccli.ReadConfig(api.ctx, workspaceFolder, path, []string{}) - if err != nil { - logger.Error(api.ctx, "read project configuration", slog.Error(err)) - } else if config.Configuration.Customizations.Coder.AutoStart { - dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStarting + if api.discoveryAutostart { + config, err := api.dccli.ReadConfig(api.ctx, workspaceFolder, path, []string{}) + if err != nil { + logger.Error(api.ctx, "read project configuration", slog.Error(err)) + } else if config.Configuration.Customizations.Coder.AutoStart { + dc.Status = codersdk.WorkspaceAgentDevcontainerStatusStarting + } } api.knownDevcontainers[workspaceFolder] = dc diff --git a/agent/agentcontainers/api_test.go b/agent/agentcontainers/api_test.go index 340853a91d360..a9ce12b892602 100644 --- a/agent/agentcontainers/api_test.go +++ b/agent/agentcontainers/api_test.go @@ -3792,6 +3792,7 @@ func TestDevcontainerDiscovery(t *testing.T) { agentcontainers.WithContainerCLI(&fakeContainerCLI{}), agentcontainers.WithDevcontainerCLI(mDCCLI), agentcontainers.WithProjectDiscovery(true), + agentcontainers.WithDiscoveryAutostart(true), ) api.Start() defer api.Close() @@ -3813,6 +3814,75 @@ func TestDevcontainerDiscovery(t *testing.T) { // Then: We expect the mock infra to not fail. }) } + + t.Run("Disabled", func(t *testing.T) { + t.Parallel() + var ( + ctx = testutil.Context(t, testutil.WaitShort) + logger = testutil.Logger(t) + mClock = quartz.NewMock(t) + mDCCLI = acmock.NewMockDevcontainerCLI(gomock.NewController(t)) + + fs = map[string]string{ + "/home/coder/.git/HEAD": "", + "/home/coder/.devcontainer/devcontainer.json": "", + } + + r = chi.NewRouter() + ) + + // We expect that neither `ReadConfig`, nor `Up` are called as we + // have explicitly disabled the agentcontainers API from attempting + // to autostart devcontainers that it discovers. + mDCCLI.EXPECT().ReadConfig(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + []string{}, + ).Return(agentcontainers.DevcontainerConfig{ + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, + }, + }, + }, + }, nil).Times(0) + + mDCCLI.EXPECT().Up(gomock.Any(), + "/home/coder", + "/home/coder/.devcontainer/devcontainer.json", + gomock.Any(), + ).Return("", nil).Times(0) + + api := agentcontainers.NewAPI(logger, + agentcontainers.WithClock(mClock), + agentcontainers.WithWatcher(watcher.NewNoop()), + agentcontainers.WithFileSystem(initFS(t, fs)), + agentcontainers.WithManifestInfo("owner", "workspace", "parent-agent", "/home/coder"), + agentcontainers.WithContainerCLI(&fakeContainerCLI{}), + agentcontainers.WithDevcontainerCLI(mDCCLI), + agentcontainers.WithProjectDiscovery(true), + agentcontainers.WithDiscoveryAutostart(false), + ) + api.Start() + defer api.Close() + r.Mount("/", api.Routes()) + + // When: All expected dev containers have been found. + require.Eventuallyf(t, func() bool { + req := httptest.NewRequest(http.MethodGet, "/", nil).WithContext(ctx) + rec := httptest.NewRecorder() + r.ServeHTTP(rec, req) + + got := codersdk.WorkspaceAgentListContainersResponse{} + err := json.NewDecoder(rec.Body).Decode(&got) + require.NoError(t, err) + + return len(got.Devcontainers) >= 1 + }, testutil.WaitShort, testutil.IntervalFast, "dev containers never found") + + // Then: We expect the mock infra to not fail. + }) }) } diff --git a/cli/agent.go b/cli/agent.go index 4f50fbfe88942..c192d4429ccaf 100644 --- a/cli/agent.go +++ b/cli/agent.go @@ -40,23 +40,24 @@ import ( func (r *RootCmd) workspaceAgent() *serpent.Command { var ( - auth string - logDir string - scriptDataDir string - pprofAddress string - noReap bool - sshMaxTimeout time.Duration - tailnetListenPort int64 - prometheusAddress string - debugAddress string - slogHumanPath string - slogJSONPath string - slogStackdriverPath string - blockFileTransfer bool - agentHeaderCommand string - agentHeader []string - devcontainers bool - devcontainerProjectDiscovery bool + auth string + logDir string + scriptDataDir string + pprofAddress string + noReap bool + sshMaxTimeout time.Duration + tailnetListenPort int64 + prometheusAddress string + debugAddress string + slogHumanPath string + slogJSONPath string + slogStackdriverPath string + blockFileTransfer bool + agentHeaderCommand string + agentHeader []string + devcontainers bool + devcontainerProjectDiscovery bool + devcontainerDiscoveryAutostart bool ) cmd := &serpent.Command{ Use: "agent", @@ -366,6 +367,7 @@ func (r *RootCmd) workspaceAgent() *serpent.Command { DevcontainerAPIOptions: []agentcontainers.Option{ agentcontainers.WithSubAgentURL(r.agentURL.String()), agentcontainers.WithProjectDiscovery(devcontainerProjectDiscovery), + agentcontainers.WithDiscoveryAutostart(devcontainerDiscoveryAutostart), }, }) @@ -519,6 +521,13 @@ func (r *RootCmd) workspaceAgent() *serpent.Command { Description: "Allow the agent to search the filesystem for devcontainer projects.", Value: serpent.BoolOf(&devcontainerProjectDiscovery), }, + { + Flag: "devcontainers-discovery-autostart-enable", + Default: "false", + Env: "CODER_AGENT_DEVCONTAINERS_DISCOVERY_AUTOSTART_ENABLE", + Description: "Allow the agent to autostart devcontainer projects it discovers based on their configuration.", + Value: serpent.BoolOf(&devcontainerDiscoveryAutostart), + }, } return cmd diff --git a/cli/testdata/coder_agent_--help.golden b/cli/testdata/coder_agent_--help.golden index 0627016855e08..c6d75705a6eb4 100644 --- a/cli/testdata/coder_agent_--help.golden +++ b/cli/testdata/coder_agent_--help.golden @@ -33,6 +33,10 @@ OPTIONS: --debug-address string, $CODER_AGENT_DEBUG_ADDRESS (default: 127.0.0.1:2113) The bind address to serve a debug HTTP server. + --devcontainers-discovery-autostart-enable bool, $CODER_AGENT_DEVCONTAINERS_DISCOVERY_AUTOSTART_ENABLE (default: false) + Allow the agent to autostart devcontainer projects it discovers based + on their configuration. + --devcontainers-enable bool, $CODER_AGENT_DEVCONTAINERS_ENABLE (default: true) Allow the agent to automatically detect running devcontainers. From b4f241391be7fcb67de077f43324c398f56a6009 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:21:27 +0000 Subject: [PATCH 062/260] chore: bump github.com/aws/aws-sdk-go-v2 from 1.36.4 to 1.37.1 (#19151) Bumps [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) from 1.36.4 to 1.37.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2&package-manager=go_modules&previous-version=1.36.4&new-version=1.37.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 2a79ebde74c2f..42fb2461036cd 100644 --- a/go.mod +++ b/go.mod @@ -82,7 +82,7 @@ require ( github.com/aquasecurity/trivy-iac v0.8.0 github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2 github.com/awalterschulze/gographviz v2.0.3+incompatible - github.com/aws/smithy-go v1.22.3 + github.com/aws/smithy-go v1.22.5 github.com/bramvdbogaerde/go-scp v1.5.0 github.com/briandowns/spinner v1.23.0 github.com/cakturk/go-netstat v0.0.0-20200220111822-e5b49efee7a5 @@ -255,7 +255,7 @@ require ( github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c // indirect github.com/atotto/clipboard v0.1.4 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.4 + github.com/aws/aws-sdk-go-v2 v1.37.1 github.com/aws/aws-sdk-go-v2/config v1.29.14 github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect diff --git a/go.sum b/go.sum index 485a035129e67..a0275da5e8a5e 100644 --- a/go.sum +++ b/go.sum @@ -754,8 +754,8 @@ github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.36.4 h1:GySzjhVvx0ERP6eyfAbAuAXLtAda5TEy19E5q5W8I9E= -github.com/aws/aws-sdk-go-v2 v1.36.4/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= +github.com/aws/aws-sdk-go-v2 v1.37.1 h1:SMUxeNz3Z6nqGsXv0JuJXc8w5YMtrQMuIBmDx//bBDY= +github.com/aws/aws-sdk-go-v2 v1.37.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= github.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM= github.com/aws/aws-sdk-go-v2/config v1.29.14/go.mod h1:wVPHWcIFv3WO89w0rE10gzf17ZYy+UVS1Geq8Iei34g= github.com/aws/aws-sdk-go-v2/credentials v1.17.67 h1:9KxtdcIA/5xPNQyZRgUSpYOE6j9Bc4+D7nZua0KGYOM= @@ -782,8 +782,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0c github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY= github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= -github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= -github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= From ce9b20867dfdd958eca6b950c538ea5f70c59a59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:26:10 +0000 Subject: [PATCH 063/260] chore: bump github.com/fergusstrange/embedded-postgres from 1.31.0 to 1.32.0 (#19155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/fergusstrange/embedded-postgres](https://github.com/fergusstrange/embedded-postgres) from 1.31.0 to 1.32.0.
Release notes

Sourced from github.com/fergusstrange/embedded-postgres's releases.

v1.32.0

What's Changed

Full Changelog: https://github.com/fergusstrange/embedded-postgres/compare/v1.31.0...v1.32.0

Commits
  • 0c7d03d Add support for Postgres 17 and update default version (#159)
  • bab016e Ensure target directories exist before extraction and add test for runtime pa...
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/fergusstrange/embedded-postgres&package-manager=go_modules&previous-version=1.31.0&new-version=1.32.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 42fb2461036cd..6aac3a404c1e8 100644 --- a/go.mod +++ b/go.mod @@ -116,7 +116,7 @@ require ( github.com/fatih/color v1.18.0 github.com/fatih/structs v1.1.0 github.com/fatih/structtag v1.2.0 - github.com/fergusstrange/embedded-postgres v1.31.0 + github.com/fergusstrange/embedded-postgres v1.32.0 github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa github.com/gen2brain/beeep v0.11.1 github.com/gliderlabs/ssh v0.3.8 diff --git a/go.sum b/go.sum index a0275da5e8a5e..055409f53754e 100644 --- a/go.sum +++ b/go.sum @@ -1058,8 +1058,8 @@ github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4 github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fergusstrange/embedded-postgres v1.31.0 h1:JmRxw2BcPRcU141nOEuGXbIU6jsh437cBB40rmftZSk= -github.com/fergusstrange/embedded-postgres v1.31.0/go.mod h1:w0YvnCgf19o6tskInrOOACtnqfVlOvluz3hlNLY7tRk= +github.com/fergusstrange/embedded-postgres v1.32.0 h1:kh2ozEvAx2A0LoIJZEGNwHmoFTEQD243KrHjifcYGMo= +github.com/fergusstrange/embedded-postgres v1.32.0/go.mod h1:w0YvnCgf19o6tskInrOOACtnqfVlOvluz3hlNLY7tRk= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= From 181c2f00ae6c6afa0ee927ec6d2759655d3c0e99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:29:10 +0000 Subject: [PATCH 064/260] chore: bump github.com/coreos/go-oidc/v3 from 3.14.1 to 3.15.0 (#19156) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/coreos/go-oidc/v3](https://github.com/coreos/go-oidc) from 3.14.1 to 3.15.0.
Release notes

Sourced from github.com/coreos/go-oidc/v3's releases.

v3.15.0

What's Changed

Full Changelog: https://github.com/coreos/go-oidc/compare/v3.14.1...v3.15.0

Commits
  • 8d1e57e oidc: verify the ID Token's signature before processing claims
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/coreos/go-oidc/v3&package-manager=go_modules&previous-version=3.14.1&new-version=3.15.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6aac3a404c1e8..2431e8357f24e 100644 --- a/go.mod +++ b/go.mod @@ -104,7 +104,7 @@ require ( github.com/coder/terraform-provider-coder/v2 v2.9.0 github.com/coder/websocket v1.8.13 github.com/coder/wgtunnel v0.1.13-0.20240522110300-ade90dfb2da0 - github.com/coreos/go-oidc/v3 v3.14.1 + github.com/coreos/go-oidc/v3 v3.15.0 github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf github.com/creack/pty v1.1.21 github.com/dave/dst v0.27.2 diff --git a/go.sum b/go.sum index 055409f53754e..83bf6b239b4a5 100644 --- a/go.sum +++ b/go.sum @@ -952,8 +952,8 @@ github.com/containerd/platforms v1.0.0-rc.1 h1:83KIq4yy1erSRgOVHNk1HYdPvzdJ5CnsW github.com/containerd/platforms v1.0.0-rc.1/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/coreos/go-oidc/v3 v3.14.1 h1:9ePWwfdwC4QKRlCXsJGou56adA/owXczOzwKdOumLqk= -github.com/coreos/go-oidc/v3 v3.14.1/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU= +github.com/coreos/go-oidc/v3 v3.15.0 h1:R6Oz8Z4bqWR7VFQ+sPSvZPQv4x8M+sJkDO5ojgwlyAg= +github.com/coreos/go-oidc/v3 v3.15.0/go.mod h1:HaZ3szPaZ0e4r6ebqvsLWlk2Tn+aejfmrfah6hnSYEU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= From 1ae5cac7b6c6a9792776ff80231e7eb5ed33c6f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:34:39 +0000 Subject: [PATCH 065/260] chore: bump github.com/aws/aws-sdk-go-v2/config from 1.29.14 to 1.30.2 (#19154) Bumps [github.com/aws/aws-sdk-go-v2/config](https://github.com/aws/aws-sdk-go-v2) from 1.29.14 to 1.30.2.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2/config&package-manager=go_modules&previous-version=1.29.14&new-version=1.30.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 20 ++++++++++---------- go.sum | 40 ++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 2431e8357f24e..7fb4e6842fad5 100644 --- a/go.mod +++ b/go.mod @@ -256,19 +256,19 @@ require ( github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aws/aws-sdk-go-v2 v1.37.1 - github.com/aws/aws-sdk-go-v2/config v1.29.14 - github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect + github.com/aws/aws-sdk-go-v2/config v1.30.2 + github.com/aws/aws-sdk-go-v2/credentials v1.18.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1 // indirect github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.1 - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.1 // indirect github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.26.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.35.1 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect diff --git a/go.sum b/go.sum index 83bf6b239b4a5..65ef2f3ef42e4 100644 --- a/go.sum +++ b/go.sum @@ -756,32 +756,32 @@ github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.37.1 h1:SMUxeNz3Z6nqGsXv0JuJXc8w5YMtrQMuIBmDx//bBDY= github.com/aws/aws-sdk-go-v2 v1.37.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= -github.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM= -github.com/aws/aws-sdk-go-v2/config v1.29.14/go.mod h1:wVPHWcIFv3WO89w0rE10gzf17ZYy+UVS1Geq8Iei34g= -github.com/aws/aws-sdk-go-v2/credentials v1.17.67 h1:9KxtdcIA/5xPNQyZRgUSpYOE6j9Bc4+D7nZua0KGYOM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.67/go.mod h1:p3C44m+cfnbv763s52gCqrjaqyPikj9Sg47kUVaNZQQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= +github.com/aws/aws-sdk-go-v2/config v1.30.2 h1:YE1BmSc4fFYqFgN1mN8uzrtc7R9x+7oSWeX8ckoltAw= +github.com/aws/aws-sdk-go-v2/config v1.30.2/go.mod h1:UNrLGZ6jfAVjgVJpkIxjLufRJqTXCVYOpkeVf83kwBo= +github.com/aws/aws-sdk-go-v2/credentials v1.18.2 h1:mfm0GKY/PHLhs7KO0sUaOtFnIQ15Qqxt+wXbO/5fIfs= +github.com/aws/aws-sdk-go-v2/credentials v1.18.2/go.mod h1:v0SdJX6ayPeZFQxgXUKw5RhLpAoZUuynxWDfh8+Eknc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1 h1:owmNBboeA0kHKDcdF8KiSXmrIuXZustfMGGytv6OMkM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1/go.mod h1:Bg1miN59SGxrZqlP8vJZSmXW+1N8Y1MjQDq1OfuNod8= github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.1 h1:yg6nrV33ljY6CppoRnnsKLqIZ5ExNdQOGRBGNfc56Yw= github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.1/go.mod h1:hGdIV5nndhIclFFvI1apVfQWn9ZKqedykZ1CtLZd03E= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 h1:ksZXBYv80EFTcgc8OJO48aQ8XDWXIQL7gGasPeCoTzI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1/go.mod h1:HSksQyyJETVZS7uM54cir0IgxttTD+8aEoJMPGepHBI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 h1:+dn/xF/05utS7tUhjIcndbuaPjfll2LhbH1cCDGLYUQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1/go.mod h1:hyAGz30LHdm5KBZDI58MXx5lDVZ5CUfvfTZvMu4HCZo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0 h1:6+lZi2JeGKtCraAj1rpoZfKqnQ9SptseRZioejfUOLM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.0/go.mod h1:eb3gfbVIxIoGgJsi9pGne19dhCBpK6opTYpQqAmdy44= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.1 h1:ky79ysLMxhwk5rxJtS+ILd3Mc8kC5fhsLBrP27r6h4I= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.1/go.mod h1:+2MmkvFvPYM1vsozBWduoLJUi5maxFk5B7KJFECujhY= github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4 h1:hgSBvRT7JEWx2+vEGI9/Ld5rZtl7M5lu8PqdvOmbRHw= github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4/go.mod h1:v7NIzEFIHBiicOMaMTuEmbnzGnqW0d+6ulNALul6fYE= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= -github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.1 h1:uWaz3DoNK9MNhm7i6UGxqufwu3BEuJZm72WlpGwyVtY= +github.com/aws/aws-sdk-go-v2/service/sso v1.26.1/go.mod h1:ILpVNjL0BO+Z3Mm0SbEeUoYS9e0eJWV1BxNppp0fcb8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.1 h1:XdG6/o1/ZDmn3wJU5SRAejHaWgKS4zHv0jBamuKuS2k= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.31.1/go.mod h1:oiotGTKadCOCl3vg/tYh4k45JlDF81Ka8rdumNhEnIQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.1 h1:iF4Xxkc0H9c/K2dS0zZw3SCkj0Z7n6AMnUiiyoJND+I= +github.com/aws/aws-sdk-go-v2/service/sts v1.35.1/go.mod h1:0bxIatfN0aLq4mjoLDeBpOjOke68OsFlXPDFJ7V0MYw= github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= From 83aafd82384938a47d01208237f29ce253e65b24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:46:34 +0000 Subject: [PATCH 066/260] chore: bump google.golang.org/grpc from 1.73.0 to 1.74.2 (#19158) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.73.0 to 1.74.2.
Release notes

Sourced from google.golang.org/grpc's releases.

Release 1.74.2

New Features

  • grpc: introduce new DialOptions and ServerOptions (WithStaticStreamWindowSize, WithStaticConnWindowSize, StaticStreamWindowSize, StaticConnWindowSize) that force fixed window sizes for all HTTP/2 connections. By default, gRPC uses dynamic sizing of these windows based upon a BDP estimation algorithm. The existing options (WithInitialWindowSize, etc) also disable BDP estimation, but this behavior will be changed in a following release. (#8283)

API Changes

  • balancer: add ExitIdle method to Balancer interface. Earlier, implementing this method was optional. (#8367)

Behavior Changes

  • xds: Remove the GRPC_EXPERIMENTAL_ENABLE_LEAST_REQUEST environment variable that allows disabling the least request balancer with xDS. Least request was made available by default with xDS in v1.72.0. (#8248)
  • server: allow 0s grpc-timeout header values, which older gRPC-Java versions could send. This restores the behavior of grpc-go before v1.73.0. (#8439)

Bug Fixes

  • googledirectpath: avoid logging the error message Attempt to set a bootstrap configuration... when creating multiple directpath channels. (#8419)

Performance Improvements

  • transport: reduce heap allocations by pooling objects and avoiding method-to-closure conversions. (#8361)
  • transport: reduce heap allocations by re-using mem.Reader objects. (#8360)

Documentation

  • examples: add examples to demonstrate enabling experimental metrics using the OpenTelemetry plugin. (#8388)

Release 1.74.1

Version 1.74.1 retracts release v1.74.0 and itself. Release 1.74.0 was accidentally tagged on the wrong commit and should not be used. Version 1.73.0 should be used until 1.74.2 is released.

Release 1.74.0 was accidentally tagged on the wrong commit and should not be used. Version 1.73.0 should be used until 1.74.1 is released.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/grpc&package-manager=go_modules&previous-version=1.73.0&new-version=1.74.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 7fb4e6842fad5..b52c30705df48 100644 --- a/go.mod +++ b/go.mod @@ -207,7 +207,7 @@ require ( golang.org/x/tools v0.35.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da google.golang.org/api v0.242.0 - google.golang.org/grpc v1.73.0 + google.golang.org/grpc v1.74.2 google.golang.org/protobuf v1.36.6 gopkg.in/DataDog/dd-trace-go.v1 v1.74.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 @@ -455,7 +455,7 @@ require ( golang.zx2c4.com/wireguard/windows v0.5.3 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect @@ -486,7 +486,7 @@ require ( ) require ( - cel.dev/expr v0.23.0 // indirect + cel.dev/expr v0.24.0 // indirect cloud.google.com/go v0.120.0 // indirect cloud.google.com/go/iam v1.5.2 // indirect cloud.google.com/go/monitoring v1.24.2 // indirect @@ -507,7 +507,7 @@ require ( github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect - github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da // indirect github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect @@ -536,7 +536,7 @@ require ( github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect google.golang.org/genai v1.12.0 // indirect diff --git a/go.sum b/go.sum index 65ef2f3ef42e4..825bd8b8ebd46 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ cdr.dev/slog v1.6.2-0.20250703074222-9df5e0a6c145 h1:Mk4axSLxKw3hjkf3PffBLQYta7nPVIWObuKCPDWgQLc= cdr.dev/slog v1.6.2-0.20250703074222-9df5e0a6c145/go.mod h1:NaoTA7KwopCrnaSb0JXTC0PTp/O/Y83Lndnq0OEV3ZQ= -cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= -cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY= +cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -897,8 +897,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/coder/agentapi-sdk-go v0.0.0-20250505131810-560d1d88d225 h1:tRIViZ5JRmzdOEo5wUWngaGEFBG8OaE1o2GIHN5ujJ8= github.com/coder/agentapi-sdk-go v0.0.0-20250505131810-560d1d88d225/go.mod h1:rNLVpYgEVeu1Zk29K64z6Od8RBP9DwqCu9OfCzh8MR4= github.com/coder/aisdk-go v0.0.9 h1:Vzo/k2qwVGLTR10ESDeP2Ecek1SdPfZlEjtTfMveiVo= @@ -1948,8 +1948,8 @@ go.opentelemetry.io/collector/semconv v0.123.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxD go.opentelemetry.io/contrib v1.0.0/go.mod h1:EH4yDYeNoaTqn/8yCWQmfNB78VHfGX2Jt2bvnvzBlGM= go.opentelemetry.io/contrib v1.19.0 h1:rnYI7OEPMWFeM4QCqWQ3InMJ0arWMR1i0Cx9A5hcjYM= go.opentelemetry.io/contrib v1.19.0/go.mod h1:gIzjwWFoGazJmtCaDgViqOSJPde2mCWzv60o0bWPcZs= -go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= -go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= @@ -2639,8 +2639,8 @@ google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= -google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= -google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= +google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -2684,8 +2684,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= -google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= +google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= +google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 06eaa006ea33644dd052e76e3b86fa2a71e70679 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:57:47 +0000 Subject: [PATCH 067/260] chore: bump github.com/prometheus/client_golang from 1.22.0 to 1.23.0 (#19159) Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.22.0 to 1.23.0.
Release notes

Sourced from github.com/prometheus/client_golang's releases.

v1.23.0 - 2025-07-30

  • [CHANGE] Minimum required Go version is now 1.23, only the two latest Go versions are supported from now on. #1812
  • [FEATURE] Add WrapCollectorWith and WrapCollectorWithPrefix #1766
  • [FEATURE] Add exemplars for native histograms #1686
  • [ENHANCEMENT] exp/api: Bubble up status code from writeResponse #1823
  • [ENHANCEMENT] collector/go: Update runtime metrics for Go v1.23 and v1.24 #1833
  • [BUGFIX] exp/api: client prompt return on context cancellation #1729

... (truncated)

Changelog

Sourced from github.com/prometheus/client_golang's changelog.

1.23.0 / 2025-07-30

  • [CHANGE] Minimum required Go version is now 1.23, only the two latest Go versions are supported from now on. #1812
  • [FEATURE] Add WrapCollectorWith and WrapCollectorWithPrefix #1766
  • [FEATURE] Add exemplars for native histograms #1686
  • [ENHANCEMENT] exp/api: Bubble up status code from writeResponse #1823
  • [ENHANCEMENT] collector/go: Update runtime metrics for Go v1.23 and v1.24 #1833
  • [BUGFIX] exp/api: client prompt return on context cancellation #1729
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/prometheus/client_golang&package-manager=go_modules&previous-version=1.22.0&new-version=1.23.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index b52c30705df48..748e6538fdcba 100644 --- a/go.mod +++ b/go.mod @@ -165,9 +165,9 @@ require ( github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e github.com/pkg/sftp v1.13.7 github.com/prometheus-community/pro-bing v0.7.0 - github.com/prometheus/client_golang v1.22.0 - github.com/prometheus/client_model v0.6.1 - github.com/prometheus/common v0.63.0 + github.com/prometheus/client_golang v1.23.0 + github.com/prometheus/client_model v0.6.2 + github.com/prometheus/common v0.65.0 github.com/quasilyte/go-ruleguard/dsl v0.3.22 github.com/robfig/cron/v3 v3.0.1 github.com/shirou/gopsutil/v4 v4.25.4 @@ -394,7 +394,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect - github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/riandyrn/otelchi v0.5.1 // indirect github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 // indirect diff --git a/go.sum b/go.sum index 825bd8b8ebd46..cb29e1ab12f81 100644 --- a/go.sum +++ b/go.sum @@ -1681,17 +1681,17 @@ github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus-community/pro-bing v0.7.0 h1:KFYFbxC2f2Fp6c+TyxbCOEarf7rbnzr9Gw8eIb0RfZA= github.com/prometheus-community/pro-bing v0.7.0/go.mod h1:Moob9dvlY50Bfq6i88xIwfyw7xLFHH69LUgx9n5zqCE= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= -github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= From 8a8c13382ea0225c3c92849ba14e72585b2061d4 Mon Sep 17 00:00:00 2001 From: Jon Ayers Date: Mon, 4 Aug 2025 12:42:50 -0400 Subject: [PATCH 068/260] feat: update form-data dependency to 4.0.4 (#19128) --- site/package.json | 1 + site/pnpm-lock.yaml | 22 ++++++++-------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/site/package.json b/site/package.json index 8d688b45c928b..75ff5a33d3a33 100644 --- a/site/package.json +++ b/site/package.json @@ -205,6 +205,7 @@ "@babel/runtime": "7.26.10", "@babel/helpers": "7.26.10", "esbuild": "^0.25.0", + "form-data": "4.0.4", "prismjs": "1.30.0" } } diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index 3c7f5176b5b6b..b5ce1062e605a 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -10,6 +10,7 @@ overrides: '@babel/runtime': 7.26.10 '@babel/helpers': 7.26.10 esbuild: ^0.25.0 + form-data: 4.0.4 prismjs: 1.30.0 importers: @@ -3842,8 +3843,8 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, tarball: https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==, tarball: https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==, tarball: https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz} engines: {node: '>= 6'} format@0.2.2: @@ -3983,10 +3984,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, tarball: https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz} engines: {node: '>= 0.4'} - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, tarball: https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz} - engines: {node: '>= 0.4'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, tarball: https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz} engines: {node: '>= 0.4'} @@ -9211,7 +9208,7 @@ snapshots: axios@1.8.2: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.2 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -10164,11 +10161,12 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 format@0.2.2: {} @@ -10303,10 +10301,6 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.0: - dependencies: - function-bind: 1.1.2 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -10492,7 +10486,7 @@ snapshots: is-core-module@2.13.1: dependencies: - hasown: 2.0.0 + hasown: 2.0.2 is-core-module@2.16.1: dependencies: @@ -11058,7 +11052,7 @@ snapshots: decimal.js: 10.4.3 domexception: 4.0.0 escodegen: 2.1.0 - form-data: 4.0.2 + form-data: 4.0.4 html-encoding-sniffer: 3.0.0 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 From 75749efec747f501f42c9625a61f722fe4c5101f Mon Sep 17 00:00:00 2001 From: Phorcys <57866459+phorcys420@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:52:51 +0200 Subject: [PATCH 069/260] chore: update diagrams to meet new branding (#19164) --- docs/images/architecture-multi-region.png | Bin 676184 -> 1395858 bytes docs/images/architecture-single-region.png | Bin 290814 -> 586463 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/architecture-multi-region.png b/docs/images/architecture-multi-region.png index 41205f401b64c09c471bdd64d9edd1219c0b882f..904b769d64237494fc7eabfa1e5e1d98cd144d7e 100644 GIT binary patch literal 1395858 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

TH#CPAF^RYSdahI(0e_>x|Y>JB!~hK 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

)NfI&^$! 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

=+O?~70Md*G6go|b77p^TM0nWSeZLfkan1c=; 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%0AqdFvK8GI5=^GqcqW7%8i9 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

NIiKMJsOMB4V!_Q7IeDdP6KrZ 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 M(Z6BPz z8DDqVSi^4xtOf8cdu78fe%sPo$aILfkU>WF#M@p(L$oY3RiRc+s)!)$yVVm$HX8=|83P`xuF#(utuGy_|1H z*IpkF7Uo$#75ii{>dEqS1<%Py!fOLHb=#WY>6#_TEdu(Rt9c23;)rfz6?#zwRgEkS zbcb_un+Y4?yGoqEEl*G9ZU3ZLdBT6`!9=i(l8F!}^&n?TncIZcE~zVwlmkJwEz^u` z{>5ww{V7VX5iqOJCVsq}Dy;nOxYr1Q(QLSJsyR=ZY!fCNoMAABkqY=(exYcfys%@dBb-p z#BLi%qm$7T2B@kK;7(E`ik*C~tv*eiI6;-u8BDF3AZk?{09=%P=u$KlfekE@=#-Rv z;P~Yh<5r-eJ%CFBU2De+bcnkBXnWq2s#=8@mx0MZ5vSotVB=FUf>n6^ZeVR`Y6`qM z--au#OQR4`4O%crZoUr2xOu??s84~oqEAl>z!_q409Hy{+_o1`iOe;ksWyrPr>Vm7 zf^XhVg3jZQfupzp;lKfOf&f65gsk~{`pz3HPSU?vfJwske$CV?RamV~GmiQ>6kHz#Oc|J5Y{S(0g;a|ZOYEoS+6ICsRqw3>C=0c%)0ob& z{>F25Y8Gs7h~sYs|3)kn1S-X8U#~2TsD_0s!NP1dh}W zsktoDcb4DL*akQTf%yofZI^b_qHZkyF2;&FkqR;o4;ZxY#5#B-Bpcs>SGLR;VCPi} z@^^+~^!bH8|DE~oegL@+r~gx$+&cR#oI8U8xgjN}ZODp0FnYM<^imXTL*33Lsrpo* z3Fbn})$MsFJ-4c&GQpdU2KSDC5Vo_~soTc6Ap0HJ)O@|OW61aTMNDk22kz4pHDgp) zN;u_HV6fZ$`pp9U8n{zS(`|>GNHbjXKN%f@U1K6dl(k-HZ5$rw{58`iWTGqGb|aLO zbarCbzTg$4*g(=#GQUQ1EaN(NGqV5b6q#mkD^&QZ!$$B#R&;Rys|{O~_Q zLtbCL0Q88!8X6yQnFS&W%qry%!biv4w;H=gbf!H*;Jj3~6`qPD^5lSO0}=gj{En#z)P#jN+B2y(hMT$BM1~{GNn?k{2HG`T!0VGl0L-ijrBdcdYQC0clNGWn0)nspo z3w8pq8aXh%qrj`&sT>G}V4LaP33&FV?S%QuyhbgG05$0R$OcgIACvYwFa zN4ZF*LO@j404YGc>8%+s35|-vRVLCFV=>g2Ci#xDa_Q?WU0JI4F*q$BIE#$R{DJg$ zZ^8vvK)?ei8I?;5kg4t}7!vLsa6K&o<8`6nK5`jG#oK{?WK~oDOQ;#n^Fla4BA4&4 zoCq2K0GKDa3w2<+(~{4mLlap0>=`~cRy@LTLk^%Oac*C znX#YYS!NNMQ*>03_Kisjt+>*!t3xLoU6@vG$GS!OPCb`8aVn%XnZq)z(wQrkBq#;V zn{{Bb;k8IMLt{U9utBhSjBL{6NW|;*O&0Pv-&ka|c(|l*N z;lmk;<1IPX5MHIQ?rLR*pUpjr&;8=3x&JQE?IOFj;>gjW1#WG(xjp-t$M8|7S7J@0z=(zIXQeA z?B|fSUx<_jDBZvK9xB5IMP_h)?r^O*TS4tWA@u;`rWHD-W&L#xfDxKYpL6@luJgj7 zl^(&bPL6Jdc+J|5CY?DdHHHy_FS-X`#?1Zhs7+Tt{9i3V>I{_;XE>R!H(;32Souj_ z0HETF!SNTyvnB@IjSMQm-|syV)(6*7c#Bm)d`I!Eu}u<#}(hoO7Ty4qjSvbw7 zKlvTt>20ZS0)PdD3ZAY3D;h8(-}^W!fUF=JY*GDeoTrY#ky=_R592LgCGmSh&JWTi7n&Loh;t3kVa6n8zw1_iYFH9<1g zk5Dc-#BacIPDOD6SPB~+R_t$$*lj8a7l`eVBD%C<$Zv5(G`WNXoXL`RiMwx60-(0m zyh~_2Lu#43eLHN?U35o+gY?~TXdJ@pMIqDF?9qz$pZ_cM|Ml0LT5c`@WUt1r`MRZ9 zg>7KHNp+r>PbGQJtF`Eq(v#1RcwQ7zyrB#;Cf4sU&I|@k<%WT3S|Dfx@2vJZ6XFwP zRZvO=K2iw@=>_e}-yf!Typc~iBFFs8;^R>z<`{_!^YK7cnCSm-fo{l@7C(ZIr zJwL(ISLaHSYOkB_bNSm5%aI);`fzt;At<<=L!H}tbstm#lG%6eoiN; zI#FazOu)e**9oA!9|H3yyQ^qXEAW>icEndT3dJ{`r1$Kvzq83Yaex3A?s8PzjSwt7 zd2NlIe986gJP>pVd9|CEZ%=~>RjfC#I52o&3yet6K|2H3y)5GmR*5bueSCXS8!#a0 z4yH+BH1OXSFKDjPF_iXS*72fP0=8D#wsOQyvk6$G@dH1Bhj{qMyP-Fkikg6(Q*jPA zoalfwtX&U5$cfid3}oFT5f{MF58$j<`Z7=sFb4MhW(zuYW#Hn_=$m%|cb<+^J~;3% z>P%A*sHtm-#iChWIt}t*7~fxG5aJ1E`vh75dI10dJ8IXZII=EpQpx(m=;jx29kD9# z;Y&vZidWnRiKAxm#2^sA>rB4KgVhO4&EbBMlT+TnD#AOaO%T)k_&D8l=1{hXjZ^VZ z6(n{P``4V+z^MvvWz@P!;--*j`yD%edBw2V)nLWdo!13>2yh;sZ(t`e1Lq&#^L7*(X|9>S!OwB? z=jg=)*yCEOSeK+N2Ge{lTZZ&OA?BdDp2S3H!S&Ho~a`Cd=?e{oh{OSRdP?R&5mq%2GXQdpNU8rSKfj)s1f0sP?KRN1Y^bFka!bm9UGt$x z4VW;%Ir_=a-xr{z69!&VDdHR`t@;Hkr({r)FCYT;is&+?u?W}DT9i5hPN?Fo&?Dsa zRe$sC4G=69*Cc|!s9a!hD>!^KGW-dI)ba-_U_d63ZNaB0+3{}M>z2>DF0P7@CrePw@WLhc&UHE;V1%N z@1`WUh`kHq5@Y>=^#ZfRirF>&J1v8Zj8g%(yp0Dh3C8|a_P6rf!0_3}-JXk11l7us z+YN>N()qbPbD!qvLKC#v&X#@x(QzQaWcZ?DomSeJ7;_!KG& zl{RUZyv(s=*V3L;QP+nlwfhAOiB1Jun+^BOT*eC-YHPIWSGM<#4==KbBUVe0cPG3{ zE{B}inCFFJ8eaAC2zV_%3WpGN5s@yZy;5Pfp&3yH8Tk}L?^CUHJvL{Z1Aecrevkdu z@ZVqj{`uL_vFNJa$}*>v!8@5?fN5V6WON(NQ|=0!od2eOG|K?`*>Uu71OVQHl)Jby zoOy}JUWwmJ`Sl_hsM3Fd(FofUfuT#HYEqjo=UG5T#3VL*0`MJWc8LT`aSeu-h8-|a z?gJ8HAxPA9N;k@7{K3!qr4-FhKntU}D^F=+$w&%$EuxM5ExKY+x+bd4Hj=#(lxL zlsfi+K!p$kW8&3$pqfulA~nsYHxVBLpjZ!o%c;glP`A_DZBE+M!`xY=TJ%8}pp0ps zkOm(jS2ep~uf}e~A0sbx3!W^{$FfniFZejs24tVW8)jAns#&E%d zVFP-^GK4LS9eXl4$qEeLX#qj)WB}1*#Q)lO)swFa#VTE@uA*DOYK`EQ?DL*-0<(?O zz6VWuFu1f5Tjs0sYC-oTlrD?P${l=9yENXPRxKi;R;&vxbo245pPmI8$hrx?s-q@8 zEr3s106JsksSBA)kxMm+X6hj4fIA%XHaX%C;+KDBSVh4A4&#y+e|A~3B1i}ZS0$z2 zG)o7G_`)ubHt}z_&o&`J$IVk2t8VvX132kEPKM5;hm!rpK>iO3arK5cN+p<4HvmZ% zND;Qs)wa3NG`XDqQTsx@%U4QOFqkl5*z}X5H_#|hRW`fwlNZH?0E(V<#%droYi`|< z0puo?$AGtX?QcrDUMM{_?le0XA{tEvWZqBd4Xyn>$-0y@u(i_^txU%xSP<*U zBK~W*EMudZ3so2>8xr9cGw)G1*k(bev%Gpm!7wFQSw^!;XsdlyBOJT#v$dK(5RP}r-1fQr*BvGDOZ=HB0!d~}0D?R^_CTZrSJMaLX8{`7NXVEoY0>Tg*CiF+(g8?kC5%sZWrv7uhy{8AMm~}8zv2LXi zY&qabR_Snf^(w&M+CvL$e{^)!h+vKfJ{c3Cs6PyY< z99xa6kbwFFJjy^!kJyF*XdBq=>HteR1Sb2usWt=TAK*8Z_@o9f{$gY>sp^yu@(1=E z_3@;qkbJ)FP(O2H)mTv(Ao{?pOxE0$W8@-Xa?s{=-5;l)3Qz|O1cLaUeyQR}mMx76vEJkX3eh)-t;IMOONHkA8MM(Py{MXdi26E~l z>eL}$zVo7K30GU%ADU+f$}cS@Hct)c3gCC4E@pT=5W~e*!3-qEU zeehqO4@3-QmmP0pt9tGL_VD~Tn5HE$?Yjs#51$W`guoz(gPFtN-v#il%WI+czkA@& zvL`RTNidSM(2)G^Tq1wcBl93N3#ra-I+r&^(dsY7V+`IfRZpbikPMr!QuOrMwSRdMUaxZ3(`WxJk^eI=>#8P8gdwvysBv2DOaqTC z%^}lf06X;ChzuU28eR!0AOMR}9}=0|%b#aT-=AYw?nnZAU<8;IlsiPJtY#{c?7`?v z9Bd-tYUf|1GH*_C5cG(s<+;z2^3bhJ#D&_YdtA1~S(M0puJs{;k5BS%!J zh~CH#WqDT@VmvxL^-_+$1=H7#A7|mEjyux@L^LO+m&u?j2BvdYoqBFs?W3SQQ%J>q zqoQV?>6>Plg82Z;Co#ZvivmvD_{2Ij5)ogqA_5?Jd2J2weL&3|T?FX#O(w z3=&+<8@o+R{wVI!Vz&$6OEfRlNxrYX^rds$YTdc_X^Kpuy}jT(0n44=0dxW*;GfqX z6E5Y2HlnFBQjX36lIT_QVbi&;$)}eqo#&}$cZrk5Pi%ole13DIuWl-wM;%s#LV$1+ zAIiN=o7zF$MiK&GC_u26f0lD2-g?CUCthUg9gjMCMeJ!Empy33RD-#Yz0XzvFZ^{t z%j=UN^k5M0Mn9`cfk(Z-CPOU!==oSH@dP zS3iO*9|8VXLV+&7`cuqG@7opMUje8atKE-50517g1p#d?+@4@Uso=N_WY9{Q3pK(R|&E^^_@+=uK$OZaY)azH?fW}50g9&mr2yUBjbuK zVzk+gIUTmX=Km_2bRzuo(HIHFp>JnG6`7GQ2HGCX zQ^mK5XJ>mR37V1G%Vj&J#@Bo$!mX;_kgI|W%H2I2COvcBkSmp8u+2J1>p(*SHiFfC z3Bj<o_;`c8`IN% zT|OBJj3$>gtr_zm0EALL^RD&(vGpEcO=fG?urrQ2V*wGR7sUdCfJmsOxq_SM}yDF-yf067FBpC@Yh9RZmHYOHVN-C)=_@UI)-z)#h9PjFa= z#Yg9wi{Mu>UaLNz3OU8bP^}FP#sH&I;`LbqVM4x8G(+?W_$iC zzUF>Y!~-@9BvSf((Ri#nfLaX-uqq1K20x0fXeIe1TSEcT0c>(MbS}0q{RI6$OauWO zgP_@A1jZ=+@C49xqxRt;LrwBTQWxsG98l9a_3waTV?f z_B%z8CNZZbAl%2Cc)p1k(r0=f;F@CN9(j$0k1@BsS3664fz0U|Ce`b4f-Ddz=! zNSNRt>HA*+jE8-@Aw||^v(Y$j@q-E620Q%$3MM#(Vl>MG1Hl?*G)?rfZj#|%F|x?2D;u&&}% z;XemgKO7vqNV24}9*)I<>O~ENuKiZP<&(tjIgtl>GHu zFkjcVx5$4K^_R{wOXQ5;0&MM<|8AC#d((4qD4~^orEnLVXpSLWKNYUz(Ru$Xlf6Z3 zCHDFZ%ROrNY1x>2A<(x(mGdJ+T^TR4U2MGj#uUSPkoNWgI(0XQc73QD#;r*N60m`i zP3`@Id#sjyw$F~A;h0Z4RnlJ}-QC~cJZIl2>uvWpK4P%k&9QYPpH)m3()b)%xm4Uc z7unA%nwB|t=O8`Mt=E_?lKc6QtGvhbpHrv*?Eo?_kA;wijuo6Gg2qOl!%608%go^^ zIKEFFS=C(Z2j{DtmJb0_H0V8Y@Be3cm%&eNSM{gK{PK6(pg2Sw}o)Nd1Y=Dmxv2w0t@Gk~CU{u2cX!7@bP154mk{ z+NX=k`m0l&VB{3DSC`?I)su9v?eSkT*Kuh}ThN+)3%|BjOKR|`KuMS6s?q~`a;XJn$x%6cO zAN}Q5$~A$$EVzB~q#9GyM}4N-e_Vd_=cP}7+E;EkNqN3oTHZTQms(otcIvn$es_EY z>u4^&) zFod;yT&tm`+4d`cuBHXZt040luFD|Fq>GE(1^9byUFWZ)<~8`vKSg*7e=9Z(mb5(+ z*)5gb8fZ$Y5YzDQn2DE^z7z3RXYr(B8Q}-)>5~gReIeRxECnn6LM$cRqYhBPX36m} zXDD~N`jrgV7^Hy6Jz7P3ww9;cR^}-yN`6^c)dY!HZ|`LN6c)MAAQKHo|6uD08gNM^ zD&ED7FP;6Ck@o?2bBO+maWS;+nz_ZA-wlg~8$;5C5uThwC=~Kc?0j4} zY5-vy#1|X-LdEj4l*-0(FMoT7V5aLzqgXEC4V%KFC+C;HLBw4<$U05YhaUCJ;}_k* za1o1eH`iNPx4qk>XlJ3$CvAP!^50J5Pqr85=R0{r2Ae~yPfrE}jz_o+vFCX142w3- zPq81(N-iwU3#+pkW%lm!sdFCqz9_T*{vB*lo)ObgiVA1=BN!n$r;#AyD*oN~;DsuA zn2;9PTGG%vJL)-Lsu6GF1o3E}hC)o3*qa?L^NA?XM!k*}ReTWNdcD1F!4snzVL{Zd z@v@D|5U6GAwRKE+;KuJ!`v@fEM#M!pQ8Pwq~!rpn`(&AaKiBKjl)~{4O(5 zWwQE$&6>nKySyl!bXu147T6O&u=RgOnJpBbSaya}jNY#tP-RR7_7;

9)qC5t8LKyZ9hc&1D9?3=5v|(FJ--T`5Jq+aB@y<(E_du>&sP5&Eao%;FCD|%QKUIHxNhX zBTk#TL~dN14UN3im3PCkixdp0W;P!CL}n^#&Xt!7qz)V69hIM&IpxakvAa#Xf%amQEG#%V=!d$IUQ zM^QDJJtw^{uhwsVLTxITcPvHnG@_vV^;vK4i^RUHjyg|&t;NMfzDd%<7`e4l8DeDr zR5AOOhYu&FGl`r2NxyPulQhZXyLbt4c;Btfsmb6Tjw%QtN=GT&!T8977N!|VD zdA6;YN{fkY3Qt17Y=-u0?{}PSk8hzYsP7W}XIjO)CYGS(F}K?WO#PHCwbdW3VqbWj=BIzfe>q&QLpzaD9Of1P zgYE67i?&vj#I>3xhqT5+*Z*`h!j!A%vk1pDUM+yB8?@wpx}d8VV5bu4;y&u=DiSl} z`SNn?Fbkhz?(`;G0|A-18{ONR8FF?3XfG@G{d;s~;nL%{RlgLk?;m;#Y)cqi;<|CA zZpxk8=#t3;=^(646Q!H=FxM}g`bAz^inbG4da}QJhMnM@v;60>BDhhLZ(j1F=0s`t za;mpF3rE}*Phi68mbXWuSC<-kQ))$9W{k{JiMPD!3YvBZquZS>!cMOzJ3xKDOljHkT2kApflqoQg>exuxTba3>>HwJEx zxwa}ZLO8IRO~w7Nl_WPEg|+!9v8nF#Q*q-*ue@tZyt$v9=-tW>>&!@{X1t5U6DpO` zYWL%Pw)jOBHios5rCNVbgUU3b>kziDZ!Wkz?fP&6%mOiG+kz-U77;_P7^gt_8edZ{ z57=i!hFj)r$H5@IX1M;i;Nganr~AG^Z5 zy{G#6XWBON_#A8NrA1DCjhwuP)Tr9d5Z`$S~uix*6_X?=kOS= zvJb`n!puw^Je}^#z{$q);UqA6HX2&)VKU@-IX{Ht19AIy+k^_XghsW8BVwpg)#L5M zN~CQV(wgB;RADq^kCGr3^fkk0$yEmxS+_#e|4!Ox+?N%RSxIrpv$j`18N|hjfrJ2twD!n=T*T(x^P5{|SdO#-%=aT5r&!xo`bU%_?T+oj)&ol?!SmDlx;mGL6X_*YK zGKZukmNpb52FDGotv@KI(?d$4+Z<-G4e@~Hnd=}&ppS`dTBy-}J{od^p zEl_c<{lHxkR+@-R^_@M#HQc1U?`1T8>p;xS26?9jz5X%f7MPjCzGekKO6*y|$^T z*bfzxZPI#T{u67)jW*2`pJ~Lm&w8=#=QC0qB2!PsxUgSL^$dXZGh{YT^xA*wk8*aB z@9^?2baaB+-g(WG)yyYIU|&zriJrI|9T}c6X_oFKmunltu#u zgbzBx^x&3-gyFM9DW_-^OWpJFn-N84@&rIdW$CV^(wr@DT`=Sb78_M{g=P)6Tz1ejRvlrgV+i{ERRyENQt9vimTr7ex?%cgq0n}2sT^+j_^+?@ zl8AJC!AqjEwCLj!5{V48lMi(#JGwr00)2*Eb$2VcM`8|-JQfpg2_vzpeM~*Vw(FM}u2l~cr@2*8g++{|!(gWWBa4jssNBm&3ea~y9 zjx*3>-Q~=C7Y()FUyHwf;XPzjQsa~Wv6XuY_1xI)V!6h{MBc#!=8wsC@B{Rs6X~+K znB*0cm3e8$8E(F8?`~*d@Byv_0;T^)4+Nnso9mW+HRvC1Kv_Ty7jA3Q6|F|wRq3=S z6(A0qx-=-#qp3BNFf<&n4S#I$PV*Y<+eWh0_=WUHu?XbW7G<)?vzLlbKy_F&HY$JW z%hMM;pfo$e`XI|B%2XlAviGl(OZqwP@fgbj8<}W%kCLY*m`_XZ%;SttJ9+; zGwV{y>h2F$pXS3RdYyw+q*18-MqW=(=+4?(eO8o*HmIK`-#&hSwIkEc|Jg=vKD5!) z>*a6z)YfMQ`%j_A>x}K)Odr(`K-=BS}ewEq@|op(yJ^wY8Om!LT|4sK7}eB=C|pT zU#g>rCQ!YKbtGzC#bw{QL~LJf|(|3e%$fKs57ecCJXR4h`K8 zVYqAB%_8DIu`_3*=<5913?Y%>XFTM&&U(W^ym0qZ2yc{QwgoFaI-k(t;8i}s7#+sU z5FWTsAwEg8>33U#cs!xkW49D{6L^0Nn+9 zN!_5Nq?qmUsl&ho!^>fdDB=?zBT3+Y3*QY69y@m*=Rwc{Dm*lNi?m{%E@q6pj3%Vw zkSw&lgeC<07YO)e?r|N{i5VfoLML~)w=qG9FbZ?SkkLq$q8KfYcG*x=B_o4v>7P9+~I5Dv~O6+xicaT}6lZK1nrhM$k7;@T>k zWVsw5J%?v5F2-9V_B=KUv{%!3d7L5i_R$k9;Hb~Z7wg?&vhEh4D+ib;c8D5|s$fy) zGUif{9DVoNJFx>?ddsMgXmr^rTW=!5-=#3>t!uz79(gj19PKU=YTn>yy|mR{KL;b} zltkQ(NF!3F3KpPOHT|UT#mB3ZSALGj-IQ|s8LEcVJ{^#+`WiY!>Y zA++S0twBOdd~laMuA<9*ouYDOaxW}B>K_Z6pXxTvs`b>+)*g~uA^`N6qi6nNcmh9sP1qgdI@4K=U;p%ao%`<0Aw$`_q#Vd+CSf1f^ z=>|(**btsTiQ?VaAhf-0;0+$X?cPZEi8EYhEgB}vbMrg7)Hi-K2aV)CMD|DeFLxn} zi`H3Ud5$~;5!NwrM-8&^wGdxJik6o*b5!;9O+e@odd^Dk&CiAovmkxxeSljDbPGjT*?}rhGFQ+`8cOH( zX+)TqAM2~TB_sn7zhin8jv&R9)jjn5rx58{D|%hKkGTi~B_nLZst@w?_m;ofP9dpp z$*YdclUY@nunF8j*<&cicw=bSECKEEK+z6Z{tr>LyO#Djs6pu=^wCo*(X<*`#`bz) zh@2$C#T}|pOPTPZo+;#bPh41F2})hJ+e5=yQIQEjA6Tx9F@>qOoVb(1%&!@sQ_T2t zgT~rFy2bx}M#4pJ+{qizn)xcJqr&(#fM;}a#LF*#JerYTehczP(H*y7yCtCwS}mx4wT8d(U`Zfs_5>CGZ|_bBTm05z<+#6h7@ z@T0GLd&JrM@#(pGn_W-0;ZGr-j|oYSAgvvTp3UT`@r=(rMB?e51KQ{4if$RTV6VdqF+uyFTq8VLk@(if-1p&#TeHYA~)3AsDiC^1M z9u(R#ev7g8*oiZ=tyy{%T!galA7g}}QX#IJr$dLmimdw$F9v!$5+6dLdha%6DHZtT z`2j_yG7@_dDa{8{IW?JknXyAgq~HAzb(;Qhm;72oX>elSwr&gf$z-`GT$tD(4O)bU z+%z?%jpvbbdml_H=zbFQE}J{q&6H7b&#qvO_OF;9uo>QQ%Uq}q2Nn@*UEiVKw*V@q zh4ZFaC&i>co-(^cj|4t@J2JL8DFIdmw#q8_t;-P9r_);aoG zG@(`$|7h;&yEe8Ul8)7K94mVGbwyne)sqODT!N@|E}I#{jRrT0&s}Rk+n;Z0X@Q@GhO^799`0J@5#Hps~ARi(kBF{2q)%1(JUd z#cX$4)UzJMsxQ@i2PF>}%M?{)S`8G1WRVeX63(-1zRH@sNUS0c;rfOj64-KhOqgJ5 zXF4`3m)?!b20FZF3A`LAG1mm!M8&0Yn3@_fLz320x2eP!l&_i@SMza15W`BqT0)t} zm??=;z$3wj)vM4Oe|TUsdeGTL9tcNgmYuRVd;ftk2QRz3WlCVnhgzlchh@-r&R_dN z%eKcRLqCQS4mR%%o$b8_Dv%Vh8aEIFRaIJ^!_Y0eo1A?wEF(^ynlif7tndSNU zY72tTBE2XnD6Us<4Berl9|b*Ah<|>#B6sH8+H6H|y-hY+ z&U-teK~et8@Q?jfP%tyuZCsU><~Al?VS_fAGdoLffuFXlMs69a!GCOQwPJ#Hh>_Sf z`j6;EBwA_h6Wv>xn8@vW$H;R{3Tc~-N;A{U{W$tXMc%G0aCDgD#0H9X?|sR$-x`~2 zEkSS6wsK5}+#sHzC?FA9I}t{x%aajGX`2t>^hWxJUIJ<%Cxr`Sz{pLabV~!{UY^Dr ztnZbZ$xBz!rnSXf(8I(8EiKWZT(y<)1}pL;c8Y#$wl$Lh{1*uj;ROzt+D(d&OLx5t zxSC9(k~H$r+brjCf35ZYK00CuI(3ZCcnL^yqpO+8Q;}OuqTK+Wu7tI1?77OtoBeTF z&B_0c4RzE9T+%ie`4mp?n&>cqG19{~0Ye*?u%&}@#Ff*+5Gtr)g#+Q(6?{rXJm!7( z?wWN13iN@MekgjN)PwkFa{>4{1wM3Qa>W;fDtNA)zTg-4)S z;LKprZZ~LqT(+B}(F-~C{K1R_NchQ9F#7FxZ0p+wA;h*w8b4>!m9%u58p5UEmNOgr z?+p8|j%aoonIckf*!AeVZ$E!>j89z-R_dX)3y#K_2=kGDET@-F!fQ$*j9Ix0ZSgfp z2C&QjeB5Z9kCe9t>0;di}Gja+;x6GAR3iFJv(oJV^a*T zzO#~+r8~~guGkR{rcp_>x3_0hewMj+?;hWUykU@yoQ7+zJ79|=2CF>F0ya^`RmGR2 z?huUYs*DD%QXmQ0L`Uj7H7pfAu;;+7kpVnzj+~0RO3@k^w{(AqP zAyr3?45PW9u6~aE8WD4_8CLV7-W|tfsu*C5>S+eeiT$NSBdD+MLv>5ji7cjGn^Jd; zblOr*c`_eZ%+F>`%r9%neLNZ2olDOLzJd zlTO75iKk(Bp+Qj857P3$2iXP?Ld1`gZ0baK0;kJ-Kwmf6bN!w7QbEDnwsNVLDRdMO z^=MF2q;Y;PHK~H0sU-hET;JGEDhUuPqBvpI^~UIZn55%SC3_1#4J2cHy;}03qlp^A zQ6ZV~`|O;k@%v4MDt!YJb~LZI$3r|QMasL4`XvWF>PcPLPkPsE&xCYSQff)FoZgEg zVs<~CNnx7zjz!3A);o2~L8y6!RM34gA42UbLV7*!Y918!wsg%*`wL&V`9F0V>HwFHhge zIn=l+&sHTe{HkfimgAV=*)SCo6@430a%iafl|CGY9@D8I#+c-Tr0~nTm|m-`QdBr+e`i;5mR&NTuuHHl*EeNgjxXSG4glLpwLS* z%`o-eRe_OF@r+Wjp$kRPM%ae)jzkB1;U|0Q3Ri$x&OeFkUw6+Cr@VFcTVCiH zpNf%3_Ip-)0DJ(YtHy)S!-EP9`gk3bvh)r|+p%uCpS4O}O}OM`F&B|;LfT!90P+l2 zk+)dc2u%8Y)_bVBxb{}~tv`z3#3Ug+H{Lwa!xSA)k{yX7-g<}lXT9PB;8ar6`rE_T zQUlHJRB~^m6b%)drStChoTw;vJV_oKLzfE$Y$)?CZP?BLBSxbkUS2t!^vn9~ARvA0^+Z(7BAfdv&)>>AHDd+I!*yxvWD}UeP4q4KD=qaR>C7XB1OjFan*E6k~rf z$i+#jafE7z7|VXM7&#@r>6rf8x&bU5p8)+kVgxphw;Z zYqKK9+6;jOIZG4RY*XDH*1<7yQ@X9%wbK&sk8gGio`NUh{WuN&zSq+#tbX>f-}vp&uNGua-A zDOp+Fu_FROF$j)jU9xr>;BJq4qA^yWj9|y=B;71leqP}0+*AZBC@AO{4%{nKQ}YH+ z5(7C{j%Fah=#g9Y&n@s)BJeKDyW)##SPN_xb<&@(mAV2 zc;git#pwZ$6wfKorEUg7Ea3oUl&P~ao;r>NuZseFlS#tMp1SqgnhHAiP~);Y2$iF0 zVLFSIFtX3c_b<2AEN|#(FC%0#sDL-3*Z-3im#@ts z-!tSbKrfszqUk4Y@D%xOyXzUduRogCoWOM9@c?NTQ_@rSkYIe*&7zbl+=m3=%lT}-s;VdMz8Eu-*!NCaGu`1RWv5n#t7b{Nkg6>g23t2r{`C8}P6mlleC~`DN zznHN}nWbI{(&$TzBfp$0j?Qu0@mQs1lyU~K0`(?^TZ?9X zId08c@yL;-{r}IA9cv=YrH3e7)W(9n!eQZoUA~} z@h?Aq@6KaJgd!+O$NWxzh+g2A4lEgSe@c%|TaD|RQZbkKChOfX(V!@ z9TH~&N^LqDSncbC!E|vgd3|#mV;0~pBk?2y5(p0u1}4A_*<0R7^>d+rDZaet8`5~= zHT5LKC8;9duXip_2Vz4!7b}85%TD**R>mf3kqd2UrF~ATe|-~ho1@E;5Wo@D z5TnyQ7azLHjpJQhs2xYleaJI~L~Yrf7ME0hqz<5r{_1xPH_GRqLB5v)vW3tAY~T$5 z+F;L*k5&%fsIT???*7ouJ^0OBwsTcLR-bpA(lxzjo)P=jT>Xiku2EEH;JYm+7y_>P zop+&HtBWZOsP?O_)L7h#t7i7z0YNOprr6K2>Q=4AKimD?o`P zf?h=dkdKL*ODSx!Rz6$`_5oZnUYekPVc7>1-^9%}CrjLgnGvGqwT?qfdA(avo{rSl zS3O>cmOUh)0iUP>K+H(U{ImJN0$Z-Y;r9%K?-YkAW6-3EZo8A0;EM|;o2UF+`3xakTNd%XPm(Hs=G_LTu&J98>M z(9^-!*AeD;H>HPZblk>4x~9fHo%FiUc8v~Q@&xhuAL$1oCixdu$uH6%yPp`rcFoR6 zP>x)192!8qcnvUBT_XpFTL8#<_@~4AL%E753Mh@ybh9%Cd~Ts}tssCu)4b9R_1~jg z$R}EXHdQ{rLW1DcpQ1<|U6=26@2>|KabL8%;*&=-hLFo8&}tDFHBt9+odV&*d2rJt zEq1KT0(#M~i45$maoaA(ZZ93plqdH?D4PHSx-dt>tM#QNfHQHULqnMco4pkXF=>9& z+Q-;X(~oBS8LL7tc*IVQBDV9T_SzF*Qrwn5pp z(+vWE{MlU=MvL^Y575*z95NT_k!=#R!8~+(8}}g=8SmjZ?J+gkjt%0N8agE$NusAX z;Vq>)?O$11dF)K(gZ{dEi5ug5rZ+tVHF7=j$t0zsA!~ab)94|~K6{eMi$cAq57n*a zqH*_HlO!EsGmA;ab&Vp6h-+4Bx2bBFG(|o>tM;!aTIXYllavsPh#g{ZHAk}g6=V?* z1u=)|pI#{ALv5O}qq*Gvejo2e>M)%*x6ZOAx7nvhWt#hX?=7~bw?-7qc~F&3GQTDV zT?>#3KEuiv9f6rmS!Q%Viop* z`+zdFhbpmlt-OXR7K^(NaAW<~_ib(gI>`imnn$9v8Sg5`3IaHB2$}5Q>PsL+X5ZYN z^|J19=pU{0PWMDB_KsmXqUWQL-ayUYX*<}xT(=;DOU_*0Rv0s#E!-*dK#OO|FWT?; z_NO9u+27vzg|8HNd+ug#>rkWP;Z@~7dObhZ}8|5P5=lV)7?SY)d%W>^{0Sk8iy0DEni+?EW`kC~n3u?2ZNuvPaN}sAFP{BH9zn3?%5g?T zaRy#oea{q3E9JrkVk2)^piQxDROaB@~0P7WmCvL-w zkd08`v-;b&rDozolZX9MuBDjQKq+_u`CG@S$*fl5)Fv*iEH78i&~-R4%rg^6?i!do zto~jImw7~co9NRMIv>k*j!78_?`FB-C!S^sf7EHhty?|w+6U7+M!PCPO#%`h8LK{B zx0cVDlX2LC3r)TUtmLKkCN)^Zo0&>tc@*U~Jh%mo3Y3dZc>;<(;micq#`8^y?t1mc z;yHTg!Ow-IH^wdC+9_VcA7XE4%IMBoFLn_XbNY8C;GB$u|J!C-4=qk)wrO!|s zK(`g)800tJm?a!5?RP=$3`LR%$k}!Q!5f{Pz8?SltMKqO3b=*3k@T)Y&cWaC&v)ZO zRj0$ENgep32I9wWtI1FF3S%Xu{CNRd<3Za(|Hu~?H+-mD8>BMB$Tz-i)q+F2E4q1n z1)Ei*RMxyiu z!y`^**4$*es(MVf$=-THAZ)(BK)^3Sb;)Q@K9~U~N+FuE&9&P{tE^v_O8s#Z0I4Vjg1b*2Zx_3_jx&3vU`c@6rl|9JKAzyE$!X-XG zEwk`LZ~c~?F9}&ij>rk*h-o1IE%BKHSs8V7Hzwv3%7P;^B&Kb1;_!xkF~9xaYL+8R zOh9+S_HPlbX%UsQLKC>}$N1*@u-EqLKJXm>k8^Vk!-AS}d~_%i^n3)?e-{yKJxvx0 zfK-P8K)&i^rt5MiV@eWH8F!UVjXD5$S`LJ4cPPgfZ4;3BQ3N3nx+(G#Jc7S^UITv1 z;xMt93otR+-|k~Fd66Oh>Q1$vDp5@9(?D+k>jpTSOSTxZVX!cVHuEb@kta+3G?TG2Tru_0#iMX})V-9S0g38dfTs z2Vxl-nQF66;~X3ulM5pyEmNliVUEfK^(*JfsxDbkB3w~-f6uBLo1cJLZLEs9-JY_w zS{8D*8aH*fGMP#)EB(l2p0|C8aQ;Lz|CZW ztrHD{q4^hU!1#aFB7#lNO;w6QukNm7g@xF@TqAXlX*fn0#YX30#hqPBLt zH#a_d5qV@Do3-S362mp#)}|TWvU75Zgotu6d79#vy+=!fTJz9RF`?}Y&fcyDrgc(j zNfiR-P{Z>b9B9-ovN!f#R)%kyYg415J9O5(=;OzW*SK%W(m%0T9&InAXVK90Kqehw zUy$LVQW;)~2n$9`QPVkiKkT{!J?M%V@6Tdk$@4!QCf$hN%%Y_OM1hGh@GpgM>eE2vCNnnd7x1vj ziF8c&A?_gEwBs$jyqKsbCV=g~cf6#j_DX!QJx$zhJbXW6$rXeC#2lig>YL8sokMiSZOL3x-TN<`RNO>C`5sd<{H0P znmvFn)UR~_B~$AA>%$Zvmz_o4pgf{eVWVE_QRJPDrgI>w%PAhv6=(E51hnw(aDlo` z5WgQ*o#AZ^D(?7w*dBDAOuA{rTf?ev+a7Bs2I_UzO}-Pe=}mzm(s5}QKz;J`WiSt0 zS>;7O#GTnk^U<%=q#46pBE6b3@uND*g%8VaQiuev`^({3C3j|r7rwF8&}uHy&a<5N z$R(_48IZrcXe9T13k_5pQXynmixoO(MDmzl0K0U;Uog1vTND+WFh`hM@VJUtuoe*g z(Cu0cR$9um;Y#aAD)rps$@jAOV$~my-Z5A}ZhvPoEidM8Dm1QAu<6_}*xT9khxw$( zlEajhcwxc3JtXQ#jhpi5+V_~rk^-Jkls-(QCE5`TDjld-WD1k{i2W=>Th&1)S}JWF zuIVEq=6?xT55wsZ|L1fi6rFx6(z+=l?+Ci=|0q1^f)0AJs~Twn(5liwS;f@*cRHi| z#Z6_fJ6U7ifD|MY9IgCq*#BRc&wn^yI90Nt0Ql$8dm8?CuJEfm1<3UsO}mU^2#P*U ziYmg3N5`;`qU=f33uC-Yv~ioU%YNg$y2+NRCEhBxu4_Vg&#)`pJicMfsv&))AEzhZ z4fiuu7PMN}O)HbQgQ}NgD!Z7GTPh~#FLlRizo56yLt{g5gzG{>M5d9wAf;fDx#4ZA zu89fH4BT&J=*NPVr)QZL37KnBAu?205Rru2EXxvOFL01X#jB(nSBo*7$$Du8hhv5- zvjE_3=i9G*}O2-sMUx;d+YCh2fIAx<11dPA# zLP0!wCB0Vs0J->exW-ypMWz1X`hx&cNqU6doiz3p$oA#lI-`};aUB>Cp)cf}m|T{2 ziOC|4FFxqm{-~rpl~TsqDv#zB&iy$J-;4Q|xwfUOY{0t#I`b&OnMS8kig(&s-QkJT zf9qOWY64BmH7zz)IviE@c%eKr)EH1yQ-G|46Qn%YfV9M&{UOwFW$mSNKwx%%R9eb8 zdbs9l#-}oY2YKP@R|G3~JF+)w=jX-LR8G&=DqY)vp6BOQ6gzo}|MR9lWyfeTja97$ ziFE$jk}QRt+tpv`2g$b+zPSSmnG=(3S7T7|yGTPgLc%GGy=2c-fijyuxztPJ*Or-{ z773AQx*23XTDwYXU3cwV?Aw0qW>O!tQR}ulU6E1fv_kvm=V^=I`F~Lb9GNf8{xJ_1 z`gIw^ zosI{erW~S(*hEfdO5Rnu5`*h~SZ(jDKM-&!V|lRi!~+G1{Np_Dhzp<3z|#pgvyP2g^b6v(7yf456nvS@p*+R{ogujxpv4Q?V{)v<5QS^aHWa0V+34X@(M?AH?3X4s5J) z3UVMbi@CPByE!$zo7!L5ezJtEwitpJnl_2>ByNWIJZXzGZg8^>K@jR2F6y40q9n8N zpV@iD<+)my0V)t||4$m2dgGTM0oICI3Yzn&lKs1#4QrEZbx*u<(AYz<4P(KQ^i@Ot z1Nr>LK(;dLz~DFYq1=`|dEKwnTp6XbB#+(A!Tt5trC7|WW74?1ZQ5*s-hr1x}Mf=znmZX!(tJXGQzEjW>)QvZCr z{EBDFN;Sr{rRU(KyCU4ktEs{HvblWh6lja?ZfGHCbb*lh(gVfT*R5{tZz?92yx|Jq zK0j3ibO`wP;`M91I&viRe@v@x-_dU?Y5?nU?wXbg*sclXiBfFhaIN1fU^BdRnNO+} z@n}B#;)2w-%;b`ep>gMMzT@zlh>bnX4Wa8@o0YvArP0~KXLQAU9ysCNhIg4Vm)UEy#P5cpT)IU>1taHm&-G?X zWZX1h&fDzBFp9|#SkXPV$(aD4X3V^4Y~(?lB5d{Jfv%w;2h&kR6Rz5mIOH>75ivC= zE!8?H*=9U=pF5d|u9RO+eQCjREj7e%bBUX^ktpuA(Zf7xv>wEQX*lr6L5V(;gfuoR zhR@T!eK9VxG?B>WsMAO54z5IR#mGtDSs@%${Tvj&Wd47aE!6o_A9KmR+upi7?EAoelSyczI}6P=>r`EeZ~_ z6%>eHYa9=X$^!QL7-F=kT3%ZCGlfS|#F)`8mDqNBi(Au=04tVj@|Awul`-X-r zdL_H&op1-60flWmTaBIh2CnoP;yoqQ`sf{%eO>-mrX2W9U^4Dd!JYivTL^~QtA@h9 zSB|3^m^^9W8z7z;TK370OJ{E_FkEe(>_Rc#Ay}?Nl$UqEK2@=mNbV^#zAt@!QMx3o z%P~P!SNHb$3)jHznv3D5n8AviRaFfeE)P_dka7yk`1S%69iiVyCG@Xu2!yKKR=Lf` z6st~u3{!!gKd+*4CFA2o@U_ZkJ`N7O*n7_Yk}g4n#CxjwVi{s_;q*e~A>nLtwS)>R zL*Sm@MuhNYlrG^7FklWVjeLo4{}oDmk{sdbpC2qZzdjbmHab<5 zDD%Xb%f02fuD*U8vH$i7t>m>dnZ=KpQ_DGl%v%j^Moz=!jRxuQb9F+bm((TR6>blk z6pvwQ2AD~O4LNh@!Ii(FB;b2RnlgLeLz`nX9XZp88N;yitO=+umMc-ATPWfw+t!0P z@ymvaEV@m6eZPP9{sWxEQ@!&3TWH?|Q$tS6WYtReL}pCrrP{Q!PhFbh`;5!4@x=+o zsJOKvP^i%1a^XkPvFc7MvN!nn9-QgIBkrzXYY|@5Asai>WTnOm>M~x)%C1d=yxazd zZTDE#DjoCCjd>iiJuk)^!|bRXhELzI-y;=4)PRJFPtLo@+CfxEFoHQG@S;+{HabHs zhNo6Z|L~1{Jo-y3P5)k9=fUM{m6rFR;g}XAZiYPMh(Z6RJa=cHJ0drkH#Q$XR90Zw zcMQ&VFXYa9o#+IDfr#Umq@!pJmub?s*0t`?Yk-&0vV+`Hy-x#8x{%0H14alJi9c-H5xr5q35@?=b9r3$%k>7^vvy?cPU&n@L*g0vcD#HX%p48xr z6Np0Ts|fNv$Rm}IR+2TYAes=OtXKF>p5g;;9rf*n3TVGobanYSs$Ie-C%*{@s;j!` z^4-%2&#b8tXuqeCQCfPFFL>H-@%yKYj0_)|t}W_4Q%EbV(Z_vns;a39lKoLYNoJ8S z`7$Kv3IHtJ;eQ_9w!c|_5#G_i_sj-Bs#iMN`AiHE$rR&Wt6HPtoM(z(4qgVgvYvn| zO1X}3nQ};}!3WfoVQ`QxE;EIJP!jn~ATr~{TLB>vJkOnf0Yh#7$C{5UeY&S{FH_>4 zJM?FvSIT*Q8hLmr|Mvm+3%dRD=T9Gjtt()gFa6mw#nAsIC7yZJgIQ6<8iy}@B&x5c z_YM)z7sfx0ymI)hwZvau&2mjEa8zZ`J^bilGR)LD) zcCE-^5Phcb%j#Zy*{=<^z^%0#6iim6*WFko5&<*}E@L`1{&}ykaypSn^xkvwBdiUU z>vRNm;Z2KOl@K#t6@ynFb38N4D=CQ)weU6AgU{;OlPr*X=$G7-L;dI=P&5b>W#FRalZWU3Kr@o-K(d zCZVKhABu#*lg;10EU%UXHE`Ib?U&VnThfnXlwaa@Tm1^iByf}q`0yxk@+3$rAqSeC!X6u#H)P(iscR8k8bC6CA*Zr)P&C)5kas#iWFJY_$E)Puv} zH;hXK4mReRT1o=pMulco`3C8|nRif(O+nCNjl;`&#Q4jRiWeh*+ip*6l|*3n(KGg+ z`k3%9vS>={d1eW8N3DbE{ptQt-CgC%$#YEfF(Q0`5^;u%F9W%xO2$P#CfyzhrLu;g z3KA;1F-%=m@5u%Nq3>X-k#F+<*n1DCsFH4NxMzITnPC(W6$3#*K}A7Ca%fZ#6$B9# z1qp(JND`Zz$3zf8MI;9i0VRoqme{BS0~sVVG%X-BxoJ|9``blOVBYtx^?mDK_pX24 z>9t0BPS>eZr)t;U&wloU9Vbi8#YHDg5*fuJtS;8MSMdK63Po6%JH$Gvx zfz85kqZzgCP)y|O1AqMSN0gqUxOMfU{NdKV4Ee*FiJpCb)v*NitaKx_^fHHSaeX_P z6qk@N*8)gu+TkR#V{T~Czj9JuUS6$5J+AAL^CYq6xqSh&iinxe*@?Z~=u8Ui+M%w* zjdM5bIm6;v;G@?a<8tcgnU^)A&|8J0bWflb_i~SnPM8^hBl{xbfr;9wLwzR2;p$ys z!T1&V<~F15W#04%m+P>t!``_hJwo!lE)RyH;U&qz&Xtn2bPZpP%-Od~e) zeXW0Mmi%&fT{rADlN*~M7#l3vw|UYgY$ik&L+X3|p_#><-RTCqV@c%^*tSWJZGb8Q zO$}Ib;zVaO9BB_ZAGce-(?bJ$&cMrT=d<~jv<0(O*|2PNIi4IFbu~lPp#U> zb<(@9H8%GBRdeb&t0zZamveOh)4@9z=hkLnzVj?c!*a1#{?Jz0xnAnX3w)xg!e0Mt z8SKW?kRvZ_(_WlmX>?5^F#5EP=V~iOHF(LVZWW$Z?rChDKTJ+8Z#h+hv4Y6pwT+v? zu0Q>aG%TyG1uVqpz?P;%ypytx*G>LNZRXs@QJGK_Gjb~Zk4N+Q<)b^7yD@HIwHwNs zq@y$KBdvzMb#)N6%CaKrH_3!;+C+-luXQ7ByD<_m3`S3N=i+cHx>UdG;9X^-KXB&! z@>%wqt(8`8A%@_8^I3Qn@86ykdYyml;_gG}UhqUkS7r*#eO>;qTgKlE^L&wyxaE~D z+&j2*mGZ)6kTYq%YfWqK-T?_g z2wS_!1pk}4su!?L^osHv?5}^mSe?0#6hP_IdP@^;vffECOYAWl?+CFd zvpz9*4@M&O@`rnYveR0|X48{vKUrTy*BuWnHi;E$Ub%Cw+vq&nn3Cf({>Ev5Is8*E{ zk+rG~N~~qj16(%Vy{nKZzzX&0`BE${po-@{k=r;N3%Y1Ep@ah6h>13zjP@@9g~MHB zudZssMx(HiXOP`Ao=YvYemQ@GR9^sLOhJ00Q}<00gDN<^x9EY3V$v6cVC(r8qZ&8! z(L&X!?XXwHIkD`TWRy^P&C^st;71zw@g#XImsGp~~vxmpoPbdp(be?{j8n-4cfu3)&FbMQl^< z_{}+~L&bN!a%W#hwWl}G`ad-D9Y@}l9@`I03IB)5K7IMJ8oMa1Ufi@b1-Jx*nj|fb z_}YE<+vA%{tmk0~Mk>+BS60Zfw?*wdk!KE^_Kqx;lYH|t@XP0ujs*a?~=tCMvJW1WiF z;M!4Ah~RxTooS;arFoBSd-qG>U6ps@wLsu=!wW zr3BRCU;iB|Jp21UzU)5)!2e1*BQj*Tw?Wu!{A(TMho6HP-F~0!Bw;q5zk+$ripp^= zftI9bT>|V<)gzYRIkL?JGRf!Xm}6Y!b45xPGDq8em*81*tF9LTG5fLfD!(}|2#UDL z6jbB5PH1t;I@!$u+rcFg#mLE1QpHt7eZ_v(~He_sOQ0!AW>$NOz z-nGH+pNzjKY3%da#lMO2)5JBkl}`zo*%Q-@E5VS>#Y(=jEJmCa50Ei|WpGL+lU){h zELs^gbG{FH!@-(}@TpVMLOpqD8S%gs&$(6h#}*q4tJH{@;n=ypu^>-1Tp*-~*1ec_ z7al5Z-MX#S^CG=CB7DqRa}w;nes|5wOaW%7{iE<=2of1`4)p9Av8IQ$87?1!$7T`( z3enR|8_op$@RL41gYIub^)Xva>NibOw5n>?u!|qybQyylL*)PWXHl2tw%J8507&Nf zeZf5O{=CWlG}rIhsN!l?f)7@P*0Wj0Nq_j{)8c_0tL1&)=wu4a-{wZrYY%=wn<5w% zRc*YVI%?nf%smQ*KT`m))gO;8ZnPfT?!9}xCaDB$jA{g@hPL&&_>p7*7g=s@L&7lr zQoy_wl;hkienU@sxZHPlk)}n?ou#UD|hUc`Y4;X%qWzJGITHb56)`Y$A z#!0?(d-~$`P7#H>*%9R(1~zhkeoFA*-hK4$Y2lt#8@bePTb^CFVN1SpzI*kS z)dy5XqrLw$glvvd*_oNnk^-V5=P2d_@j!B&wSA#cUwU58&~!gl6UX73vl^pkbneWV z^v~=k2D3W8bl`Di5_~ZB*uthvTpLUs zK1XG z>xbE*kN#d1b{?K$&YtCNWKGer(*rme5V;-u2-+_33h5WNFPX zn=kW~y{=yDl%R`p@#(Ji{Iy~t)?L9Pr%utT_!;3gJqyLv|6aUMDV!YD1KZ_2`7et> z_n22&GtYFS)ITYWArCaqoTdx3-!v2G1v0Tqky08cwxp7^^PC%xzBYG8S8CHvA>E-)0Ve{_^D>I24JFHO(vtaNWp>TiQ~$E}vCV=)fore#I}IGhdFPEzh);F0wyws8?o-~1 zv03+kn!}16YxzFb8p&f&D?@*QYQ3;9RH-yhkmu1S^Ofqw{!k)%QsV<3nA<)uW4#%4 z#*8j85z6#h>0HX=zPDCNq(gQ_9$nIEfhVz7ySONt64UndoySBLztqh&4DrE(^cz5L z#K`PNl}E0=Ha@wP%Vq2`x=RlKLm*#=`6E*TPAFKJa#wQ?9HabhuiB-mg<=$nbBS^p2-n?os6WP3^yI;ywAcj$AhmL_RQ5g;H6w2D<0U__*@lr5 zv+qkkm*V2A-kYL$5qd$+w}Rs5Xx%eD|LFYM#$A02LJQaQlyXLD8|S*>7mU?&5SVK7 z1@XsVyq26@VRQV8M$Qu(CU}ga!#iPP{K5-iFbYdFu2l3IYF@}}L9I8#<7q#SFLI08 zvB-kBaa4J26np^#^O_?;7v5l=gn)WaZ&*5^PNxNjge+;=t>p%0zBO*#|0yIJ`SFKm z{Ilh=-*(?zt~eJ8c>Tx7@Bf;|_(zi#dISD$NCiaI_V6}gGaoZnXmmIK{T;VgE6B_D zJ-(Wf_j1oB*`Z5^4kZAe;agDJ7kTpbP%_04mhOsiEDys#ORLbZ8(W9XrTy=oSp zoZw`DfqKA_ti>JY>#U5uQQb<#oT=vwqF=`LZL6xR#hvjW?oxXG()cK`@24s3psY4MDDb3xnfGPEv|cQl6pdKHZdqeYN-?T-nU^o+)l_pKT5|4~Zq8 z%1$)LRgUZ4|NPm@wZye%rS^oZaFBA7sPpw^TGFb$4BXYL%0Y*or6FU+osvjs2w4L5!nbi~KTNCd!t~w>^5D$mMz|APL*@)_^G8{8g{JX;N0i^)gXuh13f)ihZd=Q5Ixbq!kxFryo9EjC9@f zh0J?9H;deqZ>GWV%Eh>JC4D%;u(INH#)#d;i^-c0j=kP2)v?X~ml|JLX{o%MM2~CN zi4RB9c2@+8B=dDcU+?DcIX7TiuY(y0@Wl$ml#eMKHhA*1f2+U$Mvl>y-$T^3Sq+MO zEQV6wywOq9)ZB{1=YAPOvsqYlx+9{f%jki(sc6XPd^ioYQ!-77xMrcjp!kKvyWu>X zKmGE)zlk?!jow4+jVkm!(B#!r zGU)`nlpaHHgO!=q;fnp5w_Y+?etf5^T$8T!^!LoWi8VE8JGO4EEo$lx79a6W9cr$F zW~+$|-}wO*p&gx17ON(Q91v=Q_w>9l@$(uQTt|H*Wy7`8-d6Xd!t)Z7JaNagABxLf z8Hf~j`gqw`)mPxcSP9N^!ehs6rmX%5ety=G{nds$yN}#{iKEg7cnGH)Pw2%8!)s8t zgdH?K@&la1gRM?3#=SDl#-3}hBvARU|;%_;Ao@7_U zwXYqp?w@{|e4*jRjMivLZNlLlnzdO82^#ojBPECKBgcvNbL zk0U(yk(Tz^d{F$=E1z?8eG18HY?#AIr>^?v1|Pp2wvVvz1i^w=O0hPB$)^a-Q29_O#(Ybs zu72~HH72ZWXU}nPvGSejy5S8n?MaQk8tRjla9GjNutm6Bp_Em1V~)|xz#vniYxtb- z`+B%K#fDI+rC9Q;_&XXl2Z`H!N!udiTqGzNI%%)FZ3|DCB#(t4zQncad&I^=^iO`g zJ8P*!tJy=}7W)V22HTc~!X7v&tuF$d8Ar8-r8A_d0hgRyLZ*x8woqZG1?5j8&ZZxxB57>71k^xX~@q|6H`oxCioLgQh`JFv7ymD^5IXEd`+nj}Z~><_=pq`w6H z$zl}7(q=K{68r9DUn!+I$Toe;V4u2lzLp>9H23oHhwpCdgM3goc5c2NpB~}#ObU58X1Y# z??`Cyq}mNK6S!g{MBaR$(xNY)^UQ;tM~c>n%{-4q*51+uULr28Q{(h$>-)(MB>B`B zR^3k-$_suE2J_hFMD|Z?i8)>krtd@zUOA-F+|B5j`CH2)>|(>;Yh7WK%;-%ZTWv)? z{RfmK>)=gVE8UHXVGmB7ig8d`t|xwHN!q zX5vppZ1t1+?SfgkFRu$;>wPp2H>YdsOL^zP0aht#tk`c8AeEjBGodR3mpOcJ1rOhu z`S|hseJZ#bptIT6dY#RzP+X4)W8*X16s{EqO2f$=vOzDwJE9Ha6nXvjj0G$6R$mUZ z>K_}57&AL;5(0{eV2G1O*Xvq2)Nu@{hjI?_ zNLT5JfnEU_3cVyJ_1g?Sb`5pL`hHS&ZxvJa2HvnwSM&#?f9JS&g0l6X-DzpH>Emb5 z4x7+JPpF%FSwDD?Xnpmng17k4unp{VvCi&|J59_9OA{6hDJ??QqD%rz{2%?kH&9E&E zPbd2xWtQEYXVqJocsLSXR2a^fV+zNCjcHABH==M5t`fcN+P`88UVSyuPnMy3yN)|u zMgFO0WOK`hSFNMEQ+vC6G&W`!8st5C>!Mp)c-jC=X7Oe~B%%B<3x{nUA=$Te>Z3kx{q&6|=@s|Vjln}7;w?0*|i zGJ#3nepjgO>(^pHYsHUW5bk61XvdsvsJU$g&-ixMrtZ2%?{}mM#^D=XU2r{F>E7fw zzFM_5b}DYeFxT|qSseWY7NhWH!*!MbpJ~IljP&0L-{dmHpW_oYFg)z>i<1HJ}#E&eQ1z|)$&{vTwoTHf2^~{yjhFgSGkP)HD zywy_9Wyzo{?7pXDYE3(tD;2Xl%SQ=Z!A970fAXXrpid8JZX=^PB4$A_&9l&Iez#&3 zdmugBwYQ}~=zCln!rjep8%#w7-i~<{WZO=?H8FrD5-(9K>mI1o;9i-uHYnU5DszMf zc-oeL<=KkNX7;2$?!&9R&^V*A;M}i-A7|NOFk`D1JFmmnG7o<-sm;kF^^@=x5jm&p zh`YYDwkGTP|JI+7th*5xZ=&Do8&mL{xm@K=nhT?dX8EoV;H@vrc}gkmsj;yBgtzWa zpRaYvUfI-KtjgB&8v!m~!o(KNt>{(EgWr+h!LN_rn<> zCP54^6>nRLes7dcNXvu_ps!!~I>^uro7*?UB8mY#)Jlknn0cV-Hf^&(dA5ZkCMG&C z5E(Am{Y0WL5*Y*u{6{`F3aeWL*R&&V!B>bpVe{@8IcyJq&&E`$$|^;?i0>s`nZBAF zYe_(jti{2>q6LE+`P;y1J>YxAWgK=?@o;vg=C8M4Te^;Eve$QC_qSYUe(}-^}2NrGGjhargM@XlrZ_p8r7`y#Ly-t&LNX4 zWc>LQ0;dHo-Jlb}QeP7ro0=5krCWfw2|4tRn8{Mm;TXu^c@DI9i7^hTU`?(ZcC>Je ztG6Y~=UyKPR!MGfvT&L#`aP^a*2~Mq{&E#4>_==BO@nLmD9x+&yHEM8C%3)rIfkF? zkAoo-HY!z_+GpHDc@Nq;oSu{g9c<>)08OTH*nRtDl5K-L<7+iTL=8JIz@t5_`9l%8 ztzAksJ$$On>t}1~xGJpUUTX6}vtyTT(AxV(D*%Bbx8g!weZ7Mz*f*gYats@a*htI? zd-}&Ue$7n?n?pBf2P?viU4Qt6we^VQ#6=#~9jPH-3{!;+d&j`KC5&7^s{DJ@&>wje z80yW!HdCU^e&)3Nql6PReTkOl>#Rh0C z?y!QP7J9X_%HfjDS24VCpq2SYYdC0{h2`A2V!m!92H6x*2n)m~Z)wylf0^V7j9%(D zS<2Zut9o_k=~p?Fls9jpNV)4-gmAUJwb*16Q}6o(mviopW8scm$7_zRV!l3s!xam_%q!+af#i;q`L zDEAOn6&#c5R582TM*yy8rLJq?SH}6%;^W`BT(D~RoZF3!8ecRLN*Xmlm!?nldw2vM zYLCf@V1oT|>`ag$dQX2`{&{R$9=WACyDfmAQp2}tpbRX1z=dj<8;!lW^QNWZ(Wwwo z#O7d3#eVpv8GgP_-+2-lFwUphM~VDf1VXkY5W{YMxX8n8p52zDl57Hf*=BKk)sv2U z$MDDr@~mivdRLN=HuhXsU#3hLkM(pY!RKk8K0wD?gg%VJeYhcYv$2n`Z>(uQZPv2| zRUTD3!`^8R$)f%gw zI<;+ZwAHpqx2_`-DFW~`Qy6ZCEz9DVTKQuibXrXT;^Mt^i)WCmwLd9yVo=^0ApFWw zdX^>GIJdauBDjx&eWm>LaWhr(PWmpk2ym}RFVn2*a_AkPnr^v1%Lik=VS}M7Y{N=f zxsPokJmS!}k*7iCyP8>1Zf&}FjHk?lRK3dY7X(!AFXv zdb9dS@v7O<9U%h{eIg67)74mDN+Ald`NufH58GEV2FE|owbDIEAW1v;w;%+j0B{YK zN!gEidO9Fy!^xMbGNyKza`j-4yxw)tBx<^ZSCJ;$w$^sswbM8|%->0b{k#$)hceEZ zpQa65K9|^%5HeYnqR7_`CcEc#nT+cYO)AS(9#EJ2u5Q4t$Tf`|PusX&=luEe73tV8 zho19^?bv?2H7sbyHDCH#!77<+sPz6dOq>l)+Wk5S2??DC?8IOufEHz%=?9F!W~I~5 z=>TSErFKB6p+VsNNP zamwKPPZqlmY?q1}NS6WBEKl;cyHF6Ug-uDGu_*(EK+8*C8yN_J@&(W?W zuqD62C9!^~ux0{Skmey9APY?CQ-EEOe`cAG)$!?8-GtgObW6Vf5yF6 zOqTomuhb_v9m1mTPyz`E*&=`@D@7G3fUA+yZjmZa@%Lmx_)%BT+1>Bp{l7VG>(6i zWSdQrqU&g{X>JNhm%+tI@zS*Ldq>i@ltE8|~ zA1xZ$DY%G9({%k5I0(A27`Z;A! z{QY-ze~s5AzZ$1}UgJQX6prYx!i8ts+LE2=W<=crGX01~Z9?H4PpnTcU-;g!sfn-g zOtNBPf9AwfzlqHZmCBPW$j*{YjR@@lUnIovbj>*`O1%uepFNgO@{LpB=Ypa07ca7a zJ|IrnTbDKHo~nV^Nv;y^r;qo?kKhiBhZ`rq*aqP7^s`BhCRG1z=NlPr(+Dt`AS_it z0n4nNSNw*e+j%HbL~OH7%|{lY>--)5Qoe`23S111Tm7f_fqqyRTsu*5oB5>E3~2fc z36*|YlV0~zOv`A0qkhG+)qLGau=n=oHRF8(;PnODCPe9z$G8}65mA|$CVy4I+wh*6 zxd=?|4r(g+6zeCg;e}{mBMPDK-+X;mANFaD9aVXrJc83ChNRY*3Cf%A9?w{-UA~5k z0FE}kYs?tA#CgtbcM{ifS*RL!CE3$^UNtq(&||UZDnwX$XT(|bxoC9Vbq4@+Y4=|q zb!O(xqh3CztCF)?t0Q~chN+)CmrSX^k}#mLW?g+?9PV~t_R)Ts4%6G1_BS#P z)?@b5-Cs!u1DXze?+-5?Mf76|_T~z80=QJ34q%}g+4<;p{njDA*}y-MB0Ce;aF(r! zEnO4W91dJmaiY5G`XJ?)FLhW7;5QiDk z7Kj;laAu>Ql`qh;AcUc@dmY&`GtF#mUkpbL254NiZw|1{GMiS8 z9#TK1?(o^Au~Fk!FN4?+sSo>eW~<`wc^{L94ag7fw9@+5q-Y|!qJ=`*$eE*GsN^a4 z9W+qJZgJ}&n%9Z`8N}M5FvOfPJXw;Ri}`9Qx(!;cS!WEO5%^B-kkXF3_v>m(dNMKr zz@M!767G6AJEfpY;vYfuS`03@sJqX4Cic6V`Lj++^|^!m?m?^c&VpzY9`>Cl-_Z+){#2K zW{W9G2u*YPmEBOO7z%o@0v4(79wBedqz1szc-d_nQn6XQMcy2Q+<+ME($Z2bnIav> z{-8J}d#vHXpg@P}=$y8;V(o2A;TOU2fKc-~m{5u38ep{03;m1iYE~oRX~Jo5+Apf5 z_@k4zpIE{Y6M@5DzXMOsnee)BDLajHk>-s)i75ud1IUl~o*Jw>Jg5YHcSMGM*96 zvH{}M7DboF7ICHsdjXc5+;Z6nSVDge!S|fWbfclu-5wvAtoxLWjg6!F_uX;Qk^~T+ z0!qijqrd^V!LUsoRTJCu3T^_#u@^-S5Esk1baBgVW~rUWLamQAhjW3zqU}PXGVR+$ zBXpB}T@$Kt$3pEL;NTT)ZD$m6$=Ka#i_7f6gJRD;MZpiYYv|V)j`;GDHvlZi=#sG! z%`EQ#*rL5Qr)*7VxidMVU6Ga0*gxqqQHp&~UB0!UJ;DMoiU|r8naCt`e@SfV1)q?2 z)Eb_EXPo&NU+w&~obsaTj5$Xo0k8P#8J{W5ZkB``KlUfr`L7e@L_&_gZ8NCD<29gS zv#cT*(_N~&x{v%St)yhzS0(eu@6XECydg1|BFL@j{Kpt-8Ub-yx8Bp^JL_5`zrR8p zJwm;nG-5WnFFEDX)znA9?>QBqW4& zgd$6CNYp9!>F~>D7;E+GlwUchoh2(4my=2_L0;f*VG%%VKNn+4L2r&2k9Pa-God-4 zYqc1mlgcDG`px3YuK8pe5Y(HCl<#FdFt5}H#_q1_78McM)h)<*=*Iop#0w}@3vRA; z0Q;dRfABX4fN`;ZH3Onw-%_;ymxBFm3RBL>hr}#QZM~Z?odBR?lyKw3INbUX6SLkg z{jb3|*J6!Q8#c>~PUJ*VfP2X;EWf0MLP(%!5gBJW6{4Z5Rxy%!n9Q*ULKG~m+gNDD zV$H{EV9f9R$@xTFv_p&BZ`C`86`xlR0V%Mv8!S}ThV8n*Lc8}wOuBS^o*2H;gKPHH z9>2O0Ze(d|?f)Z+L_#u|8gwV?uaPuqGRl8-5{t#}s#960DOtsa=Gi8}@| zss6ES`+D+Iv9{y`;_N6oPHtOMYWcov<@>-fiR0(z|3eembHt9UETyEWtDdL^)FSBVkH9qmjutrlLVo_IK+vn+2j06q(d_64Vgat%f5g)R zMGjGTRt-xb?VxiwL425hj0kgeXWk^}ZjM!DuGAu$=MeB(9H7^DkPQhS+fOEH&j@gW z-jRoh)Mfj_T_CNJy>t8bAiZ0^Br&U#hC+zQ&J@ow`Cw~Tt{#2rKjH;)6vj5AsXcTh zgn|V>4k#&n?cIA9j1C6nyr!J+bFJ;jyl)b~dqmF>jC;$`wLQa}nSXtSJsdvJSx3O3 zCq%xk0>*+?{~@&vY<$MO2B>!LSYG3oA;Fx$IQMhT5^7kD?C40#o8?lI3Br;&s!2!* zgQ2nP4USLpC6)I_ifRUL>XdD6w*)DGn9s+1%03x%9o>mm41Dn(7iH>=cu(OkLmpzBa~8G*cs zoM(9?Di7cllS4RC(LF;b42r_XX5j&o;Xy7#s!ZJ`C`{Ej{1UyAR>aT|a=cVllkE+# zaj<`MOPG!Zc=m!$S&7bH(ZQ&ycbX7~0xbFUL>!p|M2N}3MN|XKg-`%QsU+4)>oE!> zz_ZC8)%;04EltvtlUEMDsm}dPqLte6O7$#uJy69KV%sypF@Fo}{PWQUdtkvR-dWpW z#-=%zBbsOSHQL@N34-&7A~zMzsp~J7gE>Z%(=0rq)NtsCo<)dk`Ul59VJ7tl*&7Aa z3W%|1L+A-%1CH5&@{+P3h*u}su(vq4(Jay zMA6M|Lo#*advLJ*N;;aEP4<&%Hgy?^>&8JbUdYqG+MEf{nL1sire_UdK{WD8@A^UJ zhiZo)7GwMN7(`t3!C_%7HYC&afOXEnnS|TzrAkDAo9EtAfxHB#i0Cbbc`{ew$L*bE z&F}V4ULT_7fejL+pZhY7;JUcz%snc_*Tm37aNZKEMoR$e02=D+bv>!a1w2bKnk#V0D- z6tb_ngM57yH7ea^FRCgv-on!OHDN7RDy!J+l^-}Z;{&kD<{NPI5sQh12shfRM4E$tHz^PaFkw(rkXHB z7!;6S0u4d+%}EttZ9iT{LZqV^bKQeUmFAgH0D__)KI%G*`{&@OIn%XBEYRezckG2; z7#yu%!Hhj~T6aJ7FG%tzM3sZu+f|#H6EWVshPUR&*fnpFggXP_cu|(>VUK?A`eU#r2I~vv~mCI zTjnd1aOIj1f)*05ll*`Fz^^h&Czhmpq(FwrIyTqoR|v2Z|MWx{1M*BZfBhs5R5c5Z z=}&|3vFCdrA?_k~APz9kR$ugkr z_Fm&e&=tf)=<1n+V`&wqo3vs|JFNta5f5ONR0srzt#K$HrL>%BrNtJ)X%zWz>c>T# z8dkq}QLRGL_Ns+BGfW~xS0kC|NkPI1fihnJkwL%Zl^Ld5j))krKBFN2f7bc^?x8{z zaR7!oS@+y&UG!2H4p^8ELwE5z<4Nd>X0~d`keZrwCGatBe%n&FSc@95j4; zzeBlgnjs_-o%BW-8iHq?aODD;>`;BWPBjdDo^9J05amvXhfq?_TNfPtkDrH&y7lQV zNs4#Ve+)bv_)i6UVjrL&iguO_a2qJZ8z|exwoB&MD}25AZ_z2Z?Ytx91K;4lcwTWSPUzXlte(su8$I?4a#Za;*x+RzDP=v6_}Ygm(oHa*cc}PV?O10-1e_>$1l0_ zSxyyQnYLs{SM-7cSPG0nWZe4_eC$)*^EVLhtE)bj{gX!$;RmI_^$l#c)Sv(I9dmp; z(t(Vt-yc(jzp$_%2P!0Y)0>~kyl#n0G8&1e!JMJaK~AUpy9DS9WWP~Ph4&UIS-=+N zmD32Ji?^q-z%MbR{00NsxwKDqdzXh3HCsuUO2dlm$TN#InnCMvG_Gj$$PT!U92t-QXy~$dLfC897l!|t4FH^wG95DtRxmHo0PR|fG4 zAgdlgn{PT~s9t?fe00oDvTqtSyjP8)AR0o78ZrI-6_<>SlY9APaJE8)yKkX9tn9Sa zKtIpshM_4sF#Q&!37*Hbn!`cXjB`wKs)OHi?$St}ep)?L?`^EQvNM5cjlb&g9he~Y81%QPn&Kyc zIY%TOYjMUQ>8y1K-NJ(3uFj!PxhR>gaY|?Z&=%17C|3)zUh%tY-mU{{+M4P}<;bSa z5KtkKLvr{&x|DNIA|5aP&`$9Tz@U>#N{APfmq+3BD99*>ao!|d^c`Z&V}@`v8}{3` z0?K}qMxgoh`*fSV#K=ymFjr#1-q9+3T@H=Lcd~)TYfHqF`!lGC?GoM|=9#{foSv*n z88XMgAmyAl+*`QwAjUzONea>!y5Q8U?pz%%iy5|?X}pT`bL54&u)@xzG>+6QQ_*bg z53=Bz9D}GAD7UYPLk*m`>(`0fFW5-chm(zkj2m=G64ZXp#;3Hb9trX#TdaHdP*P7n z-N{ybz-^j!1VqeH{)WsCGqB?Ah$`*&905mU72X>3q-f%thtRs$+R&8U1&-UXZwdJYxCknQQ)^u0#P$ z>~qn9IS=x$oPFv?;ZDn?oB(857t2mMC6UTeR;fLkvrONnAGsQlihGyj%%H-*7jyX8 zCV)B$4;91q=ThGxWo&c*#{(*OmZUjHDrTcNEu@;gAg$W)0HO^CbnHi%Q^4dY0zI-1 z%dqN4oA%ydL2$8z16fc` z|H5Zkj(h?-zur%UJ$N>6KXB^9?@MZ4vdCU4jY<-i{fwn~rZr+P8P9qMBD|xG$-0XM zLQZY5nCGuGgPv*wpw8sK$}Ow_SVdNzatZ!E(S_DvB0Cq8EPC$vV$Q25kN{&s!E(G#(96SvS@xPwOiT=_=4Nkt zUAWqr*5r(Zdogm)rZj#UNK9`Hx*Pqs=mlYQL;TW|f*-fT7c1q(Ea;+N2>D|hXki&Iqf>dXhf6vxy*W-KOBdf`PH~|txpp7BTK(F zeu_0>HV2gAY<8tLL(7=hhX!71-4fy55Nm0RKjOe%-%e9q&zX)zmEOU^_$mp)_)AQ-YfB5cxCz?&?nwIRFje6URj zl#+WyT($@ah0uZCAM!MCXCExIi<(FogZM57tP|Z13(RIeZc%4o?J-bbu$u8x5$6EjZ(gW@Tz+11SRFN3jan9U?If~8}#P{oaV*OGNnpS3JvJmD zz8d-InyHn>cm!)V>{ueer*-0W{o|N{9ZS=i=ULnmZH37*{ef@K($M7Mp=}yJPXkhk+`ge=%+Rr-RS^uo^TH;79 z>YL?=?B`GablU%#g?@{**G~cX|9sy3Tu&&cN_*t%6g^TtyJmORur55ecVNmHoDzq} z%bdK0-@yd>{5Q4tKR@QD>O#$`cnax{g%OM?3Igev$Tb!@v}45m@Kx%Os&lux+8ORY zX4mjawvnTLx&;`8wrNO|r-W;57^0Nk-y-Z1ZX*RZP2qPGuT`p9-OCW1RoT6Fd?Y&R zH;eU8h?@?4o7;=REo#ZW$;U~sy9k$tj-|cy*tZo6%lPC@ZW6e(j)_gcL(u6m<84O> z*;}|=nt#qkj*MFhk>$#57}InG#tP;I{2>R&(oJ;pTehsE6#Ke}3&C>ZC$kO2oIbSF zS?9aQUU`>0z2fc@g;#aRIYra;oQON>9*bm=#g<`ZJUns1zBSd8)pgz6 z03&-T*S*BpHIj1aO<}gZwbT+%gH>UVXZIw5V$q##*{<9!LY6K%al;;|Wy;yGQ8)&3 zJZy11LoeF_hQI*&Wv7ob<&_ki8jv(!5ZwR#BnA#2c%w9VeX)-7i2t=qc!9oJRLS;p zi&21EAMA-9kC z$xo+OE6xrVDxuKH&legHXH*)Rd6x$XZ+_X5qhelbi-?Nyc9#!#1uTG$4bN7LN*z)Y zy!3W^vnyj7d2%poYnE8&jQG1uY&*LL->AmSf(G=YYjuoFt+^I9>FUhF02$B49kl&i zkn)Myi3P<^N6ThRa(Yf!xH<~XiS%}n#T@}f&}a8acTPLgD3_718gsw{b7pa-+FYTz zfB&(C|15g{|Il`4Sxk=HJXjS}CQ_og@Y zxj6P`YOq_^sHs`EdRh{VV--($ew^Lsr>c#tvdA)%)uMg7 z&0KJsS$17p-bmuxf%i;ppW~B!d|ig0&+S+w$Gmh2IlS%bHcdtyzRig4!p~{nq47TY zm&k4CX|(TEtJ@R_S&}oO?{v|wOp%I?lYMx7WX8a1dK6jr%y9{BoN-IIGN`j&D7X1E zTQ%pHiaX^`+1`r!=L!2@;~+iv(*y@=M4E|W9pMez_-uVWU8QVqP9>9MpW4J@FfSXj z%U#q)X)@WA%i51m}Ue zF#^t&*kQy|&cOm}xMfi$1lm`o9upalwu*rW5%}yOQ9xj5`r_}L^d;yyT(S9tY^>bg zd+b*Fe@+GP;2WpmwX@Y2#R08&CRYwuN7ti0w5O-L7;%oJ1hmEjqnF*V#JPt{^(j{v z{M)dZj>@P5J=;(d1O;`s*6E5#uH7mw7q}i{`b=hY_x%>WbA>1?)$5DE38&HK)zl)3 zh_E0;ZOarfh<$BB1G+xmJ%YLWRm7(f3XCiW)91Y>Ypsp(XfroC=Eb{l!UZ>hi{r${ zIS0BBTbe{LPlHW6>+hjsDF>5vpRnznZu%U20mir*cA|<@{M7r{ll7jHh~Qa=BJYUe zZ5BC?Y#gB$%<#J9-T9a-5F8Yj{I>V;X8W>>TH;$V6+ub@l7fgYZLMc=wG&0w)*)Ju z!$#BT4S*2?dNa;;ZlQj~(Ixf|V4_~KSWTfLS5AnyO>^C`7}%1lw+1y*sx4WG-O>K* z5c2*jc&^%fDljhAeIh>E`P>(kf{)Cd#byyM{4q+w>#EjhT(UVa%T<~ElCMI|Uoom$ zW3r7QJSVYC@UjzRXa4mguuI?i2R*ef<|}jiTV=)R$-BBC`ArlIYoy|C*dXl@#pgJ? zV;@!*1x?&I_oOQEuEk!v&{_}SXO+1)iUVeu-q_GP-9g~(_I0ts1G(VF39BPvag?j; zbRpszI#VVzU=^^4FE)G*I1FQ!_4n=z(-At5lHZqZ1U!VCZ%SRbOaHH!4flQf@)YM_ zK*fq>AYJeN!j3fFrDQQA>iV>>yRfd#$ZPR{X;)^XO zu3dg~XS>_J+lO~#Tr_pwe{0RZ47Llcy?00a^DT}Q8AtOxL)UFzJ2rV#RPT1myL)zG zyS;?&Vb&k{ZO5i(E6s$fjt4tCynN;8;yQf(oO673R;;7Lp=pP%pqE*c@OE68ad>gL z!N@G|!`$#*OpGpc3i|us_e*@T)q>8CS17Z80Vw|GM?7f^IfCc?^j|Rjyt??Cp7}C? z`SGKV<^TLIBmM$E+B5sb$4G+WLsd{qusWf9oe=V*>SVyezBUK=mQ9`4-o)EpcQANVLcku{N)O{Nk=ZYOGCvcqFEt$ zDx9w_@a!@9N>SrU2X)7f_72@18y@i}oHR2NN|g%_O+L<=x+z_M!uceN@lD#3GaL4t zN@Fv2NE)Rtw6l1LqXAc67X+6YdW(frZnh|>x8vFR;F!1A*2?SY-1@wiBn?;YVLGI9 zT_S6J3J)(Xj<3u?FOqXbx0i5Xz$@y)nEt{8zAWJ=;p)CehN)W| zNBev$D^spz1Xo`7_p`W}7ONOrvxz;7s6&~l)4ahj_@r+_6-j#K{3eknI-5H=yYkwx z=at?cp7XHmQApgaf8)mX+BIv6i6cGwulqHG=B3rm;I`}i1<9Rjz@{A(_Qdo2MMcGJ z`R_hhb`G?B%nU8L*RLX=;;j6(;@9&N|MJP#H_`q0c4hJ-?wj)Q=ZZdlyui-6 z;(DDv{;NVG`>aY1_S$yyZhK(Z+i1Iev`=cC!lTw`R(t`mr6rE(=|Yma&%tFCSL~v& z?|JcgbcOrc!kOtw11nQ${iLx@mm`k?c&6-k)k;5hczV4=pPuD5wEGLYZ@oYb@q`+W4mFuvcXY&CZUJB;ImoO^W&S#O8!L!|9UYKXxt5gbT|LvaT>ZA82*4 zh{soElRLAoeE3?fexBWLHSC6JDx}HZu2$rAJi4Pq7qRgiea&ty@Q&lqmxJN;*@C0J zja*u)5_@WswHqZgf5bXp7kK?`=AOHHv8YY8_rXzj;)iId(y}#W99)%cBU3{qBu=JY zY`hFTn1?Q+%k^TPW^u56Od>;A(!us2&PS2UdEZ)2N%pH31!yN0`ln?1K9Slt%YY+X3|5WY`VnHF^wM1!!2kU{_=H)M0bQqQ>Zhq)c$?UQuL;y z1kxP&2 zro-haL?y@7dv5xOTiNa8Y)#HlqK~cOML;KS1Kuk>J>0L-}ILH>#Cpa(~N=f0`jFb^UXn zQRSwpODXO;hpWSs%6fOCKd`_y@_pg(_7!XOET+q+HY`LB++HkU$N&|dGu|uzR{P>p zT0N_3LFd>7Ma+;@hviwt-&KvdggI)Z!`!4<$)QpmK_~Wx?|qq_@sh&6@!iLbYL#K* zRrWU3?1ro5RDGz#qtRtI+WVc;>q2?T1-4sbqmRE#)Y4$^Rde)8*=^@^o$}oM~@@8TEfY-B&U; zD$;m6)M)f6vD?BTq*?cRh#0;;X)8CpKIVk{;j_6B8(F8XWZw4FS-qCaE6i7VYvR+> z#`B}5XS_^e^uC&;YtjbF6!ouMv69?v*R2%1Ry_Rot178S{0$^GXUa%s$|y^u-{p_( zT50&}qejISpVEok$+1|zTd$>#`bZJ*cXz1rij~)hs55G$Gx?|NW8MVe0@sFx6VjpS6%&EY(`pFr?NmYw=wU-c6jJrM1FO+zuy6;B%Gwm`eV&Pw}MoDGABd zXZOkG7B@BU;B7y1aQQnP@6&cLeM1?y>TCJrviec$w~x;@b8sxI)^p=o9G!zFyPfN+ zXn9nhZK11Nz)-omp5iIj^76+2A?r%uq0Zm`{%Tvh)sjV0hL&HsDoH{NZIQN12)Tk=rD>nIXp%nMsbxIWZXLjKP>;%*_AuZL|OVS+CdbY_pB|d_TwY zyr1{;exA>`u7r5HOMGUulvhadAU6OFXewgRWC%Gk`efnc1v|vWaPN*2m_k&r2+aJ= zf#Wp#m#O}cSi0K0XAMEd&s;!XL|pCt)DWq_gBc{)P6pm&)3yAkd^RRP`ln5%y4YG? zUcPK8(P-dpjLX=4vzED!6DP_COj9{#y(9eokt%Y^%4!~Wyg&A34I#It?oMT=Nk_3Y ztq2u7Kh%es)YTznA?*kqu;Xd*pIKAcT^^-^9s+B|C1q86~8o8<$zQfBJcJaHfl@@h2Uv zP|m^@&5fgZ^nZFrf`=^nG@978M@nk`!vQamof!4;>cba<3Msa~wIM3ZA020>uOiJ<4WDbz9)XHy5r=O9-aD{8BiK-u3`M}2)i6DT{J1&wlDs3 zxr_0}G93D!rkLPeiwuA*_ISq`|G=A!zCuk|AA#MmRbmA`FREMdU}zjSXO~zXyTpI0 z@@TSVW!F-}+)S#E{b$lB7ZPrHZ8dG)9$LL1W$CAYE9q11`nLN0-(wBz;kM% z-w(;GrE#CX$vSKpaChnIE(E(S>DCAmwX*%bmv@JR(}24>>hf)R&E&utEFEPvwtVmj1-B4{GGP_L{mrdU(Igt05dZh)ln1MlZWV*KnYhMfL^=Daipa`S&ty z4vsD2Ey|@j&)WRqoe(u7e>G6~d#x&c_KYOrfg-8Au>9&Cle6 zg~X7gL3fd*&ThR{+a{9vtUuX7qtp%6uwr5^P_B-!uma%ruUo3YQiu0i)^0r1U$0u$ zZ3LAqp|tHV%q84=-w261>ncdo@Y?IN{IlNR!7F{AI z6|Edy)sQgkiLs8;Y@@!21g=mA+4j!WCX5xlQ$(b-(#$x%+gShb4+m#eY@AuEFQ+_T zAdgDzu~Uh0t+XzqMZ+Otv26q%lHKoNNYwt}2O-BmSH;V4R*%;F8#AZt*Y~%-j(dGb zo{gw7cd;~Qhz>Qq=;{KU>(9uxZp`^+XDf00O{%Dx=-Ko<(}#mwP-X_>_BWc~_Y?AD zX+NF9>`gNTfk7D2T@4ONSvw&^m@Eee=5h8HuND)}fRdEw>!<>`? z#>de!%&F`;>PQG9z9cXG7g`3&zQ>)V*wOdFv}RsCptSt6PQFBiqMM=a@|QEr2F9?2 zkcdoNR5T((3m-K(dP`c*Ur}bb0o00e=~}$yZt4(%6n*dBJ=co%=M~xIr5Kka6}Q`{ zswf@cX)^?;H|FEuW-7-VeBzz6lvn|=JR(j$_OvVOrsLV=GriE4AG!tdE0u zi_evff-YAOM#q8O7UBMbLPV+#xwJP1G!-~;Vs{mV-&qZWF^+?kCBAJ^dB)!#Lt^{+ z+7(`gKduz3J&BQPo!~W zv`afVQGMCN>=t5%4mBM?jE1Jw{ZV9AubVlhc`j&xsABx!KCOmWPSSDJNb6GW$d@qO zn3WGko8*c`Z#kT6GuRC+4$Mr;7_lwRacDG{MGrBML zYGg2nR?F&X`QT#_vd_3CAQkf`fo##t%}3^f|wQQhNzl;sq&Dvof%K zu{!i>d0f@4OSa*w&c0*M4tIG}PS!;9TYaoC`i^y)v0u(H)Z@^j$Vje^{I@x|ZoZUR zyb;EJeeb&Yo_(^JJ1^5cGK15%3uA)47-oIpnjhFd9|Zg&_c2RzlR6X4D$VKcxLX#y~8;2N^qU~WhKJ~ zdo&}Q9Rh`E_wEIYD|IfvFQ=u*j99p*?hJ#TqK;mxGQ%41PeBk?4=o6r#^m?TmLX`R zfnV+kLFVAo_~>$okhW1yN-?(f7i%JJp zaz9BJby=xZ6Rbh?Y-!y=4DECCa;U_A2x2$LVu+CdvK<&BF~8SMH1XienVCUeSRs*4 zW?94U%nwLVcywg;)Md1N3k;ZA%IXSoY}Ntqxu|PqgkPoq8Io&VA_FK7`g&hRH?8Im zovCXf%6Eg+kblVSjlbnU+wl1Rb16H7pkG*3PKG*2ywT+yA<=atjt$8iAJ#KWozpye zbQf}%#S5G(BV=0?UHU-_nZSrU=Vg zrYh%`bM+8M_$1wLvBn!$)xOja#`K%4XM}O7_&N6>U;9;NuwNai2jse zQv|1u?~QNYKOIj0Q!(aqLkM!`&YcG5TkkWj&o~8Nw0yU;RYZ3eM1P!De=)=xY3d=J zExcBa*E#2@pSCf2#J|87_E1OE>vWh~`pJkyM8f;!(f90{dE>evsS~;qr_u+SA1Y)r zKoi70va;x`bLB6eZ+E~DYrSmh;NNM}`kUU1LLOKq!~+Rzf%uapT4mONySGEA8!^d| zg5#+jJN8S(z|Ct2`pz!;2xWQs_M{y<=;C~XqMO>uV|zg((%2-^37N^-2yrFT)E_%B zKi1oGU~j_wdt}u_E#TnO>>-4)c*Q^#{rVaq=Wu;31+2+CXQjUtlT)#qg6o73XREVC zAG$II)3OiWt%gTwAy=Lgw_;NNRQVj($9_*L1LP98hBezBi~Kq5ang9s)riJ-z)2{O=XL*3|$8Nys%{|)iui3gOnef ztU92Q7X=*Q+z9WQctL)tXMzs+leBK&egGJchMfn?kj^q@UogRvzxw62&w+z50}Aq} z#w}&(&|i_e60^lO#J=Ax|4(-guw;Y=iz11Vbe&^S@+TwG^YqPVi1X?<-g+i>s{g0C z!13*S5-@44pFdyA>1kNJc-PN=n?zpH$;peu6#+^%C7){$mg0scRw%BFDWOH|-lq^Y zJ!8*cMe=IjyjI=&qZ9Ac+_8oxEf{!6mfjU?x_hZkKKbBVOvh{61=t5mK~IsjNvuV= z1c3vMlOG*X#lOD=EJ}8THZ!1@R?WY4?J5F9s1U?YBU(QfS@wH>Y-)qz8h>V?AWcKZg zOa>F|^DsZseZ=;U|R@Nvy7q@s^`NNT7F)63ugzou&HzJ=C!avlB8ar$0`LDL*9 zpD)+nSeFn_7P-x*V*5SLmiMPe*OhL+KzF+^eB+aONXp6X_sGt(>U-nc437F|0&~|I z=%gzQ)9aB^w3A4O6JX25cux_fT!3!UV79|FnEwOgs?6VHS>q``5;q2#g8tXe1t+Q> zx8tYBm`~;2sS?M5%X)226gKgaO>;cBU)!?SMB=)wnh_YzXX4fUepofTd2QM|XYJ>& z({C}b5$&hPYe@I%^M{9Y7Um0QRZa~Cd^ihJE#c&$3*aph{rww;z5#y|Xmg~=pXm-JPT zV&HGcnTVd*iu_)8byzL?X?7MyW*^-g1zfM2+7+yk6|7xidiukfx~}dJGn5@cv7UbX*HG_fZ_X+dokRZV zYuM=P#vS2nQ>s@;@ApquxRWo3cb0Q4jHMF`KP4{RWcN2UgI()4_Du0*+ogw!c|9Q_ zPgrDk7GU@b^F7@PhRluGw&e#)^YsY}3s-=JdrRL>1H<+mi&h{CXVKZh!ME!o(h*6{ z2?0-#6)8GX`MD*0u;Ir-dP!RvJ!~pH=z)4Zft2$bmz+u){(Jpir~k;Acl}@jn~`qV z8s2TI)GgY5qxtsO;KE0ro*2htSAt6)P~Vr8Z;7Q@snS4n92O(z{3@N4C^uhy}jAAFliE{T2JJ5yYS)&YUVW$lS^LrT*!O_xP`S9WK(w$gV; zT|_&Q$KN@T!YhYl-q6pL{}GIVHwX>w)g$zJ%E}eWkVc{WAJuZwweq_HmG5d3K7LHq zT1_$oX5rF_0FqdDn9i0*F6QYfgMQ?}Fr(xsPL26JCdvZX0U)fcT1YG7ebs?n09f{aoCXacJ}{ zQal(Q?{!ePTIX&x4}=fZ$JVReJ`Bw}KX>BQvV4i!E=K)stUY9zbLn-ss%=s<;+HW1 zDBHn=ua5WM_=wnc*qGt#$PaFiamfs`7*AI?U7+*!Ngdl#!yCEacaco?I6<8&C&e^1 zHC3KsY#aIw^JDHvEi1|O#NH>Y!*jyHeVOupR&D(*84|N(EIPg8+7xVgmF8DGlAD(5$Em*mj6E)YqeNqzd)E%k}u!`Vui#%=n~QyM?yc z@$_stf2~gCfRjC1oey9%5RH4ZK9tlu09343MIYIk-MTP z(f6NJuX8#W7t-mYZompYtUdv`%eMtJ~dV;#Fei)COkQ!+`z70Vus4ifX;FYH+sX>ooxg3Iwv&c=x*yJl zUBo84u&v&~a{8tI?jPQ;*@&CJFUOqR8t3A7*9@Hqe-b;0(P@rA80`GHBsveyyIpq6 z=O}QQH{A`d`OatE4AAvX%~3IW4Kb|2caLb0n1>i?v8P52u}sU z=INK;V$8dGoB5Wf=R8ryp&hUnUFr>fv_JZrnqc!!ymcneiSg?0Kd>pW$VnQ5xEyt& zmOMo61Wt`+0E~Z3YDib@gq$3~;2gN?5k%@^S+Pgrx{Y<rEBfBXF)h!PSjJstTW$JO&bZJg4idjtgP()$I0XH{~BFcL0i=2iFH9~qv?CFUkzoojXZCIJjz~|c2#jE1}mS4QRViPcK zBs-Ei;=}ha5=N)fE%TFGMV3WTt6667@3sp`JI0``V29TI1;{9Y0g}rVXRV#`&>em7 zl?3c~)@f4I3kbqHSC2|q4~s4iRk$I4E_m&EOH!K_y*5(;T296Sqjd)oC`zMs7th6A zCQE`?!O0a+iP{rMT1y|)AqE9doJr2wD%WeswXro3QBkjZW6mjE*5|$Xd}pRF5b!vF z!9=!!ls)(^uz!B|;RncS$0Iow^iKx5u0dR}za znw%F+1duN(>ELM$=)O_B_f{v|>LOMn1lH{Ej#k*Wps^3`(twRSwnGCCJxo zPzrY+{>!1M()`v!%Qhxls)D^9}RH|&CbxF_sp>SR)DL*h--pH!*)^9?f7m&=xK`2T?^T5RIfuX)`*_I-^`QqaM<>cbpl z-z9YKer8<^|YO8(l*B-s3*@G%>UD5b`RgMy!~wHc72RnYRr%HA9d&&#)jYd zVi!im8@9&MKDkpe9ClYl+9TLQ5jyz;8^*M;e$zM`l{HCxq?0G@+mIW}{-;zEyh~`XCGzwx zA#LB~G!Sy$+zon`k9qTPEpLszr~JPm*Iao!hMSo_e{c4%Up8ITX*O^s3V~(}hoO&F zSG&N1L=i|f!$qXS1ceRWee#yZ(BF%Yx#{6vZ6BXf=>#d}879xw>O*Q!f_B1+%l zHJ3w%9=bJk|B&<1Mbn=0k7{6Y(8=&u#Vd2elARXrxgFmo=`OBkb9U!ic+f$cK($|+ z8`{R-BefG0>$P$LLttPcp7^Q7K%3@TVGRyIdfnrwL_|Ywdge zPE9En?EexAcO5)9^s1$}?CQvg5A`pr>KHYuBW!&E%D1DW%Fv)?pFMk~dU8TFx-;!W zssDz!;Nz2jZ8Rm=?a8H~7hSO_)%I9IW8*0(b3g}|3vl?u6f{AWBF1GiVzU$-o7aB! z?dx}GT|toIOKhsz1_IojJUl#@qwjVU;{kQ|rSZD7R^U;30~=RO!-N2fD1#2;u7JVD zR?PObzE{W)A4I0_)2U=c1(3J{*{>CXEPR&cbNmc%sqQoCgrXs|w4W z6fb!#p^*Mc?efX#me07b5D$I!&^3H`7)TfaGkat%^jSf;#pUwe7&4C83G>tp6< zfFps8+A6d{csDimsmGxUV;Z9o5do439JF9s5HDE5d&d9{Tc>L(-}^k26sR75d||AH z6k@*~DOdot?|Y_p;_TbMn|NRI=+Ps`?zVWQQRe#9dK#WrRXxk4pqnFwS^3^akJK+H zG2cqs!N_*(3s86h$iYn5hlU3?Mt9)0CKRUeNs`Kg-kb%(n2SAA@L_v&IJpjsof8zG z1qr97w+#UC1Zhcp;|Lzr|JMw(hmIo--2>onwyz}C=nniB@8IsVu^kSa)8o>j1ySc% zQ9T$f+t_#7Amh_EUqzAe4sG5y2KZmE^&t|^1G+2ptkGG=0;GA4xI((mX;7gejZ!a9ucjt&2FPB~l$y~;TGQiCKu&He5HUWh z*Si(E(uObbz|XYPesug60Ngd)?6;U$IaiMBK56MVA(_DadaFj6amJxzVnB0aCu$O_ zC?^-(ll;jbQ`}_oSSg;r#^F)8uJyCz5ee0h=?fs=>GA$_n!BNBwv!W+!5Cafn$?$M)2 zYIi38;yO*h)+YeES4XPFE-i$f74=TZ&tRQLL8;mMvwE3hl6Wots_Ob_2wAof2sDS# zpJo_FMD0&%3+1&}M_BY(l|g+LlVa6%YFd*2&irXb!)O3@xBoZBuu<*Ord$@GA$=*P z)B(_=qmi-+$@Sy8%ob2p|NXD32Fh|qEzLTz(Wq6`k=+1Rt@jw)f#|=C7Ih|fmKE%A z4gc#1A3TaI_cP((nbg>AJtw5@r@JvDKsHdo)Ca{IA?r-e7a@Vm9HmM>wWLq9H`z2M zexGJrCci(EU_)6{b*%4-Q{26v^0@og&I*vIi5z<*GQ11Lq@iR`i_^vgsl3b+CKTHj zT}DddtAX2}=sg2^C{81{6unPxy{vkoZ&1!r?&4Z%GX7@ng>R<*uJ$HW{iWIx)}0oD zyDgh6sdcMQTB)@boLVPYF6U;7|NOfxF=nEX!mt=*Jr!2Q8=Cj!Z_{z~_b<-sJ0(p;@FGg#qn8M^Ky8|xroImCu>*`)0gm_j$Y`g}2}4B6PlUe2?ZX7D-% zdqP&|u|MzYGitc=y}sEu^W>8x-GuMj@P2>2X}o*K&kLQNDAjOGl4-in+n<hQUXayS=t@04dmCtJ^#GyUYK&iW8TgEW<*Ak=|N}FEw7E z(+9|@*;|OK52GzJTrk;$b!21vK>h9PqZ_^kb9|G#eYO3=_uQ8;-sPFQ2lRBpwd5Rq zuJ5PUfDmR$UqJI+`0^t6rzZ(1DS7z>kVe@9HT7~F9$+N~f5-@)`}GnL@ujgTa4C)Q ziwJ!Au;3s3axzP?Ig0v`L z_!+zr0%Vs&%O2e5?A{^4?8T1!0!2lpF&0G6iaYcd2u(4{43y#{BFD;x(MLS5AzH?5 z4M9%)ul#fLl$SfA0dGY;3@?A$%l!IBbNuGCS64iT~3@keJxTi7@8>9=e9&LCR2L z=SZ+M339{GBwuqC=0<=YPl~#A}A(Tr!IsIP08(%+TAq zyaGwpKtA-l-b&)79o82useM?AeUP5fNrA&Ui#8^Y7erq0Te&cL!2zd@^IIzMrHIhc zHeL-S)Zu5HY1G9IjEtootslX^_-&i(T5USP*Cn3+v^2kN&pMK&qgbn~75oxO3ssVX zBo2JwTeYl9j%8hY^k?tY79^fK%xSmuPH@rX-S!Q6NQ8Cs=3OiC-zgXkT`8Zm7baDiw5dc=u!tv%AEo5)rn!%sTkI9mv+N}hAJ~OaG z6{p>|^JhaBTYsdd*l*;F7oWs5kdX;&gwThQez#VvAWv}8WzSO5S1bnXFqJ3Exw1az zZZAc)UwSQ3!h;@PkMlx=Fw7p(^rr0dUJD%x?4~&pRuE$iAf5ZU{>s5bfi6-pJM~C$ykpU98)o<9Tp2&xyWFv^4Ac+ z1+i?XJ)SnnxnFDgK(hDgtDSz990ueOkJcif9@>W;)@r3l+&*dPZ#I$FUL%H%YIOpG07K+Z5nZiO)@NvT~L zG|4I0ev)*gBEzLH)oINJLnni1tGhHo2x#lWrzw0lhkI@FKxD5lvcwl@V}veKRV=vk z$RR0m11}@&;qO&-Tnu-t!aEQ#*I(y7QXWL&qIAMXOURx34#M5}nmBDQJe3$kbNJA2 z)bcummy8QV)UW*PjZwc?J9xNiWH%W%!(tW~3;G|Ezj=;VrkjkG&$^1jeGI}T%G+&6 zWI}@C)R5>0>GI&5_gBVsi;TTyGfZOuXmDNhmCBAVYth87cDf!T>yV7a-V;_79$SBxD6j?>H7YW0v%o<%d~U;>P!&+Fl^&)4WC#)sggg3sl`4d6 zjScl_2_x#gmvwVX`=q~K99gh#BPlL3H2+8hbx1FSN|9kf7V5vyBOeZ42YaB! zow6{wM`{|D#h(>S4V~xs3#TbJ!-w%(R6!X&+ThUfc!M9I0RVUs^vf0?8C6J%}B`+L5X6l8Fi$#$KgM{&h&cy#Kd>UrgH` z;w8{Abh+kFpHUmU>f_@!oB6W&zM22`LV4oyks_^&Lg$Uy3ryMkRK20hsQvvIa^GfF=q6YtJ25F*I;Sx)QrwVY$0LH%E#Xou9AL3cBp+^4UI! zEIc^y5=TM_JvDZ0t;tu!aS|T8!y1O zEi8QW9~>N6T!J>YRXvR-TP$6UAj>04D|)=v234FSDuGf7`xK>~rs5)HmJp8@^%v~fdq_WU&+ zE);HzMZ-gGRe1N;YnQG@%c9-w`HvxcW?-;h=Me0^-s*rlqPNIJX}N!ZHmVDMS(Q5A zZhyys^$q3}AKw&%6#HfT_OW4baxaDFdAcOrKRn*M^JD5cLs9K2@(?a^h6f4a+$yq7 zoj`~gy*SXET;!JVINQF+@Vt?NZ;js3UD{PbG3*e5I*ZtVmC-lbVK=Eo1}m;FXv4NO zu!m(u7()`2^}Z^|UC9{F^@{-vhD3h9*Er}sn%|6h(Z(J@3QTq+jg%uDoH@SWZWY0* zeu)Q|Fb63V7wHfOg6mdwO!)8VfJ0}#$+H&+lyG`)m1VVGi$TirtOK`jnigEL+ZZ*| z>dQ1Vey)f2f@0M2)1{KZEBdR8vW%b=N%*6a zD+5kOalqo9V5Hn@x(A)UYGA2vHE`QItJ;<@OU2oyTyP^foWh%SSie+1e^}q4hJp^C zs#;4G#5(ZZoVgGxsKAChPt<|w6EN+((GG#LK%H%A8-81tI-UGs2LG`f9fffbw5p;4 zET)!D4+XH{aEcuW_k(dEE9FNr5yU)w)|esro8x=+X|rV?YS%V8UvL;-1%Dbi!#&*` zX67Hc)zTSOWnB{3zD@F?#Ou&|o!VoCMd6B%9{m8gjvS--d6F0fam0z*7GD-Hs{~+- z%r(rw!C4(fJxooj`XEr8?Bb351_<~^kEjn-gH48f2{2KULuO&lK%4_n_U(SkS88iZ zdzhu}Ps%@_grsXA-1H?<&s54)TC@yF!DU-?fOIqonYp%{*+$0uhSX2yIf#;K$6kZu zM7>YLvu3L-D+Lg&U|BN&!3Lf(kT8gi^&Gq$txnPkGjX?k&X_~@l-i*!Djh;PJ7~JI zU=|_!NClq5qpuDiufK!9g`7=&LhqXIM}{5Awg0V28{`>Vu9e?X1o}gHQ%~P+lGF89 zGLjDdzk^&{49@~?97+n3d$S5sjM3Oo)@0N*%$gicYqnTDt7{KB9RX?WXs##rF`F&z zq!^&}X>wlW`=vb~=MGWV@7D^6SneV2PY*Bx;VBBy4&6crlo4Y%02#VuLrI8=0{CeC ze6q#`?0#xg)CQ=^%fyC{E>UkM+lnW{skePs`dx@p+lRri2KGmpVz)ZvLb4&pV#AxV z*l$d~?vIMsJhM!GH>W30;BSK9f8h%yH+cPJb?#1VE>NOcoWCt~YhG1Rizcm*;qPY~ z*!2*ICvj?tU+Q-VV5&JdjF~_q^B1lakVw zCWTI_J9ST90;}5OoPXG8T-xS@cLM1C6DG&0%Ok$>c}98n&UL*>LGWKa9-jZ&C1tT} z6590?)(C)wI`^Mr8zv{1-B`|ht$@Kkt1u)Zd@i3(y{5%&2w|7J+aS3KuQylc-ko^! zaThiB4NwpQ*vfY-210_4UryUrjs*d#$zwS9JkV(GkkJEP$kHJ!0A%A&$R$5%`gGyH zw5Zn-X(zm6K%>EJv4!5Dp}KwE*JM?LM`PvM`##CuAeMzUuW@>j>u%zPhbQe%MJ;zN zLr%t)_c${KipUi%fs54)8Z2VbBMUaZtrN*d97(9XeeYC?Hr( z(c*#)>Dk)%jiAx8*o6JRR6henHMaLE2m}H(54HA`IjJddG)TIj6VxAL-4LaT8)X4> z(WKb%kmT^pIUPBY5I8uTItCKG^bE%xv4KH)vE=WCqK z2;>ID7S6&Mg6j}mhk4R42n!M)z?jOL6%_D}@9-d{A1QFh1_jyj-qKY2*S@*A4<-K! z8oU0WPDP%l*|s%B2#v9@f*Q_eLb$%n$f~P>^?l_;TbT<3SH1cS3-ryrVa}SS7o&*yH8||f3}!Aby^PI+dAbK^9Q-GS*Jh3o$_m|NQe|(&)E{Px`j__(;1$vMlNtzk?;v&|B<6 zpS7BlFZCW?t6=WKGu_LW55yeD7v5#f>X;hojIUoql84#Lq3nBXJBsM*^_yiu-EGr8 z(~v?{LZ8#L6}0gdn2`2QLUG+!(6dv-`1}3FVHT^CFbYN(NuMa!z{ z>_|-!jf1S`)lRR~!8r@f9e!S5AKf7>%&)F|E4TNlx6Tq=)cUr0{(6xnecCdp6Q2;* zcEMqh%DgASCw<0IhoXk!-c7viP_z-PkrIq&)}I{Vj<5ke-E1U&5I(Um+6=)sS-{3Y zBK#+;iHF8X9p_Biq+Bqf43vQD*!s zHb2Lq-xWNgDZC6ybS5Vn+<=qVoaiJPVyFB|u1+YUv`%FZGR+~6eg|9$rs;!9E(nSt zvkt{wadG~9??3H}S|N~H7d}C0VKKs8NZR}_Pf*8ZcNVVm74)=S4p&ipUFv6t$%FuJ zl#4C5kW6^08v1)ZpobH{X{^#&3*+sh6iefsxZ3dMoU{@Ph`E?}oj&@M6m-X#o5^o= zQ0)l*He1F&{Hy%`nT?6`Z7*;8>mf+2v{SZ|?>rzh2Z5AfWCa_pQlvF=vnGJfYvAd+kJRMTLN$4rs>RFC z0P9)33W0IoS+X};VIaJ+6!MF9_(gAJf-XawG^0(C%FF0uhOSt-TwVDZDg$d=#LWC(eH zS!a&0`D~652`5+S3D=HMl=oASOU^*GTlBaqRbuK7l-5itjFI?rs8(6tr~=42u`cXA z2z!!;0Oq}V9o!Ow<}Zkh!5ORG%yiVkoYq9nVUvrG3`vEmRasHegOwO*OIzQddI66S ziw@-=!ELdsF(9Z?U40I&tNk4K_7UfuQMe|bELgi(KPI6s0X`wlk~2(dnAHKliaF=v zAPVjKSmX6324N!EZg&VKP|n(Uc8d4ivM#$fS&>J`TwMZHk|m*JmE)@rvDM|#iNnG} z*sWasg%?jpObra?23W2Tuj8`q5Cyz|(hXdV-v`JNVwUDVhhHWvxjXRMp*Yr=GCRU2 zTDi{+vCaW>kB1>C2#1LjOMC7U7^&fO9qlBSB4|-ap4Zg`o(GD4+mV9lHTG9B1Tw)^ zjBr}EEJURpmXq_UVO3U-Hp|8$8@OxLE9O|V4xTscT(l9+y5?{0Q1NQcFCps9CvyX< zXKJ9{7qlnAy^T3PB=Za%PCsf7)upyp9g2o7@C5mMU{fqop6%Mcq zry67wFx3Z$`hs;%nJmwU`8at!F#XOz0W=nn<^eCk;}4fV0#S!yOouA|Q2112X`Ef1 zOf)uZzK>IcUz_FB;RRfvzEH^O_h^HZD))i>OqSP$64zgG(%%ay9c;qnJ1i)tOV*7i z7HifXlF$&WEMEDWeCwF(WC8&;6IgXwC{Pm>g_pe3AgK^R zHhf0CyQztAzo<0yG6@MqW@W${G4IRbjvcB0vJQ1kfOt?{7akDh-69|W6hfhf@lnu9 zW85!ha2wdXKVAM5Gf}8-UmqhOWy1K)zjYiqbfOE0A)cM1a-&@B=8{e zZ%jj<7Xvbv_`Ox(ycMgkyt&We#AVXA3ev_WPd7(_A}c> zzl>)-(yZ4T;k0Q2L3P|&CtcI?YFA{V)*4S8-$zv&*@KP{5;l0gWP)Yn9JU$D#Et&U zB=M*9fdXBW8qWk&wRPD38CEb*xJ|t~C;b_(584f=8OKCT2|zD3=MH6&hrredIY zg$ActK~R$zBy9fc$gti5Zq_LOsmc0h$1p;zhn#eo>+{)(>ti! z|1Pr5i8bdC%Gxmo{aLj0>(&S8th_kjTLHTC&zr!QmRD|)To(Sr$eWba7&yz`f#oB?$eWF7XG zf|w?(qzsIlGxalG0sx-A^WMk-Xz+&H_Cx&9*8~L%8`hi7+W_3v`3p1%C{+V6&YD9M zV|W$h`a^n9n$t&d83L|b8Fjd0r}q8jeZIWU|2N7`l9RIx1yV9Zd~8tLp_>@-C2UxI z{y>qA>)-`q_peigSSa_Qzs3`3l?`1qh7MryYZB!B05=1$)A8Yz%BuBHkQ)g<#-GQo zTMvbi!k#*n)-Gx@vt(CCA+~F7NTc?X&Abmp+(1lC9G){vYBdTMh)}_qp483$XKDpU z4rKPKM!DGeT7`1hdZKLJ7e18GROWg@vjFz%TnHa5l`+WlhSRDjl920fk;Jd}TKzUY ztbv2ly8r#g-%2C@MQ^AC-&~#y!sHz~I96q;<%`u=`}r6q75Soxu;b?o_6a@{;Y245 zN)vPULAWzGANGO)%T{O=pyJvPHV{&j-KMrB?3(rh7-X+3@1yr6bU*JiwajaNK#M!4 z?y^lj^BW~ORfKuC93QofH9x|J)&(rFb9abVDCkKN@DJV3r`p zN1s;@7|CuLh*5n2i#eM$3AZ5PY=E_tbl~0pIx$FIJ02pHp-vA&Arzi3UEAdn_FKH* zQ@@$8W~#RO%lXoo!860BPe+Bc3MMO&^Glr)ibM8i@HXudP9dG$?%ur0!#OWkSLTE* zu)!sjUm7U|YQ~d)epv})0F(N#l51g0*F6fzeIE-In(w8fw9#+4KYmKF% z50|?VRC_+9!oKD0>4c*DkGUlQzrOf{=(W%ggjRgeV7uY}vPruMP}}uassB*KbM{y)=Jh8VXeeK_9@pyS;gFG% zc{0>2^hyua4(l`S>TV3zqgj{F)L8oXv8|Uf%*;cuwUag|oVv|C@(=FsIUAbmsHlJ1 zR?HBTp9LP>?vpmeZ~!c65eyy_6fbRw{mD}AaYgOclA=C$!H1KidN>op(AUY`3HTaF@q|)%U)FnYPEN5+H=5dHFTkQA{ zDYb#zxkFg~^3x@M9I4|~q&rFt)W*zsSb7Y9)xP*g?Pa>yJ-p z;OLH0>&HRibFHe@(!KGfUkcb0h*q;F2o`uRUW~;*F@6d-p^m-Un=I8Wi7xuduQWr)+^B145kbZietR3JC|bmXg5 zA(Rh!=gI%Hg)V%BZu0Jw4*YgY zr~0m_taI=_hftn7xilW4tpi!^{NIN-HT&dE4`<~Ye}CSxH|1dS%UElJ!dA+9rwet! za-GT<0J~!0K50(3G<%+ZbCb|`zXjIScU4^UW`EuteaSm&_ zD44vwlc*uwQIutP9=w8neB$0Ht||eH)6%K=ky!0Y?MI!c{N5PQM2O_S2ibt*EEV;- zf$1CLgMtS}IHMG_iI_@NF{Ig5R#|3@I{x^0!)@*U$MsRKZi2j)25iDsn$8A1*dy z3#mnjuNKZ@+h|WWc6*eHpRgABn(fdo*0aCp(BJgz|@m5>> zkju)p^|syl2iSc789!fPR=d-D{cv+_Yp6TLkk z=0UGDHa^~VJ}(KB3+v+U%#ySFU9XP2vbRUky%-A8wG`flUtIo&Bfn;B87?ZyOVFCXYc8L(hkMU_R1X=Un8juH6H&%ix9) zdDkF%L$4c)v*uX^^hzUpv`t%n0Y&7y_aw$}=3MmmISAIkz8;{_8DHB(!~}k6iUc+O zxSN3Gi^&3Q0O7w-@LYO+Z*B7%F7Np}&-oqrhyx?w`h>4PKGOfR&jr9fJ1nHcss^{8 zPlf<_qi?DD8%<CdcXj{XY#q@AqzXu>g>i~grSaD|!1*4P;nu}eDi;Ju5q}ZVX z!j$Adj6C+t#tRc@op6(S6>3gN2DA<+B$?DIpV3h?6^#dxq_oznaWF)hWf7=mkCaJx zeaI!lxS}TfpkM2hG><3!4X=Lp;qL?=0FXJ~@YZ~t0Kjuy5Ho)pW?>%;mR_eJQE+*t>Oi=3^X#(zlHTHmW@X{Z;P~i!s`c1`BY7#+Y1Sqe zzenW}kvlR~56^5Aq5V&>`UN`3Ow?h+p*$Uc99G|k^0R4+ZBrNG=Q+(EstYNfIf2e8 z%U3lDjLdfw9?#vQ9jev-dQQ~VuHn2%&S%t@E1>tlQOD<7((;r+9s4Qilm16z2DXHk zs2PHKK&Zi5&?AX6yO+IYt^)c+PtShU>sLRtNdfH=+f4hf-Su7LKf1p+KGp%rKfo3) z)$<@_g~PPz*ZDaRlQs3@0lFqmlO6YC>CB)~u6XCIa>mi|gfh?#Q%_H(=8)u@NO4in z7bpeS3mc<1ix@@ zD*DuP`03*0EO>6#F@J5=jDFA$h9cZA>yAqpmHZm`dKG*@ z3mKor2muW(5nwk&rRULRC9Vt)V?yc~rS9#Gr^4g{wP``z%T+Y#X7@-(pUy9f=|TU; z-djgSo&W!%?D}!TW|fj~1r-E=1*A(?1Zk0O6#3XPXdTNqK+=SEh zPaq`-Y<5Q7%o@=aZ${`u<-j`acJzeY{e@+i{KDe-Jx}G(SIwPtXosgdq=r``N(bb$ z3uMqHY6ZQ#Hu0=Qa&Y9(FR`vFd`@K#H0D0$`{!6ZhB)^c&t$8OZoJWIx8~>e?DsG1 zamrD`SFP;+>iMU($1UDH@{W?+2K$5L6*iM@9C`#-z`ZgY1nrijd}Orp2fSLW3|-49~l7sMWAUN6jb z#uX=6NKigsk*uHFaNzez&8bguOrpLT@ET+gZi7QU zsJ8P(lYRO#$T}xMTn?SeLS3eWoq_vw1!PjTP#-ev$ySF#xyk@#UMiLvvrMUT(4JU~ z>x!+_;({H8{P^o~eHF42jq~=OEL2=t(9_}d4J)Y~LaZcf9l+xOg$T6IWt{3Kav*%E znf7is^IDXv`&44wgVC2-en|!oHe?L!^2e(b5qeYY=X37% zgWdoy`lV!es-^1Z^1NhyvQjoEMt9>(?4-)V6urc)xUAu9gLjKT|oHoR$C0-n=!6c-6_{^<8# zB5O&I7$Pc5mkBn0vL^1+ty_^B-1rjO;c3mKkP3!Tt-(MDu!=i=-HfoUS0% z9aSdvz*kzB>HN!6cD0>b-}DnCph80o$OC~KA+`fv4Pe)Y z+YUj(DBzB?=b3faY@rf1Bp_5g-Y7jqVeHL$Nhl;81kE4_LA(N+btC|MK@l*h?@w>jWCT z6?qFU-k05Y*XO`q=63Pp+@s6kf7T6Vzh^YKA`R^iQx1br)Mi&gUM);NfX zd|0oB>dSx@?p@2{;TmmQNp8L?6mRfvi9K<-4Km0VvST3&#Ieiwk-VHtD#Ivgct;KU z^=qbJ3CKfw-dc;dH$sVlSL<(85Yb8W)w9|t8)0iSn@rXWM=9ja?Jy*=|G;1MeA<); z6yFO%mL13FqOnHrA_J-iTWGq0LQ=CE{9&dP>IefndGLW>&=8BD&ZnU>bhlkwu)+Qc z4T)3lUSy;`c(`b?S#p>OJiWI6EDu-w%qUd8)ZrXD`1@!rECs^Fj`#bT8_`10%Z+z6 zVTVIh&VwGvE6=gx*MG3~wK`ddTuadRYwaxMZlWThs_d56F}>_nHZ6&&Bp_Kz+a} ziZcZpXwy4g2`K^AJ{g|#T(-k8eYj=_xK(~+Om~&~%7+iOA1mk}EOD{Oxl5hbhbwlu z4h420x3PWzaN-*Zw!JRmx5w~l2o}$TfkDZ;1c1&}-66o?(l}mfWmK&|aeBx#&xEF< z9q(*Sfcqt;O#JlfW01++i2_qmHguQZ_3zSG@n$-X2w9h2jnq!ZY`XG}?fZ+1kwY@^ z0(-Exuubm?s4#<@Z6vaYLh+0GyF&U<4!>B4+MCIRRVM#JEjV9ljr1EtE2|iTSo>Sd zB_v}#DrorJdrEyFE00Bj9#w>d#7)R(P!YLxWq_mq%ZtB&9HAx=Ix7XVHYCmRhohMR zxw)YLe|@zt7phGIqHygzc%!cJ)K-U>1nxh7A1n6&2I7M(oBcm*Mwd)(wWLtN3JH&@MOx9}Sl; zmO6HILT9zDfL-;cnQ2{0&G;?no&poD4kk3xzw)C^FRq|3QZWfub(PL<%ZCTu3Q)54 zkHne6($zvpRMdjeyht^=P=*CG^vBX`pEs|B*V*7%C7lNl-0W)g8|x{>)77dA6iRbQ z@kV^<<7j&*!l6f2-gFc&(Y0q7Pc1?>I~~E@O(_e}$?h~j=YmrdHK*j#BC|9>{L<~# zaPA-|CA)GstUp!(TSr{h~pb8h2-m{uiY78vukRx{kBbkgu8DTXmDl?^TRZBWvgGQ31ffVXvqp62jg47B_q@|&WSaIJ zdug?Xs#RtgOR4El2!^envsXK@E8e|IzOrJ`b8bR75QuOHB6$BuIi#~x;KhgYuloN` zuVeO-n3i(LsdJB8GJhqQQ%q(Na7*vCSnyQI)-zvt;@Z&0bzSt8Q9CBPGA^13H)>AzJuQTxM*uNLo z9p4m-Ip>M3I6L07&sZkvcM&4Vtz6Fe0(JSW8_6~k^8+jbi@mySxz8>QO^%8!8s&6p ztgB1n2;xum9C}s`&qiG9XWip;do}Hz~{17 zwpS!vlG5KSP7BE^bu@pxSHE1H%%zYoa7MH-Qd+g7vGt#dY{G~qp|jTrGGizCT=w#0~2~JV{&@ zLQKx-&tRG!L~hVB#~pw1PjWmq5~maUtTbD)i}fkj=>4b+`{Ii!xKDzLZL=C2Ga3|$ z^W1_%D4WltLc#Z?5?K`^Dg;?zD z);?_i^wLbzN~tQC9~1BDiho$R&%5=`fZgcmGx5qHZ{P5S*pSQR$?H~CQN9Ze_=P7! z3-@1@43ig=Z%^JOUa?NGd_x(}v6q|g$#!UOE8Lj0j}=Y1IMx%gdgRqfA?waxAOUyy zkjrHD4iSv}kNcP`+2r)$=P2;OOkkedVcb-I z(wrM->SMNuMkOyA7fQvQx>!!ci1lhr+`{KCT$fz<=>Fqz6$x@EJrh%;2kpI*)*an; z$p^QtbIk41aq}Sp>f>m z$m_FmBY=mM<0t4itDB}km}*8XV%^Jp;KK?{2x&RnNUv#J#fD3 z=6KJlPQnQDnp;9pS$0+95jUfblLrr9w~oU8^SO35?w|K##$EGt!W-3-@Cdy$TJ{*b z`-hGkYB+#v5Iq>OW46$y>Fl`zH`jDCaS(rLP~$}AEz&FKw^AQue~PbOk>;3$XyYf# zD$nsR-M5HxIU6SbLQ$n8Rf&805Z4Tad)K+5p)KC#2vlBdYI_bwuQn^d#GnVpbO+=e zODuGlfZj3*TJZ#)BJH-wa>~?Y7!r8pfBJ*!d*2@dFE_igzRYR)zWx3`t~Yb=sX{?j z1)5l{`MGzN7K!@Qac?A39V*ld-x1SOZaG+`X}voz-*hrHhw}&3oS)P*UIv96yL64e zRNC^!dnMeN?w^bLGA7K1BHhwg?Tr@&|MJk3(tT=csivlOf`$g_Qk;Iw^vnMJ`=PbE zTR8~FkP;+Fsi+)(OV;3YWXQ4@7#ge?4V%jKd{9tdLk^65L=;PvoVBDpyn9yrXid}? z$!l^lDk_|h4zbXB96W%JoQW3=+bv^4RCuvdwd1W}8-Y-jWm?;xfnB$_p!bgBO-c%J zy?1nU^c5+WCz?gl6~km#ecJZlKYpzA`fguviPGjoTwh?sdQ#_v!xSpYF8{?QU22o+ zOzC+|ED~i6^Hpj4e)0L_;1M2$mY)m0=oOgMU}VHzKKS=}hv}E5>e^brj{A=}cD)A$ zzQ6C}LfqqQY5K-~GsRYId0=4RB3HzueiQGbsT|`}<3b^=v^PE&r?3l2FBfT5r#QqO9Bm20N#%RoZuTbLQBu}Uy3Aa62#T@dXD=+w6D5cO~UG& z&x=But9>Q=m4o{h7qKFRRB|*#)|2 zS9j{&Jm)$ex^uw_KB4MxFCMe_!Yd*Eq5$l;^JsEXKPvj&-`}4=+T7$OKTF*s(F%z# zpZ9rn6x&cXOVmTrE=J+>z?GGPK%+nwqchQyJ`+un`X-k#*4EZ1jxe2g_;4Q^yD+bv zon0_)=YivQPAKd!EW=lC-f&u%t}h_(a*JA)9{khoI+n)gIyVA|G1;ub!ouWhn-iG3 zAu1}WcD+gZz=0Jxu^3!eS5Btq#E;+u9C~f@+CuC1V#5U1m%^B6?U#PK_^Ou%Cz{8JBOPaFW@g!>rKMqGB5~^UI}G*A)x9|> zBS2tqa4^$(x<4TvBeJ*%HS{^SxdR}FpP#&C3D4aO*#ADj^gTDtf#IPApXlhK5n}GI zKOF55JbCiu%aRhFlcQttFJ7F6Tl})b)Ba)tBdcNGF*0VwhH}pv)Shd?YZERB()V># zlGvEBV@lTTdC@p4p4YuRrY(j~viB{kCu^(~7p~eYl5Hp-l@nR*ZUjZu1XRmk<&5#w zuvP(TylP|=SN-v0Ky-I>b$$K%h^>lB`^<>tqS41))>6!|OKf6RJp~Ta@u$`~V096g zP?abFbCn{>#wzsTE>DQxqO=b=Nf({ROjhPT29C6@xV0#oHj^tUwM>*%hG3&dEU#@n zHcEs77EiaWQ5;?`zLYfnlW9x9P<<2~^$U%Y=&xQpVId){>7)&# zYti@Dr12pbv9x2G@4%ZQf?bO?TQh+Fv%Dq88Df1A?!v3>dww?q4nL)VxKzU3*B3*0 zVr{ySUhv53W1K?bFNKfM@aV;yxL4=-33H}WLC}pYHX+6trZE3zR;a|Lb}`o}eSwx& z_~OMik4deesW%oK?QTy#Np5G}QH^lyEuwIu8Ws_{bzv?!PH-DFe4N&%+fiu>t{AoK z{O;BJqNGHsrnc5;gr6)sJ5=unWg&j^_45nCZ7L&WD!<04IE@NsS)?r$6eo6UO&I!e z2JP`4Ll%#@W}PBu+ZH~26f|s=EZLaPs6zaHdyFG0-yySh&U31i;@Lut#_0HY;LMJ9 zh-zdR*yiotA{Y6pj`VE`Rx>t^!<^W89F^9zPrVDdtiyjATd}`O!hWnnd-(nK?7SKZ4wwbyEnId zt#kth8XB4&A?&?-_n2G;f(-cyCCx0-)@TeF6~VawP>Bb0bmEn~4_T>d3LZjla@Vdyk=#`4R zapMx^gBwdq8C(&b^+Q7gFG3i(G-R-Ua zYHRRN+_k@9sgrlo|HYL@<$z`XVjk^y{}4lwVoN3~Yd?fabfgdK=RLTEuGg4Fyj)-d zM`$calHa*n4PgHfU;1TnCHPI==U1nMCF9&H@9_;CmqXL^^;{1H&R2%B9)Ep2ibkQd z^!8Qv$rzqTwN!tvLfl>82Uv zaC$EIiJP?0)$~Wt^7^_>t}9!1yya_FO3_MFaMg8vIAO?PsI5(>si~=^uOBs+xOg`w zCr3?PJp|)_2qx<@biZ5rqPD(1F>$OVY&AoC(N0-eIb)e8IXRi!;xOVvFj7}XR7G4b zGAyPPt{4f9RxfI68y}B>ps~d&;aA2q$5qyEw@UYwlq7JHbpUn{W@y4*5A~RYBb>_6 zp-#enR-7)Mic=aWo&CNHHw5g}N8dV%`M8Q0cf8WdY*h@S$LdnWc8>4c?2n3DiZv|r z*!1=`R-vnale&+I7F?dS9iWbXX`}G@ug;y#f+{cCMK#G8TDFT2vaa+icm=s z$4sUL+T3gC>gvk-_s@ebU%h%oUWwo_JXuju!7w&QIz*VBn z1-;?zgF$jEKB$=si`#gn+5VB^=ajsmhRa2iV?!@^U!#5Y=qV|Q_=}RnSns9RWex+? zK@3%Wm{w)m=?XgY7z>a&wu52Xc;|IEQ(b9&RjK7W{-6@KE?U&CXU!LY5r;~MG8nIR z5%}A)bE2gw%Z=HSr7bNjB1`}NWit9HnGdMNv0fX_81*h8p$0cKH8tMesDbrC)DKB) zEY-0w#Hx2QZpdT4EmgD%$IM7)G{^%V271YE@#>{POB_ zIkcICD7>hiF_evsPAxYwDO+!~q&qyv%F1}XReD`LWi|&ddsJ%aCIm=+Q0|KhV94E2 zYWwu5+|a3~&61muFbjKcu{iu}vU#a7H{e{Ht)BmKxthqzyW;fuYJKy%X%Q&bMWC zZR3|`hpX0>XGwUXwO`!&xOp0_h*M5MK>1ErE zT7ojvKi8^iV@tW1UYn|$jg%BVkCi$9L#T9aXlUr2fs%e-E`EjANvd(NwntGb_4fyP z{k^@D)srgy83ZDWH)@SHvf6$p!#r3`QeVI3fIqjA-CEi`lhf02y4hwGFz(BD?=B)U zN^7bf1(FTNI2rlP3Wg6fJmq5>YKS2YZKS+@?fo%?-Mmg)SC;|#=M3yVo}C^DQFUA@ zIOYE3ACdV_>iX`*w$cr;l7$}z3(-Zn_5N?I(iE}CoE*V4cou_zSvi{0fm(faxU+MT zon1M`_Vt1&#_pZY+up7<{i%rsBXhjl4R}UaSQuokIaR5vO133lt)A$l1XvJT7T>oM zn%XyP42TWx6fF&nJE>|Wm58z-G?v!I#Rd4{@v~>o>e_2)X;petvqgrvhZG@+HJQJ- z;q8s2mB_@Wkp5~m*^2L0>DZaUbn1{D#%}m7)lY#Z&i!+4ePy345 zL@n&NXVI7~=!ELm)7#W?^T+I>m7WAPs-{0n_OC~>td{ih6=~0U=Ej-S_7~4KNQ&ba zrSXJ_$p9u%eyM36)psu4PflOquT)S}B)a#33yTCC%{p@=D@lAf+FnefNz8L?iTRDj z%21Szb+%GL+RF}ZO>OO}N&0?qo6=c)}NkQF@k3z_y##8qom+U1tFjc z{|*m)hN16pnqe*M$jJyJ*L&U0q<{(6Mo3m|TBTo!ckC~SM2$3iDE z4QWelt~HD)zUhAy<=H*wKEsey@l=(GMvjG#b7h|Eni!PsYPy^+nm@hV7|mFCn8(*x zdfE?=i?SmYOHePfbC?JBxo{$C#|ruN@-7K{0r}?K|8YMgD;}+^(M$=(?YnePY9pBx z#iGiys?cIP@({^)l6h&Kz@sA!pow@YMBD1E`kA=-f_pTDsPP2s2s!*%9wT|27uXk{-9YuLM%Q=%oK$*N5er)$j_XUGDuA{I8HQ(@Ri)Q4g;TSrGMyux zUPv@I)~5z8d)2+9*b{K%ZwM4t8o2hI{--={xc9$pEI-~Tc}!Ka0Sf05&M^N><@ggR zP~<#LWJEpFrn$Ph{-d(kc9O@F-?mNbCO=7j%5)wXAIBN=gI7!)oP1^Zy;w&g~rreCsd(j%X@s;;yY~P;LsXjZX`{*{M zQ-HabGAscxX9B*Se!jl_D`Oc`cn6D&moHx~E##ImL!NtpcWH!yG1S6js0t4aEr+IN zgm)@1kZmn@?wu2H;bCDFMJ}^=qF`OLsK6_gn3Kq!2R+A>TRw*0Q~}v{%z6<>NC0fb zoT8m!trtOVO)`%uO-MLnT|D1T4}h%!c70yA*3`T{k_IUtkrQ$6-@nh>SQ!&o7N8e2Krs%1Vbl7+0#H@+1a!Teb9YOH{(V2)qgt|YQx9)&FY>yuaJ{SDaPyf zE6qPgTBP3#&rDC}d8PC$*r5cJnLIEUqb9H7TY6Auiuly!$-=1yk*RQdkS5{?O$%XH zwRXDfX=rGu6e}S*=1ymbQ3FMZ2au_Lq=Rv#=e_J)PDx3DB3Bs!V1{J%SQy;6@e5RO zbV-_2wRqSSU?B$N4Li=BMSHjp7+w8=M7SU(UGMI3H#m_3gk?cwDLvyqJ62%);Gg}> z8@Q*U_GbRTx>;E(Av$$ZuyDRz-z1}W;l6EY-7|qCvZq5k@bBKy@WVp55rp35Aw?$1Ypnfj^<*d#)0&J1|1`;p$yHU4lrB1GZD{ z9fav;+tp0s?FMU>dKXIwR}=h0{ZPLBun^Z`&rI~b z9}ZR1W2cH2`F&qzPfUalSt%;6o+XOmLv3q|LG?arcETh#G$XM%b3Q-Y&;}eX5}*Oq zFUVM|CV?^q{52}pyjB+!>Dmb1MrRv0sT6MJ0w1PqlPo}q9B8MAGf95#ED-GLk7@00VO)z;GkRJ@=JK#BPNS}61IZq++D&J5G->nN~SGC?b=4rJTzSQZJB|v40I@5Scyay(lOF45%2Kp#A6`w%yGc(Ug%5~5eLJADlmLHW7h!E@n)zanq(#rT2w^ukGB z!2I*bE?|Po=G)1X+g3SDmiFBt@^Yt{fJ%nAv321DUSwm5WCGlP@BXLP9azeG6wYPo z^JAh%516UC8OzWbgMMXtVr951_9f?**rj9z8*Dg=kV8zEW;p1v> z`a$s^9qT1U!K}5~D7kx2IoqQ_HsB-;SjW>Xio6x(P)eCzz)Z>iq#(HR7+NrOpjAaq zmjM4at9Pk6pLC~qVK@$3Vi-4zT}i^;2i*BA_e3dRIH`Twyv1`jk_e7~Bk4Bwb$NQM zLGO*XACA-(P^O>~xc{Odm@K*kN64&GgF{uLU5BiqT-_tah$=5i1MBDDIJD9ZZDK)+Dz5|=Xn;}o>C>l+G%V6z%J!k{%F*Q@M#3xgVHwgf zqprpgKWJ(jw)Itk60y|+1o z+1z=C1}$rkjpgB7=QR*_{F8F{)#4n>xMrYPMC1ZPwF}FPfP^Fw{CjU9z1uucTIh)6 zfXOtmufY#^v-A$Sxq0qy4YyHfFQb7h?6X+4bCRF`CiUyL@&tIU9|*?%NQHS(nN<}0 z;i$6M0irIP-P+o)bRcBanML`=XD5SA9vmF(KmGIZbLH~{pyIr2;v@l@z`;)u{a!no&MqV1tPD>1%2C@ z_AdKVSqu`+5BxH6LhWlCugTph#90!EMx8Zj*%Q;Uos%YLk7HN-PII!vL}C7BF?E?Q z}Epz)_tNHpWAkuUgFJ!YvSx7ubG{RjMNf46+2UB zs!Ig1mDkO-z4_)lbHds5U)ZQZr_R5%j8BQ$-D#m_W96@jVPgfB`y}U#2rn1@P#yquy%Vf<*gLcy*fpiD~*(ld+^@2CgHoAKR!VC z^ylT_N`y~So4V}Z|IvKpFgR|T2JN*pHFNaN8G?$5t`pK5H-He$Pt4*6H}#sgZjF+Q zm^Y~xe+DMZkk|quYUKJxrb!jR{Lp}`B0)YxY`)hrD{VSF)^mmIpLwQTT3-~SNYDn` z@BYV0WI{PZu|?vAv(f+#@Gndp7VbWVaL7&BR0WQtzTQ_Bb$H`muz~4?tqlk~W(V(E zSY+dbd#BoK9*U(KBtvUU1!kPeMPXp zD~A^bBaE%5*V4$`SlOo4!@!bDBnDHL#;4G+PdH!0~|)>pfjo0|pG($WGTZNS{HFkH$WBHgW~*A&Aqe54m2fBT_e z!d0J$ss?V*ym^xefw1ePS`_N@&G z6Wxus{gr7f0+^8|+U!(=e0~TAn1b7;&)MBgi(UF~ioX)|GfzGHwvV#0NR+ez9_N2b zTFS)z{og+mHOiT&Z9yA0;|_)9xsDMTsxk|#Q=4ozBR-`E*?YCo5c0x*K$ndbmQ-p5 zit1wHGXZup;F3B13jpcXimBpFcoE)^32Jtw%Ww=GTy13&geHQ0kX&KcDU0ki*~{~Q zEbuEl1ncN+eOz|yIh24w%4%|fxNbHqxa{BBpIvo|@iEIxW_4}-E|{=&mrjbx z|G4=ZRo4PwNoI|z;`0f}gE?^#eG#uK?ccXHgIlT*HI*z-5@ThBunzz}f^p3xX6WBx zC}oa+`MEh>&fFhvxFF3Nd?Fauo5m7?4j?XP^m>V9#jD&NM|}01pyZG z&jdS42ku%siMMb(>ssOs1eWEkjHbkc_Y;^&;aOrhg!ji(0t&lk^KpxMP6NF_@rC zV1Y_Fw~QRIMmXpGtXdvFHk=463!uoaQ&MV0%*H!18BBmQkf+7pA^FXl`;KV{bwWr_ zSB^zgrPOL?quC}B4FN9o4aVRegI{!OHz0 z_-BHOe5Yp>fzz;1Sg)Fv)@Dgozp+j=SS0%2BibJFc*Kb zsyl_l;OF!O)53oYJRm9Ap4z5dAE!9MRI^weY`Su^UaT>EwKOrOUhASUxCDgz-0jsM}NXBG7(h}T|pI^i~%ZywS3EKSD| zPDS}@46G7FbaQ%3uPl<-8rs_C{&4`#B3NAx^kP3sXV=?XANVUFRL`W`n;MLBxpL5w zm{-TMRij-;lMPFR^vxh-sGc6IA|C|%ChHV{ea-{4f_!5#YsE|sfS+V~uCG|v<_;DB zzbHu_&jVZtO!%Oji$!1wk99dBFuEI@UJN9(d*AK*Ve=_|wA{Wv$Jr~Frb*e8KG<~v z)@q>$X!o3IY_x56T5j)2>QfUh(rSkpYfXtY1@n@1cpl_T@v{eYT?T|!U8Eovgm;iW zsjCK9WE2aL@{qxDwG%xgh)qrwmWTook*^AB5le;H8o-ybr#=ACYPuecL_%hx)T#`8 zOhZGXTxxavIC9~%FXKzn(LEj$6ly>^PlTbPuHPzq6e4DepfwO>B#`hpxD7z9epmfy zD?lr5y*LFJ`E39vZ7XQB-;GJ6C4<9cnp9PV{)`9+@Nrb9fFEbk7%9{n4{w<>ffd}9 zI=2KKo4OT6>IRs?tC>Ndt`3+8f6Z&g;ju~SeYtA}LS`TF#;jR%DcW#@i4@Sn0#8wv zs&olL#Kl2qjTxMY@01z?zejyZlwOy%{$yKwx;gMjKI`s0YeRk4S0G7n46UWqv%?$w z)@!*Ix5wF~U&!o)E+I<8U*3rX^1^ewlEcgzk9L%bfNox9zPQ>mjz&>atTzrCwz|ef`sx4I^$?QPe38@dAVKL#<}5E z#)1umkoNF_|6LUuzit=2jZI?=C>!g+I4UX`nah_iyH5lkB>iC=Ry84Ae74ea=6G=l z2#?#~5Rn)AJx~bDa_eVK;67FZC&GMA+QG}`rYQZh7dXh&95I|zF44Y%y4f+9dgHx-r za0R%rvPv8$atL@XW4OYFi(2r0VPH>7cfNgL0tU?AS3OmZj>>WFGapke#DM4>J><-y zGIChw(jTC8j2Y2^BOM@X{IdIpM~D4D{cv3J;GQ5fOr}6B`Rv+~v5|b_of(dCbL`$| z)$bQBEn+(tH+}S5Zp^qFiRh(rlHWOkIqL#1M3_Qw?NbP~89N@gB$HbwjvVqdeb6&H z1Stk*>?R1tSdXa07UZ%W7#wu4z#&%;wA`Zuqu?%K8Vm&F)1APppqkTgZSbyjurgA= zAMa$#EDqFQh~?=X%4d_}Ohs-31U__Uw5m!=l9m8FPks1SKSD{)UBk-=xP5>AEC63{ zu)4-va49mK^VRU{(f|z6F7|-R{4y&m%WxH(6C9J!L~j#5kaz|BI-JKaGDk_AIDf&g z;9Z*=pc36?C1CEN0E|OWjkn%jr~veCVvIn4{4bv^&vwPwwrOgc`h&~fft#f-NYJXg zFpZ|%*kv$GO;@)weP#%0Rj|ff!vn*Bj~_>ik8(lYpWFHK;I4_|TL1{FuwofmfR0#W zp-D>nf`#0ICTWA0i)#!oc-AGPQH0w%YW_ps;v~g4BU+snwB6{fh(E-!;MMWMVXCip zCx*^7@xxJR38a3(VVFaxMNnK^pVe$2xCxMV7_3ICA`seqKzok&1{xp-4-XE| z9{-kqkqJ(6ar1pB&Io&x>6gezg=Xwbz# zLF%>usa1hNcpISTG_x8!4|iCtnRq&=U_1pQFTuPM?nj8AUIf}x(CAJA2ZT&*Y00r@ zBt$EdeQ*M}8HxiHKKD0k_gR=-LRKYXJt4tz1G1^pGGefT|&? zQVhA>c8W!F(5eO@J`icrIqG(DQ4xSo30Qgk0G<3@3KP5ykS>y-GUalnEoitT0tN{(xKmF7qbej|KD}1U zwCv16Oxt9-zhW9i1P(RE^slrnN$ zxpC?|rIFs~og9SRjXc-jY@6$#Xeeqw1B;63LD_fE{(~K}+%3J*9QYEX(TAzke~x;- zRUTd+5-#l=;sZWm3mSyu3KN%hy8o2NlpC{WAHoTMf_q<$nN+E1YSOUD`d8C0GK2fq z*Oy+})4g&D;yzE5W?kXn;wZ?#-9685Zn(ro6_|a9x2TGlUz<67L@Bl%*!18pJ zxaB5TZqxQ)S6S&UPcUiz?ynz&C<2r}I6BCeNT2`S$oEJ$cbOURpKfWnVY(BHz4h_5>b=0SCIK2cIyn$epw_Z8C(2!adpKqh z+%lD@ttB-zSns-}+UN==nCzrdZ4NSbciV&pM3~m&^Fd>8eVbxIGQAHM;7@RK5=<^- zI3NN9^Vu(>4}=h+z5i_xm`4>Tg@_m@JXJvs<_^0;@^pWgwh?)56+Bji7bNf$6s||! zl+%PTz5CDRAn*)1PsvYrwqf&M$=Ka!-RGL{cv}dt%3WQ0c#zJ~?G+emuhY|ec?i-V z-sq*=mmEdu#=T>~pGj-X1yTLrXyYS$e=}b3pI?m!{w#0AGT;W3B*cSILMA~A-^dGK zOtc8)Y~gb)BH_e&VnK-RupDo&6-8umObjMfxB#>{q|3Q^BQO1K1M94>L|!z^g|8p! zD!LbW9#t8@NQZm}C<>d*L2LuYvzc{M_53j>xJ*D0C78@P0|JD!Q~m zCYyT_AWrCe0a5B-JrI7qE4%X;s;1MRMTuJ`V@#f*Y?cAuOs(~9E;1H|6WwrS>D~7U4}cor5e#g z*n=}T%-O-r48euAmHQkg{SBFi-QC^W85_Gh^Db(SVigZVd_fHG5|GI5U;@SBh!OR1H;4Y9-VtDK))I85zt#hv;&Who?=0W1Qf@q09Exk zfLe~g)fhK}YaqEkUQQ0I>v6c%nSGwC6`MJJ+ur`|k-e+mAAH{|A=S@gB}K3X&)GUS5ZG=l(oGALV>Nu(~4$1R1D`eJ$uN{jj@|rrI>U9L`>d zK|=g-{22VkUHW!MYeqwl1kLPNk&wC+g%M+hp0C%LTt{AP5*5TG#em-JWn>N>&rFEd za0YE*J1b~=W>3O)w`ZhcW_A{;-zx*}B|*CaUvOQXM@~NRzcn~%P~PP?O!IE=UOfEs z*^;$EUO7m068iyS@6JL-WM7E~3A~i@-`w^~A$wT~RK#CXyHRlS3+CA6t z%{tNXweq`h?q3fHzo-3wl3c&ugpto*krceq6qUC2Z!rYRZocktj0l6WJgoRZ#!v!D(l27lO+K;cA*d8ut3K8EztN~AO3ZOv1hKsiJfZB;JAti4}fR2d_{Ky6XGvryxQf(u*HWsSjl(|1plKxa`nzGmr z#oZa6%PD4!<{M+eo1s4j>oK)aERAaf;0gPv?reIOM}qn)8a<)85Ja(^^LTLq+3_5r zYfTC9moxUn5t_&Tv3BgS+{Sga$|dW<$&Gw z8XH`k|I^uWqZ?XX1w!7)djf5Fi_=ChMh2dElf4BnQ3J|)3TY%>7NQMu%?%hG=I7w_rP1(rl z?C6@exV^k;a}LG3Q+0d<`?a!^@}&?02D6R38PIfL)V+*m_)wWvcqzq9*5y5crJdi4JN#&+%=)d)YE>((au%{oNvi610V{wSj z(V3g-Lp240aa+dGIMp{-5RFtO)K%nSzcw9+^%t~|x+Zqu=lgf>dPC~24AfLe)P$@~ zK6hs|_mvKl_~*}m-DYo>c)wNby;!W|+w`Z2`)w*LYT4S`t#L)&(H$8a(m2T?tiSY7 z6L@Cj<=}EU+Cd9k|0)(N>*&~MFz)w1@fSjRTV@8^Z2Q(reQZstDnU05+ZJ2T>Auyv zE(NL^8=pE_hvo4se(*q}q)obo>;VZ;bu->>v4QlCQ!OIorbrI)dw0e&SJUOIKoxQP z{qW(#H3|110J0e@IFb{fV@c~D66pEwTx+r2WUF3AoO|%q=H9+dG;U1s$1XLrJY9~G zjGsw+e|NlJA@N4Nr>snovHmg2dQvgzorSc&1$IRVoZMXrBv8J^p9%LFyiyXo;vv)f zCgF;uFth>1X{KoB>YOW1lpCrKg!&2zY+G7-vBr*bZu>BAf@x_>nKJS>mJ}8-a&scQ zn&z&}J9)~Sk!TQsbEBPPDAhM$WcM8BolgAOtmMF5T|c z-7uVxOe()`*0z0Vjozv5mb~#f;J#3{+STEc zRWHg-K5O2j9#o@GM@^l)=ESyA#F*(4m|)`IhYOb%)&sBTwhZx7*~3aUNzhSSzfcMk z6GDHw`QwVmQHwaRSRjDBg$%7wTS*PLwzj1B+hmsMfnW@i`n0Qooq`e5LgspK3D~zc ze^iHW1K_B_nTubZEfNgs{qA6*xIUzoKy3-Wn`K@Jyj#0I0)aYPzisXM+nx(NJ8*@WV&StutN1jsj+-LoZL{_|mf+kp<>zNBBPIF z3aqcSoG&oY4nsvmb+gayKIim*JtsfWrs%jZ#mrPl>J&ulC&9qs>g9H-=paFdZ21zFp$+4Jmg&#KAP$kpLqoeRdH4r>+I zp&>kA6Hk6cU_2Phh+X(QGgphI+{sh(7-e>DY`P*4do0O)=xudlqpIt9nE%M>(Cr#W zk`H&y+RaVD%R>fA-RioZEkQl`wLyu#%s7jF__ak^-eSXJ=)YX46-Om8OPA>R{J&5J z>ZZ2ycHenb=BJqdh_OktI$Ev1ZA^0(BPVPQSa#&Uz>t`Q)g)sdEcUf=QReN%Ye}s^ z3W=;S8?TiLrfqE)-LQt9YlJvo5;nH)gu0X_gYoj?zg{9no48XR2Ncr(Vzx(6RP5@o zBx9+o^@E}!_ohBsY0f*=7tDHRY;Bl{dFT6+RL4&)N)(EzNZq{`?NRexrg`(EJnvp9 z4Ds{dp4mGh?fC!zA_;e`M<+V+Z%kENI? zxpPnGi)x>5t{DCBnvnmN#?v4WB9NYdsus*!X^en4%Q!#TBTcisk-eiCAwP8i&mD=mN+LLF|D?VMO_?JojqvBv( ztBLz{;<3dG-2#(o{!8V(jTO3alZ;g!GXU@J4)pe~{}LhsW9@B~*zQ%m?)CA>%zV$l zoikC9les9_+gUZr*fKqr^>T^COcq)BSTWreVt;$?)+)Ql>h5|wE`JMB{mRPP>zpFC z;WlYZ3aVfOR?+og9y zkwW6J7ehJ8uKACz@XkKvx@7^*rBCy6{+5zLa?BR%b!@UP)x*O7G^RWC+*9&+T}b?F zczO&ENiO9OjQnCOrGqaI)cwQ887cMWS6d)5d#E_V^61DULnUsyn#X)VQZosvMeF}$JL!h62fi1;PR z5McvoxBT!EKwUjZ%d+WExGxyDnkjMhiiJOjYd>8f2fhj>1VWCNtD+Rcm)>GSSCY9v zV`RoW_@XfkJpC^6Y>@2k(|Ip`RR9Lz!*l^Tma>8Ch6bQFxb=oiq%!6yr4#;RN8ZNI z6a|cGbc7+dUEBZF6*E#eSeXGe_?MgYuzM58QRK< zQ+6LzEn5$6OIyZuGXKiA!x?4W3>6U(3BvjR_~`z`5^K1%?Sy(VCGuK^u7tt~EOTg~-Pq6VaWPl^q4hkMW<8w4)kU1j1C$&k!ZBKN> zGWNzs5$&%wCYgODH!PVG0yT$$ULAro$WzfAK068gv zU67EW!dCapODB}8dnk_1nyv+I;0%&8^H%2mf^o$mvD~eV!!4fR*XYVAh^kFLxB?r9 zI<%-8J{0g5tlj%eM}$qQ#4g{>OCkJ62}Gj5_FGIBpfzZ3JlXQdZMhE*=eq}f z3LCq7FpB7Ly&uJbN@_3PJmrR5PHVaP_XMPaX2QVUU!C9E0{JwI%idqXKfo7Zwh0&61YxV7wnbDbKQ{#PfnyX&5I@Q^ud{zHq$+ym_I zH^KYm$o?yZi4*v-mLEGGH?c6hXGpF6BSZ2i$4}1(8Q8Bkvs>BH)5FYmgjR?7aFeMq z%GlW2ikX5zP{$?|7YvKA#D)608w+9J>5|3JsCwRCe=|A75?8wv++zdr+Q*lcHbsAp zlp0QHb9tnQ{yvgk`_JY%HM+@u`1cRDnY|vYm>-}Kzf_5}NI*t5mba^w9%*p>`9x4( zu1Gf;%iTzY&=Qh@x>07)=s-#NUwf!Y}}^JA^jgfK46? z&INoS#{jY%beEN44Dw^Y`sh55`tAPi*rYSN=Tp{jbd4i>r)nZLO{beGUKD7~cW*~E za~1#8Ol?2@J6KOVfK3(!gLU8zM;mNlUvdck zihv6Zr;G;%H>{Sw4SE%5B!9rN^`qE_PA$y1qKdSu2rAHe!tl_iU;lFNzidhTFHWjf zKUpZ{5GP$_veCepSWx0I@al>T!3A|Jk@x5^?gO>2!khFuK9{)6&&T*#g0~9XE481* z3xe%dc|8#@E7dgmsQ$gW?A4VQub!lSdWyg!+}B?6+g)2LkKrC$_aO!so?iO=5J9b{ z>R3%LajIE*(=ETgKm>^X!ViF7Fwt)K{W4`nn1undGyAZ4ch?d*6Gsyj!>GixHaz#w z{pHhBF7N!>%sxsT2Znp|%A1eiMTCSbjOvih`SDLLrF-Z+&q*q8!WllZz{y60@);5v ztuGuUXPv&^$u@G81iwEKE$qQQD58b*GLDnBOZ$AbK2rMBSFXWH)#aX7ZD$tm1wFa+ zJSwUn*V&MmfW39=QU&8ha~vh+-Un6`a>AE}Dc1yANC;3Oj^m|*X<7KaQ3mkdUTu0zRY>$5!wT0b zIUUv#q6rjzoV4#YGsy~^d%@ur#(IDU48WXDgp{B9q<2o82B(y^pYhLio0p;IHlrOcYB1o5vQB{f^l&58^><97=YXBzu;puy;88Y*w*(a`^Mc(4PtfyN- zJ1c840TsfhMe}0nOK9`yqrjXAcYVFmp+-ePhU=CBtYlsM9$Kz&u5LXPN%lZ_tVC^& zK{3s*dwtdjRlW9a6+{vA3<>^i3Q2=J&HXJdNcZaa#;R3AkoD%gDg=8c)hN!Ex**&} zEIY6ZcHM5KlZF!U;!_AsFR2%DJDfo;+35jZa8Q zib36<#)dbsF=n`xSV65q%9~WfxTXkq3A_q%NOt5=l}D@{h{N~)=d#3N8-ob&!$_$v zuwKXsT8S67XYU2-TT$h>uCv?r4mcbKa#FyEekddld934RjfRc(ju%=!xl}P#xw4oP zgGZ}G@$b>p(ax<17YJL$0a7C&vClmfjaDvx9t$Tq3n6H&z5;Iz%Uii;{5T)mFSNjO z^R84(ygdXU*Y!+j=T7Pf{6WX==&gedj{BB{yB;=GJxq-ZRa%Z zIe3eg;W`!1Zdh*?h)cVI(*cMOg#HEN#M!nS!%)ctOJP5R8W@?=#bWjKE zSY$}hsq-6Tl?vdbU6=;O!1d=qvSO~pfh4ftoWqw-Z5CZc4QV~8o0mjwJRu|8#rNUj z7e-HL&b(`_h_G^VStAuU(RAIAly+^6`Cb4?(|$=Qoe~i$zQR%@a0Cl0p_3J-v{b!d-yXLIQVBus1%}rO{ckA|kvH zUx9ltS^qxwK9=2fTrPxkxX@f3zB=|Y{5fYNy{W^J#|VJE{Aie+1HH`4s$V6$QU>pf zfkNPc{;jKXFS9O8cWbgz7r2X)YG4rlzGqD*xwkA_xEnewC6v)p8Bg~Y1HDaP3pc`yJ$X{)uaHd_A?bcAy2Qh&+CFlTjDH-i#K zJ{jprdxzQ(YnRQrM9$)Xt(obYj}uRe$z;>ij!(Mov(EpQd-Ib(TROpSDddAo#Z2eKa&%)aS$A9(CTzV=?ZW&%>7Pk4tkW>j{ z3y9S6l2}vsu><8TEjpT`{u7P--42cLNv&s19#VVs>u?$S%o9rD;E$c&ref8hlMBIn zm{>%xYY1ti)Djn4uCn-+xFfP`W!<@(GSP-o2B2R3V$zNmuDiSN@u%;xVr?XF8c$>c zA{ylRA}%31jFvSt4KBn7!`2wZWLBzg-s5;uaZ*gwok^R_QGR}dpUj>9mll)%MPw}s zoL^^#S)2k^y5P=x{v0%I!Kvg93_EtSZEH_bDMoK8ax)Dz9sql9!NBdL4l4I)y@


m6fpeSSQyU3ixJ7cJu0fm)Wp*C#?Y_lNNP&c9O8w*bQDl%kVc=*NhI*(rruX*u8 zT&>50?I-I1T4>qwF(6L&8t+NnVUXzoUx;z9p!6N}PDpcl?;SB(XwjxcqLR=*oRmOM zAwY+@YIn&x{GNoo-p{LEY@hCm?>7ook^IjS1sD-g#&1Gf^t2Wz9 zD2AOB*W`-{_$OcGq6FUV+Vpu(9&^#smf;eg41dz{`5xt}BuTN&jSaPB-flG6V5w3X z{?_d_jM~|R)rx35N_4YIRU?(%z2z}7^ceP$h|VD92^I>=<kp4aQNN$Y}xux02-#}rV%%EZQAwz3R)t?tK=Fx4F|YwK5; z_T)E&DOnkEjmE0ll~Y$H-J0a&Q#d9&1zJvB$(`gZU1`DvGDfhJ?h#{O*WUl5RQ+

-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 z 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

%YnGth)h0wGL~Ro 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

A8* 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


*-iiU8L{W$_Q}ZJSWkchOGAk|Yp=`j|yY7~k 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�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 z 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 D9PSNp literal 676184 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 $wHpztF8PtWUXrTJQvJxO01t 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

  • G|xVL%J{SG3B~gWhgtu{e-wUyfHtaD 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%0A@eKX>-H~ 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

    k>>H6k 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 MYS#*`+$9><&_q|6SA7f_T@Avh-uGi~) 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

    ZhN`zA^m{K~6S6D9UXlM)o5+-)OrFklp&rSx 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

    S1Zhy|25AXFLb^d(x|^XxK|yMeMq23_x?v~* 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 P4BT@WC26SSTc7^}Mi+Wa literal 290814 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

    DmKRNX3hbE^2RuQ?)FV3eA_! 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�C(p=SdOfPG3=JC-SEq~>4|)x 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%0AS1?-D-1e5mTKS@y6+?*=D0Jw0-G<5!VaSyRLP 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%0Ai2 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 From a02d1c1e59e2c4c8efa8a802eba04a84bc4af22b Mon Sep 17 00:00:00 2001 From: Hugo Dutka Date: Mon, 4 Aug 2025 18:53:12 +0200 Subject: [PATCH 070/260] docs: document how to start a remote MCP Coder server (#19150) Document how to start a remote MCP Coder server. Addresses https://github.com/coder/internal/issues/823. --- docs/ai-coder/mcp-server.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/ai-coder/mcp-server.md b/docs/ai-coder/mcp-server.md index 29d602030ab58..e4ce4c25d7501 100644 --- a/docs/ai-coder/mcp-server.md +++ b/docs/ai-coder/mcp-server.md @@ -1,6 +1,6 @@ # MCP Server -Power users can configure Claude Desktop, Cursor, or other external agents to interact with Coder in order to: +Power users can configure [claude.ai](https://claude.ai), Claude Desktop, Cursor, or other external agents to interact with Coder in order to: - List workspaces - Create/start/stop workspaces @@ -12,6 +12,8 @@ Power users can configure Claude Desktop, Cursor, or other external agents to in In this model, any custom agent could interact with a remote Coder workspace, or Coder can be used in a remote pipeline or a larger workflow. +## Local MCP server + The Coder CLI has options to automatically configure MCP servers for you. On your local machine, run the following command: ```sh @@ -30,4 +32,27 @@ coder exp mcp server ``` > [!NOTE] -> The MCP server is authenticated with the same identity as your Coder CLI and can perform any action on the user's behalf. Fine-grained permissions and a remote MCP server are in development. [Contact us](https://coder.com/contact) if this use case is important to you. +> The MCP server is authenticated with the same identity as your Coder CLI and can perform any action on the user's behalf. Fine-grained permissions are in development. [Contact us](https://coder.com/contact) if this use case is important to you. + +## Remote MCP server + +Coder can expose an MCP server via HTTP. This is useful for connecting web-based agents, like https://claude.ai/, to Coder. This is an experimental feature and is subject to change. + +To enable this feature, activate the `oauth2` and `mcp-server-http` experiments using an environment variable or a CLI flag: + +```sh +CODER_EXPERIMENTS="oauth2,mcp-server-http" coder server +# or +coder server --experiments=oauth2,mcp-server-http +``` + +The Coder server will expose the MCP server at: + +```txt +https://coder.example.com/api/experimental/mcp/http +``` + +> [!NOTE] +> At this time, the remote MCP server is not compatible with web-based ChatGPT. + +Users can authenticate applications to use the remote MCP server with OAuth2. An authenticated application can perform any action on the user's behalf. Fine-grained permissions are in development. From dc395c3b510e36cdd92af6e731f649e660160ef4 Mon Sep 17 00:00:00 2001 From: 35C4n0r <70096901+35C4n0r@users.noreply.github.com> Date: Mon, 4 Aug 2025 23:12:16 +0530 Subject: [PATCH 071/260] chore: add openai icon (#19118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ケイラ --- site/src/theme/externalImages.ts | 1 + site/src/theme/icons.json | 1 + site/static/icon/openai.svg | 2 ++ 3 files changed, 4 insertions(+) create mode 100644 site/static/icon/openai.svg diff --git a/site/src/theme/externalImages.ts b/site/src/theme/externalImages.ts index f736e91e7b745..15713559036d0 100644 --- a/site/src/theme/externalImages.ts +++ b/site/src/theme/externalImages.ts @@ -156,6 +156,7 @@ export const defaultParametersForBuiltinIcons = new Map([ ["/icon/kasmvnc.svg", "whiteWithColor"], ["/icon/kiro.svg", "whiteWithColor"], ["/icon/memory.svg", "monochrome"], + ["/icon/openai.svg", "monochrome"], ["/icon/rust.svg", "monochrome"], ["/icon/terminal.svg", "monochrome"], ["/icon/widgets.svg", "monochrome"], diff --git a/site/src/theme/icons.json b/site/src/theme/icons.json index c3f6b1aac6b36..5dee3442e8fe6 100644 --- a/site/src/theme/icons.json +++ b/site/src/theme/icons.json @@ -85,6 +85,7 @@ "nomad.svg", "novnc.svg", "okta.svg", + "openai.svg", "personalize.svg", "php.svg", "phpstorm.svg", diff --git a/site/static/icon/openai.svg b/site/static/icon/openai.svg new file mode 100644 index 0000000000000..3b4eff961f37e --- /dev/null +++ b/site/static/icon/openai.svg @@ -0,0 +1,2 @@ + +OpenAI icon \ No newline at end of file From 247efc0dcc7da73cd2ae80ad08d1491c8825c163 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Mon, 4 Aug 2025 20:17:47 +0200 Subject: [PATCH 072/260] docs: add OAuth2 provider experimental feature documentation (#19165) # Add OAuth2 Provider Documentation This PR adds comprehensive documentation for the experimental OAuth2 Provider feature, which allows Coder to function as an OAuth2 authorization server. The documentation covers: - Feature overview and experimental status warning - Setup requirements and enabling the feature - Methods for creating OAuth2 applications (UI and API) - Integration patterns including standard OAuth2 and PKCE flows - Discovery endpoints and token management - Testing and development guidance - Troubleshooting common issues - Security considerations and current limitations The documentation is marked as experimental and includes appropriate warnings about production usage. Signed-off-by: Thomas Kosiewski --- docs/admin/integrations/oauth2-provider.md | 239 +++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 docs/admin/integrations/oauth2-provider.md diff --git a/docs/admin/integrations/oauth2-provider.md b/docs/admin/integrations/oauth2-provider.md new file mode 100644 index 0000000000000..fb98e1520b2dd --- /dev/null +++ b/docs/admin/integrations/oauth2-provider.md @@ -0,0 +1,239 @@ +# OAuth2 Provider (Experimental) + +> ⚠️ **Experimental Feature** +> +> The OAuth2 provider functionality is currently **experimental and unstable**. This feature: +> +> - Is subject to breaking changes without notice +> - May have incomplete functionality +> - Is not recommended for production use +> - Requires the `oauth2` experiment flag to be enabled +> +> Use this feature for development and testing purposes only. + +Coder can act as an OAuth2 authorization server, allowing third-party applications to authenticate users through Coder and access the Coder API on their behalf. This enables integrations where external applications can leverage Coder's authentication and user management. + +## Requirements + +- Admin privileges in Coder +- OAuth2 experiment flag enabled +- HTTPS recommended for production deployments + +## Enable OAuth2 Provider + +Add the `oauth2` experiment flag to your Coder server: + +```bash +coder server --experiments oauth2 +``` + +Or set the environment variable: + +```env +CODER_EXPERIMENTS=oauth2 +``` + +## Creating OAuth2 Applications + +### Method 1: Web UI + +1. Navigate to **Deployment Settings** → **OAuth2 Applications** +2. Click **Create Application** +3. Fill in the application details: + - **Name**: Your application name + - **Callback URL**: `https://yourapp.example.com/callback` + - **Icon**: Optional icon URL + +### Method 2: Management API + +Create an application using the Coder API: + +```bash +curl -X POST \ + -H "Authorization: Bearer $CODER_SESSION_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "My Application", + "callback_url": "https://myapp.example.com/callback", + "icon": "https://myapp.example.com/icon.png" + }' \ + "$CODER_URL/api/v2/oauth2-provider/apps" +``` + +Generate a client secret: + +```bash +curl -X POST \ + -H "Authorization: Bearer $CODER_SESSION_TOKEN" \ + "$CODER_URL/api/v2/oauth2-provider/apps/$APP_ID/secrets" +``` + +## Integration Patterns + +### Standard OAuth2 Flow + +1. **Authorization Request**: Redirect users to Coder's authorization endpoint: + + ```url + https://coder.example.com/oauth2/authorize? + client_id=your-client-id& + response_type=code& + redirect_uri=https://yourapp.example.com/callback& + state=random-string + ``` + +2. **Token Exchange**: Exchange the authorization code for an access token: + + ```bash + curl -X POST \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "grant_type=authorization_code" \ + -d "code=$AUTH_CODE" \ + -d "client_id=$CLIENT_ID" \ + -d "client_secret=$CLIENT_SECRET" \ + -d "redirect_uri=https://yourapp.example.com/callback" \ + "$CODER_URL/oauth2/tokens" + ``` + +3. **API Access**: Use the access token to call Coder's API: + + ```bash + curl -H "Authorization: Bearer $ACCESS_TOKEN" \ + "$CODER_URL/api/v2/users/me" + ``` + +### PKCE Flow (Public Clients) + +For mobile apps and single-page applications, use PKCE for enhanced security: + +1. Generate a code verifier and challenge: + + ```bash + CODE_VERIFIER=$(openssl rand -base64 96 | tr -d "=+/" | cut -c1-128) + CODE_CHALLENGE=$(echo -n $CODE_VERIFIER | openssl dgst -sha256 -binary | base64 | tr -d "=+/" | cut -c1-43) + ``` + +2. Include PKCE parameters in the authorization request: + + ```url + https://coder.example.com/oauth2/authorize? + client_id=your-client-id& + response_type=code& + code_challenge=$CODE_CHALLENGE& + code_challenge_method=S256& + redirect_uri=https://yourapp.example.com/callback + ``` + +3. Include the code verifier in the token exchange: + + ```bash + curl -X POST \ + -d "grant_type=authorization_code" \ + -d "code=$AUTH_CODE" \ + -d "client_id=$CLIENT_ID" \ + -d "code_verifier=$CODE_VERIFIER" \ + "$CODER_URL/oauth2/tokens" + ``` + +## Discovery Endpoints + +Coder provides OAuth2 discovery endpoints for programmatic integration: + +- **Authorization Server Metadata**: `GET /.well-known/oauth-authorization-server` +- **Protected Resource Metadata**: `GET /.well-known/oauth-protected-resource` + +These endpoints return server capabilities and endpoint URLs according to [RFC 8414](https://datatracker.ietf.org/doc/html/rfc8414) and [RFC 9728](https://datatracker.ietf.org/doc/html/rfc9728). + +## Token Management + +### Refresh Tokens + +Refresh an expired access token: + +```bash +curl -X POST \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "grant_type=refresh_token" \ + -d "refresh_token=$REFRESH_TOKEN" \ + -d "client_id=$CLIENT_ID" \ + -d "client_secret=$CLIENT_SECRET" \ + "$CODER_URL/oauth2/tokens" +``` + +### Revoke Access + +Revoke all tokens for an application: + +```bash +curl -X DELETE \ + -H "Authorization: Bearer $CODER_SESSION_TOKEN" \ + "$CODER_URL/oauth2/tokens?client_id=$CLIENT_ID" +``` + +## Testing and Development + +Coder provides comprehensive test scripts for OAuth2 development: + +```bash +# Navigate to the OAuth2 test scripts +cd scripts/oauth2/ + +# Run the full automated test suite +./test-mcp-oauth2.sh + +# Create a test application for manual testing +eval $(./setup-test-app.sh) + +# Run an interactive browser-based test +./test-manual-flow.sh + +# Clean up when done +./cleanup-test-app.sh +``` + +For more details on testing, see the [OAuth2 test scripts README](../../../scripts/oauth2/README.md). + +## Common Issues + +### "OAuth2 experiment not enabled" + +Add `oauth2` to your experiment flags: `coder server --experiments oauth2` + +### "Invalid redirect_uri" + +Ensure the redirect URI in your request exactly matches the one registered for your application. + +### "PKCE verification failed" + +Verify that the `code_verifier` used in the token request matches the one used to generate the `code_challenge`. + +## Security Considerations + +- **Use HTTPS**: Always use HTTPS in production to protect tokens in transit +- **Implement PKCE**: Use PKCE for all public clients (mobile apps, SPAs) +- **Validate redirect URLs**: Only register trusted redirect URIs for your applications +- **Rotate secrets**: Periodically rotate client secrets using the management API + +## Limitations + +As an experimental feature, the current implementation has limitations: + +- No scope system - all tokens have full API access +- No client credentials grant support +- Limited to opaque access tokens (no JWT support) + +## Standards Compliance + +This implementation follows established OAuth2 standards including [RFC 6749](https://datatracker.ietf.org/doc/html/rfc6749) (OAuth2 core), [RFC 7636](https://datatracker.ietf.org/doc/html/rfc7636) (PKCE), and related specifications for discovery and client registration. + +## Next Steps + +- Review the [API Reference](../../reference/api/index.md) for complete endpoint documentation +- Check [External Authentication](../external-auth/index.md) for configuring Coder as an OAuth2 client +- See [Security Best Practices](../security/index.md) for deployment security guidance + +--- + +> 📝 **Feedback** +> +> This is an experimental feature under active development. Please report issues and feedback through [GitHub Issues](https://github.com/coder/coder/issues) with the `oauth2` label. From c94333d9b5db165fcaf449b1e19159d98c308f17 Mon Sep 17 00:00:00 2001 From: Hugo Dutka Date: Mon, 4 Aug 2025 21:20:51 +0200 Subject: [PATCH 073/260] docs: oauth2-provider fixes (#19170) Adds the oauth2-provider doc page to the manifest so it's rendered in the docs, fixes formatting in the oauth2-provider doc, and links to it from the MCP doc. To see the formatting issues, visit https://coder.com/docs/@4bcf44a/admin/integrations/oauth2-provider. To see the doc after the fixes, visit https://coder.com/docs/@f05969a/admin/integrations/oauth2-provider. --- docs/admin/integrations/oauth2-provider.md | 9 +++------ docs/ai-coder/mcp-server.md | 2 +- docs/manifest.json | 5 +++++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/admin/integrations/oauth2-provider.md b/docs/admin/integrations/oauth2-provider.md index fb98e1520b2dd..e5264904293f7 100644 --- a/docs/admin/integrations/oauth2-provider.md +++ b/docs/admin/integrations/oauth2-provider.md @@ -1,7 +1,6 @@ # OAuth2 Provider (Experimental) -> ⚠️ **Experimental Feature** -> +> [!WARNING] > The OAuth2 provider functionality is currently **experimental and unstable**. This feature: > > - Is subject to breaking changes without notice @@ -232,8 +231,6 @@ This implementation follows established OAuth2 standards including [RFC 6749](ht - Check [External Authentication](../external-auth/index.md) for configuring Coder as an OAuth2 client - See [Security Best Practices](../security/index.md) for deployment security guidance ---- +## Feedback -> 📝 **Feedback** -> -> This is an experimental feature under active development. Please report issues and feedback through [GitHub Issues](https://github.com/coder/coder/issues) with the `oauth2` label. +This is an experimental feature under active development. Please report issues and feedback through [GitHub Issues](https://github.com/coder/coder/issues) with the `oauth2` label. diff --git a/docs/ai-coder/mcp-server.md b/docs/ai-coder/mcp-server.md index e4ce4c25d7501..fdfadb4117d36 100644 --- a/docs/ai-coder/mcp-server.md +++ b/docs/ai-coder/mcp-server.md @@ -55,4 +55,4 @@ https://coder.example.com/api/experimental/mcp/http > [!NOTE] > At this time, the remote MCP server is not compatible with web-based ChatGPT. -Users can authenticate applications to use the remote MCP server with OAuth2. An authenticated application can perform any action on the user's behalf. Fine-grained permissions are in development. +Users can authenticate applications to use the remote MCP server with [OAuth2](../admin/integrations/oauth2-provider.md). An authenticated application can perform any action on the user's behalf. Fine-grained permissions are in development. diff --git a/docs/manifest.json b/docs/manifest.json index 189614f9191d1..a8dffe2f7aec1 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -718,6 +718,11 @@ "title": "Hashicorp Vault", "description": "Integrate Coder with Hashicorp Vault", "path": "./admin/integrations/vault.md" + }, + { + "title": "OAuth2 Provider", + "description": "Use Coder as an OAuth2 provider", + "path": "./admin/integrations/oauth2-provider.md" } ] }, From d05a15cb12f100106aa6cfc6069898c75802c48c Mon Sep 17 00:00:00 2001 From: Jakub Domeracki Date: Mon, 4 Aug 2025 21:24:09 +0200 Subject: [PATCH 074/260] fix: adjust the kubectl exec example (#19148) Current example fails since kubectl version 1.31: ```sh $ kubectl exec -it deployment/coder /bin/bash -n coder error: exec [POD] [COMMAND] is not supported anymore. Use exec [POD] -- [COMMAND] instead ``` The legacy syntax was removed in: https://github.com/kubernetes/kubernetes/pull/125437 --- docs/admin/users/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/users/index.md b/docs/admin/users/index.md index e86d40a5a1b1f..4f6f5049d34ee 100644 --- a/docs/admin/users/index.md +++ b/docs/admin/users/index.md @@ -173,7 +173,7 @@ coder reset-password ### Resetting a password on Kubernetes ```shell -kubectl exec -it deployment/coder /bin/bash -n coder +kubectl exec -it deployment/coder -n coder -- /bin/bash coder reset-password ``` From b0ba798f78f257e97cd0cfc4e865fecd37520d57 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Mon, 4 Aug 2025 21:51:33 +0100 Subject: [PATCH 075/260] chore(coderd/provisionerdserver): remove dangerous usage of dbtestutil.DisableForeignKeysAndTriggers (#19122) May have caught https://github.com/coder/coder/issues/18776 --- .../provisionerdserver_test.go | 467 +++++++++++------- 1 file changed, 284 insertions(+), 183 deletions(-) diff --git a/coderd/provisionerdserver/provisionerdserver_test.go b/coderd/provisionerdserver/provisionerdserver_test.go index b6f9d82a597e7..ec26a2b92000f 100644 --- a/coderd/provisionerdserver/provisionerdserver_test.go +++ b/coderd/provisionerdserver/provisionerdserver_test.go @@ -535,7 +535,10 @@ func TestAcquireJob(t *testing.T) { ctx := context.Background() user := dbgen.User(t, db, database.User{}) - version := dbgen.TemplateVersion(t, db, database.TemplateVersion{}) + version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + CreatedBy: user.ID, + OrganizationID: pd.OrganizationID, + }) file := dbgen.File(t, db, database.File{CreatedBy: user.ID}) _ = dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ InitiatorID: user.ID, @@ -613,7 +616,10 @@ func TestAcquireJob(t *testing.T) { srv, db, ps, pd := setup(t, false, nil) user := dbgen.User(t, db, database.User{}) - version := dbgen.TemplateVersion(t, db, database.TemplateVersion{}) + version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + CreatedBy: user.ID, + OrganizationID: pd.OrganizationID, + }) file := dbgen.File(t, db, database.File{CreatedBy: user.ID}) _ = dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ FileID: file.ID, @@ -676,12 +682,13 @@ func TestUpdateJob(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, nil) job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - StorageMethod: database.ProvisionerStorageMethodFile, - Type: database.ProvisionerJobTypeTemplateVersionDryRun, - Input: json.RawMessage("{}"), - Tags: pd.Tags, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, + Input: json.RawMessage("{}"), + OrganizationID: pd.OrganizationID, + Tags: pd.Tags, }) require.NoError(t, err) _, err = srv.UpdateJob(ctx, &proto.UpdateJobRequest{ @@ -694,12 +701,13 @@ func TestUpdateJob(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, nil) job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - StorageMethod: database.ProvisionerStorageMethodFile, - Type: database.ProvisionerJobTypeTemplateVersionDryRun, - Input: json.RawMessage("{}"), - Tags: pd.Tags, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, + Input: json.RawMessage("{}"), + OrganizationID: pd.OrganizationID, + Tags: pd.Tags, }) require.NoError(t, err) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -712,6 +720,7 @@ func TestUpdateJob(t *testing.T) { Time: dbtime.Now(), Valid: true, }, + OrganizationID: pd.OrganizationID, ProvisionerTags: must(json.Marshal(job.Tags)), }) require.NoError(t, err) @@ -721,14 +730,15 @@ func TestUpdateJob(t *testing.T) { require.ErrorContains(t, err, "you don't own this job") }) - setupJob := func(t *testing.T, db database.Store, srvID uuid.UUID, tags database.StringMap) uuid.UUID { + setupJob := func(t *testing.T, db database.Store, srvID, orgID uuid.UUID, tags database.StringMap) uuid.UUID { job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - Type: database.ProvisionerJobTypeTemplateVersionImport, - StorageMethod: database.ProvisionerStorageMethodFile, - Input: json.RawMessage("{}"), - Tags: tags, + ID: uuid.New(), + OrganizationID: orgID, + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeTemplateVersionImport, + StorageMethod: database.ProvisionerStorageMethodFile, + Input: json.RawMessage("{}"), + Tags: tags, }) require.NoError(t, err) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -741,6 +751,7 @@ func TestUpdateJob(t *testing.T) { Time: dbtime.Now(), Valid: true, }, + OrganizationID: orgID, ProvisionerTags: must(json.Marshal(job.Tags)), }) require.NoError(t, err) @@ -750,7 +761,7 @@ func TestUpdateJob(t *testing.T) { t.Run("Success", func(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) _, err := srv.UpdateJob(ctx, &proto.UpdateJobRequest{ JobId: job.String(), }) @@ -760,7 +771,7 @@ func TestUpdateJob(t *testing.T) { t.Run("Logs", func(t *testing.T) { t.Parallel() srv, db, ps, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) published := make(chan struct{}) @@ -785,11 +796,14 @@ func TestUpdateJob(t *testing.T) { t.Run("Readme", func(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) versionID := uuid.New() + user := dbgen.User(t, db, database.User{}) err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ - ID: versionID, - JobID: job, + ID: versionID, + CreatedBy: user.ID, + OrganizationID: pd.OrganizationID, + JobID: job, }) require.NoError(t, err) _, err = srv.UpdateJob(ctx, &proto.UpdateJobRequest{ @@ -811,11 +825,14 @@ func TestUpdateJob(t *testing.T) { defer cancel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) versionID := uuid.New() + user := dbgen.User(t, db, database.User{}) err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ - ID: versionID, - JobID: job, + ID: versionID, + CreatedBy: user.ID, + JobID: job, + OrganizationID: pd.OrganizationID, }) require.NoError(t, err) firstTemplateVariable := &sdkproto.TemplateVariable{ @@ -858,11 +875,14 @@ func TestUpdateJob(t *testing.T) { defer cancel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + user := dbgen.User(t, db, database.User{}) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) versionID := uuid.New() err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ - ID: versionID, - JobID: job, + CreatedBy: user.ID, + ID: versionID, + JobID: job, + OrganizationID: pd.OrganizationID, }) require.NoError(t, err) firstTemplateVariable := &sdkproto.TemplateVariable{ @@ -904,11 +924,14 @@ func TestUpdateJob(t *testing.T) { defer cancel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) versionID := uuid.New() + user := dbgen.User(t, db, database.User{}) err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ - ID: versionID, - JobID: job, + ID: versionID, + CreatedBy: user.ID, + JobID: job, + OrganizationID: pd.OrganizationID, }) require.NoError(t, err) _, err = srv.UpdateJob(ctx, &proto.UpdateJobRequest{ @@ -932,7 +955,7 @@ func TestUpdateJob(t *testing.T) { t.Run("LogSizeLimit", func(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) // Create a log message that exceeds the 1MB limit largeOutput := strings.Repeat("a", 1048577) // 1MB + 1 byte @@ -956,7 +979,7 @@ func TestUpdateJob(t *testing.T) { t.Run("IncrementalLogSizeOverflow", func(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) // Send logs that together exceed the limit mediumOutput := strings.Repeat("b", 524289) // Half a MB + 1 byte @@ -997,7 +1020,7 @@ func TestUpdateJob(t *testing.T) { t.Run("LogSizeTracking", func(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) logOutput := "test log message" expectedSize := int32(len(logOutput)) // #nosec G115 - Log length is 16. @@ -1022,7 +1045,7 @@ func TestUpdateJob(t *testing.T) { t.Run("LogOverflowStopsProcessing", func(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) - job := setupJob(t, db, pd.ID, pd.Tags) + job := setupJob(t, db, pd.ID, pd.OrganizationID, pd.Tags) // First: trigger overflow largeOutput := strings.Repeat("a", 1048577) // 1MB + 1 byte @@ -1086,12 +1109,13 @@ func TestFailJob(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, nil) job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - StorageMethod: database.ProvisionerStorageMethodFile, - Type: database.ProvisionerJobTypeTemplateVersionImport, - Input: json.RawMessage("{}"), - Tags: pd.Tags, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + Type: database.ProvisionerJobTypeTemplateVersionImport, + Input: json.RawMessage("{}"), + OrganizationID: pd.OrganizationID, + Tags: pd.Tags, }) require.NoError(t, err) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -1104,6 +1128,7 @@ func TestFailJob(t *testing.T) { Time: dbtime.Now(), Valid: true, }, + OrganizationID: pd.OrganizationID, ProvisionerTags: must(json.Marshal(job.Tags)), }) require.NoError(t, err) @@ -1116,12 +1141,13 @@ func TestFailJob(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - Type: database.ProvisionerJobTypeTemplateVersionImport, - StorageMethod: database.ProvisionerStorageMethodFile, - Input: json.RawMessage("{}"), - Tags: pd.Tags, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeTemplateVersionImport, + StorageMethod: database.ProvisionerStorageMethodFile, + Input: json.RawMessage("{}"), + OrganizationID: pd.OrganizationID, + Tags: pd.Tags, }) require.NoError(t, err) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -1134,6 +1160,7 @@ func TestFailJob(t *testing.T) { Time: dbtime.Now(), Valid: true, }, + OrganizationID: pd.OrganizationID, ProvisionerTags: must(json.Marshal(job.Tags)), }) require.NoError(t, err) @@ -1152,19 +1179,20 @@ func TestFailJob(t *testing.T) { }) t.Run("WorkspaceBuild", func(t *testing.T) { t.Parallel() - // Ignore log errors because we get: - // - // (*Server).FailJob audit log - get build {"error": "sql: no rows in result set"} - ignoreLogErrors := true auditor := audit.NewMock() - srv, db, ps, pd := setup(t, ignoreLogErrors, &overrides{ + srv, db, ps, pd := setup(t, false, &overrides{ auditor: auditor, }) org := dbgen.Organization(t, db, database.Organization{}) u := dbgen.User(t, db, database.User{}) - tpl := dbgen.Template(t, db, database.Template{ - OrganizationID: org.ID, + tv := dbgen.TemplateVersion(t, db, database.TemplateVersion{ CreatedBy: u.ID, + OrganizationID: org.ID, + }) + tpl := dbgen.Template(t, db, database.Template{ + OrganizationID: org.ID, + CreatedBy: u.ID, + ActiveVersionID: tv.ID, }) workspace, err := db.InsertWorkspace(ctx, database.InsertWorkspaceParams{ ID: uuid.New(), @@ -1181,22 +1209,24 @@ func TestFailJob(t *testing.T) { require.NoError(t, err) job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Input: input, - InitiatorID: workspace.OwnerID, - Provisioner: database.ProvisionerTypeEcho, - Type: database.ProvisionerJobTypeWorkspaceBuild, - StorageMethod: database.ProvisionerStorageMethodFile, - Tags: pd.Tags, + ID: uuid.New(), + Input: input, + InitiatorID: workspace.OwnerID, + OrganizationID: pd.OrganizationID, + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeWorkspaceBuild, + StorageMethod: database.ProvisionerStorageMethodFile, + Tags: pd.Tags, }) require.NoError(t, err) err = db.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{ - ID: buildID, - WorkspaceID: workspace.ID, - InitiatorID: workspace.OwnerID, - Transition: database.WorkspaceTransitionStart, - Reason: database.BuildReasonInitiator, - JobID: job.ID, + ID: buildID, + WorkspaceID: workspace.ID, + InitiatorID: workspace.OwnerID, + TemplateVersionID: tpl.ActiveVersionID, + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, + JobID: job.ID, }) require.NoError(t, err) @@ -1210,6 +1240,7 @@ func TestFailJob(t *testing.T) { Time: dbtime.Now(), Valid: true, }, + OrganizationID: pd.OrganizationID, ProvisionerTags: must(json.Marshal(job.Tags)), }) require.NoError(t, err) @@ -1318,7 +1349,9 @@ func TestCompleteJob(t *testing.T) { srv, db, _, pd := setup(t, false, &overrides{}) jobID := uuid.New() versionID := uuid.New() + user := dbgen.User(t, db, database.User{}) err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ + CreatedBy: user.ID, ID: versionID, JobID: jobID, OrganizationID: pd.OrganizationID, @@ -1376,13 +1409,15 @@ func TestCompleteJob(t *testing.T) { t.Run("TemplateDryRunTransaction", func(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) + org := dbgen.Organization(t, db, database.Organization{}) job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - Type: database.ProvisionerJobTypeTemplateVersionDryRun, - StorageMethod: database.ProvisionerStorageMethodFile, - Input: json.RawMessage("{}"), - Tags: pd.Tags, + ID: uuid.New(), + OrganizationID: org.ID, + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, + StorageMethod: database.ProvisionerStorageMethodFile, + Input: json.RawMessage("{}"), + Tags: pd.Tags, }) require.NoError(t, err) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -1390,6 +1425,7 @@ func TestCompleteJob(t *testing.T) { UUID: pd.ID, Valid: true, }, + OrganizationID: org.ID, Types: []database.ProvisionerType{database.ProvisionerTypeEcho}, ProvisionerTags: must(json.Marshal(job.Tags)), StartedAt: sql.NullTime{Time: job.CreatedAt, Valid: true}, @@ -1430,6 +1466,7 @@ func TestCompleteJob(t *testing.T) { user := dbgen.User(t, db, database.User{}) template := dbgen.Template(t, db, database.Template{ Name: "template", + CreatedBy: user.ID, Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, }) @@ -1441,27 +1478,32 @@ func TestCompleteJob(t *testing.T) { }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ OrganizationID: pd.OrganizationID, + CreatedBy: user.ID, TemplateID: uuid.NullUUID{ UUID: template.ID, Valid: true, }, JobID: uuid.New(), }) - build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: workspaceTable.ID, - TemplateVersionID: version.ID, - Transition: database.WorkspaceTransitionStart, - Reason: database.BuildReasonInitiator, - }) + wsBuildID := uuid.New() job := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ + ID: uuid.New(), FileID: file.ID, InitiatorID: user.ID, Type: database.ProvisionerJobTypeWorkspaceBuild, Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{ - WorkspaceBuildID: build.ID, + WorkspaceBuildID: wsBuildID, })), OrganizationID: pd.OrganizationID, }) + _ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + ID: wsBuildID, + JobID: job.ID, + WorkspaceID: workspaceTable.ID, + TemplateVersionID: version.ID, + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, + }) _, err := db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ OrganizationID: pd.OrganizationID, WorkerID: uuid.NullUUID{ @@ -1587,7 +1629,9 @@ func TestCompleteJob(t *testing.T) { srv, db, _, pd := setup(t, false, &overrides{}) jobID := uuid.New() versionID := uuid.New() + user := dbgen.User(t, db, database.User{}) err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ + CreatedBy: user.ID, ID: versionID, JobID: jobID, OrganizationID: pd.OrganizationID, @@ -1644,7 +1688,9 @@ func TestCompleteJob(t *testing.T) { srv, db, _, pd := setup(t, false, &overrides{}) jobID := uuid.New() versionID := uuid.New() + user := dbgen.User(t, db, database.User{}) err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ + CreatedBy: user.ID, ID: versionID, JobID: jobID, OrganizationID: pd.OrganizationID, @@ -1708,8 +1754,10 @@ func TestCompleteJob(t *testing.T) { }) jobID := uuid.New() versionID := uuid.New() + user := dbgen.User(t, db, database.User{}) err := db.InsertTemplateVersion(ctx, database.InsertTemplateVersionParams{ ID: versionID, + CreatedBy: user.ID, JobID: jobID, OrganizationID: pd.OrganizationID, }) @@ -1896,6 +1944,7 @@ func TestCompleteJob(t *testing.T) { QuietHoursSchedule: c.userQuietHoursSchedule, }) template := dbgen.Template(t, db, database.Template{ + CreatedBy: user.ID, Name: "template", Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, @@ -1927,6 +1976,7 @@ func TestCompleteJob(t *testing.T) { OrganizationID: pd.OrganizationID, }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + CreatedBy: user.ID, OrganizationID: pd.OrganizationID, TemplateID: uuid.NullUUID{ UUID: template.ID, @@ -1934,22 +1984,25 @@ func TestCompleteJob(t *testing.T) { }, JobID: uuid.New(), }) - build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: workspaceTable.ID, - InitiatorID: user.ID, - TemplateVersionID: version.ID, - Transition: c.transition, - Reason: database.BuildReasonInitiator, - }) + buildID := uuid.New() job := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ FileID: file.ID, InitiatorID: user.ID, Type: database.ProvisionerJobTypeWorkspaceBuild, Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{ - WorkspaceBuildID: build.ID, + WorkspaceBuildID: buildID, })), OrganizationID: pd.OrganizationID, }) + build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + ID: buildID, + JobID: job.ID, + WorkspaceID: workspaceTable.ID, + InitiatorID: user.ID, + TemplateVersionID: version.ID, + Transition: c.transition, + Reason: database.BuildReasonInitiator, + }) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ OrganizationID: pd.OrganizationID, WorkerID: uuid.NullUUID{ @@ -2039,12 +2092,13 @@ func TestCompleteJob(t *testing.T) { t.Parallel() srv, db, _, pd := setup(t, false, &overrides{}) job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: uuid.New(), - Provisioner: database.ProvisionerTypeEcho, - Type: database.ProvisionerJobTypeTemplateVersionDryRun, - StorageMethod: database.ProvisionerStorageMethodFile, - Input: json.RawMessage("{}"), - Tags: pd.Tags, + ID: uuid.New(), + Provisioner: database.ProvisionerTypeEcho, + Type: database.ProvisionerJobTypeTemplateVersionDryRun, + StorageMethod: database.ProvisionerStorageMethodFile, + Input: json.RawMessage("{}"), + OrganizationID: pd.OrganizationID, + Tags: pd.Tags, }) require.NoError(t, err) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ @@ -2057,6 +2111,7 @@ func TestCompleteJob(t *testing.T) { Time: dbtime.Now(), Valid: true, }, + OrganizationID: pd.OrganizationID, ProvisionerTags: must(json.Marshal(job.Tags)), }) require.NoError(t, err) @@ -2282,15 +2337,22 @@ func TestCompleteJob(t *testing.T) { if jobParams.Tags == nil { jobParams.Tags = pd.Tags } + if jobParams.OrganizationID == uuid.Nil { + jobParams.OrganizationID = pd.OrganizationID + } user := dbgen.User(t, db, database.User{}) job, err := db.InsertProvisionerJob(ctx, jobParams) + require.NoError(t, err) tpl := dbgen.Template(t, db, database.Template{ + CreatedBy: user.ID, OrganizationID: pd.OrganizationID, }) tv := dbgen.TemplateVersion(t, db, database.TemplateVersion{ - TemplateID: uuid.NullUUID{UUID: tpl.ID, Valid: true}, - JobID: job.ID, + CreatedBy: user.ID, + OrganizationID: pd.OrganizationID, + TemplateID: uuid.NullUUID{UUID: tpl.ID, Valid: true}, + JobID: job.ID, }) workspace := dbgen.Workspace(t, db, database.WorkspaceTable{ TemplateID: tpl.ID, @@ -2310,6 +2372,7 @@ func TestCompleteJob(t *testing.T) { UUID: pd.ID, Valid: true, }, + OrganizationID: pd.OrganizationID, Types: []database.ProvisionerType{jobParams.Provisioner}, ProvisionerTags: must(json.Marshal(job.Tags)), StartedAt: sql.NullTime{Time: job.CreatedAt, Valid: true}, @@ -2499,6 +2562,7 @@ func TestCompleteJob(t *testing.T) { // Given: a workspace build which simulates claiming a prebuild. user := dbgen.User(t, db, database.User{}) template := dbgen.Template(t, db, database.Template{ + CreatedBy: user.ID, Name: "template", Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, @@ -2510,6 +2574,7 @@ func TestCompleteJob(t *testing.T) { OrganizationID: pd.OrganizationID, }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + CreatedBy: user.ID, OrganizationID: pd.OrganizationID, TemplateID: uuid.NullUUID{ UUID: template.ID, @@ -2517,23 +2582,26 @@ func TestCompleteJob(t *testing.T) { }, JobID: uuid.New(), }) - build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: workspaceTable.ID, - InitiatorID: user.ID, - TemplateVersionID: version.ID, - Transition: database.WorkspaceTransitionStart, - Reason: database.BuildReasonInitiator, - }) + buildID := uuid.New() job := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ FileID: file.ID, InitiatorID: user.ID, Type: database.ProvisionerJobTypeWorkspaceBuild, Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{ - WorkspaceBuildID: build.ID, + WorkspaceBuildID: buildID, PrebuiltWorkspaceBuildStage: sdkproto.PrebuiltWorkspaceBuildStage_CLAIM, })), OrganizationID: pd.OrganizationID, }) + _ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + ID: buildID, + JobID: job.ID, + WorkspaceID: workspaceTable.ID, + InitiatorID: user.ID, + TemplateVersionID: version.ID, + Transition: database.WorkspaceTransitionStart, + Reason: database.BuildReasonInitiator, + }) _, err := db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ OrganizationID: pd.OrganizationID, WorkerID: uuid.NullUUID{ @@ -2608,13 +2676,16 @@ func TestCompleteJob(t *testing.T) { importJobID := uuid.New() tvID := uuid.New() + templateAdminUser := dbgen.User(t, db, database.User{RBACRoles: []string{codersdk.RoleTemplateAdmin}}) template := dbgen.Template(t, db, database.Template{ Name: "template", + CreatedBy: templateAdminUser.ID, Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ ID: tvID, + CreatedBy: templateAdminUser.ID, OrganizationID: pd.OrganizationID, TemplateID: uuid.NullUUID{ UUID: template.ID, @@ -2704,6 +2775,22 @@ func TestCompleteJob(t *testing.T) { }, }, }, + Resources: []*sdkproto.Resource{ + { + Agents: []*sdkproto.Agent{ + { + Id: uuid.NewString(), + Name: "a", + Apps: []*sdkproto.App{ + { + Id: sidebarAppID, + Slug: "test-app", + }, + }, + }, + }, + }, + }, }, expected: true, }, @@ -2715,13 +2802,16 @@ func TestCompleteJob(t *testing.T) { importJobID := uuid.New() tvID := uuid.New() + templateUser := dbgen.User(t, db, database.User{RBACRoles: []string{codersdk.RoleTemplateAdmin}}) template := dbgen.Template(t, db, database.Template{ Name: "template", + CreatedBy: templateUser.ID, Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ ID: tvID, + CreatedBy: templateUser.ID, OrganizationID: pd.OrganizationID, TemplateID: uuid.NullUUID{ UUID: template.ID, @@ -2735,22 +2825,19 @@ func TestCompleteJob(t *testing.T) { OwnerID: user.ID, OrganizationID: pd.OrganizationID, }) - build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: workspaceTable.ID, - TemplateVersionID: version.ID, - InitiatorID: user.ID, - Transition: database.WorkspaceTransitionStart, - }) ctx := testutil.Context(t, testutil.WaitShort) + + buildJobID := uuid.New() + wsBuildID := uuid.New() job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ - ID: importJobID, + ID: buildJobID, CreatedAt: dbtime.Now(), UpdatedAt: dbtime.Now(), OrganizationID: pd.OrganizationID, - InitiatorID: uuid.New(), + InitiatorID: user.ID, Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{ - WorkspaceBuildID: build.ID, + WorkspaceBuildID: wsBuildID, LogLevel: "DEBUG", })), Provisioner: database.ProvisionerTypeEcho, @@ -2759,6 +2846,14 @@ func TestCompleteJob(t *testing.T) { Tags: pd.Tags, }) require.NoError(t, err) + build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + ID: wsBuildID, + JobID: buildJobID, + WorkspaceID: workspaceTable.ID, + TemplateVersionID: version.ID, + InitiatorID: user.ID, + Transition: database.WorkspaceTransitionStart, + }) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ OrganizationID: pd.OrganizationID, @@ -3016,22 +3111,21 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("NoAgents", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", }) require.NoError(t, err) - resources, err := db.GetWorkspaceResourcesByJobID(ctx, job) + resources, err := db.GetWorkspaceResourcesByJobID(ctx, job.ID) require.NoError(t, err) require.Len(t, resources, 1) }) t.Run("InvalidAgentToken", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - err := insert(db, uuid.New(), &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3046,8 +3140,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("DuplicateApps", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - err := insert(db, uuid.New(), &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3062,8 +3156,8 @@ func TestInsertWorkspaceResource(t *testing.T) { require.ErrorContains(t, err, `duplicate app slug, must be unique per template: "a"`) db, _ = dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - err = insert(db, uuid.New(), &sdkproto.Resource{ + job = dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err = insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3083,9 +3177,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("AppSlugInvalid", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3096,7 +3189,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.ErrorContains(t, err, `app slug "dev_1" does not match regex`) - err = insert(db, job, &sdkproto.Resource{ + err = insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3107,7 +3200,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.ErrorContains(t, err, `app slug "dev--1" does not match regex`) - err = insert(db, job, &sdkproto.Resource{ + err = insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3122,10 +3215,9 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("DuplicateAgentNames", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) // case-insensitive-unique - err := insert(db, job, &sdkproto.Resource{ + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3135,7 +3227,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.ErrorContains(t, err, "duplicate agent name") - err = insert(db, job, &sdkproto.Resource{ + err = insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3149,9 +3241,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("AgentNameInvalid", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3159,7 +3250,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.NoError(t, err) // uppercase is still allowed - err = insert(db, job, &sdkproto.Resource{ + err = insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3167,7 +3258,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.ErrorContains(t, err, `agent name "dev_1" contains underscores`) // custom error for underscores - err = insert(db, job, &sdkproto.Resource{ + err = insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3179,9 +3270,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("Success", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", DailyCost: 10, @@ -3220,7 +3310,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.NoError(t, err) - resources, err := db.GetWorkspaceResourcesByJobID(ctx, job) + resources, err := db.GetWorkspaceResourcesByJobID(ctx, job.ID) require.NoError(t, err) require.Len(t, resources, 1) require.EqualValues(t, 10, resources[0].DailyCost) @@ -3249,9 +3339,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("AllDisplayApps", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3266,7 +3355,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.NoError(t, err) - resources, err := db.GetWorkspaceResourcesByJobID(ctx, job) + resources, err := db.GetWorkspaceResourcesByJobID(ctx, job.ID) require.NoError(t, err) require.Len(t, resources, 1) agents, err := db.GetWorkspaceAgentsByResourceIDs(ctx, []uuid.UUID{resources[0].ID}) @@ -3279,9 +3368,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("DisableDefaultApps", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3290,7 +3378,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.NoError(t, err) - resources, err := db.GetWorkspaceResourcesByJobID(ctx, job) + resources, err := db.GetWorkspaceResourcesByJobID(ctx, job.ID) require.NoError(t, err) require.Len(t, resources, 1) agents, err := db.GetWorkspaceAgentsByResourceIDs(ctx, []uuid.UUID{resources[0].ID}) @@ -3305,9 +3393,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("ResourcesMonitoring", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3334,7 +3421,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.NoError(t, err) - resources, err := db.GetWorkspaceResourcesByJobID(ctx, job) + resources, err := db.GetWorkspaceResourcesByJobID(ctx, job.ID) require.NoError(t, err) require.Len(t, resources, 1) agents, err := db.GetWorkspaceAgentsByResourceIDs(ctx, []uuid.UUID{resources[0].ID}) @@ -3358,9 +3445,8 @@ func TestInsertWorkspaceResource(t *testing.T) { t.Run("Devcontainers", func(t *testing.T) { t.Parallel() db, _ := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) - job := uuid.New() - err := insert(db, job, &sdkproto.Resource{ + job := dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{}) + err := insert(db, job.ID, &sdkproto.Resource{ Name: "something", Type: "aws_instance", Agents: []*sdkproto.Agent{{ @@ -3372,7 +3458,7 @@ func TestInsertWorkspaceResource(t *testing.T) { }}, }) require.NoError(t, err) - resources, err := db.GetWorkspaceResourcesByJobID(ctx, job) + resources, err := db.GetWorkspaceResourcesByJobID(ctx, job.ID) require.NoError(t, err) require.Len(t, resources, 1) agents, err := db.GetWorkspaceAgentsByResourceIDs(ctx, []uuid.UUID{resources[0].ID}) @@ -3443,6 +3529,7 @@ func TestNotifications(t *testing.T) { } template := dbgen.Template(t, db, database.Template{ + CreatedBy: user.ID, Name: "template", Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, @@ -3456,6 +3543,7 @@ func TestNotifications(t *testing.T) { OrganizationID: pd.OrganizationID, }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + CreatedBy: user.ID, OrganizationID: pd.OrganizationID, TemplateID: uuid.NullUUID{ UUID: template.ID, @@ -3463,24 +3551,27 @@ func TestNotifications(t *testing.T) { }, JobID: uuid.New(), }) - build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: workspaceTable.ID, - TemplateVersionID: version.ID, - InitiatorID: initiator.ID, - Transition: database.WorkspaceTransitionDelete, - Reason: tc.deletionReason, - }) + wsBuildID := uuid.New() job := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ FileID: file.ID, InitiatorID: initiator.ID, Type: database.ProvisionerJobTypeWorkspaceBuild, Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{ - WorkspaceBuildID: build.ID, + WorkspaceBuildID: wsBuildID, })), OrganizationID: pd.OrganizationID, CreatedAt: time.Now(), UpdatedAt: time.Now(), }) + _ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + ID: wsBuildID, + JobID: job.ID, + WorkspaceID: workspaceTable.ID, + TemplateVersionID: version.ID, + InitiatorID: initiator.ID, + Transition: database.WorkspaceTransitionDelete, + Reason: tc.deletionReason, + }) _, err = db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ OrganizationID: pd.OrganizationID, WorkerID: uuid.NullUUID{ @@ -3569,6 +3660,7 @@ func TestNotifications(t *testing.T) { initiator := user template := dbgen.Template(t, db, database.Template{ + CreatedBy: user.ID, Name: "template", Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, @@ -3580,6 +3672,7 @@ func TestNotifications(t *testing.T) { OrganizationID: pd.OrganizationID, }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + CreatedBy: user.ID, OrganizationID: pd.OrganizationID, TemplateID: uuid.NullUUID{ UUID: template.ID, @@ -3587,24 +3680,28 @@ func TestNotifications(t *testing.T) { }, JobID: uuid.New(), }) - build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: workspace.ID, - TemplateVersionID: version.ID, - InitiatorID: initiator.ID, - Transition: database.WorkspaceTransitionDelete, - Reason: tc.buildReason, - }) + wsBuildID := uuid.New() job := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ + ID: uuid.New(), FileID: file.ID, InitiatorID: initiator.ID, Type: database.ProvisionerJobTypeWorkspaceBuild, Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{ - WorkspaceBuildID: build.ID, + WorkspaceBuildID: wsBuildID, })), OrganizationID: pd.OrganizationID, CreatedAt: time.Now(), UpdatedAt: time.Now(), }) + _ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + ID: wsBuildID, + JobID: job.ID, + WorkspaceID: workspace.ID, + TemplateVersionID: version.ID, + InitiatorID: initiator.ID, + Transition: database.WorkspaceTransitionDelete, + Reason: tc.buildReason, + }) _, err := db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ OrganizationID: pd.OrganizationID, WorkerID: uuid.NullUUID{ @@ -3660,24 +3757,29 @@ func TestNotifications(t *testing.T) { _ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: user.ID, OrganizationID: pd.OrganizationID}) template := dbgen.Template(t, db, database.Template{ - Name: "template", DisplayName: "William's Template", Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, + CreatedBy: user.ID, + Name: "template", DisplayName: "William's Template", Provisioner: database.ProvisionerTypeEcho, OrganizationID: pd.OrganizationID, }) workspace := dbgen.Workspace(t, db, database.WorkspaceTable{ TemplateID: template.ID, OwnerID: user.ID, OrganizationID: pd.OrganizationID, }) version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + CreatedBy: user.ID, OrganizationID: pd.OrganizationID, TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true}, JobID: uuid.New(), }) - build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ - WorkspaceID: workspace.ID, TemplateVersionID: version.ID, InitiatorID: user.ID, Transition: database.WorkspaceTransitionDelete, Reason: database.BuildReasonInitiator, - }) + wsBuildID := uuid.New() job := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{ FileID: dbgen.File(t, db, database.File{CreatedBy: user.ID}).ID, InitiatorID: user.ID, Type: database.ProvisionerJobTypeWorkspaceBuild, - Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{WorkspaceBuildID: build.ID})), + Input: must(json.Marshal(provisionerdserver.WorkspaceProvisionJob{WorkspaceBuildID: wsBuildID})), OrganizationID: pd.OrganizationID, }) + build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ + ID: wsBuildID, + JobID: job.ID, + WorkspaceID: workspace.ID, TemplateVersionID: version.ID, InitiatorID: user.ID, Transition: database.WorkspaceTransitionDelete, Reason: database.BuildReasonInitiator, + }) _, err := db.AcquireProvisionerJob(ctx, database.AcquireProvisionerJobParams{ OrganizationID: pd.OrganizationID, WorkerID: uuid.NullUUID{UUID: pd.ID, Valid: true}, @@ -3730,7 +3832,6 @@ func setup(t *testing.T, ignoreLogErrors bool, ov *overrides) (proto.DRPCProvisi t.Helper() logger := testutil.Logger(t) db, ps := dbtestutil.NewDB(t) - dbtestutil.DisableForeignKeysAndTriggers(t, db) defOrg, err := db.GetDefaultOrganization(context.Background()) require.NoError(t, err, "default org not found") From 7eb41193f851cab621e685df0dc9a1564e306eb0 Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Tue, 5 Aug 2025 11:36:21 +0400 Subject: [PATCH 076/260] test: fix TestSSHServer_ClosesStdin to handle non-atomic write (#19174) fixes https://github.com/coder/internal/issues/863 We read an output file in a loop, but this could lead to races where the other process has created the file but not written, or a partial write in progress. Fix is to retry if the content is shorter than we expect. --- agent/agentssh/agentssh_test.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/agent/agentssh/agentssh_test.go b/agent/agentssh/agentssh_test.go index 159fe345483d2..7bf91123d5852 100644 --- a/agent/agentssh/agentssh_test.go +++ b/agent/agentssh/agentssh_test.go @@ -413,8 +413,9 @@ func TestSSHServer_ClosesStdin(t *testing.T) { ctx := testutil.Context(t, testutil.WaitMedium) logger := testutil.Logger(t) - s, err := agentssh.NewServer(ctx, logger, prometheus.NewRegistry(), afero.NewMemMapFs(), agentexec.DefaultExecer, nil) + s, err := agentssh.NewServer(ctx, logger.Named("ssh-server"), prometheus.NewRegistry(), afero.NewMemMapFs(), agentexec.DefaultExecer, nil) require.NoError(t, err) + logger = logger.Named("test") defer s.Close() err = s.UpdateHostSigner(42) assert.NoError(t, err) @@ -469,15 +470,25 @@ func TestSSHServer_ClosesStdin(t *testing.T) { err = testutil.RequireReceive(ctx, t, readCh) require.NoError(t, err) - sess.Close() + err = sess.Close() + require.NoError(t, err) var content []byte + expected := []byte("read exit code: 1\n") testutil.Eventually(ctx, t, func(_ context.Context) bool { content, err = os.ReadFile(filePath) - return err == nil + if err != nil { + logger.Debug(ctx, "failed to read file; will retry", slog.Error(err)) + return false + } + if len(content) != len(expected) { + logger.Debug(ctx, "file is partially written", slog.F("content", content)) + return false + } + return true }, testutil.IntervalFast) require.NoError(t, err) - require.Equal(t, "read exit code: 1\n", string(content)) + require.Equal(t, string(expected), string(content)) } func sshClient(t *testing.T, addr string) *ssh.Client { From 8b66a5ad5908ca9ecafee1d4ae530514f82b8a56 Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:52:22 +1000 Subject: [PATCH 077/260] chore(codersdk/workspacesdk): make dialer fail fast for authnz errors (#19173) Closes #18599. The linked issue was created due to me assuming the dialer didn't fail fast at all. In reality, it does fail fast, but only for a select few status codes. Auth[n|z] errors aren't any of those status codes, despite being 'permanent' in the same way a `400` is. This PR makes 401* and 403 'permanent' errors, meaning the dialer will give up immediately after receiving them from coderd. *One reason to receive a 401 is when the supplied resume_token is invalid. These are not permanent errors, and when we encounter those the dialer will retain the existing behaviour of unsetting the resume token and retrying. --- codersdk/workspacesdk/dialer.go | 38 ++++++++++++++++++++------ codersdk/workspacesdk/dialer_test.go | 40 ++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 8 deletions(-) diff --git a/codersdk/workspacesdk/dialer.go b/codersdk/workspacesdk/dialer.go index 71cac0c5f04b1..39d02931e6ae1 100644 --- a/codersdk/workspacesdk/dialer.go +++ b/codersdk/workspacesdk/dialer.go @@ -24,6 +24,10 @@ var permanentErrorStatuses = []int{ http.StatusBadRequest, // returned if API mismatch http.StatusNotFound, // returned if user doesn't have permission or agent doesn't exist http.StatusInternalServerError, // returned if database is not reachable, + http.StatusForbidden, // returned if user is not authorized + // StatusUnauthorized is only a permanent error if the error is not due to + // an invalid resume token. See `checkResumeTokenFailure`. + http.StatusUnauthorized, } type WebsocketDialer struct { @@ -39,6 +43,24 @@ type WebsocketDialer struct { isFirst bool } +// checkResumeTokenFailure checks if the parsed error indicates a resume token failure +// and updates the resumeTokenFailed flag accordingly. Returns true if a resume token +// failure was detected. +func (w *WebsocketDialer) checkResumeTokenFailure(ctx context.Context, sdkErr *codersdk.Error) bool { + if sdkErr == nil { + return false + } + + for _, v := range sdkErr.Validations { + if v.Field == "resume_token" { + w.logger.Warn(ctx, "failed to dial tailnet v2+ API: server replied invalid resume token; unsetting for next connection attempt") + w.resumeTokenFailed = true + return true + } + } + return false +} + type WebsocketDialerOption func(*WebsocketDialer) func WithWorkspaceUpdates(req *proto.WorkspaceUpdatesRequest) WebsocketDialerOption { @@ -82,9 +104,14 @@ func (w *WebsocketDialer) Dial(ctx context.Context, r tailnet.ResumeTokenControl if w.isFirst { if res != nil && slices.Contains(permanentErrorStatuses, res.StatusCode) { err = codersdk.ReadBodyAsError(res) - // A bit more human-readable help in the case the API version was rejected var sdkErr *codersdk.Error if xerrors.As(err, &sdkErr) { + // Check for resume token failure first + if w.checkResumeTokenFailure(ctx, sdkErr) { + return tailnet.ControlProtocolClients{}, err + } + + // A bit more human-readable help in the case the API version was rejected if sdkErr.Message == AgentAPIMismatchMessage && sdkErr.StatusCode() == http.StatusBadRequest { sdkErr.Helper = fmt.Sprintf( @@ -107,13 +134,8 @@ func (w *WebsocketDialer) Dial(ctx context.Context, r tailnet.ResumeTokenControl bodyErr := codersdk.ReadBodyAsError(res) var sdkErr *codersdk.Error if xerrors.As(bodyErr, &sdkErr) { - for _, v := range sdkErr.Validations { - if v.Field == "resume_token" { - // Unset the resume token for the next attempt - w.logger.Warn(ctx, "failed to dial tailnet v2+ API: server replied invalid resume token; unsetting for next connection attempt") - w.resumeTokenFailed = true - return tailnet.ControlProtocolClients{}, err - } + if w.checkResumeTokenFailure(ctx, sdkErr) { + return tailnet.ControlProtocolClients{}, err } } if !errors.Is(err, context.Canceled) { diff --git a/codersdk/workspacesdk/dialer_test.go b/codersdk/workspacesdk/dialer_test.go index dbe351e4e492c..227299d43afda 100644 --- a/codersdk/workspacesdk/dialer_test.go +++ b/codersdk/workspacesdk/dialer_test.go @@ -270,6 +270,46 @@ func TestWebsocketDialer_ResumeTokenFailure(t *testing.T) { require.Error(t, err) } +func TestWebsocketDialer_UnauthenticatedFailFast(t *testing.T) { + t.Parallel() + ctx := testutil.Context(t, testutil.WaitShort) + logger := slogtest.Make(t, &slogtest.Options{ + IgnoreErrors: true, + }).Leveled(slog.LevelDebug) + + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + httpapi.Write(ctx, w, http.StatusUnauthorized, codersdk.Response{}) + })) + defer svr.Close() + svrURL, err := url.Parse(svr.URL) + require.NoError(t, err) + + uut := workspacesdk.NewWebsocketDialer(logger, svrURL, &websocket.DialOptions{}) + + _, err = uut.Dial(ctx, nil) + require.Error(t, err) +} + +func TestWebsocketDialer_UnauthorizedFailFast(t *testing.T) { + t.Parallel() + ctx := testutil.Context(t, testutil.WaitShort) + logger := slogtest.Make(t, &slogtest.Options{ + IgnoreErrors: true, + }).Leveled(slog.LevelDebug) + + svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + httpapi.Write(ctx, w, http.StatusUnauthorized, codersdk.Response{}) + })) + defer svr.Close() + svrURL, err := url.Parse(svr.URL) + require.NoError(t, err) + + uut := workspacesdk.NewWebsocketDialer(logger, svrURL, &websocket.DialOptions{}) + + _, err = uut.Dial(ctx, nil) + require.Error(t, err) +} + func TestWebsocketDialer_UplevelVersion(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitShort) From 760dc8b467c4d7facf051aa8072394967e50be48 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Tue, 5 Aug 2025 13:58:55 +0100 Subject: [PATCH 078/260] fix(agent/agentcontainers): fix `TestDevcontainerDiscovery/AutoStart` flake (#19179) Fixes https://github.com/coder/internal/issues/864 --- agent/agentcontainers/api_test.go | 254 +++++++++++++----------------- 1 file changed, 107 insertions(+), 147 deletions(-) diff --git a/agent/agentcontainers/api_test.go b/agent/agentcontainers/api_test.go index a9ce12b892602..b956e17d5efaa 100644 --- a/agent/agentcontainers/api_test.go +++ b/agent/agentcontainers/api_test.go @@ -71,6 +71,7 @@ func (f *fakeContainerCLI) ExecAs(ctx context.Context, name, user string, args . // fakeDevcontainerCLI implements the agentcontainers.DevcontainerCLI // interface for testing. type fakeDevcontainerCLI struct { + up func(workspaceFolder, configPath string) (string, error) upID string upErr error upErrC chan func() error // If set, send to return err, close to return upErr. @@ -79,9 +80,14 @@ type fakeDevcontainerCLI struct { readConfig agentcontainers.DevcontainerConfig readConfigErr error readConfigErrC chan func(envs []string) error + + configMap map[string]agentcontainers.DevcontainerConfig // By config path } -func (f *fakeDevcontainerCLI) Up(ctx context.Context, _, _ string, _ ...agentcontainers.DevcontainerCLIUpOptions) (string, error) { +func (f *fakeDevcontainerCLI) Up(ctx context.Context, workspaceFolder, configPath string, _ ...agentcontainers.DevcontainerCLIUpOptions) (string, error) { + if f.up != nil { + return f.up(workspaceFolder, configPath) + } if f.upErrC != nil { select { case <-ctx.Done(): @@ -109,7 +115,12 @@ func (f *fakeDevcontainerCLI) Exec(ctx context.Context, _, _ string, cmd string, return f.execErr } -func (f *fakeDevcontainerCLI) ReadConfig(ctx context.Context, _, _ string, envs []string, _ ...agentcontainers.DevcontainerCLIReadConfigOptions) (agentcontainers.DevcontainerConfig, error) { +func (f *fakeDevcontainerCLI) ReadConfig(ctx context.Context, _, configPath string, envs []string, _ ...agentcontainers.DevcontainerCLIReadConfigOptions) (agentcontainers.DevcontainerConfig, error) { + if f.configMap != nil { + if v, found := f.configMap[configPath]; found { + return v, f.readConfigErr + } + } if f.readConfigErrC != nil { select { case <-ctx.Done(): @@ -3576,193 +3587,112 @@ func TestDevcontainerDiscovery(t *testing.T) { name string agentDir string fs map[string]string + configMap map[string]agentcontainers.DevcontainerConfig expectDevcontainerCount int - setupMocks func(mDCCLI *acmock.MockDevcontainerCLI) + expectUpCalledCount int }{ { name: "SingleEnabled", agentDir: "/home/coder", expectDevcontainerCount: 1, + expectUpCalledCount: 1, fs: map[string]string{ "/home/coder/.git/HEAD": "", "/home/coder/.devcontainer/devcontainer.json": "", }, - setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { - gomock.InOrder( - // Given: This dev container has auto start enabled. - mDCCLI.EXPECT().ReadConfig(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - []string{}, - ).Return(agentcontainers.DevcontainerConfig{ - Configuration: agentcontainers.DevcontainerConfiguration{ - Customizations: agentcontainers.DevcontainerCustomizations{ - Coder: agentcontainers.CoderCustomization{ - AutoStart: true, - }, + configMap: map[string]agentcontainers.DevcontainerConfig{ + "/home/coder/.devcontainer/devcontainer.json": { + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, }, }, - }, nil), - - // Then: We expect it to be started. - mDCCLI.EXPECT().Up(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - gomock.Any(), - ).Return("", nil), - ) + }, + }, }, }, { name: "SingleDisabled", agentDir: "/home/coder", expectDevcontainerCount: 1, + expectUpCalledCount: 0, fs: map[string]string{ "/home/coder/.git/HEAD": "", "/home/coder/.devcontainer/devcontainer.json": "", }, - setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { - gomock.InOrder( - // Given: This dev container has auto start disabled. - mDCCLI.EXPECT().ReadConfig(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - []string{}, - ).Return(agentcontainers.DevcontainerConfig{ - Configuration: agentcontainers.DevcontainerConfiguration{ - Customizations: agentcontainers.DevcontainerCustomizations{ - Coder: agentcontainers.CoderCustomization{ - AutoStart: false, - }, + configMap: map[string]agentcontainers.DevcontainerConfig{ + "/home/coder/.devcontainer/devcontainer.json": { + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: false, }, }, - }, nil), - - // Then: We expect it to _not_ be started. - mDCCLI.EXPECT().Up(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - gomock.Any(), - ).Return("", nil).Times(0), - ) + }, + }, }, }, { name: "OneEnabledOneDisabled", agentDir: "/home/coder", expectDevcontainerCount: 2, + expectUpCalledCount: 1, fs: map[string]string{ "/home/coder/.git/HEAD": "", "/home/coder/.devcontainer/devcontainer.json": "", "/home/coder/project/.devcontainer.json": "", }, - setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { - gomock.InOrder( - // Given: This dev container has auto start enabled. - mDCCLI.EXPECT().ReadConfig(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - []string{}, - ).Return(agentcontainers.DevcontainerConfig{ - Configuration: agentcontainers.DevcontainerConfiguration{ - Customizations: agentcontainers.DevcontainerCustomizations{ - Coder: agentcontainers.CoderCustomization{ - AutoStart: true, - }, + configMap: map[string]agentcontainers.DevcontainerConfig{ + "/home/coder/.devcontainer/devcontainer.json": { + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, }, }, - }, nil), - - // Then: We expect it to be started. - mDCCLI.EXPECT().Up(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - gomock.Any(), - ).Return("", nil), - ) - - gomock.InOrder( - // Given: This dev container has auto start disabled. - mDCCLI.EXPECT().ReadConfig(gomock.Any(), - "/home/coder/project", - "/home/coder/project/.devcontainer.json", - []string{}, - ).Return(agentcontainers.DevcontainerConfig{ - Configuration: agentcontainers.DevcontainerConfiguration{ - Customizations: agentcontainers.DevcontainerCustomizations{ - Coder: agentcontainers.CoderCustomization{ - AutoStart: false, - }, + }, + }, + "/home/coder/project/.devcontainer.json": { + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: false, }, }, - }, nil), - - // Then: We expect it to _not_ be started. - mDCCLI.EXPECT().Up(gomock.Any(), - "/home/coder/project", - "/home/coder/project/.devcontainer.json", - gomock.Any(), - ).Return("", nil).Times(0), - ) + }, + }, }, }, { name: "MultipleEnabled", agentDir: "/home/coder", expectDevcontainerCount: 2, + expectUpCalledCount: 2, fs: map[string]string{ "/home/coder/.git/HEAD": "", "/home/coder/.devcontainer/devcontainer.json": "", "/home/coder/project/.devcontainer.json": "", }, - setupMocks: func(mDCCLI *acmock.MockDevcontainerCLI) { - gomock.InOrder( - // Given: This dev container has auto start enabled. - mDCCLI.EXPECT().ReadConfig(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - []string{}, - ).Return(agentcontainers.DevcontainerConfig{ - Configuration: agentcontainers.DevcontainerConfiguration{ - Customizations: agentcontainers.DevcontainerCustomizations{ - Coder: agentcontainers.CoderCustomization{ - AutoStart: true, - }, + configMap: map[string]agentcontainers.DevcontainerConfig{ + "/home/coder/.devcontainer/devcontainer.json": { + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, }, }, - }, nil), - - // Then: We expect it to be started. - mDCCLI.EXPECT().Up(gomock.Any(), - "/home/coder", - "/home/coder/.devcontainer/devcontainer.json", - gomock.Any(), - ).Return("", nil), - ) - - gomock.InOrder( - // Given: This dev container has auto start enabled. - mDCCLI.EXPECT().ReadConfig(gomock.Any(), - "/home/coder/project", - "/home/coder/project/.devcontainer.json", - []string{}, - ).Return(agentcontainers.DevcontainerConfig{ - Configuration: agentcontainers.DevcontainerConfiguration{ - Customizations: agentcontainers.DevcontainerCustomizations{ - Coder: agentcontainers.CoderCustomization{ - AutoStart: true, - }, + }, + }, + "/home/coder/project/.devcontainer.json": { + Configuration: agentcontainers.DevcontainerConfiguration{ + Customizations: agentcontainers.DevcontainerCustomizations{ + Coder: agentcontainers.CoderCustomization{ + AutoStart: true, }, }, - }, nil), - - // Then: We expect it to be started. - mDCCLI.EXPECT().Up(gomock.Any(), - "/home/coder/project", - "/home/coder/project/.devcontainer.json", - gomock.Any(), - ).Return("", nil), - ) + }, + }, }, }, } @@ -3775,43 +3705,73 @@ func TestDevcontainerDiscovery(t *testing.T) { ctx = testutil.Context(t, testutil.WaitShort) logger = testutil.Logger(t) mClock = quartz.NewMock(t) - mDCCLI = acmock.NewMockDevcontainerCLI(gomock.NewController(t)) + + upCalledMu sync.Mutex + upCalledFor = map[string]bool{} + + fCCLI = &fakeContainerCLI{} + fDCCLI = &fakeDevcontainerCLI{ + configMap: tt.configMap, + up: func(_, configPath string) (string, error) { + upCalledMu.Lock() + upCalledFor[configPath] = true + upCalledMu.Unlock() + return "", nil + }, + } r = chi.NewRouter() ) - // Given: We setup our mocks. These mocks handle our expectations for these - // tests. If there are missing/unexpected mock calls, the test will fail. - tt.setupMocks(mDCCLI) - api := agentcontainers.NewAPI(logger, agentcontainers.WithClock(mClock), agentcontainers.WithWatcher(watcher.NewNoop()), agentcontainers.WithFileSystem(initFS(t, tt.fs)), agentcontainers.WithManifestInfo("owner", "workspace", "parent-agent", "/home/coder"), - agentcontainers.WithContainerCLI(&fakeContainerCLI{}), - agentcontainers.WithDevcontainerCLI(mDCCLI), + agentcontainers.WithContainerCLI(fCCLI), + agentcontainers.WithDevcontainerCLI(fDCCLI), agentcontainers.WithProjectDiscovery(true), agentcontainers.WithDiscoveryAutostart(true), ) api.Start() - defer api.Close() r.Mount("/", api.Routes()) - // When: All expected dev containers have been found. + // Given: We allow the discover routing to progress + var got codersdk.WorkspaceAgentListContainersResponse require.Eventuallyf(t, func() bool { req := httptest.NewRequest(http.MethodGet, "/", nil).WithContext(ctx) rec := httptest.NewRecorder() r.ServeHTTP(rec, req) - got := codersdk.WorkspaceAgentListContainersResponse{} + got = codersdk.WorkspaceAgentListContainersResponse{} err := json.NewDecoder(rec.Body).Decode(&got) require.NoError(t, err) - return len(got.Devcontainers) >= tt.expectDevcontainerCount + upCalledMu.Lock() + upCalledCount := len(upCalledFor) + upCalledMu.Unlock() + + return len(got.Devcontainers) >= tt.expectDevcontainerCount && upCalledCount >= tt.expectUpCalledCount }, testutil.WaitShort, testutil.IntervalFast, "dev containers never found") - // Then: We expect the mock infra to not fail. + // Close the API. We expect this not to fail because we should have finished + // at this point. + err := api.Close() + require.NoError(t, err) + + // Then: We expect to find the expected devcontainers + assert.Len(t, got.Devcontainers, tt.expectDevcontainerCount) + + // And: We expect `up` to have been called the expected amount of times. + assert.Len(t, upCalledFor, tt.expectUpCalledCount) + + // And: `up` was called on the correct containers + for configPath, config := range tt.configMap { + autoStart := config.Configuration.Customizations.Coder.AutoStart + wasUpCalled := upCalledFor[configPath] + + require.Equal(t, autoStart, wasUpCalled) + } }) } From cc609cbd53cd837433a8bcc081d000d918ec33a7 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Tue, 5 Aug 2025 19:30:17 +0100 Subject: [PATCH 079/260] fix(site): display tasks link when no templates contain an AI task (#19184) Fixes https://github.com/coder/coder/issues/19059 This change ensures we always show the "Tasks" link, even when a deployment doesn't yet have a tasks template set up. --- coderd/database/dbauthz/dbauthz.go | 5 ----- coderd/database/dbauthz/dbauthz_test.go | 3 --- coderd/database/dbmetrics/querymetrics.go | 7 ------- coderd/database/dbmock/dbmock.go | 15 --------------- coderd/database/querier.go | 2 -- coderd/database/queries.sql.go | 12 ------------ coderd/database/queries/templateversions.sql | 4 ---- site/site.go | 17 +---------------- site/src/pages/TasksPage/TasksPage.tsx | 7 ++++++- 9 files changed, 7 insertions(+), 65 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 402097f13deae..99dd9833fa5d6 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -3617,11 +3617,6 @@ func (q *querier) GetWorkspacesEligibleForTransition(ctx context.Context, now ti return q.db.GetWorkspacesEligibleForTransition(ctx, now) } -func (q *querier) HasTemplateVersionsWithAITask(ctx context.Context) (bool, error) { - // Anyone can call HasTemplateVersionsWithAITask. - return q.db.HasTemplateVersionsWithAITask(ctx) -} - func (q *querier) InsertAPIKey(ctx context.Context, arg database.InsertAPIKeyParams) (database.APIKey, error) { return insert(q.log, q.auth, rbac.ResourceApiKey.WithOwner(arg.UserID.String()), diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index 9e4f1f80fe05f..66a477ebfbaba 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -4826,9 +4826,6 @@ func (s *MethodTestSuite) TestSystemFunctions() { }) check.Args(j.ID).Asserts(v.RBACObject(tpl), policy.ActionRead).Returns(j) })) - s.Run("HasTemplateVersionsWithAITask", s.Subtest(func(db database.Store, check *expects) { - check.Args().Asserts() - })) } func (s *MethodTestSuite) TestNotifications() { diff --git a/coderd/database/dbmetrics/querymetrics.go b/coderd/database/dbmetrics/querymetrics.go index 574eeb069e47f..d0cd0d1ab797d 100644 --- a/coderd/database/dbmetrics/querymetrics.go +++ b/coderd/database/dbmetrics/querymetrics.go @@ -2098,13 +2098,6 @@ func (m queryMetricsStore) GetWorkspacesEligibleForTransition(ctx context.Contex return workspaces, err } -func (m queryMetricsStore) HasTemplateVersionsWithAITask(ctx context.Context) (bool, error) { - start := time.Now() - r0, r1 := m.s.HasTemplateVersionsWithAITask(ctx) - m.queryLatencies.WithLabelValues("HasTemplateVersionsWithAITask").Observe(time.Since(start).Seconds()) - return r0, r1 -} - func (m queryMetricsStore) InsertAPIKey(ctx context.Context, arg database.InsertAPIKeyParams) (database.APIKey, error) { start := time.Now() key, err := m.s.InsertAPIKey(ctx, arg) diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index 30589c9fbb8bf..e88763ba1eb74 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -4472,21 +4472,6 @@ func (mr *MockStoreMockRecorder) GetWorkspacesEligibleForTransition(ctx, now any return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWorkspacesEligibleForTransition", reflect.TypeOf((*MockStore)(nil).GetWorkspacesEligibleForTransition), ctx, now) } -// HasTemplateVersionsWithAITask mocks base method. -func (m *MockStore) HasTemplateVersionsWithAITask(ctx context.Context) (bool, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "HasTemplateVersionsWithAITask", ctx) - ret0, _ := ret[0].(bool) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// HasTemplateVersionsWithAITask indicates an expected call of HasTemplateVersionsWithAITask. -func (mr *MockStoreMockRecorder) HasTemplateVersionsWithAITask(ctx any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasTemplateVersionsWithAITask", reflect.TypeOf((*MockStore)(nil).HasTemplateVersionsWithAITask), ctx) -} - // InTx mocks base method. func (m *MockStore) InTx(arg0 func(database.Store) error, arg1 *database.TxOptions) error { m.ctrl.T.Helper() diff --git a/coderd/database/querier.go b/coderd/database/querier.go index d812ff1a96de9..a50bb0bb2192a 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -473,8 +473,6 @@ type sqlcQuerier interface { GetWorkspacesAndAgentsByOwnerID(ctx context.Context, ownerID uuid.UUID) ([]GetWorkspacesAndAgentsByOwnerIDRow, error) GetWorkspacesByTemplateID(ctx context.Context, templateID uuid.UUID) ([]WorkspaceTable, error) GetWorkspacesEligibleForTransition(ctx context.Context, now time.Time) ([]GetWorkspacesEligibleForTransitionRow, error) - // Determines if the template versions table has any rows with has_ai_task = TRUE. - HasTemplateVersionsWithAITask(ctx context.Context) (bool, error) InsertAPIKey(ctx context.Context, arg InsertAPIKeyParams) (APIKey, error) // We use the organization_id as the id // for simplicity since all users is diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index a7b61d6eabd50..2c1381a3b99f1 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -13014,18 +13014,6 @@ func (q *sqlQuerier) GetTemplateVersionsCreatedAfter(ctx context.Context, create return items, nil } -const hasTemplateVersionsWithAITask = `-- name: HasTemplateVersionsWithAITask :one -SELECT EXISTS (SELECT 1 FROM template_versions WHERE has_ai_task = TRUE) -` - -// Determines if the template versions table has any rows with has_ai_task = TRUE. -func (q *sqlQuerier) HasTemplateVersionsWithAITask(ctx context.Context) (bool, error) { - row := q.db.QueryRowContext(ctx, hasTemplateVersionsWithAITask) - var exists bool - err := row.Scan(&exists) - return exists, err -} - const insertTemplateVersion = `-- name: InsertTemplateVersion :exec INSERT INTO template_versions ( diff --git a/coderd/database/queries/templateversions.sql b/coderd/database/queries/templateversions.sql index 4a37413d2f439..5cf59fab30272 100644 --- a/coderd/database/queries/templateversions.sql +++ b/coderd/database/queries/templateversions.sql @@ -234,7 +234,3 @@ FROM WHERE template_versions.id IN (archived_versions.id) RETURNING template_versions.id; - --- name: HasTemplateVersionsWithAITask :one --- Determines if the template versions table has any rows with has_ai_task = TRUE. -SELECT EXISTS (SELECT 1 FROM template_versions WHERE has_ai_task = TRUE); diff --git a/site/site.go b/site/site.go index 682d21c695a88..e2a0d408e7f8d 100644 --- a/site/site.go +++ b/site/site.go @@ -448,7 +448,6 @@ func (h *Handler) renderHTMLWithState(r *http.Request, filePath string, state ht var user database.User var themePreference string var terminalFont string - var tasksTabVisible bool orgIDs := []uuid.UUID{} eg.Go(func() error { var err error @@ -484,20 +483,6 @@ func (h *Handler) renderHTMLWithState(r *http.Request, filePath string, state ht orgIDs = memberIDs[0].OrganizationIDs return err }) - eg.Go(func() error { - // If HideAITasks is true, force hide the tasks tab - if h.opts.HideAITasks { - tasksTabVisible = false - return nil - } - - hasAITask, err := h.opts.Database.HasTemplateVersionsWithAITask(ctx) - if err != nil { - return err - } - tasksTabVisible = hasAITask - return nil - }) err := eg.Wait() if err == nil { var wg sync.WaitGroup @@ -571,7 +556,7 @@ func (h *Handler) renderHTMLWithState(r *http.Request, filePath string, state ht wg.Add(1) go func() { defer wg.Done() - tasksTabVisible, err := json.Marshal(tasksTabVisible) + tasksTabVisible, err := json.Marshal(!h.opts.HideAITasks) if err == nil { state.TasksTabVisible = html.EscapeString(string(tasksTabVisible)) } diff --git a/site/src/pages/TasksPage/TasksPage.tsx b/site/src/pages/TasksPage/TasksPage.tsx index 68ec93e736fe7..e923f88312ba0 100644 --- a/site/src/pages/TasksPage/TasksPage.tsx +++ b/site/src/pages/TasksPage/TasksPage.tsx @@ -13,6 +13,7 @@ import { AvatarData } from "components/Avatar/AvatarData"; import { AvatarDataSkeleton } from "components/Avatar/AvatarDataSkeleton"; import { Button } from "components/Button/Button"; import { displayError } from "components/GlobalSnackbar/utils"; +import { Link } from "components/Link/Link"; import { Margins } from "components/Margins/Margins"; import { PageHeader, @@ -60,6 +61,7 @@ import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { Link as RouterLink, useNavigate } from "react-router-dom"; import TextareaAutosize from "react-textarea-autosize"; +import { docs } from "utils/docs"; import { pageTitle } from "utils/page"; import { relativeTime } from "utils/time"; import { type UserOption, UsersCombobox } from "./UsersCombobox"; @@ -139,7 +141,10 @@ const NoTemplatesPlaceholder: FC = () => { No Task templates found - Create a Task template to get started + + Learn about Tasks + {" "} + to get started.

    j_sbml!39BjFKixhZd9kYvOHF^M<*Xy%xBOu+6Z4H zg+NvZu9Z8?OrxBm;9b4FqwysR2ZP!A1>8A|Ql6VaZZQ)w(({ZqV4LYa?YxZS#rd$A z;=L0CqOCU<7g||x-+bjB`*3Z_WzY8@Jl%J=(XLjm@%%EI0IW1F3|xw}ezz9ZFmGs6 z(PnB8r)fj>x_r28B`NFLVRkz8dbY7wM3%2Z@X$SsvMuas*n4rEmmTy-HCyq_W+J1- zvDxEtql*4F>2{ZF301!tQtm#0kZL>>`16rQJ}HO9?!1V5!ulg3vlYfJ5%Er}J^pUh zX}b(+h$!@Kj5avGSocLe%Xq@)B^KNh5g=ylUTq0{L> zm1|l#nIS65@;ZDaQVD;?ZxGur1{$#To@NU~G+C%;#o9Fh&YiJM)>uuWaj~{Bx=N;IOUTXmJ`Tuoy1xE+~J`l=b!@;m>>huO)jE zc^=l0exRlfG0ibv*3jCWklT&zQKd4(50M_sQKEXmH@;PC73@VQ1!Z^C&41rR7ZcG( zwr+l^qwuo*Mi^-(W%1cg2L)rqyVV&CTx7!bwSA_&lu3*W5<;4-cLUNLXhKb&%%sEs z7vqSGi7AMw7;leNFSXF{>3Zjoud|TDbfw{ek&LqZi1{oHyRMrv9zHEqBJ{V+@^3Na z^)crlf{Tl&1iNCjvF-{V3$W2zw+gi9B)|97R(LWY7&D8aGK=tGB)L3A$vHv`*FT|m zlbx@m36&w%_xgp0K|*vE(6K6{tbEZ`ZYVP!e31-UCh}NqzQtudCdI$LnjVvyO5vjU z#$W8ezZpRJU!OvzYP^WJUH7yg{W5W1+a`N4Z*{OC9}Lf0Mz>PgotC91P7lZFHrB4a z@gK~WbZt02UtqMcn=a5C%e;~!se>HtY?U7oxwTRBdaFjEsNv$%&|0XT`vtT2?nxZ~ z#UdWqI}bFN2yp90xKQqAHqMW-KQV{d(R z3zOL1nC&)`&?0lO;I@n;(sb}Tp5Xe`=35umiEj1rMjBD`yjW__IJ5yK#-NV_ByuTY{Y!>SkI-cz+9fGGk!1(jaV2df__A3oxoXVj!X)Bg$@@9U!pa1UL`i1 zAQ+-by26Mdwq>>kQ@fD;wI_pR8Wk+A)Gt}_)eK9bWtm6kJ6rFd5f!HcA{9cU+9X!$ zGs|O&(9D`GkDxbZ3#IdWQs&Rzc!LIN<9fM@!szOt?`K_U|37Ej>CV8!czvsGdjvr6 zd|el!r!G=&{8bt+^B@0vYczTM6yGylAAnCu^VF_$3$#LCYa#U<94h*;cM2Az=q@-3 zLr|f2!#$n1^9XwH#9w)10$v(y7sA8J%Cj+qGx8QdCxkDoQJq!z;_FS@itkhwgFoA9 zcMz{DFh3;GffT+E>VB!M59OwBT{e>J|7tzL8xf~74fj=8NS%6@JBXy?J95f3E=XFu zUXy#rF=}CvroB_@lA4xXyyRVwqf_CoQ`qiaM!i6Ky$*fsOFmeHLs)@qW~obigbtGK z30Ifhx_QX7GGtVYTA$51H?qR^BRX5ZJHKJsY=KhQGw{%6ENW* zqK=ZnfA-93ywtD_PwK>R@odS_L7f8;?Y-#^-+iGRNFXuzyY_-1w_>PWH{D|mh2U6X zF(FN-oY?ryo-(<=p@_6hX2S<;UV5NJRDGK~a7x^|wdMVDnj{~N72Q$tpf|$j0kIOI5fS+2p zrNQ6}xg-JcjuhwGL$cC9SoN`2h0QSk21iU(RQdvx_x(zWH<*g;0wjpe)%1nKem;)- zt?=xIuA`BJt!glD=A3%xX=Ds8F{3G72JEHy3yHy;r(s0m=@O55zV;HS)X;%afL;AD zk}kQ_a%gBYrbDWXz=QbmtgGWSG+&0bL1&>o44DbAPl{k&{_{!?CfxO`VGHUfcfeE6 z9JVmwfJaNwElBxP24!+pI+tWvAL&|!J+a8IlnZ+>!=ASSm%c?7mT!=+_qf5``(E4K zP#ru0S9Osn(HauigYf z$-QOPfsJve3gb0pX3bhv5Ur_tc4#x21!3f}Llj6)k@gFpjc65KjIK}sM8_1x zqssJfer35rtOB>tjq!gRr#n*fRN z%YhNd1JCcp84*=gK~s!G+@O|tMT>DaeD!K z&v|>D;3?tKvgzx^+V0nju@cMH7J9=>jj#H4SqfrobG4zJreZH2cXq$))#5`Lk*r-% z6wvgQ=7-J^FMw=XeaL{wTgZe>)oM;UR9Rl0X=AB?)2fi;d#G}5`IDfG$j%Jq+-R?v zE;TK9Tr9h?rT`+IGRMk)0OmloAPqyC2f`mud3mMSy3zj_7gyKnRZ*;kLQ7B?A?Xte zEQ)opu)DjU3VXT08(9#_UdnxYi4Xb`S>Z@VA4C76%vLx5A(<+=wWOlN^uPv+yEJC$ z^5-TF&iknCMvPu|l7OsAwmfcKv_$6-XvVBFdYo-mIrml|*FgD}iwd;9f_{7%a_c`Q z5B3XHQDD4uFo_qwT8YsqgpNNHIPqL&y4WkY=Y04j&SJS>+)AJkk{=r^mN%pSTv%Aa z46}E=VGp%;9in7s9Bf86@75J0RZ}Cu$0sou|1{_(&_=@|(8S^|#?Jt*F?||#Q@?KT zL)`))5$)waQkZ;Wh@=R1D2X!>Sr|rmZ_VK>&?a?=K$aq$hNFl>r2WEfnP36QLS6;`# zF|ST>U$)p3G*1Mumv4;4w|vkRh)pYiq0yXc2rZV-$ehk#HpIl%Qf|#^-h#Da{;} zPvlJy=s@<|$S3ay9grt?ra-1vu!L?h@W4iW@P`_(T4i20m>T+M+s5*c>^p zEXsG6e_g^5`jcI9Ff@9{yMpf9O`9i!X>u=X_lpIXSq>|ho-avc#(shBI#KmUIhKAx zPkL$a)j(e;ys`+^1Vy`X-FMg$Jc2?ylcp}F z!B#NQsFjadajc`6VkrqqMIJeYuWoq{e^>`SN(aqb%)>}9$|Dw zfUW&sA0HVk5e462^&5r_N2opG@`cLC47V3QJjva}JU4uErZKC-YALSA&u^(&Bngom z43vdW=bvrElhat%sg1n&V5~?kN3xe4*Q-jutuiP?syCJ;K(4o4pHn3H9FSPS$?x_| zvVkAw&DP-n=^%4OgUP0x@C9e-^1TA;_INete6CU&�J~2>Q5huV`)~YLz5QbR@yD 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�UebK|M0bmf%LxG>QIPwmCd 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

  • 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

    Release notes

    Sourced from step-security/harden-runner's releases.

    v2.13.0

    What's Changed

    • Improved job markdown summary
    • Https monitoring for all domains (included with the enterprise tier)

    Full Changelog: https://github.com/step-security/harden-runner/compare/v2...v2.13.0

    From 4ba93824f9b0628a22429445928f91dbea91a541 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Tue, 5 Aug 2025 14:19:57 -0500 Subject: [PATCH 080/260] chore(helm): make coder pprof endpoint available externally (#19185) PProf is still disabled by default --- helm/coder/templates/_coder.tpl | 2 ++ helm/coder/tests/testdata/auto_access_url_1.golden | 2 ++ helm/coder/tests/testdata/auto_access_url_1_coder.golden | 2 ++ helm/coder/tests/testdata/auto_access_url_2.golden | 2 ++ helm/coder/tests/testdata/auto_access_url_2_coder.golden | 2 ++ helm/coder/tests/testdata/auto_access_url_3.golden | 2 ++ helm/coder/tests/testdata/auto_access_url_3_coder.golden | 2 ++ helm/coder/tests/testdata/command.golden | 2 ++ helm/coder/tests/testdata/command_args.golden | 2 ++ helm/coder/tests/testdata/command_args_coder.golden | 2 ++ helm/coder/tests/testdata/command_coder.golden | 2 ++ helm/coder/tests/testdata/custom_resources.golden | 2 ++ helm/coder/tests/testdata/custom_resources_coder.golden | 2 ++ helm/coder/tests/testdata/default_values.golden | 2 ++ helm/coder/tests/testdata/default_values_coder.golden | 2 ++ helm/coder/tests/testdata/env_from.golden | 2 ++ helm/coder/tests/testdata/env_from_coder.golden | 2 ++ helm/coder/tests/testdata/extra_templates.golden | 2 ++ helm/coder/tests/testdata/extra_templates_coder.golden | 2 ++ helm/coder/tests/testdata/labels_annotations.golden | 2 ++ helm/coder/tests/testdata/labels_annotations_coder.golden | 2 ++ helm/coder/tests/testdata/partial_resources.golden | 2 ++ helm/coder/tests/testdata/partial_resources_coder.golden | 2 ++ helm/coder/tests/testdata/pod_securitycontext.golden | 2 ++ helm/coder/tests/testdata/pod_securitycontext_coder.golden | 2 ++ helm/coder/tests/testdata/prometheus.golden | 2 ++ helm/coder/tests/testdata/prometheus_coder.golden | 2 ++ helm/coder/tests/testdata/provisionerd_psk.golden | 2 ++ helm/coder/tests/testdata/provisionerd_psk_coder.golden | 2 ++ helm/coder/tests/testdata/sa.golden | 2 ++ helm/coder/tests/testdata/sa_coder.golden | 2 ++ helm/coder/tests/testdata/sa_disabled.golden | 2 ++ helm/coder/tests/testdata/sa_disabled_coder.golden | 2 ++ helm/coder/tests/testdata/sa_extra_rules.golden | 2 ++ helm/coder/tests/testdata/sa_extra_rules_coder.golden | 2 ++ helm/coder/tests/testdata/securitycontext.golden | 2 ++ helm/coder/tests/testdata/securitycontext_coder.golden | 2 ++ helm/coder/tests/testdata/svc_loadbalancer.golden | 2 ++ helm/coder/tests/testdata/svc_loadbalancer_class.golden | 2 ++ helm/coder/tests/testdata/svc_loadbalancer_class_coder.golden | 2 ++ helm/coder/tests/testdata/svc_loadbalancer_coder.golden | 2 ++ helm/coder/tests/testdata/svc_nodeport.golden | 2 ++ helm/coder/tests/testdata/svc_nodeport_coder.golden | 2 ++ helm/coder/tests/testdata/tls.golden | 2 ++ helm/coder/tests/testdata/tls_coder.golden | 2 ++ helm/coder/tests/testdata/topology.golden | 2 ++ helm/coder/tests/testdata/topology_coder.golden | 2 ++ helm/coder/tests/testdata/workspace_proxy.golden | 2 ++ helm/coder/tests/testdata/workspace_proxy_coder.golden | 2 ++ helm/coder/values.yaml | 2 ++ 50 files changed, 100 insertions(+) diff --git a/helm/coder/templates/_coder.tpl b/helm/coder/templates/_coder.tpl index 3964fd1e3f66d..2efa530c34a47 100644 --- a/helm/coder/templates/_coder.tpl +++ b/helm/coder/templates/_coder.tpl @@ -41,6 +41,8 @@ env: value: "0.0.0.0:8080" - name: CODER_PROMETHEUS_ADDRESS value: "0.0.0.0:2112" +- name: CODER_PPROF_ADDRESS + value: "0.0.0.0:6060" {{- if .Values.provisionerDaemon.pskSecretName }} - name: CODER_PROVISIONER_DAEMON_PSK valueFrom: diff --git a/helm/coder/tests/testdata/auto_access_url_1.golden b/helm/coder/tests/testdata/auto_access_url_1.golden index a8455dd53357f..82b78f878e0a9 100644 --- a/helm/coder/tests/testdata/auto_access_url_1.golden +++ b/helm/coder/tests/testdata/auto_access_url_1.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: KUBE_POD_IP valueFrom: fieldRef: diff --git a/helm/coder/tests/testdata/auto_access_url_1_coder.golden b/helm/coder/tests/testdata/auto_access_url_1_coder.golden index 5862de46fa900..849553b8ab023 100644 --- a/helm/coder/tests/testdata/auto_access_url_1_coder.golden +++ b/helm/coder/tests/testdata/auto_access_url_1_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: KUBE_POD_IP valueFrom: fieldRef: diff --git a/helm/coder/tests/testdata/auto_access_url_2.golden b/helm/coder/tests/testdata/auto_access_url_2.golden index d5c7ce4dd17ac..666341a133394 100644 --- a/helm/coder/tests/testdata/auto_access_url_2.golden +++ b/helm/coder/tests/testdata/auto_access_url_2.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/auto_access_url_2_coder.golden b/helm/coder/tests/testdata/auto_access_url_2_coder.golden index 94341b196c2b3..4a2c6074b058e 100644 --- a/helm/coder/tests/testdata/auto_access_url_2_coder.golden +++ b/helm/coder/tests/testdata/auto_access_url_2_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/auto_access_url_3.golden b/helm/coder/tests/testdata/auto_access_url_3.golden index 5ce3303dcdca3..a0b24ff212346 100644 --- a/helm/coder/tests/testdata/auto_access_url_3.golden +++ b/helm/coder/tests/testdata/auto_access_url_3.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: KUBE_POD_IP valueFrom: fieldRef: diff --git a/helm/coder/tests/testdata/auto_access_url_3_coder.golden b/helm/coder/tests/testdata/auto_access_url_3_coder.golden index 9298e7411bc74..2e62cb18b60ab 100644 --- a/helm/coder/tests/testdata/auto_access_url_3_coder.golden +++ b/helm/coder/tests/testdata/auto_access_url_3_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: KUBE_POD_IP valueFrom: fieldRef: diff --git a/helm/coder/tests/testdata/command.golden b/helm/coder/tests/testdata/command.golden index 9ef66d7ad3a07..a11cb7564e392 100644 --- a/helm/coder/tests/testdata/command.golden +++ b/helm/coder/tests/testdata/command.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/command_args.golden b/helm/coder/tests/testdata/command_args.golden index d5633ce361966..d296c1a8b58d9 100644 --- a/helm/coder/tests/testdata/command_args.golden +++ b/helm/coder/tests/testdata/command_args.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/command_args_coder.golden b/helm/coder/tests/testdata/command_args_coder.golden index 8fafa90a7f080..c606627a02e67 100644 --- a/helm/coder/tests/testdata/command_args_coder.golden +++ b/helm/coder/tests/testdata/command_args_coder.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/command_coder.golden b/helm/coder/tests/testdata/command_coder.golden index 055cec2380d59..a7027d4eed4da 100644 --- a/helm/coder/tests/testdata/command_coder.golden +++ b/helm/coder/tests/testdata/command_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/custom_resources.golden b/helm/coder/tests/testdata/custom_resources.golden index ca5391e3ac5d9..e9889d36dee51 100644 --- a/helm/coder/tests/testdata/custom_resources.golden +++ b/helm/coder/tests/testdata/custom_resources.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/custom_resources_coder.golden b/helm/coder/tests/testdata/custom_resources_coder.golden index f783a4f7e53e5..3e45a160f1c58 100644 --- a/helm/coder/tests/testdata/custom_resources_coder.golden +++ b/helm/coder/tests/testdata/custom_resources_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/default_values.golden b/helm/coder/tests/testdata/default_values.golden index c48dffefd12f1..bbaa590568e46 100644 --- a/helm/coder/tests/testdata/default_values.golden +++ b/helm/coder/tests/testdata/default_values.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/default_values_coder.golden b/helm/coder/tests/testdata/default_values_coder.golden index bb8157ea46153..d63411508ed66 100644 --- a/helm/coder/tests/testdata/default_values_coder.golden +++ b/helm/coder/tests/testdata/default_values_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/env_from.golden b/helm/coder/tests/testdata/env_from.golden index eb43115a79187..aca0cb45b3825 100644 --- a/helm/coder/tests/testdata/env_from.golden +++ b/helm/coder/tests/testdata/env_from.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/env_from_coder.golden b/helm/coder/tests/testdata/env_from_coder.golden index a539842ce9187..b4c074225011b 100644 --- a/helm/coder/tests/testdata/env_from_coder.golden +++ b/helm/coder/tests/testdata/env_from_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/extra_templates.golden b/helm/coder/tests/testdata/extra_templates.golden index 2b0d5117c855f..77f06833e3c27 100644 --- a/helm/coder/tests/testdata/extra_templates.golden +++ b/helm/coder/tests/testdata/extra_templates.golden @@ -162,6 +162,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/extra_templates_coder.golden b/helm/coder/tests/testdata/extra_templates_coder.golden index bca6beee0c1ea..ec5d34eec870d 100644 --- a/helm/coder/tests/testdata/extra_templates_coder.golden +++ b/helm/coder/tests/testdata/extra_templates_coder.golden @@ -162,6 +162,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/labels_annotations.golden b/helm/coder/tests/testdata/labels_annotations.golden index 6a83ee5ec1684..0acc2521ba045 100644 --- a/helm/coder/tests/testdata/labels_annotations.golden +++ b/helm/coder/tests/testdata/labels_annotations.golden @@ -161,6 +161,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/labels_annotations_coder.golden b/helm/coder/tests/testdata/labels_annotations_coder.golden index f4454b575ba93..bef5c25d68525 100644 --- a/helm/coder/tests/testdata/labels_annotations_coder.golden +++ b/helm/coder/tests/testdata/labels_annotations_coder.golden @@ -161,6 +161,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/partial_resources.golden b/helm/coder/tests/testdata/partial_resources.golden index 9eade81274a44..2f5fd5f3c7cad 100644 --- a/helm/coder/tests/testdata/partial_resources.golden +++ b/helm/coder/tests/testdata/partial_resources.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/partial_resources_coder.golden b/helm/coder/tests/testdata/partial_resources_coder.golden index 3edfa2a2fcbb3..14c47eab84c8e 100644 --- a/helm/coder/tests/testdata/partial_resources_coder.golden +++ b/helm/coder/tests/testdata/partial_resources_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/pod_securitycontext.golden b/helm/coder/tests/testdata/pod_securitycontext.golden index 17f6272f3637b..e0b02c62ed91c 100644 --- a/helm/coder/tests/testdata/pod_securitycontext.golden +++ b/helm/coder/tests/testdata/pod_securitycontext.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/pod_securitycontext_coder.golden b/helm/coder/tests/testdata/pod_securitycontext_coder.golden index c8d1ced840fc3..9133b085074f6 100644 --- a/helm/coder/tests/testdata/pod_securitycontext_coder.golden +++ b/helm/coder/tests/testdata/pod_securitycontext_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/prometheus.golden b/helm/coder/tests/testdata/prometheus.golden index 0caa782975e8f..2e6b185a6c326 100644 --- a/helm/coder/tests/testdata/prometheus.golden +++ b/helm/coder/tests/testdata/prometheus.golden @@ -152,6 +152,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/prometheus_coder.golden b/helm/coder/tests/testdata/prometheus_coder.golden index 6985f714612c1..e335d22523709 100644 --- a/helm/coder/tests/testdata/prometheus_coder.golden +++ b/helm/coder/tests/testdata/prometheus_coder.golden @@ -152,6 +152,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/provisionerd_psk.golden b/helm/coder/tests/testdata/provisionerd_psk.golden index 8efac9058c2fc..72cfdd976b5e9 100644 --- a/helm/coder/tests/testdata/provisionerd_psk.golden +++ b/helm/coder/tests/testdata/provisionerd_psk.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_PROVISIONER_DAEMON_PSK valueFrom: secretKeyRef: diff --git a/helm/coder/tests/testdata/provisionerd_psk_coder.golden b/helm/coder/tests/testdata/provisionerd_psk_coder.golden index cb9908874c686..a34e294f992dc 100644 --- a/helm/coder/tests/testdata/provisionerd_psk_coder.golden +++ b/helm/coder/tests/testdata/provisionerd_psk_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_PROVISIONER_DAEMON_PSK valueFrom: secretKeyRef: diff --git a/helm/coder/tests/testdata/sa.golden b/helm/coder/tests/testdata/sa.golden index f57293b211df6..ff423c318baa5 100644 --- a/helm/coder/tests/testdata/sa.golden +++ b/helm/coder/tests/testdata/sa.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/sa_coder.golden b/helm/coder/tests/testdata/sa_coder.golden index ae3ce59e35a24..8725a6724e6a8 100644 --- a/helm/coder/tests/testdata/sa_coder.golden +++ b/helm/coder/tests/testdata/sa_coder.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/sa_disabled.golden b/helm/coder/tests/testdata/sa_disabled.golden index 387a05f79536f..122c297571a44 100644 --- a/helm/coder/tests/testdata/sa_disabled.golden +++ b/helm/coder/tests/testdata/sa_disabled.golden @@ -139,6 +139,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/sa_disabled_coder.golden b/helm/coder/tests/testdata/sa_disabled_coder.golden index 77f9b0fc58ae9..da091e00279a2 100644 --- a/helm/coder/tests/testdata/sa_disabled_coder.golden +++ b/helm/coder/tests/testdata/sa_disabled_coder.golden @@ -139,6 +139,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/sa_extra_rules.golden b/helm/coder/tests/testdata/sa_extra_rules.golden index 8d74df5001d34..0a01a6411e33a 100644 --- a/helm/coder/tests/testdata/sa_extra_rules.golden +++ b/helm/coder/tests/testdata/sa_extra_rules.golden @@ -167,6 +167,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/sa_extra_rules_coder.golden b/helm/coder/tests/testdata/sa_extra_rules_coder.golden index 50849b76e89f2..91133dd9803bf 100644 --- a/helm/coder/tests/testdata/sa_extra_rules_coder.golden +++ b/helm/coder/tests/testdata/sa_extra_rules_coder.golden @@ -167,6 +167,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/securitycontext.golden b/helm/coder/tests/testdata/securitycontext.golden index ee1a3e3a795fd..486447d93a4aa 100644 --- a/helm/coder/tests/testdata/securitycontext.golden +++ b/helm/coder/tests/testdata/securitycontext.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/securitycontext_coder.golden b/helm/coder/tests/testdata/securitycontext_coder.golden index fd3d70482df5b..7d5b409b8eed3 100644 --- a/helm/coder/tests/testdata/securitycontext_coder.golden +++ b/helm/coder/tests/testdata/securitycontext_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/svc_loadbalancer.golden b/helm/coder/tests/testdata/svc_loadbalancer.golden index dd55f8d530087..71310077bb6c0 100644 --- a/helm/coder/tests/testdata/svc_loadbalancer.golden +++ b/helm/coder/tests/testdata/svc_loadbalancer.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/svc_loadbalancer_class.golden b/helm/coder/tests/testdata/svc_loadbalancer_class.golden index 92969226da94b..548c360f1c089 100644 --- a/helm/coder/tests/testdata/svc_loadbalancer_class.golden +++ b/helm/coder/tests/testdata/svc_loadbalancer_class.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/svc_loadbalancer_class_coder.golden b/helm/coder/tests/testdata/svc_loadbalancer_class_coder.golden index aa8a19a234b3d..aad0731549777 100644 --- a/helm/coder/tests/testdata/svc_loadbalancer_class_coder.golden +++ b/helm/coder/tests/testdata/svc_loadbalancer_class_coder.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/svc_loadbalancer_coder.golden b/helm/coder/tests/testdata/svc_loadbalancer_coder.golden index a7d389fb048df..667f4f84cd7f8 100644 --- a/helm/coder/tests/testdata/svc_loadbalancer_coder.golden +++ b/helm/coder/tests/testdata/svc_loadbalancer_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/svc_nodeport.golden b/helm/coder/tests/testdata/svc_nodeport.golden index 9a271628728f7..d2f1c5c9767ef 100644 --- a/helm/coder/tests/testdata/svc_nodeport.golden +++ b/helm/coder/tests/testdata/svc_nodeport.golden @@ -152,6 +152,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/svc_nodeport_coder.golden b/helm/coder/tests/testdata/svc_nodeport_coder.golden index 0a8805f84ba8b..5d258cfb10d8c 100644 --- a/helm/coder/tests/testdata/svc_nodeport_coder.golden +++ b/helm/coder/tests/testdata/svc_nodeport_coder.golden @@ -152,6 +152,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/tls.golden b/helm/coder/tests/testdata/tls.golden index 1cd0fb75bc6c6..66e1dd69915df 100644 --- a/helm/coder/tests/testdata/tls.golden +++ b/helm/coder/tests/testdata/tls.golden @@ -158,6 +158,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: https://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/tls_coder.golden b/helm/coder/tests/testdata/tls_coder.golden index 95bec4a8c510e..ddad245300a6f 100644 --- a/helm/coder/tests/testdata/tls_coder.golden +++ b/helm/coder/tests/testdata/tls_coder.golden @@ -158,6 +158,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: https://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/topology.golden b/helm/coder/tests/testdata/topology.golden index 4d8af24ce3c7f..2a061efaf2b8d 100644 --- a/helm/coder/tests/testdata/topology.golden +++ b/helm/coder/tests/testdata/topology.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/topology_coder.golden b/helm/coder/tests/testdata/topology_coder.golden index 3b81214417262..0256522c4dcc7 100644 --- a/helm/coder/tests/testdata/topology_coder.golden +++ b/helm/coder/tests/testdata/topology_coder.golden @@ -153,6 +153,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/workspace_proxy.golden b/helm/coder/tests/testdata/workspace_proxy.golden index d096bfe94feea..3a7386af35d25 100644 --- a/helm/coder/tests/testdata/workspace_proxy.golden +++ b/helm/coder/tests/testdata/workspace_proxy.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.default.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/tests/testdata/workspace_proxy_coder.golden b/helm/coder/tests/testdata/workspace_proxy_coder.golden index 2ed59d5591261..3cafe9855474e 100644 --- a/helm/coder/tests/testdata/workspace_proxy_coder.golden +++ b/helm/coder/tests/testdata/workspace_proxy_coder.golden @@ -154,6 +154,8 @@ spec: value: 0.0.0.0:8080 - name: CODER_PROMETHEUS_ADDRESS value: 0.0.0.0:2112 + - name: CODER_PPROF_ADDRESS + value: 0.0.0.0:6060 - name: CODER_ACCESS_URL value: http://coder.coder.svc.cluster.local - name: KUBE_POD_IP diff --git a/helm/coder/values.yaml b/helm/coder/values.yaml index fcc8f7746b0f1..72708c88495ad 100644 --- a/helm/coder/values.yaml +++ b/helm/coder/values.yaml @@ -12,6 +12,8 @@ coder: # - CODER_TLS_KEY_FILE: set if tls.secretName is not empty. # - CODER_PROMETHEUS_ADDRESS: set to 0.0.0.0:2112 and cannot be changed. # Prometheus must still be enabled by setting CODER_PROMETHEUS_ENABLE. + # - CODER_PPROF_ADDRESS: set to 0.0.0.0:6060 and cannot be changed. + # Profiling must still be enabled by setting CODER_PPROF_ENABLE. # - KUBE_POD_IP # - CODER_DERP_SERVER_RELAY_URL # From a2fc26114c18bbb7a9d53ba69b6778925ab6cad6 Mon Sep 17 00:00:00 2001 From: Stephen Kirby <58410745+stirby@users.noreply.github.com> Date: Tue, 5 Aug 2025 21:40:40 -0500 Subject: [PATCH 081/260] chore(docs): update calendar and helm install docs for v2.25.0 (#19186) Co-authored-by: M Atif Ali --- docs/install/kubernetes.md | 12 ++++++------ docs/install/releases/index.md | 18 +++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/install/kubernetes.md b/docs/install/kubernetes.md index 72c51e0da3e8c..0b9c506878517 100644 --- a/docs/install/kubernetes.md +++ b/docs/install/kubernetes.md @@ -135,9 +135,9 @@ We support two release channels: mainline and stable - read the helm install coder coder-v2/coder \ --namespace coder \ --values values.yaml \ - --version 2.23.1 + --version 2.25.0 ``` - + - **OCI Registry** @@ -146,7 +146,7 @@ We support two release channels: mainline and stable - read the helm install coder oci://ghcr.io/coder/chart/coder \ --namespace coder \ --values values.yaml \ - --version 2.23.1 + --version 2.25.0 ``` - **Stable** Coder release: @@ -159,9 +159,9 @@ We support two release channels: mainline and stable - read the helm install coder coder-v2/coder \ --namespace coder \ --values values.yaml \ - --version 2.22.1 + --version 2.25.0 ``` - + - **OCI Registry** @@ -170,7 +170,7 @@ We support two release channels: mainline and stable - read the helm install coder oci://ghcr.io/coder/chart/coder \ --namespace coder \ --values values.yaml \ - --version 2.22.1 + --version 2.25.0 ``` You can watch Coder start up by running `kubectl get pods -n coder`. Once Coder diff --git a/docs/install/releases/index.md b/docs/install/releases/index.md index 577939c05dde9..83efc16aefe17 100644 --- a/docs/install/releases/index.md +++ b/docs/install/releases/index.md @@ -55,15 +55,15 @@ pages. ## Release schedule -| Release name | Release Date | Status | Latest Release | -|------------------------------------------------|-------------------|------------------|----------------------------------------------------------------| -| [2.19](https://coder.com/changelog/coder-2-19) | February 04, 2025 | Not Supported | [v2.19.3](https://github.com/coder/coder/releases/tag/v2.19.3) | -| [2.20](https://coder.com/changelog/coder-2-20) | March 04, 2025 | Not Supported | [v2.20.3](https://github.com/coder/coder/releases/tag/v2.20.3) | -| [2.21](https://coder.com/changelog/coder-2-21) | April 02, 2025 | Not Supported | [v2.21.3](https://github.com/coder/coder/releases/tag/v2.21.3) | -| [2.22](https://coder.com/changelog/coder-2-22) | May 16, 2025 | Security Support | [v2.22.1](https://github.com/coder/coder/releases/tag/v2.22.1) | -| [2.23](https://coder.com/changelog/coder-2-23) | June 03, 2025 | Stable | [v2.23.2](https://github.com/coder/coder/releases/tag/v2.23.2) | -| [2.24](https://coder.com/changelog/coder-2-24) | July 01, 2025 | Mainline | [v2.24.1](https://github.com/coder/coder/releases/tag/v2.24.1) | -| 2.25 | | Not Released | N/A | +| Release name | Release Date | Status | Latest Release | +|------------------------------------------------|-----------------|------------------|----------------------------------------------------------------| +| [2.20](https://coder.com/changelog/coder-2-20) | March 04, 2025 | Not Supported | [v2.20.3](https://github.com/coder/coder/releases/tag/v2.20.3) | +| [2.21](https://coder.com/changelog/coder-2-21) | April 02, 2025 | Not Supported | [v2.21.3](https://github.com/coder/coder/releases/tag/v2.21.3) | +| [2.22](https://coder.com/changelog/coder-2-22) | May 16, 2025 | Security Support | [v2.22.1](https://github.com/coder/coder/releases/tag/v2.22.1) | +| [2.23](https://coder.com/changelog/coder-2-23) | June 03, 2025 | Security Support | [v2.23.2](https://github.com/coder/coder/releases/tag/v2.23.4) | +| [2.24](https://coder.com/changelog/coder-2-24) | July 01, 2025 | Stable | [v2.24.2](https://github.com/coder/coder/releases/tag/v2.24.2) | +| [2.24](https://coder.com/changelog/coder-2-24) | August 05, 2025 | Mainline | [v2.25.0](https://github.com/coder/coder/releases/tag/v2.25.0) | +| 2.25 | | Not Released | N/A | > [!TIP] From 5c88d93207b15a404eae47c0c09e150d16336407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Wed, 6 Aug 2025 00:19:02 -0600 Subject: [PATCH 082/260] chore: update to node 20.19.4 (#19188) --- .github/actions/setup-node/action.yaml | 2 +- dogfood/coder/Dockerfile | 12 +++++----- site/package.json | 2 +- site/pnpm-lock.yaml | 10 ++++----- .../WorkspaceScheduleForm.test.tsx | 22 +++++++++---------- .../WorkspaceScheduleForm.tsx | 2 +- site/src/utils/timeZones.ts | 18 ++++++++++++++- 7 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.github/actions/setup-node/action.yaml b/.github/actions/setup-node/action.yaml index 02ffa14312ffe..6ed9985185746 100644 --- a/.github/actions/setup-node/action.yaml +++ b/.github/actions/setup-node/action.yaml @@ -16,7 +16,7 @@ runs: - name: Setup Node uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: - node-version: 20.16.0 + node-version: 20.19.4 # See https://github.com/actions/setup-node#caching-global-packages-data cache: "pnpm" cache-dependency-path: ${{ inputs.directory }}/pnpm-lock.yaml diff --git a/dogfood/coder/Dockerfile b/dogfood/coder/Dockerfile index 4820eec56989b..20fa93fef04d4 100644 --- a/dogfood/coder/Dockerfile +++ b/dogfood/coder/Dockerfile @@ -4,7 +4,7 @@ FROM rust:slim@sha256:3f391b0678a6e0c88fd26f13e399c9c515ac47354e3cadfee7daee3b21 ENV CARGO_INSTALL_ROOT=/tmp/ # Use more reliable mirrors for Debian packages RUN sed -i 's|http://deb.debian.org/debian|http://mirrors.edge.kernel.org/debian|g' /etc/apt/sources.list && \ - apt-get update || true + apt-get update || true RUN apt-get update && apt-get install -y libssl-dev openssl pkg-config build-essential RUN cargo install jj-cli typos-cli watchexec-cli @@ -126,8 +126,8 @@ RUN mkdir -p /etc/sudoers.d && \ # Use more reliable mirrors for Ubuntu packages RUN sed -i 's|http://archive.ubuntu.com/ubuntu/|http://mirrors.edge.kernel.org/ubuntu/|g' /etc/apt/sources.list && \ - sed -i 's|http://security.ubuntu.com/ubuntu/|http://mirrors.edge.kernel.org/ubuntu/|g' /etc/apt/sources.list && \ - apt-get update --quiet && apt-get install --yes \ + sed -i 's|http://security.ubuntu.com/ubuntu/|http://mirrors.edge.kernel.org/ubuntu/|g' /etc/apt/sources.list && \ + apt-get update --quiet && apt-get install --yes \ ansible \ apt-transport-https \ apt-utils \ @@ -245,7 +245,7 @@ RUN DOCTL_VERSION=$(curl -s "https://api.github.com/repos/digitalocean/doctl/rel ARG NVM_INSTALL_SHA=bdea8c52186c4dd12657e77e7515509cda5bf9fa5a2f0046bce749e62645076d # Install frontend utilities ENV NVM_DIR=/usr/local/nvm -ENV NODE_VERSION=20.16.0 +ENV NODE_VERSION=20.19.4 RUN mkdir -p $NVM_DIR RUN curl -o nvm_install.sh https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh && \ echo "${NVM_INSTALL_SHA} nvm_install.sh" | sha256sum -c && \ @@ -256,8 +256,8 @@ RUN source $NVM_DIR/nvm.sh && \ nvm use $NODE_VERSION ENV PATH=$NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH RUN corepack enable && \ - corepack prepare npm@10.8.1 --activate && \ - corepack prepare pnpm@9.15.1 --activate + corepack prepare npm@10.8.1 --activate && \ + corepack prepare pnpm@9.15.1 --activate RUN pnpx playwright@1.47.0 install --with-deps chromium diff --git a/site/package.json b/site/package.json index 75ff5a33d3a33..b05cd6a890562 100644 --- a/site/package.json +++ b/site/package.json @@ -114,7 +114,7 @@ "semver": "7.6.2", "tailwind-merge": "2.6.0", "tailwindcss-animate": "1.0.7", - "tzdata": "1.0.40", + "tzdata": "1.0.44", "ua-parser-js": "1.0.40", "ufuzzy": "npm:@leeoniya/ufuzzy@1.0.10", "undici": "6.21.2", diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index b5ce1062e605a..2039cc3e62bae 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -258,8 +258,8 @@ importers: specifier: 1.0.7 version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.3.38)(@types/node@20.17.16)(typescript@5.6.3))) tzdata: - specifier: 1.0.40 - version: 1.0.40 + specifier: 1.0.44 + version: 1.0.44 ua-parser-js: specifier: 1.0.40 version: 1.0.40 @@ -6071,8 +6071,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - tzdata@1.0.40: - resolution: {integrity: sha512-IsWNGfC5GrVPG4ejYJtf3tOlBdJYs0uNzv1a+vkdANHDq2kPg4oAN2UlCfpqrCwErPZVhI6MLA2gkeuXAVnpLg==, tarball: https://registry.npmjs.org/tzdata/-/tzdata-1.0.40.tgz} + tzdata@1.0.44: + resolution: {integrity: sha512-xJ8xcdoFRwFpIQ90QV3WFXJNCO/feNn9vHVsZMJiKmtMYuo7nvF6CTpBc+SgegC1fb/3L+m32ytXT9XrBjrINg==, tarball: https://registry.npmjs.org/tzdata/-/tzdata-1.0.44.tgz} ua-parser-js@1.0.40: resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==, tarball: https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz} @@ -13020,7 +13020,7 @@ snapshots: typescript@5.6.3: {} - tzdata@1.0.40: {} + tzdata@1.0.44: {} ua-parser-js@1.0.40: {} diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx index 1e9b50292887b..59f2798d76568 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx @@ -71,7 +71,7 @@ describe("validationSchema", () => { saturday: false, }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorNoDayOfWeek); + expect(validate).toThrow(Language.errorNoDayOfWeek); }); it("disallows empty startTime when autostart is enabled", () => { @@ -87,7 +87,7 @@ describe("validationSchema", () => { startTime: "", }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorNoTime); + expect(validate).toThrow(Language.errorNoTime); }); it("allows startTime 16:20", () => { @@ -105,7 +105,7 @@ describe("validationSchema", () => { startTime: "9:30", }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorTime); + expect(validate).toThrow(Language.errorTime); }); it("disallows startTime to be HH:m", () => { @@ -114,7 +114,7 @@ describe("validationSchema", () => { startTime: "09:5", }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorTime); + expect(validate).toThrow(Language.errorTime); }); it("disallows an invalid startTime 24:01", () => { @@ -123,7 +123,7 @@ describe("validationSchema", () => { startTime: "24:01", }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorTime); + expect(validate).toThrow(Language.errorTime); }); it("disallows an invalid startTime 09:60", () => { @@ -132,7 +132,7 @@ describe("validationSchema", () => { startTime: "09:60", }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorTime); + expect(validate).toThrow(Language.errorTime); }); it("disallows an invalid timezone Canada/North", () => { @@ -141,7 +141,7 @@ describe("validationSchema", () => { timezone: "Canada/North", }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorTimezone); + expect(validate).toThrow(Language.errorTimezone); }); it.each<[string]>(timeZones.map((zone) => [zone]))( @@ -162,7 +162,7 @@ describe("validationSchema", () => { ttl: 24 * 7, }; const validate = () => validationSchema.validateSync(values); - expect(validate).not.toThrowError(); + expect(validate).not.toThrow(); }); it("allows a ttl of 30 days", () => { @@ -171,7 +171,7 @@ describe("validationSchema", () => { ttl: 24 * 30, }; const validate = () => validationSchema.validateSync(values); - expect(validate).not.toThrowError(); + expect(validate).not.toThrow(); }); it("disallows a ttl of 30 days + 1 hour", () => { @@ -180,7 +180,7 @@ describe("validationSchema", () => { ttl: 24 * 30 + 1, }; const validate = () => validationSchema.validateSync(values); - expect(validate).toThrowError(Language.errorTtlMax); + expect(validate).toThrow(Language.errorTtlMax); }); it("allows a ttl of 1.2 hours", () => { @@ -189,7 +189,7 @@ describe("validationSchema", () => { ttl: 1.2, }; const validate = () => validationSchema.validateSync(values); - expect(validate).not.toThrowError(); + expect(validate).not.toThrow(); }); }); diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx index 813018f35543a..cdf1f5b0d9726 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.tsx @@ -158,7 +158,7 @@ export const validationSchema = Yup.object({ try { dayjs.tz(dayjs(), value); return true; - } catch (e) { + } catch { return false; } }), diff --git a/site/src/utils/timeZones.ts b/site/src/utils/timeZones.ts index d69574b1ae382..caadd191f0b36 100644 --- a/site/src/utils/timeZones.ts +++ b/site/src/utils/timeZones.ts @@ -1,6 +1,22 @@ +/** + * Ideally the version of tzdata should correspond to the version of the + * timezone database used by the version of Node we're running our tests + * against. For example, Node v20.19.4 and tzdata@1.0.44 both correspond to + * version 2025b of the ICU timezone: + * https://github.com/nodejs/node/blob/v20.19.4/test/fixtures/tz-version.txt + * https://github.com/rogierschouten/tzdata-generate/releases/tag/v1.0.44 + * + * For some reason though, the timezones allowed by `Intl.DateTimeFormat` in + * Node diverged slightly from the timezones present in the tzdata package, + * despite being derived from the same data. Notably, the timezones that we + * filter out below are not allowed by Node as of v20.18.1 and onward–which is + * the version that updated the 20 release line from 2024a to 2024b. + */ import tzData from "tzdata"; -export const timeZones = Object.keys(tzData.zones).sort(); +export const timeZones = Object.keys(tzData.zones) + .filter((it) => it !== "Factory" && it !== "null") + .sort(); export const getPreferredTimezone = () => Intl.DateTimeFormat().resolvedOptions().timeZone; From 408e19fd984028cf1dd6ee5097b95329088eec87 Mon Sep 17 00:00:00 2001 From: Jakub Domeracki Date: Wed, 6 Aug 2025 10:06:23 +0200 Subject: [PATCH 083/260] fix: adjust the condition to actually run this step from release branches (#19187) fix: adjust the condition to actually run this step from release branches --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0fa2d17e0aac4..23e1dfd6d2dab 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -635,7 +635,7 @@ jobs: run: ls -lh build - name: Publish Coder CLI binaries and detached signatures to GCS - if: ${{ !inputs.dry_run && github.ref == 'refs/heads/main' && github.repository_owner == 'coder'}} + if: ${{ !inputs.dry_run }} run: | set -euxo pipefail From 5b80c47e8cb7464dd8e86f1bdeef3b7a01e1cb5a Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Wed, 6 Aug 2025 10:41:01 -0500 Subject: [PATCH 084/260] feat: add `author` filter command to template filtering (#19202) Can do `author:username` to filter templates created by a certain author. Adding to help clean out some templates that I created on our dev instance. This makes sorting a bit easier. --- coderd/database/modelqueries.go | 2 ++ coderd/database/queries.sql.go | 17 ++++++++++++ coderd/database/queries/templates.sql | 13 +++++++++ coderd/searchquery/search.go | 4 ++- coderd/templates_test.go | 40 +++++++++++++++++++++++++++ codersdk/organizations.go | 6 ++++ 6 files changed, 81 insertions(+), 1 deletion(-) diff --git a/coderd/database/modelqueries.go b/coderd/database/modelqueries.go index 2a0abbccfdd9b..dceddd2e8c3da 100644 --- a/coderd/database/modelqueries.go +++ b/coderd/database/modelqueries.go @@ -82,6 +82,8 @@ func (q *sqlQuerier) GetAuthorizedTemplates(ctx context.Context, arg GetTemplate pq.Array(arg.IDs), arg.Deprecated, arg.HasAITask, + arg.AuthorID, + arg.AuthorUsername, ) if err != nil { return nil, err diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 2c1381a3b99f1..b078e2dbb29c0 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -12059,6 +12059,19 @@ WHERE tv.has_ai_task = $7 :: boolean ELSE true END + -- Filter by author_id + AND CASE + WHEN $8 :: uuid != '00000000-0000-0000-0000-000000000000'::uuid THEN + t.created_by = $8 + ELSE true + END + -- Filter by author_username + AND CASE + WHEN $9 :: text != '' THEN + t.created_by = (SELECT id FROM users WHERE lower(users.username) = lower($9) AND deleted = false) + ELSE true + END + -- Authorize Filter clause will be injected below in GetAuthorizedTemplates -- @authorize_filter ORDER BY (t.name, t.id) ASC @@ -12072,6 +12085,8 @@ type GetTemplatesWithFilterParams struct { IDs []uuid.UUID `db:"ids" json:"ids"` Deprecated sql.NullBool `db:"deprecated" json:"deprecated"` HasAITask sql.NullBool `db:"has_ai_task" json:"has_ai_task"` + AuthorID uuid.UUID `db:"author_id" json:"author_id"` + AuthorUsername string `db:"author_username" json:"author_username"` } func (q *sqlQuerier) GetTemplatesWithFilter(ctx context.Context, arg GetTemplatesWithFilterParams) ([]Template, error) { @@ -12083,6 +12098,8 @@ func (q *sqlQuerier) GetTemplatesWithFilter(ctx context.Context, arg GetTemplate pq.Array(arg.IDs), arg.Deprecated, arg.HasAITask, + arg.AuthorID, + arg.AuthorUsername, ) if err != nil { return nil, err diff --git a/coderd/database/queries/templates.sql b/coderd/database/queries/templates.sql index 4a37bd2d1058b..a922a9bef1918 100644 --- a/coderd/database/queries/templates.sql +++ b/coderd/database/queries/templates.sql @@ -59,6 +59,19 @@ WHERE tv.has_ai_task = sqlc.narg('has_ai_task') :: boolean ELSE true END + -- Filter by author_id + AND CASE + WHEN @author_id :: uuid != '00000000-0000-0000-0000-000000000000'::uuid THEN + t.created_by = @author_id + ELSE true + END + -- Filter by author_username + AND CASE + WHEN @author_username :: text != '' THEN + t.created_by = (SELECT id FROM users WHERE lower(users.username) = lower(@author_username) AND deleted = false) + ELSE true + END + -- Authorize Filter clause will be injected below in GetAuthorizedTemplates -- @authorize_filter ORDER BY (t.name, t.id) ASC diff --git a/coderd/searchquery/search.go b/coderd/searchquery/search.go index d35f3c94b5ff7..4f3f3259c09d9 100644 --- a/coderd/searchquery/search.go +++ b/coderd/searchquery/search.go @@ -278,12 +278,14 @@ func Templates(ctx context.Context, db database.Store, query string) (database.G parser := httpapi.NewQueryParamParser() filter := database.GetTemplatesWithFilterParams{ Deleted: parser.Boolean(values, false, "deleted"), + OrganizationID: parseOrganization(ctx, db, parser, values, "organization"), ExactName: parser.String(values, "", "exact_name"), FuzzyName: parser.String(values, "", "name"), IDs: parser.UUIDs(values, []uuid.UUID{}, "ids"), Deprecated: parser.NullableBoolean(values, sql.NullBool{}, "deprecated"), - OrganizationID: parseOrganization(ctx, db, parser, values, "organization"), HasAITask: parser.NullableBoolean(values, sql.NullBool{}, "has-ai-task"), + AuthorID: parser.UUID(values, uuid.Nil, "author_id"), + AuthorUsername: parser.String(values, "", "author"), } parser.ErrorExcessParams(values) diff --git a/coderd/templates_test.go b/coderd/templates_test.go index 0858ce83325cc..8cd5a6ba9bf30 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -814,6 +814,46 @@ func TestTemplatesByOrganization(t *testing.T) { require.False(t, templates[0].Deprecated) require.Empty(t, templates[0].DeprecationMessage) }) + + t.Run("ListByAuthor", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + owner := coderdtest.CreateFirstUser(t, client) + adminAlpha, adminAlphaData := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) + adminBravo, adminBravoData := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) + adminCharlie, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) + + versionA := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) + versionB := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) + versionC := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) + foo := coderdtest.CreateTemplate(t, adminAlpha, owner.OrganizationID, versionA.ID, func(request *codersdk.CreateTemplateRequest) { + request.Name = "foo" + }) + bar := coderdtest.CreateTemplate(t, adminBravo, owner.OrganizationID, versionB.ID, func(request *codersdk.CreateTemplateRequest) { + request.Name = "bar" + }) + _ = coderdtest.CreateTemplate(t, adminCharlie, owner.OrganizationID, versionC.ID, func(request *codersdk.CreateTemplateRequest) { + request.Name = "baz" + }) + + ctx := testutil.Context(t, testutil.WaitLong) + + // List alpha + alpha, err := client.Templates(ctx, codersdk.TemplateFilter{ + AuthorUsername: adminAlphaData.Username, + }) + require.NoError(t, err) + require.Len(t, alpha, 1) + require.Equal(t, foo.ID, alpha[0].ID) + + // List bravo + bravo, err := client.Templates(ctx, codersdk.TemplateFilter{ + AuthorUsername: adminBravoData.Username, + }) + require.NoError(t, err) + require.Len(t, bravo, 1) + require.Equal(t, bar.ID, bravo[0].ID) + }) } func TestTemplateByOrganizationAndName(t *testing.T) { diff --git a/codersdk/organizations.go b/codersdk/organizations.go index 86bc47bce2375..f87d0eae188ba 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -541,6 +541,7 @@ type TemplateFilter struct { OrganizationID uuid.UUID `typescript:"-"` ExactName string `typescript:"-"` FuzzyName string `typescript:"-"` + AuthorUsername string `typescript:"-"` SearchQuery string `json:"q,omitempty"` } @@ -562,6 +563,11 @@ func (f TemplateFilter) asRequestOption() RequestOption { if f.FuzzyName != "" { params = append(params, fmt.Sprintf("name:%q", f.FuzzyName)) } + + if f.AuthorUsername != "" { + params = append(params, fmt.Sprintf("author:%q", f.AuthorUsername)) + } + if f.SearchQuery != "" { params = append(params, f.SearchQuery) } From 3024bdebcb5d641076a37b577e9def92d3bb94dc Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Wed, 6 Aug 2025 11:45:07 -0500 Subject: [PATCH 085/260] chore: support 'me' as the username for template author (#19204) `author:me` to find my templates. Much nicer than knowing my own username --- coderd/searchquery/search.go | 7 ++++++- coderd/searchquery/search_test.go | 11 ++++++++++- coderd/templates.go | 3 ++- coderd/templates_test.go | 6 +++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/coderd/searchquery/search.go b/coderd/searchquery/search.go index 4f3f3259c09d9..cbaaa74a848eb 100644 --- a/coderd/searchquery/search.go +++ b/coderd/searchquery/search.go @@ -263,7 +263,7 @@ func Workspaces(ctx context.Context, db database.Store, query string, page coder return filter, parser.Errors } -func Templates(ctx context.Context, db database.Store, query string) (database.GetTemplatesWithFilterParams, []codersdk.ValidationError) { +func Templates(ctx context.Context, db database.Store, actorID uuid.UUID, query string) (database.GetTemplatesWithFilterParams, []codersdk.ValidationError) { // Always lowercase for all searches. query = strings.ToLower(query) values, errors := searchTerms(query, func(term string, values url.Values) error { @@ -288,6 +288,11 @@ func Templates(ctx context.Context, db database.Store, query string) (database.G AuthorUsername: parser.String(values, "", "author"), } + if filter.AuthorUsername == codersdk.Me { + filter.AuthorID = actorID + filter.AuthorUsername = "" + } + parser.ErrorExcessParams(values) return filter, parser.Errors } diff --git a/coderd/searchquery/search_test.go b/coderd/searchquery/search_test.go index 4744b57edff4a..5c45274668b25 100644 --- a/coderd/searchquery/search_test.go +++ b/coderd/searchquery/search_test.go @@ -640,6 +640,7 @@ func TestSearchUsers(t *testing.T) { func TestSearchTemplates(t *testing.T) { t.Parallel() + userID := uuid.New() testCases := []struct { Name string Query string @@ -688,6 +689,14 @@ func TestSearchTemplates(t *testing.T) { }, }, }, + { + Name: "MyTemplates", + Query: "author:me", + Expected: database.GetTemplatesWithFilterParams{ + AuthorUsername: "", + AuthorID: userID, + }, + }, } for _, c := range testCases { @@ -696,7 +705,7 @@ func TestSearchTemplates(t *testing.T) { // Do not use a real database, this is only used for an // organization lookup. db, _ := dbtestutil.NewDB(t) - values, errs := searchquery.Templates(context.Background(), db, c.Query) + values, errs := searchquery.Templates(context.Background(), db, userID, c.Query) if c.ExpectedErrorContains != "" { require.True(t, len(errs) > 0, "expect some errors") var s strings.Builder diff --git a/coderd/templates.go b/coderd/templates.go index 694bb90b86a4d..f9c5d8271a1e6 100644 --- a/coderd/templates.go +++ b/coderd/templates.go @@ -544,9 +544,10 @@ func (api *API) templatesByOrganization() http.HandlerFunc { func (api *API) fetchTemplates(mutate func(r *http.Request, arg *database.GetTemplatesWithFilterParams)) http.HandlerFunc { return func(rw http.ResponseWriter, r *http.Request) { ctx := r.Context() + key := httpmw.APIKey(r) queryStr := r.URL.Query().Get("q") - filter, errs := searchquery.Templates(ctx, api.Database, queryStr) + filter, errs := searchquery.Templates(ctx, api.Database, key.UserID, queryStr) if len(errs) > 0 { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ Message: "Invalid template search query.", diff --git a/coderd/templates_test.go b/coderd/templates_test.go index 8cd5a6ba9bf30..050ae77f8ca49 100644 --- a/coderd/templates_test.go +++ b/coderd/templates_test.go @@ -820,7 +820,7 @@ func TestTemplatesByOrganization(t *testing.T) { client := coderdtest.New(t, nil) owner := coderdtest.CreateFirstUser(t, client) adminAlpha, adminAlphaData := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) - adminBravo, adminBravoData := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) + adminBravo, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) adminCharlie, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.RoleTemplateAdmin()) versionA := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) @@ -847,8 +847,8 @@ func TestTemplatesByOrganization(t *testing.T) { require.Equal(t, foo.ID, alpha[0].ID) // List bravo - bravo, err := client.Templates(ctx, codersdk.TemplateFilter{ - AuthorUsername: adminBravoData.Username, + bravo, err := adminBravo.Templates(ctx, codersdk.TemplateFilter{ + AuthorUsername: codersdk.Me, }) require.NoError(t, err) require.Len(t, bravo, 1) From 1c70d32ef36593011af9fdb5c3b082cc97ed3775 Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Wed, 6 Aug 2025 18:24:38 +0100 Subject: [PATCH 086/260] fix(site): hide "Show parent apps" when no running or starting devcontainers (#19200) Fixes https://github.com/coder/coder/issues/19199 We now hide the "Show parent apps" button when there are no running or starting devcontainers. --- .../modules/resources/AgentRow.stories.tsx | 43 ++++++++++++++++--- site/src/modules/resources/AgentRow.tsx | 21 +++++---- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/site/src/modules/resources/AgentRow.stories.tsx b/site/src/modules/resources/AgentRow.stories.tsx index a5ad16ae9f97b..c1bc40e98eb1d 100644 --- a/site/src/modules/resources/AgentRow.stories.tsx +++ b/site/src/modules/resources/AgentRow.stories.tsx @@ -286,10 +286,43 @@ export const GroupApp: Story = { }; export const Devcontainer: Story = { - beforeEach: () => { - spyOn(API, "getAgentContainers").mockResolvedValue({ - devcontainers: [M.MockWorkspaceAgentDevcontainer], - containers: [M.MockWorkspaceAgentContainer], - }); + parameters: { + queries: [ + { + key: ["agents", M.MockWorkspaceAgent.id, "containers"], + data: { + devcontainers: [M.MockWorkspaceAgentDevcontainer], + containers: [M.MockWorkspaceAgentContainer], + }, + }, + ], + webSocket: [], + }, +}; + +export const FoundDevcontainer: Story = { + args: { + agent: { + ...M.MockWorkspaceAgentReady, + }, + }, + parameters: { + queries: [ + { + key: ["agents", M.MockWorkspaceAgentReady.id, "containers"], + data: { + devcontainers: [ + { + ...M.MockWorkspaceAgentDevcontainer, + status: "stopped", + container: undefined, + agent: undefined, + }, + ], + containers: [], + }, + }, + ], + webSocket: [], }, }; diff --git a/site/src/modules/resources/AgentRow.tsx b/site/src/modules/resources/AgentRow.tsx index ab0e5884c48e9..3cf757a15c2ab 100644 --- a/site/src/modules/resources/AgentRow.tsx +++ b/site/src/modules/resources/AgentRow.tsx @@ -137,17 +137,16 @@ export const AgentRow: FC = ({ // This is used to show the parent apps of the devcontainer. const [showParentApps, setShowParentApps] = useState(false); - let shouldDisplayAppsSection = shouldDisplayAgentApps; - if ( - devcontainers && - devcontainers.find( - // We only want to hide the parent apps by default when there are dev - // containers that are either starting or running. If they are all in - // the stopped state, it doesn't make sense to hide the parent apps. + const anyRunningOrStartingDevcontainers = + devcontainers?.find( (dc) => dc.status === "running" || dc.status === "starting", - ) !== undefined && - !showParentApps - ) { + ) !== undefined; + + // We only want to hide the parent apps by default when there are dev + // containers that are either starting or running. If they are all in + // the stopped state, it doesn't make sense to hide the parent apps. + let shouldDisplayAppsSection = shouldDisplayAgentApps; + if (anyRunningOrStartingDevcontainers && !showParentApps) { shouldDisplayAppsSection = false; } @@ -187,7 +186,7 @@ export const AgentRow: FC = ({
    - {devcontainers && devcontainers.length > 0 && ( + {anyRunningOrStartingDevcontainers && (
    {externalApps.length > 0 && ( -
    - - - - - - {externalApps.map((app) => { - const link = useAppLink(app, { - agent, - workspace: task.workspace, - }); - - return ( - - - {app.icon ? ( - - ) : ( - - )} - {link.label} - - - ); - })} - - -
    + )}
    -
    - {embeddedApps.map((app) => { - return ( - - ); - })} -
    + {embeddedApps.length > 0 ? ( +
    + {embeddedApps.map((app) => { + return ( + + ); + })} +
    + ) : ( +
    +

    + No embedded apps found. +

    + + + + Learn how to configure apps + {" "} + for your tasks. + +
    + )} ); }; +type TaskExternalAppsDropdownProps = { + task: Task; + agents: WorkspaceAgent[]; + externalApps: WorkspaceApp[]; +}; + +const TaskExternalAppsDropdown: FC = ({ + task, + agents, + externalApps, +}) => { + return ( +
    + + + + + + {externalApps.map((app) => { + const agent = agents.find((agent) => + agent.apps.some((a) => a.id === app.id), + ); + if (!agent) { + throw new Error( + `Agent for app ${app.id} not found in task workspace`, + ); + } + + const link = useAppLink(app, { + agent, + workspace: task.workspace, + }); + + return ( + + + {app.icon ? ( + + ) : ( + + )} + {link.label} + + + ); + })} + + +
    + ); +}; + type TaskAppTabProps = { task: Task; app: WorkspaceApp; From 02de067d46ddfd7f49f42f85482585cc2764cf2c Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Thu, 7 Aug 2025 17:03:51 +0100 Subject: [PATCH 099/260] refactor(site): remove usage of `throw` in `TaskApps.tsx` (#19235) --- site/src/pages/TaskPage/TaskApps.tsx | 57 ++++++++++++++-------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/site/src/pages/TaskPage/TaskApps.tsx b/site/src/pages/TaskPage/TaskApps.tsx index 1fd31bd3b1481..83cd01f37c004 100644 --- a/site/src/pages/TaskPage/TaskApps.tsx +++ b/site/src/pages/TaskPage/TaskApps.tsx @@ -23,6 +23,11 @@ type TaskAppsProps = { task: Task; }; +type AppWithAgent = { + app: WorkspaceApp; + agent: WorkspaceAgent; +}; + export const TaskApps: FC = ({ task }) => { const agents = task.workspace.latest_build.resources .flatMap((r) => r.agents) @@ -31,27 +36,34 @@ export const TaskApps: FC = ({ task }) => { // The Chat UI app will be displayed in the sidebar, so we don't want to show // it here const apps = agents - .flatMap((a) => a?.apps) + .flatMap((agent) => + agent.apps.map((app) => ({ + app, + agent, + })), + ) .filter( - (a) => !!a && a.id !== task.workspace.latest_build.ai_task_sidebar_app_id, + ({ app }) => + !!app && app.id !== task.workspace.latest_build.ai_task_sidebar_app_id, ); - const embeddedApps = apps.filter((app) => !app.external); - const externalApps = apps.filter((app) => app.external); + const embeddedApps = apps.filter(({ app }) => !app.external); + const externalApps = apps.filter(({ app }) => app.external); const [activeAppId, setActiveAppId] = useState( - embeddedApps[0]?.id, + embeddedApps[0]?.app.id, ); return (
    + + ); }; -type TasksTableProps = { - filter: TasksFilter; +type PillButtonProps = ButtonProps & { + active?: boolean; }; -const TasksTable: FC = ({ filter }) => { - const { - data: tasks, - error, - refetch, - } = useQuery({ - queryKey: ["tasks", filter], - queryFn: () => data.fetchTasks(filter), - refetchInterval: 10_000, - }); - - let body: ReactNode = null; - - if (error) { - const message = getErrorMessage(error, "Error loading tasks"); - const detail = getErrorDetail(error) ?? "Please try again"; - - body = ( - - -
    -
    -

    - {message} -

    - {detail} - -
    -
    -
    -
    - ); - } else if (tasks) { - body = - tasks.length === 0 ? ( - - -
    -
    -

    - No tasks found -

    - - Use the form above to run a task - -
    -
    -
    -
    - ) : ( - tasks.map(({ workspace, prompt }) => { - const templateDisplayName = - workspace.template_display_name ?? workspace.template_name; - - return ( - - - - - {prompt} - - - Access task - - - } - subtitle={templateDisplayName} - avatar={ - - } - /> - - - - - - - {relativeTime(new Date(workspace.created_at))} - - } - src={workspace.owner_avatar_url} - /> - - - ); - }) - ); - } else { - body = ( - - - - - - - - - - - - - - ); - } - +const PillButton: FC = ({ className, active, ...props }) => { return ( - - - - Task - Status - Created by - - - {body} -
    + +
    - {embeddedApps.map((app) => ( + {embeddedApps.map(({ app, agent }) => ( { e.preventDefault(); @@ -72,7 +84,7 @@ export const TaskApps: FC = ({ task }) => { {embeddedApps.length > 0 ? (
    - {embeddedApps.map((app) => { + {embeddedApps.map(({ app }) => { return ( = ({ task }) => { type TaskExternalAppsDropdownProps = { task: Task; agents: WorkspaceAgent[]; - externalApps: WorkspaceApp[]; + externalApps: AppWithAgent[]; }; const TaskExternalAppsDropdown: FC = ({ @@ -126,16 +138,7 @@ const TaskExternalAppsDropdown: FC = ({ - {externalApps.map((app) => { - const agent = agents.find((agent) => - agent.apps.some((a) => a.id === app.id), - ); - if (!agent) { - throw new Error( - `Agent for app ${app.id} not found in task workspace`, - ); - } - + {externalApps.map(({ app, agent }) => { const link = useAppLink(app, { agent, workspace: task.workspace, @@ -163,20 +166,18 @@ const TaskExternalAppsDropdown: FC = ({ type TaskAppTabProps = { task: Task; app: WorkspaceApp; + agent: WorkspaceAgent; active: boolean; onClick: (e: React.MouseEvent) => void; }; -const TaskAppTab: FC = ({ task, app, active, onClick }) => { - const agent = task.workspace.latest_build.resources - .flatMap((r) => r.agents) - .filter((a) => !!a) - .find((a) => a.apps.some((a) => a.id === app.id)); - - if (!agent) { - throw new Error(`Agent for app ${app.id} not found in task workspace`); - } - +const TaskAppTab: FC = ({ + task, + app, + agent, + active, + onClick, +}) => { const link = useAppLink(app, { agent, workspace: task.workspace, From 26458cd6f05f1d2f211ba2e891373bff6eca8594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Thu, 7 Aug 2025 10:14:58 -0600 Subject: [PATCH 100/260] refactor: consolidate template and workspace acl validation (#19192) --- coderd/coderd.go | 3 +- coderd/database/dbauthz/dbauthz.go | 20 ++++ coderd/database/dbauthz/dbauthz_test.go | 9 ++ coderd/database/dbmetrics/querymetrics.go | 14 +++ coderd/database/dbmock/dbmock.go | 30 +++++ coderd/database/querier.go | 2 + coderd/database/queries.sql.go | 64 +++++++++++ coderd/database/queries/groups.sql | 18 +++ coderd/database/queries/users.sql | 20 ++++ coderd/rbac/acl/updatevalidator.go | 130 ++++++++++++++++++++++ coderd/rbac/acl/updatevalidator_test.go | 91 +++++++++++++++ coderd/workspaces.go | 64 +++-------- enterprise/coderd/templates.go | 76 ++++--------- enterprise/coderd/templates_test.go | 97 +++++++++++++++- 14 files changed, 535 insertions(+), 103 deletions(-) create mode 100644 coderd/rbac/acl/updatevalidator.go create mode 100644 coderd/rbac/acl/updatevalidator_test.go diff --git a/coderd/coderd.go b/coderd/coderd.go index 26bf4a7bf9b63..4168374c06820 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -1415,7 +1415,8 @@ func New(options *Options) *API { r.Get("/timings", api.workspaceTimings) r.Route("/acl", func(r chi.Router) { r.Use( - httpmw.RequireExperiment(api.Experiments, codersdk.ExperimentWorkspaceSharing)) + httpmw.RequireExperiment(api.Experiments, codersdk.ExperimentWorkspaceSharing), + ) r.Patch("/", api.patchWorkspaceACL) }) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 99dd9833fa5d6..4e752399e08eb 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -5376,6 +5376,26 @@ func (q *querier) UpsertWorkspaceAppAuditSession(ctx context.Context, arg databa return q.db.UpsertWorkspaceAppAuditSession(ctx, arg) } +func (q *querier) ValidateGroupIDs(ctx context.Context, groupIDs []uuid.UUID) (database.ValidateGroupIDsRow, error) { + // This check is probably overly restrictive, but the "correct" check isn't + // necessarily obvious. It's only used as a verification check for ACLs right + // now, which are performed as system. + if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil { + return database.ValidateGroupIDsRow{}, err + } + return q.db.ValidateGroupIDs(ctx, groupIDs) +} + +func (q *querier) ValidateUserIDs(ctx context.Context, userIDs []uuid.UUID) (database.ValidateUserIDsRow, error) { + // This check is probably overly restrictive, but the "correct" check isn't + // necessarily obvious. It's only used as a verification check for ACLs right + // now, which are performed as system. + if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil { + return database.ValidateUserIDsRow{}, err + } + return q.db.ValidateUserIDs(ctx, userIDs) +} + func (q *querier) GetAuthorizedTemplates(ctx context.Context, arg database.GetTemplatesWithFilterParams, _ rbac.PreparedAuthorized) ([]database.Template, error) { // TODO Delete this function, all GetTemplates should be authorized. For now just call getTemplates on the authz querier. return q.GetTemplatesWithFilter(ctx, arg) diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index 66a477ebfbaba..deca01456244f 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -623,6 +623,11 @@ func (s *MethodTestSuite) TestGroup() { ID: g.ID, }).Asserts(g, policy.ActionUpdate) })) + s.Run("ValidateGroupIDs", s.Subtest(func(db database.Store, check *expects) { + o := dbgen.Organization(s.T(), db, database.Organization{}) + g := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID}) + check.Args([]uuid.UUID{g.ID}).Asserts(rbac.ResourceSystem, policy.ActionRead) + })) } func (s *MethodTestSuite) TestProvisionerJob() { @@ -2077,6 +2082,10 @@ func (s *MethodTestSuite) TestUser() { Interval: int32((time.Hour * 24).Seconds()), }).Asserts(rbac.ResourceUser, policy.ActionRead) })) + s.Run("ValidateUserIDs", s.Subtest(func(db database.Store, check *expects) { + u := dbgen.User(s.T(), db, database.User{}) + check.Args([]uuid.UUID{u.ID}).Asserts(rbac.ResourceSystem, policy.ActionRead) + })) } func (s *MethodTestSuite) TestWorkspace() { diff --git a/coderd/database/dbmetrics/querymetrics.go b/coderd/database/dbmetrics/querymetrics.go index d0cd0d1ab797d..bbed6b55346c8 100644 --- a/coderd/database/dbmetrics/querymetrics.go +++ b/coderd/database/dbmetrics/querymetrics.go @@ -3372,6 +3372,20 @@ func (m queryMetricsStore) UpsertWorkspaceAppAuditSession(ctx context.Context, a return r0, r1 } +func (m queryMetricsStore) ValidateGroupIDs(ctx context.Context, groupIds []uuid.UUID) (database.ValidateGroupIDsRow, error) { + start := time.Now() + r0, r1 := m.s.ValidateGroupIDs(ctx, groupIds) + m.queryLatencies.WithLabelValues("ValidateGroupIDs").Observe(time.Since(start).Seconds()) + return r0, r1 +} + +func (m queryMetricsStore) ValidateUserIDs(ctx context.Context, userIds []uuid.UUID) (database.ValidateUserIDsRow, error) { + start := time.Now() + r0, r1 := m.s.ValidateUserIDs(ctx, userIds) + m.queryLatencies.WithLabelValues("ValidateUserIDs").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m queryMetricsStore) GetAuthorizedTemplates(ctx context.Context, arg database.GetTemplatesWithFilterParams, prepared rbac.PreparedAuthorized) ([]database.Template, error) { start := time.Now() templates, err := m.s.GetAuthorizedTemplates(ctx, arg, prepared) diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index e88763ba1eb74..e1d40f12eb521 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -7159,6 +7159,36 @@ func (mr *MockStoreMockRecorder) UpsertWorkspaceAppAuditSession(ctx, arg any) *g return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertWorkspaceAppAuditSession", reflect.TypeOf((*MockStore)(nil).UpsertWorkspaceAppAuditSession), ctx, arg) } +// ValidateGroupIDs mocks base method. +func (m *MockStore) ValidateGroupIDs(ctx context.Context, groupIds []uuid.UUID) (database.ValidateGroupIDsRow, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidateGroupIDs", ctx, groupIds) + ret0, _ := ret[0].(database.ValidateGroupIDsRow) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ValidateGroupIDs indicates an expected call of ValidateGroupIDs. +func (mr *MockStoreMockRecorder) ValidateGroupIDs(ctx, groupIds any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateGroupIDs", reflect.TypeOf((*MockStore)(nil).ValidateGroupIDs), ctx, groupIds) +} + +// ValidateUserIDs mocks base method. +func (m *MockStore) ValidateUserIDs(ctx context.Context, userIds []uuid.UUID) (database.ValidateUserIDsRow, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidateUserIDs", ctx, userIds) + ret0, _ := ret[0].(database.ValidateUserIDsRow) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ValidateUserIDs indicates an expected call of ValidateUserIDs. +func (mr *MockStoreMockRecorder) ValidateUserIDs(ctx, userIds any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateUserIDs", reflect.TypeOf((*MockStore)(nil).ValidateUserIDs), ctx, userIds) +} + // Wrappers mocks base method. func (m *MockStore) Wrappers() []string { m.ctrl.T.Helper() diff --git a/coderd/database/querier.go b/coderd/database/querier.go index a50bb0bb2192a..1ea4ae5376f80 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -689,6 +689,8 @@ type sqlcQuerier interface { // was started. This means that a new row was inserted (no previous session) or // the updated_at is older than stale interval. UpsertWorkspaceAppAuditSession(ctx context.Context, arg UpsertWorkspaceAppAuditSessionParams) (bool, error) + ValidateGroupIDs(ctx context.Context, groupIds []uuid.UUID) (ValidateGroupIDsRow, error) + ValidateUserIDs(ctx context.Context, userIds []uuid.UUID) (ValidateUserIDsRow, error) } var _ sqlcQuerier = (*sqlQuerier)(nil) diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index b078e2dbb29c0..4adc936683067 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -2869,6 +2869,37 @@ func (q *sqlQuerier) UpdateGroupByID(ctx context.Context, arg UpdateGroupByIDPar return i, err } +const validateGroupIDs = `-- name: ValidateGroupIDs :one +WITH input AS ( + SELECT + unnest($1::uuid[]) AS id +) +SELECT + array_agg(input.id)::uuid[] as invalid_group_ids, + COUNT(*) = 0 as ok +FROM + -- Preserve rows where there is not a matching left (groups) row for each + -- right (input) row... + groups + RIGHT JOIN input ON groups.id = input.id +WHERE + -- ...so that we can retain exactly those rows where an input ID does not + -- match an existing group. + groups.id IS NULL +` + +type ValidateGroupIDsRow struct { + InvalidGroupIds []uuid.UUID `db:"invalid_group_ids" json:"invalid_group_ids"` + Ok bool `db:"ok" json:"ok"` +} + +func (q *sqlQuerier) ValidateGroupIDs(ctx context.Context, groupIds []uuid.UUID) (ValidateGroupIDsRow, error) { + row := q.db.QueryRowContext(ctx, validateGroupIDs, pq.Array(groupIds)) + var i ValidateGroupIDsRow + err := row.Scan(pq.Array(&i.InvalidGroupIds), &i.Ok) + return i, err +} + const getTemplateAppInsights = `-- name: GetTemplateAppInsights :many WITH -- Create a list of all unique apps by template, this is used to @@ -14792,6 +14823,39 @@ func (q *sqlQuerier) UpdateUserThemePreference(ctx context.Context, arg UpdateUs return i, err } +const validateUserIDs = `-- name: ValidateUserIDs :one +WITH input AS ( + SELECT + unnest($1::uuid[]) AS id +) +SELECT + array_agg(input.id)::uuid[] as invalid_user_ids, + COUNT(*) = 0 as ok +FROM + -- Preserve rows where there is not a matching left (users) row for each + -- right (input) row... + users + RIGHT JOIN input ON users.id = input.id +WHERE + -- ...so that we can retain exactly those rows where an input ID does not + -- match an existing user... + users.id IS NULL OR + -- ...or that only matches a user that was deleted. + users.deleted = true +` + +type ValidateUserIDsRow struct { + InvalidUserIds []uuid.UUID `db:"invalid_user_ids" json:"invalid_user_ids"` + Ok bool `db:"ok" json:"ok"` +} + +func (q *sqlQuerier) ValidateUserIDs(ctx context.Context, userIds []uuid.UUID) (ValidateUserIDsRow, error) { + row := q.db.QueryRowContext(ctx, validateUserIDs, pq.Array(userIds)) + var i ValidateUserIDsRow + err := row.Scan(pq.Array(&i.InvalidUserIds), &i.Ok) + return i, err +} + const getWorkspaceAgentDevcontainersByAgentID = `-- name: GetWorkspaceAgentDevcontainersByAgentID :many SELECT id, workspace_agent_id, created_at, workspace_folder, config_path, name diff --git a/coderd/database/queries/groups.sql b/coderd/database/queries/groups.sql index 48a5ba5c79968..3413e5832e27d 100644 --- a/coderd/database/queries/groups.sql +++ b/coderd/database/queries/groups.sql @@ -8,6 +8,24 @@ WHERE LIMIT 1; +-- name: ValidateGroupIDs :one +WITH input AS ( + SELECT + unnest(@group_ids::uuid[]) AS id +) +SELECT + array_agg(input.id)::uuid[] as invalid_group_ids, + COUNT(*) = 0 as ok +FROM + -- Preserve rows where there is not a matching left (groups) row for each + -- right (input) row... + groups + RIGHT JOIN input ON groups.id = input.id +WHERE + -- ...so that we can retain exactly those rows where an input ID does not + -- match an existing group. + groups.id IS NULL; + -- name: GetGroupByOrgAndName :one SELECT * diff --git a/coderd/database/queries/users.sql b/coderd/database/queries/users.sql index eece2f96512ea..0b6e52d6bc918 100644 --- a/coderd/database/queries/users.sql +++ b/coderd/database/queries/users.sql @@ -25,6 +25,26 @@ WHERE LIMIT 1; +-- name: ValidateUserIDs :one +WITH input AS ( + SELECT + unnest(@user_ids::uuid[]) AS id +) +SELECT + array_agg(input.id)::uuid[] as invalid_user_ids, + COUNT(*) = 0 as ok +FROM + -- Preserve rows where there is not a matching left (users) row for each + -- right (input) row... + users + RIGHT JOIN input ON users.id = input.id +WHERE + -- ...so that we can retain exactly those rows where an input ID does not + -- match an existing user... + users.id IS NULL OR + -- ...or that only matches a user that was deleted. + users.deleted = true; + -- name: GetUsersByIDs :many -- This shouldn't check for deleted, because it's frequently used -- to look up references to actions. eg. a user could build a workspace diff --git a/coderd/rbac/acl/updatevalidator.go b/coderd/rbac/acl/updatevalidator.go new file mode 100644 index 0000000000000..9785609f2e33a --- /dev/null +++ b/coderd/rbac/acl/updatevalidator.go @@ -0,0 +1,130 @@ +package acl + +import ( + "context" + "fmt" + + "github.com/google/uuid" + + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbauthz" + "github.com/coder/coder/v2/codersdk" +) + +type UpdateValidator[Role codersdk.WorkspaceRole | codersdk.TemplateRole] interface { + // Users should return a map from user UUIDs (as strings) to the role they + // are being assigned. Additionally, it should return a string that will be + // used as the field name for the ValidationErrors returned from Validate. + Users() (map[string]Role, string) + // Groups should return a map from group UUIDs (as strings) to the role they + // are being assigned. Additionally, it should return a string that will be + // used as the field name for the ValidationErrors returned from Validate. + Groups() (map[string]Role, string) + // ValidateRole should return an error that will be used in the + // ValidationError if the role is invalid for the corresponding resource type. + ValidateRole(role Role) error +} + +func Validate[Role codersdk.WorkspaceRole | codersdk.TemplateRole]( + ctx context.Context, + db database.Store, + v UpdateValidator[Role], +) []codersdk.ValidationError { + // nolint:gocritic // Validate requires full read access to users and groups + ctx = dbauthz.AsSystemRestricted(ctx) + var validErrs []codersdk.ValidationError + + groupRoles, groupsField := v.Groups() + groupIDs := make([]uuid.UUID, 0, len(groupRoles)) + for idStr, role := range groupRoles { + // Validate the provided role names + if err := v.ValidateRole(role); err != nil { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: groupsField, + Detail: err.Error(), + }) + } + // Validate that the IDs are UUIDs + id, err := uuid.Parse(idStr) + if err != nil { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: groupsField, + Detail: fmt.Sprintf("%v is not a valid UUID.", idStr), + }) + continue + } + // Don't check if the ID exists when setting the role to + // WorkspaceRoleDeleted or TemplateRoleDeleted. They might've existing at + // some point and got deleted. If we report that as an error here then they + // can't be removed. + if string(role) == "" { + continue + } + groupIDs = append(groupIDs, id) + } + + // Validate that the groups exist + groupValidation, err := db.ValidateGroupIDs(ctx, groupIDs) + if err != nil { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: groupsField, + Detail: fmt.Sprintf("failed to validate group IDs: %v", err.Error()), + }) + } + if !groupValidation.Ok { + for _, id := range groupValidation.InvalidGroupIds { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: groupsField, + Detail: fmt.Sprintf("group with ID %v does not exist", id), + }) + } + } + + userRoles, usersField := v.Users() + userIDs := make([]uuid.UUID, 0, len(userRoles)) + for idStr, role := range userRoles { + // Validate the provided role names + if err := v.ValidateRole(role); err != nil { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: usersField, + Detail: err.Error(), + }) + } + // Validate that the IDs are UUIDs + id, err := uuid.Parse(idStr) + if err != nil { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: usersField, + Detail: fmt.Sprintf("%v is not a valid UUID.", idStr), + }) + continue + } + // Don't check if the ID exists when setting the role to + // WorkspaceRoleDeleted or TemplateRoleDeleted. They might've existing at + // some point and got deleted. If we report that as an error here then they + // can't be removed. + if string(role) == "" { + continue + } + userIDs = append(userIDs, id) + } + + // Validate that the groups exist + userValidation, err := db.ValidateUserIDs(ctx, userIDs) + if err != nil { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: usersField, + Detail: fmt.Sprintf("failed to validate user IDs: %v", err.Error()), + }) + } + if !userValidation.Ok { + for _, id := range userValidation.InvalidUserIds { + validErrs = append(validErrs, codersdk.ValidationError{ + Field: usersField, + Detail: fmt.Sprintf("user with ID %v does not exist", id), + }) + } + } + + return validErrs +} diff --git a/coderd/rbac/acl/updatevalidator_test.go b/coderd/rbac/acl/updatevalidator_test.go new file mode 100644 index 0000000000000..0e394370b1356 --- /dev/null +++ b/coderd/rbac/acl/updatevalidator_test.go @@ -0,0 +1,91 @@ +package acl_test + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" + + "github.com/coder/coder/v2/coderd" + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbgen" + "github.com/coder/coder/v2/coderd/database/dbtestutil" + "github.com/coder/coder/v2/coderd/rbac/acl" + "github.com/coder/coder/v2/codersdk" + "github.com/coder/coder/v2/testutil" +) + +func TestOK(t *testing.T) { + t.Parallel() + + db, _ := dbtestutil.NewDB(t) + o := dbgen.Organization(t, db, database.Organization{}) + g := dbgen.Group(t, db, database.Group{OrganizationID: o.ID}) + u := dbgen.User(t, db, database.User{}) + ctx := testutil.Context(t, testutil.WaitShort) + + update := codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + u.ID.String(): codersdk.WorkspaceRoleAdmin, + // An unknown ID is allowed if and only if the specified role is either + // codersdk.WorkspaceRoleDeleted or codersdk.TemplateRoleDeleted. + uuid.NewString(): codersdk.WorkspaceRoleDeleted, + }, + GroupRoles: map[string]codersdk.WorkspaceRole{ + g.ID.String(): codersdk.WorkspaceRoleAdmin, + // An unknown ID is allowed if and only if the specified role is either + // codersdk.WorkspaceRoleDeleted or codersdk.TemplateRoleDeleted. + uuid.NewString(): codersdk.WorkspaceRoleDeleted, + }, + } + errors := acl.Validate(ctx, db, coderd.WorkspaceACLUpdateValidator(update)) + require.Empty(t, errors) +} + +func TestDeniesUnknownIDs(t *testing.T) { + t.Parallel() + + db, _ := dbtestutil.NewDB(t) + ctx := testutil.Context(t, testutil.WaitShort) + + update := codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + uuid.NewString(): codersdk.WorkspaceRoleAdmin, + }, + GroupRoles: map[string]codersdk.WorkspaceRole{ + uuid.NewString(): codersdk.WorkspaceRoleAdmin, + }, + } + errors := acl.Validate(ctx, db, coderd.WorkspaceACLUpdateValidator(update)) + require.Len(t, errors, 2) + require.Equal(t, errors[0].Field, "group_roles") + require.ErrorContains(t, errors[0], "does not exist") + require.Equal(t, errors[1].Field, "user_roles") + require.ErrorContains(t, errors[1], "does not exist") +} + +func TestDeniesUnknownRolesAndInvalidIDs(t *testing.T) { + t.Parallel() + + db, _ := dbtestutil.NewDB(t) + ctx := testutil.Context(t, testutil.WaitShort) + + update := codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + "Quifrey": "level 5", + }, + GroupRoles: map[string]codersdk.WorkspaceRole{ + "apprentices": "level 2", + }, + } + errors := acl.Validate(ctx, db, coderd.WorkspaceACLUpdateValidator(update)) + require.Len(t, errors, 4) + require.Equal(t, errors[0].Field, "group_roles") + require.ErrorContains(t, errors[0], "role \"level 2\" is not a valid workspace role") + require.Equal(t, errors[1].Field, "group_roles") + require.ErrorContains(t, errors[1], "not a valid UUID") + require.Equal(t, errors[2].Field, "user_roles") + require.ErrorContains(t, errors[2], "role \"level 5\" is not a valid workspace role") + require.Equal(t, errors[3].Field, "user_roles") + require.ErrorContains(t, errors[3], "not a valid UUID") +} diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 8d1376e7e6939..6da85c7608ca4 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -32,6 +32,7 @@ import ( "github.com/coder/coder/v2/coderd/notifications" "github.com/coder/coder/v2/coderd/prebuilds" "github.com/coder/coder/v2/coderd/rbac" + "github.com/coder/coder/v2/coderd/rbac/acl" "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/schedule" "github.com/coder/coder/v2/coderd/schedule/cron" @@ -2086,17 +2087,10 @@ func (api *API) patchWorkspaceACL(rw http.ResponseWriter, r *http.Request) { return } - validErrs := validateWorkspaceACLPerms(ctx, api.Database, req.UserRoles, "user_roles") - validErrs = append(validErrs, validateWorkspaceACLPerms( - ctx, - api.Database, - req.GroupRoles, - "group_roles", - )...) - + validErrs := acl.Validate(ctx, api.Database, WorkspaceACLUpdateValidator(req)) if len(validErrs) > 0 { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ - Message: "Invalid request to update template metadata!", + Message: "Invalid request to update workspace ACL", Validations: validErrs, }) return @@ -2492,50 +2486,28 @@ func (api *API) publishWorkspaceAgentLogsUpdate(ctx context.Context, workspaceAg } } -func validateWorkspaceACLPerms(ctx context.Context, db database.Store, perms map[string]codersdk.WorkspaceRole, field string) []codersdk.ValidationError { - // nolint:gocritic // Validate requires full read access to users and groups - ctx = dbauthz.AsSystemRestricted(ctx) - var validErrs []codersdk.ValidationError - for idStr, role := range perms { - if err := validateWorkspaceRole(role); err != nil { - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: err.Error()}) - continue - } +type WorkspaceACLUpdateValidator codersdk.UpdateWorkspaceACL - id, err := uuid.Parse(idStr) - if err != nil { - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: idStr + "is not a valid UUID."}) - continue - } +var ( + workspaceACLUpdateUsersFieldName = "user_roles" + workspaceACLUpdateGroupsFieldName = "group_roles" +) - switch field { - case "user_roles": - // TODO(lilac): put this back after Kirby button shenanigans are over - // This could get slow if we get a ton of user perm updates. - // _, err = db.GetUserByID(ctx, id) - // if err != nil { - // validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: fmt.Sprintf("Failed to find resource with ID %q: %v", idStr, err.Error())}) - // continue - // } - case "group_roles": - // This could get slow if we get a ton of group perm updates. - _, err = db.GetGroupByID(ctx, id) - if err != nil { - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: fmt.Sprintf("Failed to find resource with ID %q: %v", idStr, err.Error())}) - continue - } - default: - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: "invalid field"}) - } - } +// WorkspaceACLUpdateValidator implements acl.UpdateValidator[codersdk.WorkspaceRole] +var _ acl.UpdateValidator[codersdk.WorkspaceRole] = WorkspaceACLUpdateValidator{} + +func (w WorkspaceACLUpdateValidator) Users() (map[string]codersdk.WorkspaceRole, string) { + return w.UserRoles, workspaceACLUpdateUsersFieldName +} - return validErrs +func (w WorkspaceACLUpdateValidator) Groups() (map[string]codersdk.WorkspaceRole, string) { + return w.GroupRoles, workspaceACLUpdateGroupsFieldName } -func validateWorkspaceRole(role codersdk.WorkspaceRole) error { +func (WorkspaceACLUpdateValidator) ValidateRole(role codersdk.WorkspaceRole) error { actions := db2sdk.WorkspaceRoleActions(role) if len(actions) == 0 && role != codersdk.WorkspaceRoleDeleted { - return xerrors.Errorf("role %q is not a valid Workspace role", role) + return xerrors.Errorf("role %q is not a valid workspace role", role) } return nil diff --git a/enterprise/coderd/templates.go b/enterprise/coderd/templates.go index 438a7cfd5c65f..07323dce3c7e6 100644 --- a/enterprise/coderd/templates.go +++ b/enterprise/coderd/templates.go @@ -1,7 +1,6 @@ package coderd import ( - "context" "database/sql" "fmt" "net/http" @@ -15,6 +14,7 @@ import ( "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/httpapi" "github.com/coder/coder/v2/coderd/httpmw" + "github.com/coder/coder/v2/coderd/rbac/acl" "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/util/slice" "github.com/coder/coder/v2/codersdk" @@ -208,17 +208,10 @@ func (api *API) patchTemplateACL(rw http.ResponseWriter, r *http.Request) { return } - validErrs := validateTemplateACLPerms(ctx, api.Database, req.UserPerms, "user_perms") - validErrs = append(validErrs, validateTemplateACLPerms( - ctx, - api.Database, - req.GroupPerms, - "group_perms", - )...) - + validErrs := acl.Validate(ctx, api.Database, TemplateACLUpdateValidator(req)) if len(validErrs) > 0 { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ - Message: "Invalid request to update template metadata!", + Message: "Invalid request to update template ACL", Validations: validErrs, }) return @@ -273,43 +266,31 @@ func (api *API) patchTemplateACL(rw http.ResponseWriter, r *http.Request) { }) } -func validateTemplateACLPerms(ctx context.Context, db database.Store, perms map[string]codersdk.TemplateRole, field string) []codersdk.ValidationError { - // nolint:gocritic // Validate requires full read access to users and groups - ctx = dbauthz.AsSystemRestricted(ctx) - var validErrs []codersdk.ValidationError - for idStr, role := range perms { - if err := validateTemplateRole(role); err != nil { - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: err.Error()}) - continue - } +type TemplateACLUpdateValidator codersdk.UpdateTemplateACL - id, err := uuid.Parse(idStr) - if err != nil { - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: idStr + "is not a valid UUID."}) - continue - } +var ( + templateACLUpdateUsersFieldName = "user_perms" + templateACLUpdateGroupsFieldName = "group_perms" +) - switch field { - case "user_perms": - // This could get slow if we get a ton of user perm updates. - _, err = db.GetUserByID(ctx, id) - if err != nil { - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: fmt.Sprintf("Failed to find resource with ID %q: %v", idStr, err.Error())}) - continue - } - case "group_perms": - // This could get slow if we get a ton of group perm updates. - _, err = db.GetGroupByID(ctx, id) - if err != nil { - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: fmt.Sprintf("Failed to find resource with ID %q: %v", idStr, err.Error())}) - continue - } - default: - validErrs = append(validErrs, codersdk.ValidationError{Field: field, Detail: "invalid field"}) - } +// TemplateACLUpdateValidator implements acl.UpdateValidator[codersdk.TemplateRole] +var _ acl.UpdateValidator[codersdk.TemplateRole] = TemplateACLUpdateValidator{} + +func (w TemplateACLUpdateValidator) Users() (map[string]codersdk.TemplateRole, string) { + return w.UserPerms, templateACLUpdateUsersFieldName +} + +func (w TemplateACLUpdateValidator) Groups() (map[string]codersdk.TemplateRole, string) { + return w.GroupPerms, templateACLUpdateGroupsFieldName +} + +func (TemplateACLUpdateValidator) ValidateRole(role codersdk.TemplateRole) error { + actions := db2sdk.TemplateRoleActions(role) + if len(actions) == 0 && role != codersdk.TemplateRoleDeleted { + return xerrors.Errorf("role %q is not a valid template role", role) } - return validErrs + return nil } func convertTemplateUsers(tus []database.TemplateUser, orgIDsByUserIDs map[uuid.UUID][]uuid.UUID) []codersdk.TemplateUser { @@ -325,15 +306,6 @@ func convertTemplateUsers(tus []database.TemplateUser, orgIDsByUserIDs map[uuid. return users } -func validateTemplateRole(role codersdk.TemplateRole) error { - actions := db2sdk.TemplateRoleActions(role) - if len(actions) == 0 && role != codersdk.TemplateRoleDeleted { - return xerrors.Errorf("role %q is not a valid Template role", role) - } - - return nil -} - func convertToTemplateRole(actions []policy.Action) codersdk.TemplateRole { switch { case len(actions) == 2 && slice.SameElements(actions, []policy.Action{policy.ActionUse, policy.ActionRead}): diff --git a/enterprise/coderd/templates_test.go b/enterprise/coderd/templates_test.go index 6c7a20f85a642..d95450e28e8aa 100644 --- a/enterprise/coderd/templates_test.go +++ b/enterprise/coderd/templates_test.go @@ -1413,13 +1413,40 @@ func TestUpdateTemplateACL(t *testing.T) { template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) req := codersdk.UpdateTemplateACL{ UserPerms: map[string]codersdk.TemplateRole{ - "hi": "admin", + "hi": codersdk.TemplateRoleAdmin, }, } ctx := testutil.Context(t, testutil.WaitLong) - //nolint:gocritic // we're testing invalid UUID so testing RBAC is not relevant here. + //nolint:gocritic // Testing ACL validation + err := client.UpdateTemplateACL(ctx, template.ID, req) + require.Error(t, err) + cerr, _ := codersdk.AsError(err) + require.Equal(t, http.StatusBadRequest, cerr.StatusCode()) + }) + + // We should report invalid UUIDs as errors + t.Run("DeleteRoleForInvalidUUID", func(t *testing.T) { + t.Parallel() + + client, user := coderdenttest.New(t, &coderdenttest.Options{LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureTemplateRBAC: 1, + }, + }}) + + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + req := codersdk.UpdateTemplateACL{ + UserPerms: map[string]codersdk.TemplateRole{ + "hi": codersdk.TemplateRoleDeleted, + }, + } + + ctx := testutil.Context(t, testutil.WaitLong) + + //nolint:gocritic // Testing ACL validation err := client.UpdateTemplateACL(ctx, template.ID, req) require.Error(t, err) cerr, _ := codersdk.AsError(err) @@ -1445,13 +1472,75 @@ func TestUpdateTemplateACL(t *testing.T) { ctx := testutil.Context(t, testutil.WaitLong) - //nolint:gocritic // we're testing invalid user so testing RBAC is not relevant here. + //nolint:gocritic // Testing ACL validation err := client.UpdateTemplateACL(ctx, template.ID, req) require.Error(t, err) cerr, _ := codersdk.AsError(err) require.Equal(t, http.StatusBadRequest, cerr.StatusCode()) }) + // We should allow the special "Delete" role for valid UUIDs that don't + // correspond to a valid user, because the user might have been deleted. + t.Run("DeleteRoleForDeletedUser", func(t *testing.T) { + t.Parallel() + + client, user := coderdenttest.New(t, &coderdenttest.Options{LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureTemplateRBAC: 1, + }, + }}) + + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + ctx := testutil.Context(t, testutil.WaitLong) + + _, deletedUser := coderdtest.CreateAnotherUser(t, client, user.OrganizationID) + //nolint:gocritic // Can't delete yourself + err := client.DeleteUser(ctx, deletedUser.ID) + require.NoError(t, err) + + req := codersdk.UpdateTemplateACL{ + UserPerms: map[string]codersdk.TemplateRole{ + deletedUser.ID.String(): codersdk.TemplateRoleDeleted, + }, + } + //nolint:gocritic // Testing ACL validation + err = client.UpdateTemplateACL(ctx, template.ID, req) + require.NoError(t, err) + }) + + t.Run("DeletedUser", func(t *testing.T) { + t.Parallel() + + client, user := coderdenttest.New(t, &coderdenttest.Options{LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureTemplateRBAC: 1, + }, + }}) + + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + ctx := testutil.Context(t, testutil.WaitLong) + + _, deletedUser := coderdtest.CreateAnotherUser(t, client, user.OrganizationID) + //nolint:gocritic // Can't delete yourself + err := client.DeleteUser(ctx, deletedUser.ID) + require.NoError(t, err) + + req := codersdk.UpdateTemplateACL{ + UserPerms: map[string]codersdk.TemplateRole{ + deletedUser.ID.String(): codersdk.TemplateRoleAdmin, + }, + } + //nolint:gocritic // Testing ACL validation + err = client.UpdateTemplateACL(ctx, template.ID, req) + require.Error(t, err) + cerr, _ := codersdk.AsError(err) + require.Equal(t, http.StatusBadRequest, cerr.StatusCode()) + }) + t.Run("InvalidRole", func(t *testing.T) { t.Parallel() @@ -1472,7 +1561,7 @@ func TestUpdateTemplateACL(t *testing.T) { ctx := testutil.Context(t, testutil.WaitLong) - //nolint:gocritic // we're testing invalid role so testing RBAC is not relevant here. + //nolint:gocritic // Testing ACL validation err := client.UpdateTemplateACL(ctx, template.ID, req) require.Error(t, err) cerr, _ := codersdk.AsError(err) From 8ba8b4f061c3832639a21e11caca4015da8f4330 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 7 Aug 2025 11:21:17 -0500 Subject: [PATCH 101/260] chore: add profiling labels for pprof analysis (#19232) PProf labels segment the code into groups for determing the source of cpu/memory profiles. Since the web server and background jobs share a lot of the same code (eg wsbuilder), it helps to know if the load is user induced, or background job based. --- cli/server.go | 9 +++--- coderd/autobuild/lifecycle_executor.go | 11 +++---- coderd/coderd.go | 1 + coderd/httpmw/pprof.go | 30 +++++++++++++++++++ coderd/pproflabel/pproflabel.go | 25 ++++++++++++++++ .../insights/metricscollector.go | 5 ++-- enterprise/coderd/coderd.go | 8 +++-- enterprise/wsproxy/wsproxy.go | 1 + 8 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 coderd/httpmw/pprof.go create mode 100644 coderd/pproflabel/pproflabel.go diff --git a/cli/server.go b/cli/server.go index 26d0c8f110403..f9e744761b22e 100644 --- a/cli/server.go +++ b/cli/server.go @@ -55,6 +55,7 @@ import ( "cdr.dev/slog" "cdr.dev/slog/sloggers/sloghuman" + "github.com/coder/coder/v2/coderd/pproflabel" "github.com/coder/pretty" "github.com/coder/quartz" "github.com/coder/retry" @@ -1459,14 +1460,14 @@ func newProvisionerDaemon( tracer := coderAPI.TracerProvider.Tracer(tracing.TracerName) terraformClient, terraformServer := drpcsdk.MemTransportPipe() wg.Add(1) - go func() { + pproflabel.Go(ctx, pproflabel.Service(pproflabel.ServiceTerraformProvisioner), func(ctx context.Context) { defer wg.Done() <-ctx.Done() _ = terraformClient.Close() _ = terraformServer.Close() - }() + }) wg.Add(1) - go func() { + pproflabel.Go(ctx, pproflabel.Service(pproflabel.ServiceTerraformProvisioner), func(ctx context.Context) { defer wg.Done() defer cancel() @@ -1485,7 +1486,7 @@ func newProvisionerDaemon( default: } } - }() + }) connector[string(database.ProvisionerTypeTerraform)] = sdkproto.NewDRPCProvisionerClient(terraformClient) default: diff --git a/coderd/autobuild/lifecycle_executor.go b/coderd/autobuild/lifecycle_executor.go index 234a72de04c50..16072e6517125 100644 --- a/coderd/autobuild/lifecycle_executor.go +++ b/coderd/autobuild/lifecycle_executor.go @@ -20,6 +20,7 @@ import ( "cdr.dev/slog" "github.com/coder/coder/v2/coderd/files" + "github.com/coder/coder/v2/coderd/pproflabel" "github.com/coder/coder/v2/coderd/audit" "github.com/coder/coder/v2/coderd/database" @@ -107,10 +108,10 @@ func (e *Executor) WithStatsChannel(ch chan<- Stats) *Executor { // tick from its channel. It will stop when its context is Done, or when // its channel is closed. func (e *Executor) Run() { - go func() { + pproflabel.Go(e.ctx, pproflabel.Service(pproflabel.ServiceLifecycles), func(ctx context.Context) { for { select { - case <-e.ctx.Done(): + case <-ctx.Done(): return case t, ok := <-e.tick: if !ok { @@ -120,15 +121,15 @@ func (e *Executor) Run() { e.metrics.autobuildExecutionDuration.Observe(stats.Elapsed.Seconds()) if e.statsCh != nil { select { - case <-e.ctx.Done(): + case <-ctx.Done(): return case e.statsCh <- stats: } } - e.log.Debug(e.ctx, "run stats", slog.F("elapsed", stats.Elapsed), slog.F("transitions", stats.Transitions)) + e.log.Debug(ctx, "run stats", slog.F("elapsed", stats.Elapsed), slog.F("transitions", stats.Transitions)) } } - }() + }) } func (e *Executor) runOnce(t time.Time) Stats { diff --git a/coderd/coderd.go b/coderd/coderd.go index 4168374c06820..928fa21a95242 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -852,6 +852,7 @@ func New(options *Options) *API { r.Use( httpmw.Recover(api.Logger), + httpmw.WithProfilingLabels, tracing.StatusWriterMiddleware, tracing.Middleware(api.TracerProvider), httpmw.AttachRequestID, diff --git a/coderd/httpmw/pprof.go b/coderd/httpmw/pprof.go new file mode 100644 index 0000000000000..eee3e9c9fdbe1 --- /dev/null +++ b/coderd/httpmw/pprof.go @@ -0,0 +1,30 @@ +package httpmw + +import ( + "context" + "net/http" + "runtime/pprof" + + "github.com/coder/coder/v2/coderd/pproflabel" +) + +// WithProfilingLabels adds a pprof label to all http request handlers. This is +// primarily used to determine if load is coming from background jobs, or from +// http traffic. +func WithProfilingLabels(next http.Handler) http.Handler { + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + // Label to differentiate between http and websocket requests. Websocket requests + // are assumed to be long-lived and more resource consuming. + requestType := "http" + if r.Header.Get("Upgrade") == "websocket" { + requestType = "websocket" + } + + pprof.Do(ctx, pproflabel.Service(pproflabel.ServiceHTTPServer, "request_type", requestType), func(ctx context.Context) { + r = r.WithContext(ctx) + next.ServeHTTP(rw, r) + }) + }) +} diff --git a/coderd/pproflabel/pproflabel.go b/coderd/pproflabel/pproflabel.go new file mode 100644 index 0000000000000..cd803b0f1baea --- /dev/null +++ b/coderd/pproflabel/pproflabel.go @@ -0,0 +1,25 @@ +package pproflabel + +import ( + "context" + "runtime/pprof" +) + +// Go is just a convince wrapper to set off a labeled goroutine. +func Go(ctx context.Context, labels pprof.LabelSet, f func(context.Context)) { + go pprof.Do(ctx, labels, f) +} + +const ( + ServiceTag = "service" + + ServiceHTTPServer = "http-api" + ServiceLifecycles = "lifecycle-executor" + ServiceMetricCollector = "metrics-collector" + ServicePrebuildReconciler = "prebuilds-reconciler" + ServiceTerraformProvisioner = "terraform-provisioner" +) + +func Service(name string, pairs ...string) pprof.LabelSet { + return pprof.Labels(append([]string{ServiceTag, name}, pairs...)...) +} diff --git a/coderd/prometheusmetrics/insights/metricscollector.go b/coderd/prometheusmetrics/insights/metricscollector.go index 41d3a0220f391..a095968526ca8 100644 --- a/coderd/prometheusmetrics/insights/metricscollector.go +++ b/coderd/prometheusmetrics/insights/metricscollector.go @@ -14,6 +14,7 @@ import ( "cdr.dev/slog" "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/pproflabel" "github.com/coder/coder/v2/coderd/util/slice" "github.com/coder/coder/v2/codersdk" ) @@ -158,7 +159,7 @@ func (mc *MetricsCollector) Run(ctx context.Context) (func(), error) { }) } - go func() { + pproflabel.Go(ctx, pproflabel.Service(pproflabel.ServiceMetricCollector), func(ctx context.Context) { defer close(done) defer ticker.Stop() for { @@ -170,7 +171,7 @@ func (mc *MetricsCollector) Run(ctx context.Context) (func(), error) { doTick() } } - }() + }) return func() { closeFunc() <-done diff --git a/enterprise/coderd/coderd.go b/enterprise/coderd/coderd.go index 9583e14cd7fd3..40569ead70658 100644 --- a/enterprise/coderd/coderd.go +++ b/enterprise/coderd/coderd.go @@ -12,20 +12,20 @@ import ( "sync" "time" - "github.com/coder/quartz" - "github.com/coder/coder/v2/buildinfo" "github.com/coder/coder/v2/coderd/appearance" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/entitlements" "github.com/coder/coder/v2/coderd/idpsync" agplportsharing "github.com/coder/coder/v2/coderd/portsharing" + "github.com/coder/coder/v2/coderd/pproflabel" agplprebuilds "github.com/coder/coder/v2/coderd/prebuilds" "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/wsbuilder" "github.com/coder/coder/v2/enterprise/coderd/connectionlog" "github.com/coder/coder/v2/enterprise/coderd/enidpsync" "github.com/coder/coder/v2/enterprise/coderd/portsharing" + "github.com/coder/quartz" "golang.org/x/xerrors" "tailscale.com/tailcfg" @@ -903,7 +903,9 @@ func (api *API) updateEntitlements(ctx context.Context) error { } api.AGPL.PrebuildsReconciler.Store(&reconciler) - go reconciler.Run(context.Background()) + // TODO: Should this context be the api.ctx context? To cancel when + // the API (and entire app) is closed via shutdown? + pproflabel.Go(context.Background(), pproflabel.Service(pproflabel.ServicePrebuildReconciler), reconciler.Run) api.AGPL.PrebuildsClaimer.Store(&claimer) } diff --git a/enterprise/wsproxy/wsproxy.go b/enterprise/wsproxy/wsproxy.go index 69241d8aa1c17..c2ac1baf2db4e 100644 --- a/enterprise/wsproxy/wsproxy.go +++ b/enterprise/wsproxy/wsproxy.go @@ -333,6 +333,7 @@ func New(ctx context.Context, opts *Options) (*Server, error) { r.Use( // TODO: @emyrk Should we standardize these in some other package? httpmw.Recover(s.Logger), + httpmw.WithProfilingLabels, tracing.StatusWriterMiddleware, tracing.Middleware(s.TracerProvider), httpmw.AttachRequestID, From b8851f03e32a0770d686aacd0cb47cadb03e3a1d Mon Sep 17 00:00:00 2001 From: Andrew Aquino Date: Thu, 7 Aug 2025 14:08:23 -0400 Subject: [PATCH 102/260] fix: prevent horizontal form section info from overlapping form fields (#19189) ...on screens that are not wide enough to accommodate 2-column layout. closes #19055 Sticky positioning on form section info still works as expected on desktop: https://github.com/user-attachments/assets/e8f5b364-d20e-4248-acc6-848293947c92 Sticky positioning is no longer applied to form section info on tablet/mobile: https://github.com/user-attachments/assets/c52c6b04-7b73-457e-9d9e-0b461fff56ac --- site/src/components/Form/Form.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/site/src/components/Form/Form.tsx b/site/src/components/Form/Form.tsx index faf900fb4f344..715f5ec008c5d 100644 --- a/site/src/components/Form/Form.tsx +++ b/site/src/components/Form/Form.tsx @@ -159,10 +159,13 @@ const styles = { position: "initial" as const, }, }), - formSectionInfoHorizontal: { + formSectionInfoHorizontal: (theme) => ({ maxWidth: 312, - position: "sticky", - }, + + [theme.breakpoints.up("lg")]: { + position: "sticky", + }, + }), formSectionInfoTitle: (theme) => ({ fontSize: 20, color: theme.palette.text.primary, From 34c46c07485070830a29207adbd4b09dc6487074 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 7 Aug 2025 13:58:39 -0500 Subject: [PATCH 103/260] chore: rename `service` -> `coder_service`, remove `agent_id` label (#19241) Pyroscope uses `service` tag for top level distinction. So move our `service` -> `coder_service` --- coderd/coderd.go | 10 +++++++++- coderd/httpmw/pprof.go | 15 ++++++++++++++- coderd/pproflabel/pproflabel.go | 10 +++++++++- coderd/workspaceagentsrpc.go | 19 ++++++++----------- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/coderd/coderd.go b/coderd/coderd.go index 928fa21a95242..78ae849fd1894 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -14,12 +14,14 @@ import ( "net/url" "path/filepath" "regexp" + "runtime/pprof" "strings" "sync" "sync/atomic" "time" "github.com/coder/coder/v2/coderd/oauth2provider" + "github.com/coder/coder/v2/coderd/pproflabel" "github.com/coder/coder/v2/coderd/prebuilds" "github.com/coder/coder/v2/coderd/wsbuilder" @@ -1340,7 +1342,13 @@ func New(options *Options) *API { ).Get("/connection", api.workspaceAgentConnectionGeneric) r.Route("/me", func(r chi.Router) { r.Use(workspaceAgentInfo) - r.Get("/rpc", api.workspaceAgentRPC) + r.Group(func(r chi.Router) { + r.Use( + // Override the request_type for agent rpc traffic. + httpmw.WithStaticProfilingLabels(pprof.Labels(pproflabel.RequestTypeTag, "agent-rpc")), + ) + r.Get("/rpc", api.workspaceAgentRPC) + }) r.Patch("/logs", api.patchWorkspaceAgentLogs) r.Patch("/app-status", api.patchWorkspaceAgentAppStatus) // Deprecated: Required to support legacy agents diff --git a/coderd/httpmw/pprof.go b/coderd/httpmw/pprof.go index eee3e9c9fdbe1..4c51c1ebe552e 100644 --- a/coderd/httpmw/pprof.go +++ b/coderd/httpmw/pprof.go @@ -22,9 +22,22 @@ func WithProfilingLabels(next http.Handler) http.Handler { requestType = "websocket" } - pprof.Do(ctx, pproflabel.Service(pproflabel.ServiceHTTPServer, "request_type", requestType), func(ctx context.Context) { + pprof.Do(ctx, pproflabel.Service(pproflabel.ServiceHTTPServer, pproflabel.RequestTypeTag, requestType), func(ctx context.Context) { r = r.WithContext(ctx) next.ServeHTTP(rw, r) }) }) } + +func WithStaticProfilingLabels(labels pprof.LabelSet) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + pprof.Do(ctx, labels, func(ctx context.Context) { + r = r.WithContext(ctx) + next.ServeHTTP(rw, r) + }) + }) + } +} diff --git a/coderd/pproflabel/pproflabel.go b/coderd/pproflabel/pproflabel.go index cd803b0f1baea..2bfd071dcdc39 100644 --- a/coderd/pproflabel/pproflabel.go +++ b/coderd/pproflabel/pproflabel.go @@ -10,14 +10,22 @@ func Go(ctx context.Context, labels pprof.LabelSet, f func(context.Context)) { go pprof.Do(ctx, labels, f) } +func Do(ctx context.Context, labels pprof.LabelSet, f func(context.Context)) { + pprof.Do(ctx, labels, f) +} + const ( - ServiceTag = "service" + // ServiceTag should not collide with the pyroscope built-in tag "service". + // Use `coder_` to avoid collisions. + ServiceTag = "coder_service" ServiceHTTPServer = "http-api" ServiceLifecycles = "lifecycle-executor" ServiceMetricCollector = "metrics-collector" ServicePrebuildReconciler = "prebuilds-reconciler" ServiceTerraformProvisioner = "terraform-provisioner" + + RequestTypeTag = "coder_request_type" ) func Service(name string, pairs ...string) pprof.LabelSet { diff --git a/coderd/workspaceagentsrpc.go b/coderd/workspaceagentsrpc.go index 0806118f2a832..8dacbe9812ca9 100644 --- a/coderd/workspaceagentsrpc.go +++ b/coderd/workspaceagentsrpc.go @@ -6,7 +6,6 @@ import ( "fmt" "io" "net/http" - "runtime/pprof" "sync" "sync/atomic" "time" @@ -348,16 +347,14 @@ func (m *agentConnectionMonitor) init() { func (m *agentConnectionMonitor) start(ctx context.Context) { ctx, m.cancel = context.WithCancel(ctx) m.wg.Add(2) - go pprof.Do(ctx, pprof.Labels("agent", m.workspaceAgent.ID.String()), - func(ctx context.Context) { - defer m.wg.Done() - m.sendPings(ctx) - }) - go pprof.Do(ctx, pprof.Labels("agent", m.workspaceAgent.ID.String()), - func(ctx context.Context) { - defer m.wg.Done() - m.monitor(ctx) - }) + go func(ctx context.Context) { + defer m.wg.Done() + m.sendPings(ctx) + }(ctx) + go func(ctx context.Context) { + defer m.wg.Done() + m.monitor(ctx) + }(ctx) } func (m *agentConnectionMonitor) monitor(ctx context.Context) { From c65996a041a974988a43e981f2f0c4f4773a1c43 Mon Sep 17 00:00:00 2001 From: Yevhenii Shcherbina Date: Thu, 7 Aug 2025 15:58:59 -0400 Subject: [PATCH 104/260] feat: add user_secrets table (#19162) Closes https://github.com/coder/internal/issues/780 ## Summary of changes: - added `user_secrets` table - `user_secrets` table contains `env_name` and `file_path` fields which are not used at the moment, but will be used in later PRs - `user_secrets` table doesn't contain `value_key_id`, I will add it in a separate migration in a dbcrypt PR - on one hand I don't want to add fields which are not used (because it's a risk smth may change in implementation later), on the other hand I don't want to add too many migrations for user secrets table - added unique sql indexes - added sql queries for CRUD operations on user-secrets - introduced new `ResourceUserSecret` resource - basic unit-tests for CRUD ops and authorization behavior - Role updates: - owner: - remove `ResourceUserSecret` from site-wide perms - add `ResourceUserSecret` to user-wide perms - orgAdmin - remove `ResourceUserSecret` from org-wide perms; seems it's not strictly required, because `ResourceUserSecret` is not tied to organization in dbauthz wrappers? - memberRole - no need to change memberRole because it implicitly has access to user-secrets thanks to the `allPermsExcept` - is it enough changes to roles? Main questions: - [ ] We will have 2 migrations for user-secrets: - initial migration (in current PR) - adding `value_key_id` in dbcrypt PR - is this approach reasonable? - [ ] Are changes to roles's permissions are correct? - [ ] Are changes in roles_test.go are correct? --------- Co-authored-by: Steven Masley --- coderd/apidoc/docs.go | 2 + coderd/apidoc/swagger.json | 2 + coderd/database/dbauthz/dbauthz.go | 64 +++++ coderd/database/dbauthz/dbauthz_test.go | 61 +++++ coderd/database/dbgen/dbgen.go | 14 + coderd/database/dbmetrics/querymetrics.go | 42 +++ coderd/database/dbmock/dbmock.go | 89 +++++++ coderd/database/dump.sql | 24 ++ coderd/database/foreign_key_constraint.go | 1 + .../000357_add_user_secrets.down.sql | 7 + .../migrations/000357_add_user_secrets.up.sql | 34 +++ .../fixtures/000357_add_user_secrets.up.sql | 18 ++ coderd/database/modelmethods.go | 4 + coderd/database/models.go | 12 + coderd/database/querier.go | 6 + coderd/database/querier_test.go | 246 ++++++++++++++++++ coderd/database/queries.sql.go | 190 ++++++++++++++ coderd/database/queries/user_secrets.sql | 40 +++ coderd/database/unique_constraint.go | 4 + coderd/rbac/object_gen.go | 11 + coderd/rbac/policy/policy.go | 8 + coderd/rbac/roles.go | 7 +- coderd/rbac/roles_test.go | 14 + codersdk/rbacresources_gen.go | 2 + docs/reference/api/members.md | 5 + docs/reference/api/schemas.md | 1 + site/src/api/rbacresourcesGenerated.ts | 6 + site/src/api/typesGenerated.ts | 2 + 28 files changed, 913 insertions(+), 3 deletions(-) create mode 100644 coderd/database/migrations/000357_add_user_secrets.down.sql create mode 100644 coderd/database/migrations/000357_add_user_secrets.up.sql create mode 100644 coderd/database/migrations/testdata/fixtures/000357_add_user_secrets.up.sql create mode 100644 coderd/database/queries/user_secrets.sql diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index fa2aad745ec5a..0a8b2c07793c3 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -15702,6 +15702,7 @@ const docTemplate = `{ "tailnet_coordinator", "template", "user", + "user_secret", "webpush_subscription", "workspace", "workspace_agent_devcontainers", @@ -15742,6 +15743,7 @@ const docTemplate = `{ "ResourceTailnetCoordinator", "ResourceTemplate", "ResourceUser", + "ResourceUserSecret", "ResourceWebpushSubscription", "ResourceWorkspace", "ResourceWorkspaceAgentDevcontainers", diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index e1bcc5bf1013c..cd6537de0e210 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -14263,6 +14263,7 @@ "tailnet_coordinator", "template", "user", + "user_secret", "webpush_subscription", "workspace", "workspace_agent_devcontainers", @@ -14303,6 +14304,7 @@ "ResourceTailnetCoordinator", "ResourceTemplate", "ResourceUser", + "ResourceUserSecret", "ResourceWebpushSubscription", "ResourceWorkspace", "ResourceWorkspaceAgentDevcontainers", diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 4e752399e08eb..d5cc334f5ff7f 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -1387,6 +1387,14 @@ func (q *querier) CountUnreadInboxNotificationsByUserID(ctx context.Context, use return q.db.CountUnreadInboxNotificationsByUserID(ctx, userID) } +func (q *querier) CreateUserSecret(ctx context.Context, arg database.CreateUserSecretParams) (database.UserSecret, error) { + obj := rbac.ResourceUserSecret.WithOwner(arg.UserID.String()) + if err := q.authorizeContext(ctx, policy.ActionCreate, obj); err != nil { + return database.UserSecret{}, err + } + return q.db.CreateUserSecret(ctx, arg) +} + // TODO: Handle org scoped lookups func (q *querier) CustomRoles(ctx context.Context, arg database.CustomRolesParams) ([]database.CustomRole, error) { roleObject := rbac.ResourceAssignRole @@ -1657,6 +1665,19 @@ func (q *querier) DeleteTailnetTunnel(ctx context.Context, arg database.DeleteTa return q.db.DeleteTailnetTunnel(ctx, arg) } +func (q *querier) DeleteUserSecret(ctx context.Context, id uuid.UUID) error { + // First get the secret to check ownership + secret, err := q.GetUserSecret(ctx, id) + if err != nil { + return err + } + + if err := q.authorizeContext(ctx, policy.ActionDelete, secret); err != nil { + return err + } + return q.db.DeleteUserSecret(ctx, id) +} + func (q *querier) DeleteWebpushSubscriptionByUserIDAndEndpoint(ctx context.Context, arg database.DeleteWebpushSubscriptionByUserIDAndEndpointParams) error { if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceWebpushSubscription.WithOwner(arg.UserID.String())); err != nil { return err @@ -3075,6 +3096,28 @@ func (q *querier) GetUserNotificationPreferences(ctx context.Context, userID uui return q.db.GetUserNotificationPreferences(ctx, userID) } +func (q *querier) GetUserSecret(ctx context.Context, id uuid.UUID) (database.UserSecret, error) { + // First get the secret to check ownership + secret, err := q.db.GetUserSecret(ctx, id) + if err != nil { + return database.UserSecret{}, err + } + + if err := q.authorizeContext(ctx, policy.ActionRead, secret); err != nil { + return database.UserSecret{}, err + } + return secret, nil +} + +func (q *querier) GetUserSecretByUserIDAndName(ctx context.Context, arg database.GetUserSecretByUserIDAndNameParams) (database.UserSecret, error) { + obj := rbac.ResourceUserSecret.WithOwner(arg.UserID.String()) + if err := q.authorizeContext(ctx, policy.ActionRead, obj); err != nil { + return database.UserSecret{}, err + } + + return q.db.GetUserSecretByUserIDAndName(ctx, arg) +} + func (q *querier) GetUserStatusCounts(ctx context.Context, arg database.GetUserStatusCountsParams) ([]database.GetUserStatusCountsRow, error) { if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceUser); err != nil { return nil, err @@ -4153,6 +4196,14 @@ func (q *querier) ListProvisionerKeysByOrganizationExcludeReserved(ctx context.C return fetchWithPostFilter(q.auth, policy.ActionRead, q.db.ListProvisionerKeysByOrganizationExcludeReserved)(ctx, organizationID) } +func (q *querier) ListUserSecrets(ctx context.Context, userID uuid.UUID) ([]database.UserSecret, error) { + obj := rbac.ResourceUserSecret.WithOwner(userID.String()) + if err := q.authorizeContext(ctx, policy.ActionRead, obj); err != nil { + return nil, err + } + return q.db.ListUserSecrets(ctx, userID) +} + func (q *querier) ListWorkspaceAgentPortShares(ctx context.Context, workspaceID uuid.UUID) ([]database.WorkspaceAgentPortShare, error) { workspace, err := q.db.GetWorkspaceByID(ctx, workspaceID) if err != nil { @@ -4866,6 +4917,19 @@ func (q *querier) UpdateUserRoles(ctx context.Context, arg database.UpdateUserRo return q.db.UpdateUserRoles(ctx, arg) } +func (q *querier) UpdateUserSecret(ctx context.Context, arg database.UpdateUserSecretParams) (database.UserSecret, error) { + // First get the secret to check ownership + secret, err := q.db.GetUserSecret(ctx, arg.ID) + if err != nil { + return database.UserSecret{}, err + } + + if err := q.authorizeContext(ctx, policy.ActionUpdate, secret); err != nil { + return database.UserSecret{}, err + } + return q.db.UpdateUserSecret(ctx, arg) +} + func (q *querier) UpdateUserStatus(ctx context.Context, arg database.UpdateUserStatusParams) (database.User, error) { fetch := func(ctx context.Context, arg database.UpdateUserStatusParams) (database.User, error) { return q.db.GetUserByID(ctx, arg.ID) diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index deca01456244f..82b7b47c892b2 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -5883,3 +5883,64 @@ func (s *MethodTestSuite) TestAuthorizePrebuiltWorkspace() { }).Asserts(w, policy.ActionUpdate, w.AsPrebuild(), policy.ActionUpdate) })) } + +func (s *MethodTestSuite) TestUserSecrets() { + s.Run("GetUserSecretByUserIDAndName", s.Subtest(func(db database.Store, check *expects) { + user := dbgen.User(s.T(), db, database.User{}) + userSecret := dbgen.UserSecret(s.T(), db, database.UserSecret{ + UserID: user.ID, + }) + arg := database.GetUserSecretByUserIDAndNameParams{ + UserID: user.ID, + Name: userSecret.Name, + } + check.Args(arg). + Asserts(rbac.ResourceUserSecret.WithOwner(arg.UserID.String()), policy.ActionRead). + Returns(userSecret) + })) + s.Run("GetUserSecret", s.Subtest(func(db database.Store, check *expects) { + user := dbgen.User(s.T(), db, database.User{}) + userSecret := dbgen.UserSecret(s.T(), db, database.UserSecret{ + UserID: user.ID, + }) + check.Args(userSecret.ID). + Asserts(userSecret, policy.ActionRead). + Returns(userSecret) + })) + s.Run("ListUserSecrets", s.Subtest(func(db database.Store, check *expects) { + user := dbgen.User(s.T(), db, database.User{}) + userSecret := dbgen.UserSecret(s.T(), db, database.UserSecret{ + UserID: user.ID, + }) + check.Args(user.ID). + Asserts(rbac.ResourceUserSecret.WithOwner(user.ID.String()), policy.ActionRead). + Returns([]database.UserSecret{userSecret}) + })) + s.Run("CreateUserSecret", s.Subtest(func(db database.Store, check *expects) { + user := dbgen.User(s.T(), db, database.User{}) + arg := database.CreateUserSecretParams{ + UserID: user.ID, + } + check.Args(arg). + Asserts(rbac.ResourceUserSecret.WithOwner(arg.UserID.String()), policy.ActionCreate) + })) + s.Run("UpdateUserSecret", s.Subtest(func(db database.Store, check *expects) { + user := dbgen.User(s.T(), db, database.User{}) + userSecret := dbgen.UserSecret(s.T(), db, database.UserSecret{ + UserID: user.ID, + }) + arg := database.UpdateUserSecretParams{ + ID: userSecret.ID, + } + check.Args(arg). + Asserts(userSecret, policy.ActionUpdate) + })) + s.Run("DeleteUserSecret", s.Subtest(func(db database.Store, check *expects) { + user := dbgen.User(s.T(), db, database.User{}) + userSecret := dbgen.UserSecret(s.T(), db, database.UserSecret{ + UserID: user.ID, + }) + check.Args(userSecret.ID). + Asserts(userSecret, policy.ActionRead, userSecret, policy.ActionDelete) + })) +} diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index 81d9efd1cd3e3..11e02d0f651e9 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -1422,6 +1422,20 @@ func PresetParameter(t testing.TB, db database.Store, seed database.InsertPreset return parameters } +func UserSecret(t testing.TB, db database.Store, seed database.UserSecret) database.UserSecret { + userSecret, err := db.CreateUserSecret(genCtx, database.CreateUserSecretParams{ + ID: takeFirst(seed.ID, uuid.New()), + UserID: takeFirst(seed.UserID, uuid.New()), + Name: takeFirst(seed.Name, "secret-name"), + Description: takeFirst(seed.Description, "secret description"), + Value: takeFirst(seed.Value, "secret value"), + EnvName: takeFirst(seed.EnvName, "SECRET_ENV_NAME"), + FilePath: takeFirst(seed.FilePath, "~/secret/file/path"), + }) + require.NoError(t, err, "failed to insert user secret") + return userSecret +} + func ClaimPrebuild(t testing.TB, db database.Store, newUserID uuid.UUID, newName string, presetID uuid.UUID) database.ClaimPrebuiltWorkspaceRow { claimedWorkspace, err := db.ClaimPrebuiltWorkspace(genCtx, database.ClaimPrebuiltWorkspaceParams{ NewUserID: newUserID, diff --git a/coderd/database/dbmetrics/querymetrics.go b/coderd/database/dbmetrics/querymetrics.go index bbed6b55346c8..e0606f9e40665 100644 --- a/coderd/database/dbmetrics/querymetrics.go +++ b/coderd/database/dbmetrics/querymetrics.go @@ -215,6 +215,13 @@ func (m queryMetricsStore) CountUnreadInboxNotificationsByUserID(ctx context.Con return r0, r1 } +func (m queryMetricsStore) CreateUserSecret(ctx context.Context, arg database.CreateUserSecretParams) (database.UserSecret, error) { + start := time.Now() + r0, r1 := m.s.CreateUserSecret(ctx, arg) + m.queryLatencies.WithLabelValues("CreateUserSecret").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m queryMetricsStore) CustomRoles(ctx context.Context, arg database.CustomRolesParams) ([]database.CustomRole, error) { start := time.Now() r0, r1 := m.s.CustomRoles(ctx, arg) @@ -460,6 +467,13 @@ func (m queryMetricsStore) DeleteTailnetTunnel(ctx context.Context, arg database return r0, r1 } +func (m queryMetricsStore) DeleteUserSecret(ctx context.Context, id uuid.UUID) error { + start := time.Now() + r0 := m.s.DeleteUserSecret(ctx, id) + m.queryLatencies.WithLabelValues("DeleteUserSecret").Observe(time.Since(start).Seconds()) + return r0 +} + func (m queryMetricsStore) DeleteWebpushSubscriptionByUserIDAndEndpoint(ctx context.Context, arg database.DeleteWebpushSubscriptionByUserIDAndEndpointParams) error { start := time.Now() r0 := m.s.DeleteWebpushSubscriptionByUserIDAndEndpoint(ctx, arg) @@ -1657,6 +1671,20 @@ func (m queryMetricsStore) GetUserNotificationPreferences(ctx context.Context, u return r0, r1 } +func (m queryMetricsStore) GetUserSecret(ctx context.Context, id uuid.UUID) (database.UserSecret, error) { + start := time.Now() + r0, r1 := m.s.GetUserSecret(ctx, id) + m.queryLatencies.WithLabelValues("GetUserSecret").Observe(time.Since(start).Seconds()) + return r0, r1 +} + +func (m queryMetricsStore) GetUserSecretByUserIDAndName(ctx context.Context, arg database.GetUserSecretByUserIDAndNameParams) (database.UserSecret, error) { + start := time.Now() + r0, r1 := m.s.GetUserSecretByUserIDAndName(ctx, arg) + m.queryLatencies.WithLabelValues("GetUserSecretByUserIDAndName").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m queryMetricsStore) GetUserStatusCounts(ctx context.Context, arg database.GetUserStatusCountsParams) ([]database.GetUserStatusCountsRow, error) { start := time.Now() r0, r1 := m.s.GetUserStatusCounts(ctx, arg) @@ -2539,6 +2567,13 @@ func (m queryMetricsStore) ListProvisionerKeysByOrganizationExcludeReserved(ctx return r0, r1 } +func (m queryMetricsStore) ListUserSecrets(ctx context.Context, userID uuid.UUID) ([]database.UserSecret, error) { + start := time.Now() + r0, r1 := m.s.ListUserSecrets(ctx, userID) + m.queryLatencies.WithLabelValues("ListUserSecrets").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m queryMetricsStore) ListWorkspaceAgentPortShares(ctx context.Context, workspaceID uuid.UUID) ([]database.WorkspaceAgentPortShare, error) { start := time.Now() r0, r1 := m.s.ListWorkspaceAgentPortShares(ctx, workspaceID) @@ -2987,6 +3022,13 @@ func (m queryMetricsStore) UpdateUserRoles(ctx context.Context, arg database.Upd return user, err } +func (m queryMetricsStore) UpdateUserSecret(ctx context.Context, arg database.UpdateUserSecretParams) (database.UserSecret, error) { + start := time.Now() + r0, r1 := m.s.UpdateUserSecret(ctx, arg) + m.queryLatencies.WithLabelValues("UpdateUserSecret").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m queryMetricsStore) UpdateUserStatus(ctx context.Context, arg database.UpdateUserStatusParams) (database.User, error) { start := time.Now() user, err := m.s.UpdateUserStatus(ctx, arg) diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index e1d40f12eb521..22807f0e3569d 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -338,6 +338,21 @@ func (mr *MockStoreMockRecorder) CountUnreadInboxNotificationsByUserID(ctx, user return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CountUnreadInboxNotificationsByUserID", reflect.TypeOf((*MockStore)(nil).CountUnreadInboxNotificationsByUserID), ctx, userID) } +// CreateUserSecret mocks base method. +func (m *MockStore) CreateUserSecret(ctx context.Context, arg database.CreateUserSecretParams) (database.UserSecret, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateUserSecret", ctx, arg) + ret0, _ := ret[0].(database.UserSecret) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateUserSecret indicates an expected call of CreateUserSecret. +func (mr *MockStoreMockRecorder) CreateUserSecret(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateUserSecret", reflect.TypeOf((*MockStore)(nil).CreateUserSecret), ctx, arg) +} + // CustomRoles mocks base method. func (m *MockStore) CustomRoles(ctx context.Context, arg database.CustomRolesParams) ([]database.CustomRole, error) { m.ctrl.T.Helper() @@ -835,6 +850,20 @@ func (mr *MockStoreMockRecorder) DeleteTailnetTunnel(ctx, arg any) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTailnetTunnel", reflect.TypeOf((*MockStore)(nil).DeleteTailnetTunnel), ctx, arg) } +// DeleteUserSecret mocks base method. +func (m *MockStore) DeleteUserSecret(ctx context.Context, id uuid.UUID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteUserSecret", ctx, id) + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteUserSecret indicates an expected call of DeleteUserSecret. +func (mr *MockStoreMockRecorder) DeleteUserSecret(ctx, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteUserSecret", reflect.TypeOf((*MockStore)(nil).DeleteUserSecret), ctx, id) +} + // DeleteWebpushSubscriptionByUserIDAndEndpoint mocks base method. func (m *MockStore) DeleteWebpushSubscriptionByUserIDAndEndpoint(ctx context.Context, arg database.DeleteWebpushSubscriptionByUserIDAndEndpointParams) error { m.ctrl.T.Helper() @@ -3527,6 +3556,36 @@ func (mr *MockStoreMockRecorder) GetUserNotificationPreferences(ctx, userID any) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserNotificationPreferences", reflect.TypeOf((*MockStore)(nil).GetUserNotificationPreferences), ctx, userID) } +// GetUserSecret mocks base method. +func (m *MockStore) GetUserSecret(ctx context.Context, id uuid.UUID) (database.UserSecret, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUserSecret", ctx, id) + ret0, _ := ret[0].(database.UserSecret) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUserSecret indicates an expected call of GetUserSecret. +func (mr *MockStoreMockRecorder) GetUserSecret(ctx, id any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserSecret", reflect.TypeOf((*MockStore)(nil).GetUserSecret), ctx, id) +} + +// GetUserSecretByUserIDAndName mocks base method. +func (m *MockStore) GetUserSecretByUserIDAndName(ctx context.Context, arg database.GetUserSecretByUserIDAndNameParams) (database.UserSecret, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUserSecretByUserIDAndName", ctx, arg) + ret0, _ := ret[0].(database.UserSecret) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetUserSecretByUserIDAndName indicates an expected call of GetUserSecretByUserIDAndName. +func (mr *MockStoreMockRecorder) GetUserSecretByUserIDAndName(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUserSecretByUserIDAndName", reflect.TypeOf((*MockStore)(nil).GetUserSecretByUserIDAndName), ctx, arg) +} + // GetUserStatusCounts mocks base method. func (m *MockStore) GetUserStatusCounts(ctx context.Context, arg database.GetUserStatusCountsParams) ([]database.GetUserStatusCountsRow, error) { m.ctrl.T.Helper() @@ -5417,6 +5476,21 @@ func (mr *MockStoreMockRecorder) ListProvisionerKeysByOrganizationExcludeReserve return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListProvisionerKeysByOrganizationExcludeReserved", reflect.TypeOf((*MockStore)(nil).ListProvisionerKeysByOrganizationExcludeReserved), ctx, organizationID) } +// ListUserSecrets mocks base method. +func (m *MockStore) ListUserSecrets(ctx context.Context, userID uuid.UUID) ([]database.UserSecret, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListUserSecrets", ctx, userID) + ret0, _ := ret[0].([]database.UserSecret) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListUserSecrets indicates an expected call of ListUserSecrets. +func (mr *MockStoreMockRecorder) ListUserSecrets(ctx, userID any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListUserSecrets", reflect.TypeOf((*MockStore)(nil).ListUserSecrets), ctx, userID) +} + // ListWorkspaceAgentPortShares mocks base method. func (m *MockStore) ListWorkspaceAgentPortShares(ctx context.Context, workspaceID uuid.UUID) ([]database.WorkspaceAgentPortShare, error) { m.ctrl.T.Helper() @@ -6372,6 +6446,21 @@ func (mr *MockStoreMockRecorder) UpdateUserRoles(ctx, arg any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUserRoles", reflect.TypeOf((*MockStore)(nil).UpdateUserRoles), ctx, arg) } +// UpdateUserSecret mocks base method. +func (m *MockStore) UpdateUserSecret(ctx context.Context, arg database.UpdateUserSecretParams) (database.UserSecret, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "UpdateUserSecret", ctx, arg) + ret0, _ := ret[0].(database.UserSecret) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// UpdateUserSecret indicates an expected call of UpdateUserSecret. +func (mr *MockStoreMockRecorder) UpdateUserSecret(ctx, arg any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateUserSecret", reflect.TypeOf((*MockStore)(nil).UpdateUserSecret), ctx, arg) +} + // UpdateUserStatus mocks base method. func (m *MockStore) UpdateUserStatus(ctx context.Context, arg database.UpdateUserStatusParams) (database.User, error) { m.ctrl.T.Helper() diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 5245920ba04a9..7bea770248310 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -1861,6 +1861,18 @@ COMMENT ON COLUMN user_links.oauth_refresh_token_key_id IS 'The ID of the key us COMMENT ON COLUMN user_links.claims IS 'Claims from the IDP for the linked user. Includes both id_token and userinfo claims. '; +CREATE TABLE user_secrets ( + id uuid DEFAULT gen_random_uuid() NOT NULL, + user_id uuid NOT NULL, + name text NOT NULL, + description text NOT NULL, + value text NOT NULL, + env_name text DEFAULT ''::text NOT NULL, + file_path text DEFAULT ''::text NOT NULL, + created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL, + updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP NOT NULL +); + CREATE TABLE user_status_changes ( id uuid DEFAULT gen_random_uuid() NOT NULL, user_id uuid NOT NULL, @@ -2675,6 +2687,9 @@ ALTER TABLE ONLY user_deleted ALTER TABLE ONLY user_links ADD CONSTRAINT user_links_pkey PRIMARY KEY (user_id, login_type); +ALTER TABLE ONLY user_secrets + ADD CONSTRAINT user_secrets_pkey PRIMARY KEY (id); + ALTER TABLE ONLY user_status_changes ADD CONSTRAINT user_status_changes_pkey PRIMARY KEY (id); @@ -2863,6 +2878,12 @@ CREATE UNIQUE INDEX templates_organization_id_name_idx ON templates USING btree CREATE UNIQUE INDEX user_links_linked_id_login_type_idx ON user_links USING btree (linked_id, login_type) WHERE (linked_id <> ''::text); +CREATE UNIQUE INDEX user_secrets_user_env_name_idx ON user_secrets USING btree (user_id, env_name) WHERE (env_name <> ''::text); + +CREATE UNIQUE INDEX user_secrets_user_file_path_idx ON user_secrets USING btree (user_id, file_path) WHERE (file_path <> ''::text); + +CREATE UNIQUE INDEX user_secrets_user_name_idx ON user_secrets USING btree (user_id, name); + CREATE UNIQUE INDEX users_email_lower_idx ON users USING btree (lower(email)) WHERE (deleted = false); CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)) WHERE (deleted = false); @@ -3168,6 +3189,9 @@ ALTER TABLE ONLY user_links ALTER TABLE ONLY user_links ADD CONSTRAINT user_links_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; +ALTER TABLE ONLY user_secrets + ADD CONSTRAINT user_secrets_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; + ALTER TABLE ONLY user_status_changes ADD CONSTRAINT user_status_changes_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id); diff --git a/coderd/database/foreign_key_constraint.go b/coderd/database/foreign_key_constraint.go index c3aaf7342a97c..33aa8edd69032 100644 --- a/coderd/database/foreign_key_constraint.go +++ b/coderd/database/foreign_key_constraint.go @@ -63,6 +63,7 @@ const ( ForeignKeyUserLinksOauthAccessTokenKeyID ForeignKeyConstraint = "user_links_oauth_access_token_key_id_fkey" // ALTER TABLE ONLY user_links ADD CONSTRAINT user_links_oauth_access_token_key_id_fkey FOREIGN KEY (oauth_access_token_key_id) REFERENCES dbcrypt_keys(active_key_digest); ForeignKeyUserLinksOauthRefreshTokenKeyID ForeignKeyConstraint = "user_links_oauth_refresh_token_key_id_fkey" // ALTER TABLE ONLY user_links ADD CONSTRAINT user_links_oauth_refresh_token_key_id_fkey FOREIGN KEY (oauth_refresh_token_key_id) REFERENCES dbcrypt_keys(active_key_digest); ForeignKeyUserLinksUserID ForeignKeyConstraint = "user_links_user_id_fkey" // ALTER TABLE ONLY user_links ADD CONSTRAINT user_links_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; + ForeignKeyUserSecretsUserID ForeignKeyConstraint = "user_secrets_user_id_fkey" // ALTER TABLE ONLY user_secrets ADD CONSTRAINT user_secrets_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; ForeignKeyUserStatusChangesUserID ForeignKeyConstraint = "user_status_changes_user_id_fkey" // ALTER TABLE ONLY user_status_changes ADD CONSTRAINT user_status_changes_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id); ForeignKeyWebpushSubscriptionsUserID ForeignKeyConstraint = "webpush_subscriptions_user_id_fkey" // ALTER TABLE ONLY webpush_subscriptions ADD CONSTRAINT webpush_subscriptions_user_id_fkey FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; ForeignKeyWorkspaceAgentDevcontainersWorkspaceAgentID ForeignKeyConstraint = "workspace_agent_devcontainers_workspace_agent_id_fkey" // ALTER TABLE ONLY workspace_agent_devcontainers ADD CONSTRAINT workspace_agent_devcontainers_workspace_agent_id_fkey FOREIGN KEY (workspace_agent_id) REFERENCES workspace_agents(id) ON DELETE CASCADE; diff --git a/coderd/database/migrations/000357_add_user_secrets.down.sql b/coderd/database/migrations/000357_add_user_secrets.down.sql new file mode 100644 index 0000000000000..67bd30002e23a --- /dev/null +++ b/coderd/database/migrations/000357_add_user_secrets.down.sql @@ -0,0 +1,7 @@ +-- Drop the unique indexes first (in reverse order of creation) +DROP INDEX IF EXISTS user_secrets_user_file_path_idx; +DROP INDEX IF EXISTS user_secrets_user_env_name_idx; +DROP INDEX IF EXISTS user_secrets_user_name_idx; + +-- Drop the table +DROP TABLE IF EXISTS user_secrets; diff --git a/coderd/database/migrations/000357_add_user_secrets.up.sql b/coderd/database/migrations/000357_add_user_secrets.up.sql new file mode 100644 index 0000000000000..8a4d398f490eb --- /dev/null +++ b/coderd/database/migrations/000357_add_user_secrets.up.sql @@ -0,0 +1,34 @@ +-- Stores encrypted user secrets (global, available across all organizations) +CREATE TABLE user_secrets ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, + name TEXT NOT NULL, + description TEXT NOT NULL, + + -- The encrypted secret value (base64-encoded encrypted data) + value TEXT NOT NULL, + + -- Auto-injection settings + -- Environment variable name (e.g., "DATABASE_PASSWORD", "API_KEY") + -- Empty string means don't inject as env var + env_name TEXT NOT NULL DEFAULT '', + + -- File path where secret should be written (e.g., "/home/coder/.ssh/id_rsa") + -- Empty string means don't inject as file + file_path TEXT NOT NULL DEFAULT '', + + -- Timestamps + created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +-- Unique constraint: user can't have duplicate secret names +CREATE UNIQUE INDEX user_secrets_user_name_idx ON user_secrets(user_id, name); + +-- Unique constraint: user can't have duplicate env names +CREATE UNIQUE INDEX user_secrets_user_env_name_idx ON user_secrets(user_id, env_name) +WHERE env_name != ''; + +-- Unique constraint: user can't have duplicate file paths +CREATE UNIQUE INDEX user_secrets_user_file_path_idx ON user_secrets(user_id, file_path) +WHERE file_path != ''; diff --git a/coderd/database/migrations/testdata/fixtures/000357_add_user_secrets.up.sql b/coderd/database/migrations/testdata/fixtures/000357_add_user_secrets.up.sql new file mode 100644 index 0000000000000..a82ceb593b629 --- /dev/null +++ b/coderd/database/migrations/testdata/fixtures/000357_add_user_secrets.up.sql @@ -0,0 +1,18 @@ +INSERT INTO user_secrets ( + id, + user_id, + name, + description, + value, + env_name, + file_path +) +VALUES ( + '4848b19e-b392-4a1b-bc7d-0b7ffb41ef87', + '30095c71-380b-457a-8995-97b8ee6e5307', + 'secret-name', + 'secret description', + 'secret value', + 'SECRET_ENV_NAME', + '~/secret/file/path' +); diff --git a/coderd/database/modelmethods.go b/coderd/database/modelmethods.go index caf7ccce4c6a7..e080c7d7e4217 100644 --- a/coderd/database/modelmethods.go +++ b/coderd/database/modelmethods.go @@ -632,3 +632,7 @@ func (m WorkspaceAgentVolumeResourceMonitor) Debounce( return m.DebouncedUntil, false } + +func (s UserSecret) RBACObject() rbac.Object { + return rbac.ResourceUserSecret.WithID(s.ID).WithOwner(s.UserID.String()) +} diff --git a/coderd/database/models.go b/coderd/database/models.go index 8b13c8a8af057..75d2b941dab3c 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -3812,6 +3812,18 @@ type UserLink struct { Claims UserLinkClaims `db:"claims" json:"claims"` } +type UserSecret struct { + ID uuid.UUID `db:"id" json:"id"` + UserID uuid.UUID `db:"user_id" json:"user_id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + Value string `db:"value" json:"value"` + EnvName string `db:"env_name" json:"env_name"` + FilePath string `db:"file_path" json:"file_path"` + CreatedAt time.Time `db:"created_at" json:"created_at"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` +} + // Tracks the history of user status changes type UserStatusChange struct { ID uuid.UUID `db:"id" json:"id"` diff --git a/coderd/database/querier.go b/coderd/database/querier.go index 1ea4ae5376f80..a0f265e9658ce 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -71,6 +71,7 @@ type sqlcQuerier interface { // Prebuild considered in-progress if it's in the "starting", "stopping", or "deleting" state. CountInProgressPrebuilds(ctx context.Context) ([]CountInProgressPrebuildsRow, error) CountUnreadInboxNotificationsByUserID(ctx context.Context, userID uuid.UUID) (int64, error) + CreateUserSecret(ctx context.Context, arg CreateUserSecretParams) (UserSecret, error) CustomRoles(ctx context.Context, arg CustomRolesParams) ([]CustomRole, error) DeleteAPIKeyByID(ctx context.Context, id string) error DeleteAPIKeysByUserID(ctx context.Context, userID uuid.UUID) error @@ -118,6 +119,7 @@ type sqlcQuerier interface { DeleteTailnetClientSubscription(ctx context.Context, arg DeleteTailnetClientSubscriptionParams) error DeleteTailnetPeer(ctx context.Context, arg DeleteTailnetPeerParams) (DeleteTailnetPeerRow, error) DeleteTailnetTunnel(ctx context.Context, arg DeleteTailnetTunnelParams) (DeleteTailnetTunnelRow, error) + DeleteUserSecret(ctx context.Context, id uuid.UUID) error DeleteWebpushSubscriptionByUserIDAndEndpoint(ctx context.Context, arg DeleteWebpushSubscriptionByUserIDAndEndpointParams) error DeleteWebpushSubscriptions(ctx context.Context, ids []uuid.UUID) error DeleteWorkspaceAgentPortShare(ctx context.Context, arg DeleteWorkspaceAgentPortShareParams) error @@ -383,6 +385,8 @@ type sqlcQuerier interface { GetUserLinkByUserIDLoginType(ctx context.Context, arg GetUserLinkByUserIDLoginTypeParams) (UserLink, error) GetUserLinksByUserID(ctx context.Context, userID uuid.UUID) ([]UserLink, error) GetUserNotificationPreferences(ctx context.Context, userID uuid.UUID) ([]NotificationPreference, error) + GetUserSecret(ctx context.Context, id uuid.UUID) (UserSecret, error) + GetUserSecretByUserIDAndName(ctx context.Context, arg GetUserSecretByUserIDAndNameParams) (UserSecret, error) // GetUserStatusCounts returns the count of users in each status over time. // The time range is inclusively defined by the start_time and end_time parameters. // @@ -546,6 +550,7 @@ type sqlcQuerier interface { InsertWorkspaceResourceMetadata(ctx context.Context, arg InsertWorkspaceResourceMetadataParams) ([]WorkspaceResourceMetadatum, error) ListProvisionerKeysByOrganization(ctx context.Context, organizationID uuid.UUID) ([]ProvisionerKey, error) ListProvisionerKeysByOrganizationExcludeReserved(ctx context.Context, organizationID uuid.UUID) ([]ProvisionerKey, error) + ListUserSecrets(ctx context.Context, userID uuid.UUID) ([]UserSecret, error) ListWorkspaceAgentPortShares(ctx context.Context, workspaceID uuid.UUID) ([]WorkspaceAgentPortShare, error) MarkAllInboxNotificationsAsRead(ctx context.Context, arg MarkAllInboxNotificationsAsReadParams) error OIDCClaimFieldValues(ctx context.Context, arg OIDCClaimFieldValuesParams) ([]string, error) @@ -621,6 +626,7 @@ type sqlcQuerier interface { UpdateUserProfile(ctx context.Context, arg UpdateUserProfileParams) (User, error) UpdateUserQuietHoursSchedule(ctx context.Context, arg UpdateUserQuietHoursScheduleParams) (User, error) UpdateUserRoles(ctx context.Context, arg UpdateUserRolesParams) (User, error) + UpdateUserSecret(ctx context.Context, arg UpdateUserSecretParams) (UserSecret, error) UpdateUserStatus(ctx context.Context, arg UpdateUserStatusParams) (User, error) UpdateUserTerminalFont(ctx context.Context, arg UpdateUserTerminalFontParams) (UserConfig, error) UpdateUserThemePreference(ctx context.Context, arg UpdateUserThemePreferenceParams) (UserConfig, error) diff --git a/coderd/database/querier_test.go b/coderd/database/querier_test.go index d90967b95a384..c964a066c58eb 100644 --- a/coderd/database/querier_test.go +++ b/coderd/database/querier_test.go @@ -6004,6 +6004,252 @@ func TestGetRunningPrebuiltWorkspaces(t *testing.T) { require.Equal(t, runningPrebuild.ID, runningPrebuilds[0].ID, "expected the running prebuilt workspace to be returned") } +func TestUserSecretsCRUDOperations(t *testing.T) { + t.Parallel() + + // Use raw database without dbauthz wrapper for this test + db, _ := dbtestutil.NewDB(t) + ctx := testutil.Context(t, testutil.WaitMedium) + + t.Run("FullCRUDWorkflow", func(t *testing.T) { + t.Parallel() + + // Create a new user for this test + testUser := dbgen.User(t, db, database.User{}) + + // 1. CREATE + secretID := uuid.New() + createParams := database.CreateUserSecretParams{ + ID: secretID, + UserID: testUser.ID, + Name: "workflow-secret", + Description: "Secret for full CRUD workflow", + Value: "workflow-value", + EnvName: "WORKFLOW_ENV", + FilePath: "/workflow/path", + } + + createdSecret, err := db.CreateUserSecret(ctx, createParams) + require.NoError(t, err) + assert.Equal(t, secretID, createdSecret.ID) + + // 2. READ by ID + readSecret, err := db.GetUserSecret(ctx, createdSecret.ID) + require.NoError(t, err) + assert.Equal(t, createdSecret.ID, readSecret.ID) + assert.Equal(t, "workflow-secret", readSecret.Name) + + // 3. READ by UserID and Name + readByNameParams := database.GetUserSecretByUserIDAndNameParams{ + UserID: testUser.ID, + Name: "workflow-secret", + } + readByNameSecret, err := db.GetUserSecretByUserIDAndName(ctx, readByNameParams) + require.NoError(t, err) + assert.Equal(t, createdSecret.ID, readByNameSecret.ID) + + // 4. LIST + secrets, err := db.ListUserSecrets(ctx, testUser.ID) + require.NoError(t, err) + require.Len(t, secrets, 1) + assert.Equal(t, createdSecret.ID, secrets[0].ID) + + // 5. UPDATE + updateParams := database.UpdateUserSecretParams{ + ID: createdSecret.ID, + Description: "Updated workflow description", + Value: "updated-workflow-value", + EnvName: "UPDATED_WORKFLOW_ENV", + FilePath: "/updated/workflow/path", + } + + updatedSecret, err := db.UpdateUserSecret(ctx, updateParams) + require.NoError(t, err) + assert.Equal(t, "Updated workflow description", updatedSecret.Description) + assert.Equal(t, "updated-workflow-value", updatedSecret.Value) + + // 6. DELETE + err = db.DeleteUserSecret(ctx, createdSecret.ID) + require.NoError(t, err) + + // Verify deletion + _, err = db.GetUserSecret(ctx, createdSecret.ID) + require.Error(t, err) + assert.Contains(t, err.Error(), "no rows in result set") + + // Verify list is empty + secrets, err = db.ListUserSecrets(ctx, testUser.ID) + require.NoError(t, err) + assert.Len(t, secrets, 0) + }) + + t.Run("UniqueConstraints", func(t *testing.T) { + t.Parallel() + + // Create a new user for this test + testUser := dbgen.User(t, db, database.User{}) + + // Create first secret + secret1 := dbgen.UserSecret(t, db, database.UserSecret{ + UserID: testUser.ID, + Name: "unique-test", + Description: "First secret", + Value: "value1", + EnvName: "UNIQUE_ENV", + FilePath: "/unique/path", + }) + + // Try to create another secret with the same name (should fail) + _, err := db.CreateUserSecret(ctx, database.CreateUserSecretParams{ + UserID: testUser.ID, + Name: "unique-test", // Same name + Description: "Second secret", + Value: "value2", + }) + require.Error(t, err) + assert.Contains(t, err.Error(), "duplicate key value") + + // Try to create another secret with the same env_name (should fail) + _, err = db.CreateUserSecret(ctx, database.CreateUserSecretParams{ + UserID: testUser.ID, + Name: "unique-test-2", + Description: "Second secret", + Value: "value2", + EnvName: "UNIQUE_ENV", // Same env_name + }) + require.Error(t, err) + assert.Contains(t, err.Error(), "duplicate key value") + + // Try to create another secret with the same file_path (should fail) + _, err = db.CreateUserSecret(ctx, database.CreateUserSecretParams{ + UserID: testUser.ID, + Name: "unique-test-3", + Description: "Second secret", + Value: "value2", + FilePath: "/unique/path", // Same file_path + }) + require.Error(t, err) + assert.Contains(t, err.Error(), "duplicate key value") + + // Create secret with empty env_name and file_path (should succeed) + secret2 := dbgen.UserSecret(t, db, database.UserSecret{ + UserID: testUser.ID, + Name: "unique-test-4", + Description: "Second secret", + Value: "value2", + EnvName: "", // Empty env_name + FilePath: "", // Empty file_path + }) + + // Verify both secrets exist + _, err = db.GetUserSecret(ctx, secret1.ID) + require.NoError(t, err) + _, err = db.GetUserSecret(ctx, secret2.ID) + require.NoError(t, err) + }) +} + +func TestUserSecretsAuthorization(t *testing.T) { + t.Parallel() + + // Use raw database and wrap with dbauthz for authorization testing + db, _ := dbtestutil.NewDB(t) + authorizer := rbac.NewStrictCachingAuthorizer(prometheus.NewRegistry()) + authDB := dbauthz.New(db, authorizer, slogtest.Make(t, &slogtest.Options{}), coderdtest.AccessControlStorePointer()) + ctx := testutil.Context(t, testutil.WaitMedium) + + // Create test users + user1 := dbgen.User(t, db, database.User{}) + user2 := dbgen.User(t, db, database.User{}) + owner := dbgen.User(t, db, database.User{}) + orgAdmin := dbgen.User(t, db, database.User{}) + + // Create organization for org-scoped roles + org := dbgen.Organization(t, db, database.Organization{}) + + // Create secrets for users + user1Secret := dbgen.UserSecret(t, db, database.UserSecret{ + UserID: user1.ID, + Name: "user1-secret", + Description: "User 1's secret", + Value: "user1-value", + }) + + user2Secret := dbgen.UserSecret(t, db, database.UserSecret{ + UserID: user2.ID, + Name: "user2-secret", + Description: "User 2's secret", + Value: "user2-value", + }) + + testCases := []struct { + name string + subject rbac.Subject + secretID uuid.UUID + expectedAccess bool + }{ + { + name: "UserCanAccessOwnSecrets", + subject: rbac.Subject{ + ID: user1.ID.String(), + Roles: rbac.RoleIdentifiers{rbac.RoleMember()}, + Scope: rbac.ScopeAll, + }, + secretID: user1Secret.ID, + expectedAccess: true, + }, + { + name: "UserCannotAccessOtherUserSecrets", + subject: rbac.Subject{ + ID: user1.ID.String(), + Roles: rbac.RoleIdentifiers{rbac.RoleMember()}, + Scope: rbac.ScopeAll, + }, + secretID: user2Secret.ID, + expectedAccess: false, + }, + { + name: "OwnerCannotAccessUserSecrets", + subject: rbac.Subject{ + ID: owner.ID.String(), + Roles: rbac.RoleIdentifiers{rbac.RoleOwner()}, + Scope: rbac.ScopeAll, + }, + secretID: user1Secret.ID, + expectedAccess: false, + }, + { + name: "OrgAdminCannotAccessUserSecrets", + subject: rbac.Subject{ + ID: orgAdmin.ID.String(), + Roles: rbac.RoleIdentifiers{rbac.ScopedRoleOrgAdmin(org.ID)}, + Scope: rbac.ScopeAll, + }, + secretID: user1Secret.ID, + expectedAccess: false, + }, + } + + for _, tc := range testCases { + tc := tc // capture range variable + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + authCtx := dbauthz.As(ctx, tc.subject) + + // Test GetUserSecret + _, err := authDB.GetUserSecret(authCtx, tc.secretID) + + if tc.expectedAccess { + require.NoError(t, err, "expected access to be granted") + } else { + require.Error(t, err, "expected access to be denied") + assert.True(t, dbauthz.IsNotAuthorizedError(err), "expected authorization error") + } + }) + } +} + func TestWorkspaceBuildDeadlineConstraint(t *testing.T) { t.Parallel() diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 4adc936683067..74cefd09359b0 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -13807,6 +13807,196 @@ func (q *sqlQuerier) UpdateUserLinkedID(ctx context.Context, arg UpdateUserLinke return i, err } +const createUserSecret = `-- name: CreateUserSecret :one +INSERT INTO user_secrets ( + id, + user_id, + name, + description, + value, + env_name, + file_path +) VALUES ( + $1, $2, $3, $4, $5, $6, $7 +) RETURNING id, user_id, name, description, value, env_name, file_path, created_at, updated_at +` + +type CreateUserSecretParams struct { + ID uuid.UUID `db:"id" json:"id"` + UserID uuid.UUID `db:"user_id" json:"user_id"` + Name string `db:"name" json:"name"` + Description string `db:"description" json:"description"` + Value string `db:"value" json:"value"` + EnvName string `db:"env_name" json:"env_name"` + FilePath string `db:"file_path" json:"file_path"` +} + +func (q *sqlQuerier) CreateUserSecret(ctx context.Context, arg CreateUserSecretParams) (UserSecret, error) { + row := q.db.QueryRowContext(ctx, createUserSecret, + arg.ID, + arg.UserID, + arg.Name, + arg.Description, + arg.Value, + arg.EnvName, + arg.FilePath, + ) + var i UserSecret + err := row.Scan( + &i.ID, + &i.UserID, + &i.Name, + &i.Description, + &i.Value, + &i.EnvName, + &i.FilePath, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const deleteUserSecret = `-- name: DeleteUserSecret :exec +DELETE FROM user_secrets +WHERE id = $1 +` + +func (q *sqlQuerier) DeleteUserSecret(ctx context.Context, id uuid.UUID) error { + _, err := q.db.ExecContext(ctx, deleteUserSecret, id) + return err +} + +const getUserSecret = `-- name: GetUserSecret :one +SELECT id, user_id, name, description, value, env_name, file_path, created_at, updated_at FROM user_secrets +WHERE id = $1 +` + +func (q *sqlQuerier) GetUserSecret(ctx context.Context, id uuid.UUID) (UserSecret, error) { + row := q.db.QueryRowContext(ctx, getUserSecret, id) + var i UserSecret + err := row.Scan( + &i.ID, + &i.UserID, + &i.Name, + &i.Description, + &i.Value, + &i.EnvName, + &i.FilePath, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getUserSecretByUserIDAndName = `-- name: GetUserSecretByUserIDAndName :one +SELECT id, user_id, name, description, value, env_name, file_path, created_at, updated_at FROM user_secrets +WHERE user_id = $1 AND name = $2 +` + +type GetUserSecretByUserIDAndNameParams struct { + UserID uuid.UUID `db:"user_id" json:"user_id"` + Name string `db:"name" json:"name"` +} + +func (q *sqlQuerier) GetUserSecretByUserIDAndName(ctx context.Context, arg GetUserSecretByUserIDAndNameParams) (UserSecret, error) { + row := q.db.QueryRowContext(ctx, getUserSecretByUserIDAndName, arg.UserID, arg.Name) + var i UserSecret + err := row.Scan( + &i.ID, + &i.UserID, + &i.Name, + &i.Description, + &i.Value, + &i.EnvName, + &i.FilePath, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const listUserSecrets = `-- name: ListUserSecrets :many +SELECT id, user_id, name, description, value, env_name, file_path, created_at, updated_at FROM user_secrets +WHERE user_id = $1 +ORDER BY name ASC +` + +func (q *sqlQuerier) ListUserSecrets(ctx context.Context, userID uuid.UUID) ([]UserSecret, error) { + rows, err := q.db.QueryContext(ctx, listUserSecrets, userID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []UserSecret + for rows.Next() { + var i UserSecret + if err := rows.Scan( + &i.ID, + &i.UserID, + &i.Name, + &i.Description, + &i.Value, + &i.EnvName, + &i.FilePath, + &i.CreatedAt, + &i.UpdatedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const updateUserSecret = `-- name: UpdateUserSecret :one +UPDATE user_secrets +SET + description = $2, + value = $3, + env_name = $4, + file_path = $5, + updated_at = CURRENT_TIMESTAMP +WHERE id = $1 +RETURNING id, user_id, name, description, value, env_name, file_path, created_at, updated_at +` + +type UpdateUserSecretParams struct { + ID uuid.UUID `db:"id" json:"id"` + Description string `db:"description" json:"description"` + Value string `db:"value" json:"value"` + EnvName string `db:"env_name" json:"env_name"` + FilePath string `db:"file_path" json:"file_path"` +} + +func (q *sqlQuerier) UpdateUserSecret(ctx context.Context, arg UpdateUserSecretParams) (UserSecret, error) { + row := q.db.QueryRowContext(ctx, updateUserSecret, + arg.ID, + arg.Description, + arg.Value, + arg.EnvName, + arg.FilePath, + ) + var i UserSecret + err := row.Scan( + &i.ID, + &i.UserID, + &i.Name, + &i.Description, + &i.Value, + &i.EnvName, + &i.FilePath, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + const allUserIDs = `-- name: AllUserIDs :many SELECT DISTINCT id FROM USERS WHERE CASE WHEN $1::bool THEN TRUE ELSE is_system = false END diff --git a/coderd/database/queries/user_secrets.sql b/coderd/database/queries/user_secrets.sql new file mode 100644 index 0000000000000..271b97c9bb13c --- /dev/null +++ b/coderd/database/queries/user_secrets.sql @@ -0,0 +1,40 @@ +-- name: GetUserSecretByUserIDAndName :one +SELECT * FROM user_secrets +WHERE user_id = $1 AND name = $2; + +-- name: GetUserSecret :one +SELECT * FROM user_secrets +WHERE id = $1; + +-- name: ListUserSecrets :many +SELECT * FROM user_secrets +WHERE user_id = $1 +ORDER BY name ASC; + +-- name: CreateUserSecret :one +INSERT INTO user_secrets ( + id, + user_id, + name, + description, + value, + env_name, + file_path +) VALUES ( + $1, $2, $3, $4, $5, $6, $7 +) RETURNING *; + +-- name: UpdateUserSecret :one +UPDATE user_secrets +SET + description = $2, + value = $3, + env_name = $4, + file_path = $5, + updated_at = CURRENT_TIMESTAMP +WHERE id = $1 +RETURNING *; + +-- name: DeleteUserSecret :exec +DELETE FROM user_secrets +WHERE id = $1; diff --git a/coderd/database/unique_constraint.go b/coderd/database/unique_constraint.go index 38c95e67410c9..3ed326102b18c 100644 --- a/coderd/database/unique_constraint.go +++ b/coderd/database/unique_constraint.go @@ -70,6 +70,7 @@ const ( UniqueUserConfigsPkey UniqueConstraint = "user_configs_pkey" // ALTER TABLE ONLY user_configs ADD CONSTRAINT user_configs_pkey PRIMARY KEY (user_id, key); UniqueUserDeletedPkey UniqueConstraint = "user_deleted_pkey" // ALTER TABLE ONLY user_deleted ADD CONSTRAINT user_deleted_pkey PRIMARY KEY (id); UniqueUserLinksPkey UniqueConstraint = "user_links_pkey" // ALTER TABLE ONLY user_links ADD CONSTRAINT user_links_pkey PRIMARY KEY (user_id, login_type); + UniqueUserSecretsPkey UniqueConstraint = "user_secrets_pkey" // ALTER TABLE ONLY user_secrets ADD CONSTRAINT user_secrets_pkey PRIMARY KEY (id); UniqueUserStatusChangesPkey UniqueConstraint = "user_status_changes_pkey" // ALTER TABLE ONLY user_status_changes ADD CONSTRAINT user_status_changes_pkey PRIMARY KEY (id); UniqueUsersPkey UniqueConstraint = "users_pkey" // ALTER TABLE ONLY users ADD CONSTRAINT users_pkey PRIMARY KEY (id); UniqueWebpushSubscriptionsPkey UniqueConstraint = "webpush_subscriptions_pkey" // ALTER TABLE ONLY webpush_subscriptions ADD CONSTRAINT webpush_subscriptions_pkey PRIMARY KEY (id); @@ -115,6 +116,9 @@ const ( UniqueTemplateUsageStatsStartTimeTemplateIDUserIDIndex UniqueConstraint = "template_usage_stats_start_time_template_id_user_id_idx" // CREATE UNIQUE INDEX template_usage_stats_start_time_template_id_user_id_idx ON template_usage_stats USING btree (start_time, template_id, user_id); UniqueTemplatesOrganizationIDNameIndex UniqueConstraint = "templates_organization_id_name_idx" // CREATE UNIQUE INDEX templates_organization_id_name_idx ON templates USING btree (organization_id, lower((name)::text)) WHERE (deleted = false); UniqueUserLinksLinkedIDLoginTypeIndex UniqueConstraint = "user_links_linked_id_login_type_idx" // CREATE UNIQUE INDEX user_links_linked_id_login_type_idx ON user_links USING btree (linked_id, login_type) WHERE (linked_id <> ''::text); + UniqueUserSecretsUserEnvNameIndex UniqueConstraint = "user_secrets_user_env_name_idx" // CREATE UNIQUE INDEX user_secrets_user_env_name_idx ON user_secrets USING btree (user_id, env_name) WHERE (env_name <> ''::text); + UniqueUserSecretsUserFilePathIndex UniqueConstraint = "user_secrets_user_file_path_idx" // CREATE UNIQUE INDEX user_secrets_user_file_path_idx ON user_secrets USING btree (user_id, file_path) WHERE (file_path <> ''::text); + UniqueUserSecretsUserNameIndex UniqueConstraint = "user_secrets_user_name_idx" // CREATE UNIQUE INDEX user_secrets_user_name_idx ON user_secrets USING btree (user_id, name); UniqueUsersEmailLowerIndex UniqueConstraint = "users_email_lower_idx" // CREATE UNIQUE INDEX users_email_lower_idx ON users USING btree (lower(email)) WHERE (deleted = false); UniqueUsersUsernameLowerIndex UniqueConstraint = "users_username_lower_idx" // CREATE UNIQUE INDEX users_username_lower_idx ON users USING btree (lower(username)) WHERE (deleted = false); UniqueWorkspaceAppAuditSessionsUniqueIndex UniqueConstraint = "workspace_app_audit_sessions_unique_index" // CREATE UNIQUE INDEX workspace_app_audit_sessions_unique_index ON workspace_app_audit_sessions USING btree (agent_id, app_id, user_id, ip, user_agent, slug_or_port, status_code); diff --git a/coderd/rbac/object_gen.go b/coderd/rbac/object_gen.go index 5fb3cc2bd8a3b..ca7f23b4af280 100644 --- a/coderd/rbac/object_gen.go +++ b/coderd/rbac/object_gen.go @@ -301,6 +301,16 @@ var ( Type: "user", } + // ResourceUserSecret + // Valid Actions + // - "ActionCreate" :: create a user secret + // - "ActionDelete" :: delete a user secret + // - "ActionRead" :: read user secret metadata and value + // - "ActionUpdate" :: update user secret metadata and value + ResourceUserSecret = Object{ + Type: "user_secret", + } + // ResourceWebpushSubscription // Valid Actions // - "ActionCreate" :: create webpush subscriptions @@ -403,6 +413,7 @@ func AllResources() []Objecter { ResourceTailnetCoordinator, ResourceTemplate, ResourceUser, + ResourceUserSecret, ResourceWebpushSubscription, ResourceWorkspace, ResourceWorkspaceAgentDevcontainers, diff --git a/coderd/rbac/policy/policy.go b/coderd/rbac/policy/policy.go index 8f05bbdbe544f..5ba79c6434d44 100644 --- a/coderd/rbac/policy/policy.go +++ b/coderd/rbac/policy/policy.go @@ -343,4 +343,12 @@ var RBACPermissions = map[string]PermissionDefinition{ ActionCreate: "create workspace agent devcontainers", }, }, + "user_secret": { + Actions: map[Action]ActionDefinition{ + ActionCreate: "create a user secret", + ActionRead: "read user secret metadata and value", + ActionUpdate: "update user secret metadata and value", + ActionDelete: "delete a user secret", + }, + }, } diff --git a/coderd/rbac/roles.go b/coderd/rbac/roles.go index b8d3f959ce477..33635f34e5914 100644 --- a/coderd/rbac/roles.go +++ b/coderd/rbac/roles.go @@ -269,8 +269,9 @@ func ReloadBuiltinRoles(opts *RoleOptions) { DisplayName: "Owner", Site: append( // Workspace dormancy and workspace are omitted. - // Workspace is specifically handled based on the opts.NoOwnerWorkspaceExec - allPermsExcept(ResourceWorkspaceDormant, ResourcePrebuiltWorkspace, ResourceWorkspace), + // Workspace is specifically handled based on the opts.NoOwnerWorkspaceExec. + // Owners cannot access other users' secrets. + allPermsExcept(ResourceWorkspaceDormant, ResourcePrebuiltWorkspace, ResourceWorkspace, ResourceUserSecret), // This adds back in the Workspace permissions. Permissions(map[string][]policy.Action{ ResourceWorkspace.Type: ownerWorkspaceActions, @@ -417,7 +418,7 @@ func ReloadBuiltinRoles(opts *RoleOptions) { }), Org: map[string][]Permission{ // Org admins should not have workspace exec perms. - organizationID.String(): append(allPermsExcept(ResourceWorkspace, ResourceWorkspaceDormant, ResourcePrebuiltWorkspace, ResourceAssignRole), Permissions(map[string][]policy.Action{ + organizationID.String(): append(allPermsExcept(ResourceWorkspace, ResourceWorkspaceDormant, ResourcePrebuiltWorkspace, ResourceAssignRole, ResourceUserSecret), Permissions(map[string][]policy.Action{ ResourceWorkspaceDormant.Type: {policy.ActionRead, policy.ActionDelete, policy.ActionCreate, policy.ActionUpdate, policy.ActionWorkspaceStop, policy.ActionCreateAgent, policy.ActionDeleteAgent}, ResourceWorkspace.Type: slice.Omit(ResourceWorkspace.AvailableActions(), policy.ActionApplicationConnect, policy.ActionSSH), // PrebuiltWorkspaces are a subset of Workspaces. diff --git a/coderd/rbac/roles_test.go b/coderd/rbac/roles_test.go index 267a99993e642..f79a6408df79b 100644 --- a/coderd/rbac/roles_test.go +++ b/coderd/rbac/roles_test.go @@ -858,6 +858,20 @@ func TestRolePermissions(t *testing.T) { false: {setOtherOrg, setOrgNotMe, memberMe, orgMemberMe, templateAdmin, userAdmin}, }, }, + // Only the user themselves can access their own secrets — no one else. + { + Name: "UserSecrets", + Actions: []policy.Action{policy.ActionCreate, policy.ActionRead, policy.ActionUpdate, policy.ActionDelete}, + Resource: rbac.ResourceUserSecret.WithOwner(currentUser.String()), + AuthorizeMap: map[bool][]hasAuthSubjects{ + true: {memberMe, orgMemberMe}, + false: { + owner, orgAdmin, + otherOrgAdmin, otherOrgMember, orgAuditor, orgUserAdmin, orgTemplateAdmin, + templateAdmin, userAdmin, otherOrgAuditor, otherOrgUserAdmin, otherOrgTemplateAdmin, + }, + }, + }, } // We expect every permission to be tested above. diff --git a/codersdk/rbacresources_gen.go b/codersdk/rbacresources_gen.go index 3e22d29c73297..9dd2056b781b4 100644 --- a/codersdk/rbacresources_gen.go +++ b/codersdk/rbacresources_gen.go @@ -36,6 +36,7 @@ const ( ResourceTailnetCoordinator RBACResource = "tailnet_coordinator" ResourceTemplate RBACResource = "template" ResourceUser RBACResource = "user" + ResourceUserSecret RBACResource = "user_secret" ResourceWebpushSubscription RBACResource = "webpush_subscription" ResourceWorkspace RBACResource = "workspace" ResourceWorkspaceAgentDevcontainers RBACResource = "workspace_agent_devcontainers" @@ -100,6 +101,7 @@ var RBACResourceActions = map[RBACResource][]RBACAction{ ResourceTailnetCoordinator: {ActionCreate, ActionDelete, ActionRead, ActionUpdate}, ResourceTemplate: {ActionCreate, ActionDelete, ActionRead, ActionUpdate, ActionUse, ActionViewInsights}, ResourceUser: {ActionCreate, ActionDelete, ActionRead, ActionReadPersonal, ActionUpdate, ActionUpdatePersonal}, + ResourceUserSecret: {ActionCreate, ActionDelete, ActionRead, ActionUpdate}, ResourceWebpushSubscription: {ActionCreate, ActionDelete, ActionRead}, ResourceWorkspace: {ActionApplicationConnect, ActionCreate, ActionCreateAgent, ActionDelete, ActionDeleteAgent, ActionRead, ActionSSH, ActionWorkspaceStart, ActionWorkspaceStop, ActionUpdate}, ResourceWorkspaceAgentDevcontainers: {ActionCreate}, diff --git a/docs/reference/api/members.md b/docs/reference/api/members.md index 4b0adbf45e338..0533da5114482 100644 --- a/docs/reference/api/members.md +++ b/docs/reference/api/members.md @@ -214,6 +214,7 @@ Status Code **200** | `resource_type` | `tailnet_coordinator` | | `resource_type` | `template` | | `resource_type` | `user` | +| `resource_type` | `user_secret` | | `resource_type` | `webpush_subscription` | | `resource_type` | `workspace` | | `resource_type` | `workspace_agent_devcontainers` | @@ -384,6 +385,7 @@ Status Code **200** | `resource_type` | `tailnet_coordinator` | | `resource_type` | `template` | | `resource_type` | `user` | +| `resource_type` | `user_secret` | | `resource_type` | `webpush_subscription` | | `resource_type` | `workspace` | | `resource_type` | `workspace_agent_devcontainers` | @@ -554,6 +556,7 @@ Status Code **200** | `resource_type` | `tailnet_coordinator` | | `resource_type` | `template` | | `resource_type` | `user` | +| `resource_type` | `user_secret` | | `resource_type` | `webpush_subscription` | | `resource_type` | `workspace` | | `resource_type` | `workspace_agent_devcontainers` | @@ -693,6 +696,7 @@ Status Code **200** | `resource_type` | `tailnet_coordinator` | | `resource_type` | `template` | | `resource_type` | `user` | +| `resource_type` | `user_secret` | | `resource_type` | `webpush_subscription` | | `resource_type` | `workspace` | | `resource_type` | `workspace_agent_devcontainers` | @@ -1054,6 +1058,7 @@ Status Code **200** | `resource_type` | `tailnet_coordinator` | | `resource_type` | `template` | | `resource_type` | `user` | +| `resource_type` | `user_secret` | | `resource_type` | `webpush_subscription` | | `resource_type` | `workspace` | | `resource_type` | `workspace_agent_devcontainers` | diff --git a/docs/reference/api/schemas.md b/docs/reference/api/schemas.md index 581743ea7cc22..b3824d0c9b9b8 100644 --- a/docs/reference/api/schemas.md +++ b/docs/reference/api/schemas.md @@ -6379,6 +6379,7 @@ Only certain features set these fields: - FeatureManagedAgentLimit| | `tailnet_coordinator` | | `template` | | `user` | +| `user_secret` | | `webpush_subscription` | | `workspace` | | `workspace_agent_devcontainers` | diff --git a/site/src/api/rbacresourcesGenerated.ts b/site/src/api/rbacresourcesGenerated.ts index 5d632d57fad95..33ff18e8ce4d6 100644 --- a/site/src/api/rbacresourcesGenerated.ts +++ b/site/src/api/rbacresourcesGenerated.ts @@ -167,6 +167,12 @@ export const RBACResourceActions: Partial< update: "update an existing user", update_personal: "update personal data", }, + user_secret: { + create: "create a user secret", + delete: "delete a user secret", + read: "read user secret metadata and value", + update: "update user secret metadata and value", + }, webpush_subscription: { create: "create webpush subscriptions", delete: "delete webpush subscriptions", diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index db901630b71cf..52fdb1d6effc4 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -2386,6 +2386,7 @@ export type RBACResource = | "tailnet_coordinator" | "template" | "user" + | "user_secret" | "webpush_subscription" | "*" | "workspace" @@ -2426,6 +2427,7 @@ export const RBACResources: RBACResource[] = [ "tailnet_coordinator", "template", "user", + "user_secret", "webpush_subscription", "*", "workspace", From 0a3afeddc8a077dd90b472b04dcafe4ca1cd54eb Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 7 Aug 2025 15:05:32 -0500 Subject: [PATCH 105/260] chore: add more pprof labels for various go routines (#19243) - ReplicaSync - Notifications - MetricsAggregator - DBPurge --- coderd/database/dbpurge/dbpurge.go | 11 ++++++----- coderd/notifications/manager.go | 7 ++++--- coderd/pproflabel/pproflabel.go | 10 +++++++++- coderd/prometheusmetrics/aggregator.go | 8 ++++---- enterprise/replicasync/replicasync.go | 3 ++- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/coderd/database/dbpurge/dbpurge.go b/coderd/database/dbpurge/dbpurge.go index 135d7f40b05dd..5afa9b4ba2975 100644 --- a/coderd/database/dbpurge/dbpurge.go +++ b/coderd/database/dbpurge/dbpurge.go @@ -12,6 +12,7 @@ import ( "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/database/dbtime" + "github.com/coder/coder/v2/coderd/pproflabel" "github.com/coder/quartz" ) @@ -38,7 +39,7 @@ func New(ctx context.Context, logger slog.Logger, db database.Store, clk quartz. // Start the ticker with the initial delay. ticker := clk.NewTicker(delay) - doTick := func(start time.Time) { + doTick := func(ctx context.Context, start time.Time) { defer ticker.Reset(delay) // Start a transaction to grab advisory lock, we don't want to run // multiple purges at the same time (multiple replicas). @@ -85,21 +86,21 @@ func New(ctx context.Context, logger slog.Logger, db database.Store, clk quartz. } } - go func() { + pproflabel.Go(ctx, pproflabel.Service(pproflabel.ServiceDBPurge), func(ctx context.Context) { defer close(closed) defer ticker.Stop() // Force an initial tick. - doTick(dbtime.Time(clk.Now()).UTC()) + doTick(ctx, dbtime.Time(clk.Now()).UTC()) for { select { case <-ctx.Done(): return case tick := <-ticker.C: ticker.Stop() - doTick(dbtime.Time(tick).UTC()) + doTick(ctx, dbtime.Time(tick).UTC()) } } - }() + }) return &instance{ cancel: cancelFunc, closed: closed, diff --git a/coderd/notifications/manager.go b/coderd/notifications/manager.go index 11588a09fb797..943306d443265 100644 --- a/coderd/notifications/manager.go +++ b/coderd/notifications/manager.go @@ -11,12 +11,13 @@ import ( "golang.org/x/xerrors" "cdr.dev/slog" - "github.com/coder/quartz" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/pubsub" "github.com/coder/coder/v2/coderd/notifications/dispatch" + "github.com/coder/coder/v2/coderd/pproflabel" "github.com/coder/coder/v2/codersdk" + "github.com/coder/quartz" ) var ErrInvalidDispatchTimeout = xerrors.New("dispatch timeout must be less than lease period") @@ -145,7 +146,7 @@ func (m *Manager) Run(ctx context.Context) { m.runOnce.Do(func() { // Closes when Stop() is called or context is canceled. - go func() { + pproflabel.Go(ctx, pproflabel.Service(pproflabel.ServiceNotifications), func(ctx context.Context) { err := m.loop(ctx) if err != nil { if xerrors.Is(err, ErrManagerAlreadyClosed) { @@ -154,7 +155,7 @@ func (m *Manager) Run(ctx context.Context) { m.log.Error(ctx, "notification manager stopped with error", slog.Error(err)) } } - }() + }) }) } diff --git a/coderd/pproflabel/pproflabel.go b/coderd/pproflabel/pproflabel.go index 2bfd071dcdc39..a412ec0bf92c3 100644 --- a/coderd/pproflabel/pproflabel.go +++ b/coderd/pproflabel/pproflabel.go @@ -21,9 +21,17 @@ const ( ServiceHTTPServer = "http-api" ServiceLifecycles = "lifecycle-executor" - ServiceMetricCollector = "metrics-collector" ServicePrebuildReconciler = "prebuilds-reconciler" ServiceTerraformProvisioner = "terraform-provisioner" + ServiceDBPurge = "db-purge" + ServiceNotifications = "notifications" + ServiceReplicaSync = "replica-sync" + // ServiceMetricCollector collects metrics from insights in the database and + // exports them in a prometheus collector format. + ServiceMetricCollector = "metrics-collector" + // ServiceAgentMetricAggregator merges agent metrics and exports them in a + // prometheus collector format. + ServiceAgentMetricAggregator = "agent-metrics-aggregator" RequestTypeTag = "coder_request_type" ) diff --git a/coderd/prometheusmetrics/aggregator.go b/coderd/prometheusmetrics/aggregator.go index 44ade677d5cff..ad51c3e7fa8a7 100644 --- a/coderd/prometheusmetrics/aggregator.go +++ b/coderd/prometheusmetrics/aggregator.go @@ -11,11 +11,11 @@ import ( "github.com/prometheus/common/model" "golang.org/x/xerrors" - "github.com/coder/coder/v2/coderd/agentmetrics" - "cdr.dev/slog" agentproto "github.com/coder/coder/v2/agent/proto" + "github.com/coder/coder/v2/coderd/agentmetrics" + "github.com/coder/coder/v2/coderd/pproflabel" ) const ( @@ -298,7 +298,7 @@ func (ma *MetricsAggregator) Run(ctx context.Context) func() { done := make(chan struct{}) cleanupTicker := time.NewTicker(ma.metricsCleanupInterval) - go func() { + pproflabel.Go(ctx, pproflabel.Service(pproflabel.ServiceAgentMetricAggregator), func(ctx context.Context) { defer close(done) defer cleanupTicker.Stop() @@ -395,7 +395,7 @@ func (ma *MetricsAggregator) Run(ctx context.Context) func() { return } } - }() + }) return func() { cancelFunc() <-done diff --git a/enterprise/replicasync/replicasync.go b/enterprise/replicasync/replicasync.go index 528540a262464..129e652c97de5 100644 --- a/enterprise/replicasync/replicasync.go +++ b/enterprise/replicasync/replicasync.go @@ -23,6 +23,7 @@ import ( "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/database/dbtime" "github.com/coder/coder/v2/coderd/database/pubsub" + "github.com/coder/coder/v2/coderd/pproflabel" ) var PubsubEvent = "replica" @@ -104,7 +105,7 @@ func New(ctx context.Context, logger slog.Logger, db database.Store, ps pubsub.P return nil, xerrors.Errorf("subscribe: %w", err) } manager.closeWait.Add(1) - go manager.loop(ctx) + pproflabel.Go(ctx, pproflabel.Service(pproflabel.ServiceReplicaSync), manager.loop) return manager, nil } From 5225c5671d402be240e745348367e223926dea7e Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Thu, 7 Aug 2025 16:54:50 -0400 Subject: [PATCH 106/260] fix(site): add tests for `createMockWebSocket` (#19172) Needed for https://github.com/coder/coder/pull/19126 and https://github.com/coder/coder/pull/18679 ## Changes made - Moved `createWebSocket` to dedicated file and addressed edge cases for making it a reliable mock - Added test cases to validate mock functionality --- site/src/testHelpers/websockets.test.ts | 186 ++++++++++++++++++++ site/src/testHelpers/websockets.ts | 162 ++++++++++++++++++ site/src/utils/OneWayWebSocket.test.ts | 214 +++++------------------- 3 files changed, 388 insertions(+), 174 deletions(-) create mode 100644 site/src/testHelpers/websockets.test.ts create mode 100644 site/src/testHelpers/websockets.ts diff --git a/site/src/testHelpers/websockets.test.ts b/site/src/testHelpers/websockets.test.ts new file mode 100644 index 0000000000000..edd4191cffebe --- /dev/null +++ b/site/src/testHelpers/websockets.test.ts @@ -0,0 +1,186 @@ +import { createMockWebSocket } from "./websockets"; + +describe(createMockWebSocket.name, () => { + it("Throws if URL does not have ws:// or wss:// protocols", () => { + const urls: readonly string[] = [ + "http://www.dog.ceo/roll-over", + "https://www.dog.ceo/roll-over", + ]; + for (const url of urls) { + expect(() => { + void createMockWebSocket(url); + }).toThrow("URL must start with ws:// or wss://"); + } + }); + + it("Sends events from server to socket", () => { + const [socket, server] = createMockWebSocket("wss://www.dog.ceo/shake"); + + const onOpen = jest.fn(); + const onError = jest.fn(); + const onMessage = jest.fn(); + const onClose = jest.fn(); + + socket.addEventListener("open", onOpen); + socket.addEventListener("error", onError); + socket.addEventListener("message", onMessage); + socket.addEventListener("close", onClose); + + const openEvent = new Event("open"); + const errorEvent = new Event("error"); + const messageEvent = new MessageEvent("message"); + const closeEvent = new CloseEvent("close"); + + server.publishOpen(openEvent); + server.publishError(errorEvent); + server.publishMessage(messageEvent); + server.publishClose(closeEvent); + + expect(onOpen).toHaveBeenCalledTimes(1); + expect(onOpen).toHaveBeenCalledWith(openEvent); + + expect(onError).toHaveBeenCalledTimes(1); + expect(onError).toHaveBeenCalledWith(errorEvent); + + expect(onMessage).toHaveBeenCalledTimes(1); + expect(onMessage).toHaveBeenCalledWith(messageEvent); + + expect(onClose).toHaveBeenCalledTimes(1); + expect(onClose).toHaveBeenCalledWith(closeEvent); + }); + + it("Sends JSON data to the socket for message events", () => { + const [socket, server] = createMockWebSocket("wss://www.dog.ceo/wag"); + const onMessage = jest.fn(); + + // Could type this as a special JSON type, but unknown is good enough, + // since any invalid values will throw in the test case + const jsonData: readonly unknown[] = [ + "blah", + 42, + true, + false, + null, + {}, + [], + [{ value: "blah" }, { value: "guh" }, { value: "huh" }], + { + name: "Hershel Layton", + age: 40, + profession: "Puzzle Solver", + sadBackstory: true, + greatVideoGames: true, + }, + ]; + for (const jd of jsonData) { + socket.addEventListener("message", onMessage); + server.publishMessage( + new MessageEvent("message", { data: JSON.stringify(jd) }), + ); + + expect(onMessage).toHaveBeenCalledTimes(1); + expect(onMessage).toHaveBeenCalledWith( + new MessageEvent("message", { data: JSON.stringify(jd) }), + ); + + socket.removeEventListener("message", onMessage); + onMessage.mockClear(); + } + }); + + it("Only registers each socket event handler once", () => { + const [socket, server] = createMockWebSocket("wss://www.dog.ceo/borf"); + + const onOpen = jest.fn(); + const onError = jest.fn(); + const onMessage = jest.fn(); + const onClose = jest.fn(); + + // Do it once + socket.addEventListener("open", onOpen); + socket.addEventListener("error", onError); + socket.addEventListener("message", onMessage); + socket.addEventListener("close", onClose); + + // Do it again with the exact same functions + socket.addEventListener("open", onOpen); + socket.addEventListener("error", onError); + socket.addEventListener("message", onMessage); + socket.addEventListener("close", onClose); + + server.publishOpen(new Event("open")); + server.publishError(new Event("error")); + server.publishMessage(new MessageEvent("message")); + server.publishClose(new CloseEvent("close")); + + expect(onOpen).toHaveBeenCalledTimes(1); + expect(onError).toHaveBeenCalledTimes(1); + expect(onMessage).toHaveBeenCalledTimes(1); + expect(onClose).toHaveBeenCalledTimes(1); + }); + + it("Lets a socket unsubscribe to event types", () => { + const [socket, server] = createMockWebSocket("wss://www.dog.ceo/zoomies"); + + const onOpen = jest.fn(); + const onError = jest.fn(); + const onMessage = jest.fn(); + const onClose = jest.fn(); + + socket.addEventListener("open", onOpen); + socket.addEventListener("error", onError); + socket.addEventListener("message", onMessage); + socket.addEventListener("close", onClose); + + socket.removeEventListener("open", onOpen); + socket.removeEventListener("error", onError); + socket.removeEventListener("message", onMessage); + socket.removeEventListener("close", onClose); + + server.publishOpen(new Event("open")); + server.publishError(new Event("error")); + server.publishMessage(new MessageEvent("message")); + server.publishClose(new CloseEvent("close")); + + expect(onOpen).not.toHaveBeenCalled(); + expect(onError).not.toHaveBeenCalled(); + expect(onMessage).not.toHaveBeenCalled(); + expect(onClose).not.toHaveBeenCalled(); + }); + + it("Renders socket inert after being closed", () => { + const [socket, server] = createMockWebSocket("wss://www.dog.ceo/woof"); + expect(server.isConnectionOpen).toBe(true); + + const onMessage = jest.fn(); + socket.addEventListener("message", onMessage); + + socket.close(); + expect(server.isConnectionOpen).toBe(false); + + server.publishMessage(new MessageEvent("message")); + expect(onMessage).not.toHaveBeenCalled(); + }); + + it("Tracks arguments sent by the mock socket", () => { + const [socket, server] = createMockWebSocket("wss://www.dog.ceo/wan-wan"); + const data = JSON.stringify({ + famousDogs: [ + "snoopy", + "clifford", + "lassie", + "beethoven", + "courage the cowardly dog", + ], + }); + + socket.send(data); + expect(server.clientSentData).toHaveLength(1); + expect(server.clientSentData).toEqual([data]); + + socket.close(); + socket.send(data); + expect(server.clientSentData).toHaveLength(1); + expect(server.clientSentData).toEqual([data]); + }); +}); diff --git a/site/src/testHelpers/websockets.ts b/site/src/testHelpers/websockets.ts new file mode 100644 index 0000000000000..57584cd55e887 --- /dev/null +++ b/site/src/testHelpers/websockets.ts @@ -0,0 +1,162 @@ +import type { WebSocketEventType } from "utils/OneWayWebSocket"; + +type SocketSendData = Parameters[0]; + +export type MockWebSocketServer = Readonly<{ + publishMessage: (event: MessageEvent) => void; + publishError: (event: Event) => void; + publishClose: (event: CloseEvent) => void; + publishOpen: (event: Event) => void; + + readonly isConnectionOpen: boolean; + readonly clientSentData: readonly SocketSendData[]; +}>; + +type CallbackStore = { + [K in keyof WebSocketEventMap]: Set<(event: WebSocketEventMap[K]) => void>; +}; + +type MockWebSocket = Omit & { + /** + * A version of the WebSocket `send` method that has been pre-wrapped inside + * a Jest mock. + * + * The Jest mock functionality should be used at a minimum. Basically: + * 1. If you want to check that the mock socket sent something to the mock + * server: call the `send` method as a function, and then check the + * `clientSentData` on `MockWebSocketServer` to see what data got + * received. + * 2. If you need to make sure that the client-side `send` method got called + * at all: you can use the Jest mock functionality, but you should + * probably also be checking `clientSentData` still and making additional + * assertions with it. + * + * Generally, tests should center around whether socket-to-server + * communication was successful, not whether the client-side method was + * called. + */ + send: jest.Mock; +}; + +export function createMockWebSocket( + url: string, + protocol?: string | string[] | undefined, +): readonly [MockWebSocket, MockWebSocketServer] { + if (!url.startsWith("ws://") && !url.startsWith("wss://")) { + throw new Error("URL must start with ws:// or wss://"); + } + + const activeProtocol = Array.isArray(protocol) + ? protocol.join(" ") + : (protocol ?? ""); + + let isOpen = true; + const store: CallbackStore = { + message: new Set(), + error: new Set(), + close: new Set(), + open: new Set(), + }; + + const sentData: SocketSendData[] = []; + + const mockSocket: MockWebSocket = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3, + + url, + protocol: activeProtocol, + readyState: 1, + binaryType: "blob", + bufferedAmount: 0, + extensions: "", + onclose: null, + onerror: null, + onmessage: null, + onopen: null, + dispatchEvent: jest.fn(), + + send: jest.fn((data) => { + if (!isOpen) { + return; + } + sentData.push(data); + }), + + addEventListener: ( + eventType: E, + callback: (event: WebSocketEventMap[E]) => void, + ) => { + if (!isOpen) { + return; + } + const subscribers = store[eventType]; + subscribers.add(callback); + }, + + removeEventListener: ( + eventType: E, + callback: (event: WebSocketEventMap[E]) => void, + ) => { + if (!isOpen) { + return; + } + const subscribers = store[eventType]; + subscribers.delete(callback); + }, + + close: () => { + isOpen = false; + }, + }; + + const publisher: MockWebSocketServer = { + get isConnectionOpen() { + return isOpen; + }, + + get clientSentData() { + return [...sentData]; + }, + + publishOpen: (event) => { + if (!isOpen) { + return; + } + for (const sub of store.open) { + sub(event); + } + }, + + publishError: (event) => { + if (!isOpen) { + return; + } + for (const sub of store.error) { + sub(event); + } + }, + + publishMessage: (event) => { + if (!isOpen) { + return; + } + for (const sub of store.message) { + sub(event); + } + }, + + publishClose: (event) => { + if (!isOpen) { + return; + } + for (const sub of store.close) { + sub(event); + } + }, + }; + + return [mockSocket, publisher] as const; +} diff --git a/site/src/utils/OneWayWebSocket.test.ts b/site/src/utils/OneWayWebSocket.test.ts index c6b00b593111f..a0492dab9b439 100644 --- a/site/src/utils/OneWayWebSocket.test.ts +++ b/site/src/utils/OneWayWebSocket.test.ts @@ -8,144 +8,10 @@ */ import { - type OneWayMessageEvent, - OneWayWebSocket, - type WebSocketEventType, -} from "./OneWayWebSocket"; - -type MockPublisher = Readonly<{ - publishMessage: (event: MessageEvent) => void; - publishError: (event: ErrorEvent) => void; - publishClose: (event: CloseEvent) => void; - publishOpen: (event: Event) => void; -}>; - -function createMockWebSocket( - url: string, - protocols?: string | string[], -): readonly [WebSocket, MockPublisher] { - type EventMap = { - message: MessageEvent; - error: ErrorEvent; - close: CloseEvent; - open: Event; - }; - type CallbackStore = { - [K in keyof EventMap]: ((event: EventMap[K]) => void)[]; - }; - - let activeProtocol: string; - if (Array.isArray(protocols)) { - activeProtocol = protocols[0] ?? ""; - } else if (typeof protocols === "string") { - activeProtocol = protocols; - } else { - activeProtocol = ""; - } - - let closed = false; - const store: CallbackStore = { - message: [], - error: [], - close: [], - open: [], - }; - - const mockSocket: WebSocket = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3, - - url, - protocol: activeProtocol, - readyState: 1, - binaryType: "blob", - bufferedAmount: 0, - extensions: "", - onclose: null, - onerror: null, - onmessage: null, - onopen: null, - send: jest.fn(), - dispatchEvent: jest.fn(), - - addEventListener: ( - eventType: E, - callback: WebSocketEventMap[E], - ) => { - if (closed) { - return; - } - - const subscribers = store[eventType]; - const cb = callback as unknown as CallbackStore[E][0]; - if (!subscribers.includes(cb)) { - subscribers.push(cb); - } - }, - - removeEventListener: ( - eventType: E, - callback: WebSocketEventMap[E], - ) => { - if (closed) { - return; - } - - const subscribers = store[eventType]; - const cb = callback as unknown as CallbackStore[E][0]; - if (subscribers.includes(cb)) { - const updated = store[eventType].filter((c) => c !== cb); - store[eventType] = updated as unknown as CallbackStore[E]; - } - }, - - close: () => { - closed = true; - }, - }; - - const publisher: MockPublisher = { - publishOpen: (event) => { - if (closed) { - return; - } - for (const sub of store.open) { - sub(event); - } - }, - - publishError: (event) => { - if (closed) { - return; - } - for (const sub of store.error) { - sub(event); - } - }, - - publishMessage: (event) => { - if (closed) { - return; - } - for (const sub of store.message) { - sub(event); - } - }, - - publishClose: (event) => { - if (closed) { - return; - } - for (const sub of store.close) { - sub(event); - } - }, - }; - - return [mockSocket, publisher] as const; -} + type MockWebSocketServer, + createMockWebSocket, +} from "testHelpers/websockets"; +import { type OneWayMessageEvent, OneWayWebSocket } from "./OneWayWebSocket"; describe(OneWayWebSocket.name, () => { const dummyRoute = "/api/v2/blah"; @@ -167,12 +33,12 @@ describe(OneWayWebSocket.name, () => { }); it("Lets a consumer add an event listener of each type", () => { - let publisher!: MockPublisher; + let mockServer!: MockWebSocketServer; const oneWay = new OneWayWebSocket({ apiRoute: dummyRoute, websocketInit: (url, protocols) => { - const [socket, pub] = createMockWebSocket(url, protocols); - publisher = pub; + const [socket, server] = createMockWebSocket(url, protocols); + mockServer = server; return socket; }, }); @@ -187,14 +53,14 @@ describe(OneWayWebSocket.name, () => { oneWay.addEventListener("error", onError); oneWay.addEventListener("message", onMessage); - publisher.publishOpen(new Event("open")); - publisher.publishClose(new CloseEvent("close")); - publisher.publishError( + mockServer.publishOpen(new Event("open")); + mockServer.publishClose(new CloseEvent("close")); + mockServer.publishError( new ErrorEvent("error", { error: new Error("Whoops - connection broke"), }), ); - publisher.publishMessage( + mockServer.publishMessage( new MessageEvent("message", { data: "null", }), @@ -207,12 +73,12 @@ describe(OneWayWebSocket.name, () => { }); it("Lets a consumer remove an event listener of each type", () => { - let publisher!: MockPublisher; + let mockServer!: MockWebSocketServer; const oneWay = new OneWayWebSocket({ apiRoute: dummyRoute, websocketInit: (url, protocols) => { - const [socket, pub] = createMockWebSocket(url, protocols); - publisher = pub; + const [socket, server] = createMockWebSocket(url, protocols); + mockServer = server; return socket; }, }); @@ -232,14 +98,14 @@ describe(OneWayWebSocket.name, () => { oneWay.removeEventListener("error", onError); oneWay.removeEventListener("message", onMessage); - publisher.publishOpen(new Event("open")); - publisher.publishClose(new CloseEvent("close")); - publisher.publishError( + mockServer.publishOpen(new Event("open")); + mockServer.publishClose(new CloseEvent("close")); + mockServer.publishError( new ErrorEvent("error", { error: new Error("Whoops - connection broke"), }), ); - publisher.publishMessage( + mockServer.publishMessage( new MessageEvent("message", { data: "null", }), @@ -252,12 +118,12 @@ describe(OneWayWebSocket.name, () => { }); it("Only calls each callback once if callback is added multiple times", () => { - let publisher!: MockPublisher; + let mockServer!: MockWebSocketServer; const oneWay = new OneWayWebSocket({ apiRoute: dummyRoute, websocketInit: (url, protocols) => { - const [socket, pub] = createMockWebSocket(url, protocols); - publisher = pub; + const [socket, server] = createMockWebSocket(url, protocols); + mockServer = server; return socket; }, }); @@ -274,14 +140,14 @@ describe(OneWayWebSocket.name, () => { oneWay.addEventListener("message", onMessage); } - publisher.publishOpen(new Event("open")); - publisher.publishClose(new CloseEvent("close")); - publisher.publishError( + mockServer.publishOpen(new Event("open")); + mockServer.publishClose(new CloseEvent("close")); + mockServer.publishError( new ErrorEvent("error", { error: new Error("Whoops - connection broke"), }), ); - publisher.publishMessage( + mockServer.publishMessage( new MessageEvent("message", { data: "null", }), @@ -294,12 +160,12 @@ describe(OneWayWebSocket.name, () => { }); it("Lets consumers register multiple callbacks for each event type", () => { - let publisher!: MockPublisher; + let mockServer!: MockWebSocketServer; const oneWay = new OneWayWebSocket({ apiRoute: dummyRoute, websocketInit: (url, protocols) => { - const [socket, pub] = createMockWebSocket(url, protocols); - publisher = pub; + const [socket, server] = createMockWebSocket(url, protocols); + mockServer = server; return socket; }, }); @@ -322,14 +188,14 @@ describe(OneWayWebSocket.name, () => { oneWay.addEventListener("error", onError2); oneWay.addEventListener("message", onMessage2); - publisher.publishOpen(new Event("open")); - publisher.publishClose(new CloseEvent("close")); - publisher.publishError( + mockServer.publishOpen(new Event("open")); + mockServer.publishClose(new CloseEvent("close")); + mockServer.publishError( new ErrorEvent("error", { error: new Error("Whoops - connection broke"), }), ); - publisher.publishMessage( + mockServer.publishMessage( new MessageEvent("message", { data: "null", }), @@ -375,12 +241,12 @@ describe(OneWayWebSocket.name, () => { }); it("Gives consumers pre-parsed versions of message events", () => { - let publisher!: MockPublisher; + let mockServer!: MockWebSocketServer; const oneWay = new OneWayWebSocket({ apiRoute: dummyRoute, websocketInit: (url, protocols) => { - const [socket, pub] = createMockWebSocket(url, protocols); - publisher = pub; + const [socket, server] = createMockWebSocket(url, protocols); + mockServer = server; return socket; }, }); @@ -396,7 +262,7 @@ describe(OneWayWebSocket.name, () => { data: JSON.stringify(payload), }); - publisher.publishMessage(event); + mockServer.publishMessage(event); expect(onMessage).toHaveBeenCalledWith({ sourceEvent: event, parsedMessage: payload, @@ -405,12 +271,12 @@ describe(OneWayWebSocket.name, () => { }); it("Exposes parsing error if message payload could not be parsed as JSON", () => { - let publisher!: MockPublisher; + let mockServer!: MockWebSocketServer; const oneWay = new OneWayWebSocket({ apiRoute: dummyRoute, websocketInit: (url, protocols) => { - const [socket, pub] = createMockWebSocket(url, protocols); - publisher = pub; + const [socket, server] = createMockWebSocket(url, protocols); + mockServer = server; return socket; }, }); @@ -422,7 +288,7 @@ describe(OneWayWebSocket.name, () => { const event = new MessageEvent("message", { data: payload, }); - publisher.publishMessage(event); + mockServer.publishMessage(event); const arg: OneWayMessageEvent = onMessage.mock.lastCall[0]; expect(arg.sourceEvent).toEqual(event); From d1e64affd6db67061cc999b08144136774aa68b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Thu, 7 Aug 2025 15:27:49 -0600 Subject: [PATCH 107/260] refactor: migrate Abbr to Tailwind (#19242) --- site/src/components/Abbr/Abbr.stories.tsx | 15 ++++----------- site/src/components/Abbr/Abbr.tsx | 11 +++++++---- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/site/src/components/Abbr/Abbr.stories.tsx b/site/src/components/Abbr/Abbr.stories.tsx index 6720b90fffda5..2b64d5885c205 100644 --- a/site/src/components/Abbr/Abbr.stories.tsx +++ b/site/src/components/Abbr/Abbr.stories.tsx @@ -25,10 +25,10 @@ export const InlinedShorthand: Story = { }, decorators: [ (Story) => ( -

    +

    The physical pain of getting bonked on the head with a cartoon mallet lasts precisely 593{" "} - + . The emotional turmoil and complete embarrassment lasts forever. @@ -45,7 +45,7 @@ export const Acronym: Story = { }, decorators: [ (Story) => ( - + ), @@ -60,16 +60,9 @@ export const Initialism: Story = { }, decorators: [ (Story) => ( - + ), ], }; - -const styles = { - // Just here to make the abbreviated part more obvious in the component library - underlined: { - textDecoration: "underline dotted", - }, -}; diff --git a/site/src/components/Abbr/Abbr.tsx b/site/src/components/Abbr/Abbr.tsx index c41f68e08117f..b27141818efb3 100644 --- a/site/src/components/Abbr/Abbr.tsx +++ b/site/src/components/Abbr/Abbr.tsx @@ -1,4 +1,5 @@ import type { FC, HTMLAttributes } from "react"; +import { cn } from "utils/cn"; export type Pronunciation = "shorthand" | "acronym" | "initialism"; @@ -29,10 +30,12 @@ export const Abbr: FC = ({ // always have to supplement with aria-label title={title} aria-label={getAccessibleLabel(children, title, pronunciation)} - css={{ - textDecoration: "inherit", - letterSpacing: children === children.toUpperCase() ? "0.02em" : "0", - }} + className={cn( + "decoration-inherit", + children === children.toUpperCase() + ? "tracking-wide" + : "tracking-normal", + )} {...delegatedProps} > {children} From 7bb52e1f8ad8d1305c99fdeb71ba906a96800176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Thu, 7 Aug 2025 17:09:46 -0600 Subject: [PATCH 108/260] test: add tests for updating workspace acl (#19240) --- coderd/workspaces_test.go | 109 ++++++++++++++++++++++++++- enterprise/coderd/templates_test.go | 33 +++----- enterprise/coderd/workspaces_test.go | 81 ++++++++++++++++++++ 3 files changed, 196 insertions(+), 27 deletions(-) diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 96381043db0ab..90a7c87d41041 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -2678,8 +2678,7 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { // ensure test invariant: new workspaces have no autostart schedule. require.Empty(t, workspace.AutostartSchedule, "expected newly-minted workspace to have no autostart schedule") - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) err := client.UpdateWorkspaceAutostart(ctx, workspace.ID, codersdk.UpdateWorkspaceAutostartRequest{ Schedule: ptr.Ref("CRON_TZ=Europe/Dublin 30 9 * * 1-5"), @@ -2698,8 +2697,7 @@ func TestWorkspaceUpdateAutostart(t *testing.T) { } ) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) err := client.UpdateWorkspaceAutostart(ctx, wsid, req) require.IsType(t, err, &codersdk.Error{}, "expected codersdk.Error") @@ -4813,3 +4811,106 @@ func TestMultipleAITasksDisallowed(t *testing.T) { require.NoError(t, err) require.Contains(t, pj.Error.String, "only one 'coder_ai_task' resource can be provisioned per template") } + +func TestUpdateWorkspaceACL(t *testing.T) { + t.Parallel() + + t.Run("OK", func(t *testing.T) { + t.Parallel() + + dv := coderdtest.DeploymentValues(t) + dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)} + adminClient := coderdtest.New(t, &coderdtest.Options{ + IncludeProvisionerDaemon: true, + DeploymentValues: dv, + }) + adminUser := coderdtest.CreateFirstUser(t, adminClient) + orgID := adminUser.OrganizationID + client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID) + _, friend := coderdtest.CreateAnotherUser(t, adminClient, orgID) + + tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID) + template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID) + + ws := coderdtest.CreateWorkspace(t, client, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + + ctx := testutil.Context(t, testutil.WaitMedium) + err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + friend.ID.String(): codersdk.WorkspaceRoleAdmin, + }, + }) + require.NoError(t, err) + }) + + t.Run("UnknownUserID", func(t *testing.T) { + t.Parallel() + + dv := coderdtest.DeploymentValues(t) + dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)} + adminClient := coderdtest.New(t, &coderdtest.Options{ + IncludeProvisionerDaemon: true, + DeploymentValues: dv, + }) + adminUser := coderdtest.CreateFirstUser(t, adminClient) + orgID := adminUser.OrganizationID + client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID) + + tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID) + template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID) + + ws := coderdtest.CreateWorkspace(t, client, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + + ctx := testutil.Context(t, testutil.WaitMedium) + err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + uuid.NewString(): codersdk.WorkspaceRoleAdmin, + }, + }) + require.Error(t, err) + cerr, ok := codersdk.AsError(err) + require.True(t, ok) + require.Len(t, cerr.Validations, 1) + require.Equal(t, cerr.Validations[0].Field, "user_roles") + }) + + t.Run("DeletedUser", func(t *testing.T) { + t.Parallel() + + dv := coderdtest.DeploymentValues(t) + dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)} + adminClient := coderdtest.New(t, &coderdtest.Options{ + IncludeProvisionerDaemon: true, + DeploymentValues: dv, + }) + adminUser := coderdtest.CreateFirstUser(t, adminClient) + orgID := adminUser.OrganizationID + client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID) + _, mike := coderdtest.CreateAnotherUser(t, adminClient, orgID) + + tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID) + template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID) + + ws := coderdtest.CreateWorkspace(t, client, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + + ctx := testutil.Context(t, testutil.WaitMedium) + err := adminClient.DeleteUser(ctx, mike.ID) + require.NoError(t, err) + err = client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + mike.ID.String(): codersdk.WorkspaceRoleAdmin, + }, + }) + require.Error(t, err) + cerr, ok := codersdk.AsError(err) + require.True(t, ok) + require.Len(t, cerr.Validations, 1) + require.Equal(t, cerr.Validations[0].Field, "user_roles") + }) +} diff --git a/enterprise/coderd/templates_test.go b/enterprise/coderd/templates_test.go index d95450e28e8aa..30b04eaa007b4 100644 --- a/enterprise/coderd/templates_test.go +++ b/enterprise/coderd/templates_test.go @@ -70,8 +70,7 @@ func TestTemplates(t *testing.T) { _ = coderdtest.CreateWorkspace(t, otherClient, secondTemplate.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) updated, err := client.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{ DeprecationMessage: ptr.Ref("Stop using this template"), @@ -185,8 +184,7 @@ func TestTemplates(t *testing.T) { ws, err := client.Workspace(context.Background(), ws.ID) require.NoError(t, err) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) // OK var level codersdk.WorkspaceAgentPortShareLevel = codersdk.WorkspaceAgentPortShareLevelPublic @@ -704,8 +702,7 @@ func TestTemplates(t *testing.T) { coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) require.True(t, template.RequireActiveVersion) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) // Update the field and assert it persists. updatedTemplate, err := anotherClient.UpdateTemplateMeta(ctx, template.ID, codersdk.UpdateTemplateMeta{ @@ -761,9 +758,6 @@ func TestTemplates(t *testing.T) { }) require.NoError(t, err) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() - _, err = owner.Template(ctx, template.ID) require.NoError(t, err) }) @@ -932,8 +926,7 @@ func TestTemplateACL(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) acl, err := anotherClient.TemplateACL(ctx, template.ID) require.NoError(t, err) @@ -955,8 +948,7 @@ func TestTemplateACL(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) //nolint:gocritic // non-template-admin cannot update template acl acl, err := client.TemplateACL(ctx, template.ID) @@ -1004,8 +996,7 @@ func TestTemplateACL(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, admin.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, admin.OrganizationID, version.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) //nolint:gocritic // non-template-admin cannot get template acl acl, err := client.TemplateACL(ctx, template.ID) @@ -1267,8 +1258,7 @@ func TestUpdateTemplateACL(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) err := anotherClient.UpdateTemplateACL(ctx, template.ID, codersdk.UpdateTemplateACL{ UserPerms: map[string]codersdk.TemplateRole{ @@ -1359,8 +1349,7 @@ func TestUpdateTemplateACL(t *testing.T) { }, } - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) err := anotherClient.UpdateTemplateACL(ctx, template.ID, req) require.NoError(t, err) @@ -1679,8 +1668,7 @@ func TestUpdateTemplateACL(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) acl, err := anotherClient.TemplateACL(ctx, template.ID) require.NoError(t, err) @@ -1769,8 +1757,7 @@ func TestUpdateTemplateACL(t *testing.T) { version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() + ctx := testutil.Context(t, testutil.WaitLong) acl, err := anotherClient.TemplateACL(ctx, template.ID) require.NoError(t, err) diff --git a/enterprise/coderd/workspaces_test.go b/enterprise/coderd/workspaces_test.go index 2278fb2a71939..f8fcddb005e19 100644 --- a/enterprise/coderd/workspaces_test.go +++ b/enterprise/coderd/workspaces_test.go @@ -3523,3 +3523,84 @@ func must[T any](value T, err error) T { } return value } + +func TestUpdateWorkspaceACL(t *testing.T) { + t.Parallel() + + t.Run("OKWithGroup", func(t *testing.T) { + t.Parallel() + + dv := coderdtest.DeploymentValues(t) + dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)} + adminClient, adminUser := coderdenttest.New(t, &coderdenttest.Options{ + Options: &coderdtest.Options{ + IncludeProvisionerDaemon: true, + DeploymentValues: dv, + }, + LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureTemplateRBAC: 1, + }, + }, + }) + orgID := adminUser.OrganizationID + client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID) + _, friend := coderdtest.CreateAnotherUser(t, adminClient, orgID) + group := coderdtest.CreateGroup(t, adminClient, orgID, "bloob") + + tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID) + template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID) + + ws := coderdtest.CreateWorkspace(t, client, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + + ctx := testutil.Context(t, testutil.WaitMedium) + err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + friend.ID.String(): codersdk.WorkspaceRoleAdmin, + }, + GroupRoles: map[string]codersdk.WorkspaceRole{ + group.ID.String(): codersdk.WorkspaceRoleAdmin, + }, + }) + require.NoError(t, err) + }) + + t.Run("UnknownIDs", func(t *testing.T) { + t.Parallel() + + dv := coderdtest.DeploymentValues(t) + dv.Experiments = []string{string(codersdk.ExperimentWorkspaceSharing)} + adminClient := coderdtest.New(t, &coderdtest.Options{ + IncludeProvisionerDaemon: true, + DeploymentValues: dv, + }) + adminUser := coderdtest.CreateFirstUser(t, adminClient) + orgID := adminUser.OrganizationID + client, _ := coderdtest.CreateAnotherUser(t, adminClient, orgID) + + tv := coderdtest.CreateTemplateVersion(t, adminClient, orgID, nil) + coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, tv.ID) + template := coderdtest.CreateTemplate(t, adminClient, orgID, tv.ID) + + ws := coderdtest.CreateWorkspace(t, client, template.ID) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, ws.LatestBuild.ID) + + ctx := testutil.Context(t, testutil.WaitMedium) + err := client.UpdateWorkspaceACL(ctx, ws.ID, codersdk.UpdateWorkspaceACL{ + UserRoles: map[string]codersdk.WorkspaceRole{ + uuid.NewString(): codersdk.WorkspaceRoleAdmin, + }, + GroupRoles: map[string]codersdk.WorkspaceRole{ + uuid.NewString(): codersdk.WorkspaceRoleAdmin, + }, + }) + require.Error(t, err) + cerr, ok := codersdk.AsError(err) + require.True(t, ok) + require.Len(t, cerr.Validations, 2) + require.Equal(t, cerr.Validations[0].Field, "group_roles") + require.Equal(t, cerr.Validations[1].Field, "user_roles") + }) +} From bdde9828b49cd2d149faf33bd7f432abc2e03c45 Mon Sep 17 00:00:00 2001 From: Rowan Smith Date: Fri, 8 Aug 2025 16:00:09 +1000 Subject: [PATCH 109/260] docs: fix marketplace links for GCP (#19250) --- docs/install/cloud/compute-engine.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/install/cloud/compute-engine.md b/docs/install/cloud/compute-engine.md index 49572059afc60..671a890125392 100644 --- a/docs/install/cloud/compute-engine.md +++ b/docs/install/cloud/compute-engine.md @@ -10,9 +10,12 @@ Google Cloud Platform project. ## Launch a Coder instance from the Google Cloud Marketplace -We publish an Ubuntu 22.04 VM image with Coder and Docker pre-installed. Search -for `Coder v2` in the GCP Marketplace or -[use direct link](https://console.cloud.google.com/marketplace/product/coder-enterprise-market-public/coder-v2). +We publish an Ubuntu 22.04 VM image with Coder and Docker pre-installed. + +Two SKU's are available via the Google Cloud Marketplace: + +1. [License purchase via Google Cloud Marketplace](https://console.cloud.google.com/marketplace/product/coder-enterprise-market-public/coder-gcmp?inv=1&invt=Ab45rg&project=secret-beacon-468405-p5) +2. [A solution to deploy VM's on GCP (Bring Your Own License)](https://console.cloud.google.com/marketplace/product/workspan-public-422119/coder?inv=1&invt=Ab45rg&project=secret-beacon-468405-p5) ![Coder on GCP Marketplace](../../images/platforms/gcp/marketplace.png) From b200fc8e674ab68ca421de218eb54b0e9282b8f8 Mon Sep 17 00:00:00 2001 From: Sas Swart Date: Fri, 8 Aug 2025 11:03:17 +0200 Subject: [PATCH 110/260] feat(enterprise/coderd): allow system users to be added to groups (#18341) closes https://github.com/coder/coder/issues/18274 This pull request makes system users visible in various group related queries so that they can be added to and removed from groups. This allows system user quotas to be configured. System users are still ignored in certain queries, such as when license seat consumption is determined. This pull request further ensures the existence of a "coder_prebuilt_workspaces" group in any organization that needs prebuilt workspaces ## Summary by CodeRabbit * **New Features** * Organization and group member listings now include system users. * **Bug Fixes** * Updated tests to reflect the inclusion of system users in member and group queries. --- coderd/database/dbauthz/dbauthz.go | 10 + coderd/database/queries.sql.go | 14 +- .../database/queries/organizationmembers.sql | 2 + coderd/members.go | 1 + .../prebuilt-workspaces.md | 8 +- enterprise/coderd/prebuilds/membership.go | 89 ++++-- .../coderd/prebuilds/membership_test.go | 244 +++++++++++------ enterprise/coderd/workspacequota_test.go | 259 ++++++++++++++++++ 8 files changed, 524 insertions(+), 103 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index d5cc334f5ff7f..517a5540b3f00 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -485,6 +485,16 @@ var ( rbac.ResourceFile.Type: { policy.ActionRead, }, + // Needs to be able to add the prebuilds system user to the "prebuilds" group in each organization that needs prebuilt workspaces + // so that prebuilt workspaces can be scheduled and owned in those organizations. + rbac.ResourceGroup.Type: { + policy.ActionRead, + policy.ActionCreate, + policy.ActionUpdate, + }, + rbac.ResourceGroupMember.Type: { + policy.ActionRead, + }, }), }, }), diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 74cefd09359b0..b8363ad5b273f 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -6592,16 +6592,19 @@ WHERE organization_id = $1 ELSE true END + -- Filter by system type + AND CASE WHEN $2::bool THEN TRUE ELSE is_system = false END ORDER BY -- Deterministic and consistent ordering of all users. This is to ensure consistent pagination. - LOWER(username) ASC OFFSET $2 + LOWER(username) ASC OFFSET $3 LIMIT -- A null limit means "no limit", so 0 means return all - NULLIF($3 :: int, 0) + NULLIF($4 :: int, 0) ` type PaginatedOrganizationMembersParams struct { OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + IncludeSystem bool `db:"include_system" json:"include_system"` OffsetOpt int32 `db:"offset_opt" json:"offset_opt"` LimitOpt int32 `db:"limit_opt" json:"limit_opt"` } @@ -6617,7 +6620,12 @@ type PaginatedOrganizationMembersRow struct { } func (q *sqlQuerier) PaginatedOrganizationMembers(ctx context.Context, arg PaginatedOrganizationMembersParams) ([]PaginatedOrganizationMembersRow, error) { - rows, err := q.db.QueryContext(ctx, paginatedOrganizationMembers, arg.OrganizationID, arg.OffsetOpt, arg.LimitOpt) + rows, err := q.db.QueryContext(ctx, paginatedOrganizationMembers, + arg.OrganizationID, + arg.IncludeSystem, + arg.OffsetOpt, + arg.LimitOpt, + ) if err != nil { return nil, err } diff --git a/coderd/database/queries/organizationmembers.sql b/coderd/database/queries/organizationmembers.sql index 9d570bc1c49ee..1c0af011776e3 100644 --- a/coderd/database/queries/organizationmembers.sql +++ b/coderd/database/queries/organizationmembers.sql @@ -89,6 +89,8 @@ WHERE organization_id = @organization_id ELSE true END + -- Filter by system type + AND CASE WHEN @include_system::bool THEN TRUE ELSE is_system = false END ORDER BY -- Deterministic and consistent ordering of all users. This is to ensure consistent pagination. LOWER(username) ASC OFFSET @offset_opt diff --git a/coderd/members.go b/coderd/members.go index 0bd5bb1fbc8bd..371b58015b83b 100644 --- a/coderd/members.go +++ b/coderd/members.go @@ -203,6 +203,7 @@ func (api *API) paginatedMembers(rw http.ResponseWriter, r *http.Request) { paginatedMemberRows, err := api.Database.PaginatedOrganizationMembers(ctx, database.PaginatedOrganizationMembersParams{ OrganizationID: organization.ID, + IncludeSystem: false, // #nosec G115 - Pagination limits are small and fit in int32 LimitOpt: int32(paginationParams.Limit), // #nosec G115 - Pagination offsets are small and fit in int32 diff --git a/docs/admin/templates/extending-templates/prebuilt-workspaces.md b/docs/admin/templates/extending-templates/prebuilt-workspaces.md index 8e61687ce0f01..70161f687ba76 100644 --- a/docs/admin/templates/extending-templates/prebuilt-workspaces.md +++ b/docs/admin/templates/extending-templates/prebuilt-workspaces.md @@ -235,12 +235,18 @@ The system always maintains the desired number of prebuilt workspaces for the ac ### Managing resource quotas -Prebuilt workspaces can be used in conjunction with [resource quotas](../../users/quotas.md). +To help prevent unexpected infrastructure costs, prebuilt workspaces can be used in conjunction with [resource quotas](../../users/quotas.md). Because unclaimed prebuilt workspaces are owned by the `prebuilds` user, you can: 1. Configure quotas for any group that includes this user. 1. Set appropriate limits to balance prebuilt workspace availability with resource constraints. +When prebuilt workspaces are configured for an organization, Coder creates a "prebuilds" group in that organization and adds the prebuilds user to it. This group has a default quota allowance of 0, which you should adjust based on your needs: + +- **Set a quota allowance** on the "prebuilds" group to control how many prebuilt workspaces can be provisioned +- **Monitor usage** to ensure the quota is appropriate for your desired number of prebuilt instances +- **Adjust as needed** based on your template costs and desired prebuilt workspace pool size + If a quota is exceeded, the prebuilt workspace will fail provisioning the same way other workspaces do. ### Template configuration best practices diff --git a/enterprise/coderd/prebuilds/membership.go b/enterprise/coderd/prebuilds/membership.go index 079711bcbcc49..03328c2012534 100644 --- a/enterprise/coderd/prebuilds/membership.go +++ b/enterprise/coderd/prebuilds/membership.go @@ -12,6 +12,11 @@ import ( "github.com/coder/quartz" ) +const ( + PrebuiltWorkspacesGroupName = "coder_prebuilt_workspaces" + PrebuiltWorkspacesGroupDisplayName = "Prebuilt Workspaces" +) + // StoreMembershipReconciler encapsulates the responsibility of ensuring that the prebuilds system user is a member of all // organizations for which prebuilt workspaces are requested. This is necessary because our data model requires that such // prebuilt workspaces belong to a member of the organization of their eventual claimant. @@ -27,11 +32,16 @@ func NewStoreMembershipReconciler(store database.Store, clock quartz.Clock) Stor } } -// ReconcileAll compares the current membership of a user to the membership required in order to create prebuilt workspaces. -// If the user in question is not yet a member of an organization that needs prebuilt workspaces, ReconcileAll will create -// the membership required. +// ReconcileAll compares the current organization and group memberships of a user to the memberships required +// in order to create prebuilt workspaces. If the user in question is not yet a member of an organization that +// needs prebuilt workspaces, ReconcileAll will create the membership required. // -// This method does not have an opinion on transaction or lock management. These responsibilities are left to the caller. +// To facilitate quota management, ReconcileAll will ensure: +// * the existence of a group (defined by PrebuiltWorkspacesGroupName) in each organization that needs prebuilt workspaces +// * that the prebuilds system user belongs to the group in each organization that needs prebuilt workspaces +// * that the group has a quota of 0 by default, which users can adjust based on their needs. +// +// ReconcileAll does not have an opinion on transaction or lock management. These responsibilities are left to the caller. func (s StoreMembershipReconciler) ReconcileAll(ctx context.Context, userID uuid.UUID, presets []database.GetTemplatePresetsWithPrebuildsRow) error { organizationMemberships, err := s.store.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ UserID: userID, @@ -44,37 +54,74 @@ func (s StoreMembershipReconciler) ReconcileAll(ctx context.Context, userID uuid return xerrors.Errorf("determine prebuild organization membership: %w", err) } - systemUserMemberships := make(map[uuid.UUID]struct{}, 0) + orgMemberships := make(map[uuid.UUID]struct{}, 0) defaultOrg, err := s.store.GetDefaultOrganization(ctx) if err != nil { return xerrors.Errorf("get default organization: %w", err) } - systemUserMemberships[defaultOrg.ID] = struct{}{} + orgMemberships[defaultOrg.ID] = struct{}{} for _, o := range organizationMemberships { - systemUserMemberships[o.ID] = struct{}{} + orgMemberships[o.ID] = struct{}{} } var membershipInsertionErrors error for _, preset := range presets { - _, alreadyMember := systemUserMemberships[preset.OrganizationID] - if alreadyMember { - continue + _, alreadyOrgMember := orgMemberships[preset.OrganizationID] + if !alreadyOrgMember { + // Add the organization to our list of memberships regardless of potential failure below + // to avoid a retry that will probably be doomed anyway. + orgMemberships[preset.OrganizationID] = struct{}{} + + // Insert the missing membership + _, err = s.store.InsertOrganizationMember(ctx, database.InsertOrganizationMemberParams{ + OrganizationID: preset.OrganizationID, + UserID: userID, + CreatedAt: s.clock.Now(), + UpdatedAt: s.clock.Now(), + Roles: []string{}, + }) + if err != nil { + membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("insert membership for prebuilt workspaces: %w", err)) + continue + } } - // Add the organization to our list of memberships regardless of potential failure below - // to avoid a retry that will probably be doomed anyway. - systemUserMemberships[preset.OrganizationID] = struct{}{} - // Insert the missing membership - _, err = s.store.InsertOrganizationMember(ctx, database.InsertOrganizationMemberParams{ + // Create a "prebuilds" group in the organization and add the system user to it + // This group will have a quota of 0 by default, which users can adjust based on their needs + prebuildsGroup, err := s.store.InsertGroup(ctx, database.InsertGroupParams{ + ID: uuid.New(), + Name: PrebuiltWorkspacesGroupName, + DisplayName: PrebuiltWorkspacesGroupDisplayName, OrganizationID: preset.OrganizationID, - UserID: userID, - CreatedAt: s.clock.Now(), - UpdatedAt: s.clock.Now(), - Roles: []string{}, + AvatarURL: "", + QuotaAllowance: 0, // Default quota of 0, users should set this based on their needs + }) + if err != nil { + // If the group already exists, try to get it + if !database.IsUniqueViolation(err) { + membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("create prebuilds group: %w", err)) + continue + } + prebuildsGroup, err = s.store.GetGroupByOrgAndName(ctx, database.GetGroupByOrgAndNameParams{ + OrganizationID: preset.OrganizationID, + Name: PrebuiltWorkspacesGroupName, + }) + if err != nil { + membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("get existing prebuilds group: %w", err)) + continue + } + } + + // Add the system user to the prebuilds group + err = s.store.InsertGroupMember(ctx, database.InsertGroupMemberParams{ + GroupID: prebuildsGroup.ID, + UserID: userID, }) if err != nil { - membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("insert membership for prebuilt workspaces: %w", err)) - continue + // Ignore unique violation errors as the user might already be in the group + if !database.IsUniqueViolation(err) { + membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("add system user to prebuilds group: %w", err)) + } } } return membershipInsertionErrors diff --git a/enterprise/coderd/prebuilds/membership_test.go b/enterprise/coderd/prebuilds/membership_test.go index 82d2abf92a4d8..ae4b05515575c 100644 --- a/enterprise/coderd/prebuilds/membership_test.go +++ b/enterprise/coderd/prebuilds/membership_test.go @@ -1,18 +1,23 @@ package prebuilds_test import ( - "context" + "database/sql" + "errors" "testing" "github.com/google/uuid" "github.com/stretchr/testify/require" + "tailscale.com/types/ptr" "github.com/coder/quartz" + "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/database/dbgen" "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/enterprise/coderd/prebuilds" + "github.com/coder/coder/v2/testutil" ) // TestReconcileAll verifies that StoreMembershipReconciler correctly updates membership @@ -20,7 +25,6 @@ import ( func TestReconcileAll(t *testing.T) { t.Parallel() - ctx := context.Background() clock := quartz.NewMock(t) // Helper to build a minimal Preset row belonging to a given org. @@ -32,87 +36,171 @@ func TestReconcileAll(t *testing.T) { } tests := []struct { - name string - includePreset bool - preExistingMembership bool + name string + includePreset []bool + preExistingOrgMembership []bool + preExistingGroup []bool + preExistingGroupMembership []bool + // Expected outcomes + expectOrgMembershipExists *bool + expectGroupExists *bool + expectUserInGroup *bool }{ - // The StoreMembershipReconciler acts based on the provided agplprebuilds.GlobalSnapshot. - // These test cases must therefore trust any valid snapshot, so the only relevant functional test cases are: - - // No presets to act on and the prebuilds user does not belong to any organizations. - // Reconciliation should be a no-op - {name: "no presets, no memberships", includePreset: false, preExistingMembership: false}, - // If we have a preset that requires prebuilds, but the prebuilds user is not a member of - // that organization, then we should add the membership. - {name: "preset, but no membership", includePreset: true, preExistingMembership: false}, - // If the prebuilds system user is already a member of the organization to which a preset belongs, - // then reconciliation should be a no-op: - {name: "preset, but already a member", includePreset: true, preExistingMembership: true}, - // If the prebuilds system user is a member of an organization that doesn't have need any prebuilds, - // then it must have required prebuilds in the past. The membership is not currently necessary, but - // the reconciler won't remove it, because there's little cost to keeping it and prebuilds might be - // enabled again. - {name: "member, but no presets", includePreset: false, preExistingMembership: true}, + { + name: "if there are no presets, membership reconciliation is a no-op", + includePreset: []bool{false}, + preExistingOrgMembership: []bool{true, false}, + preExistingGroup: []bool{true, false}, + preExistingGroupMembership: []bool{true, false}, + expectOrgMembershipExists: ptr.To(false), + expectGroupExists: ptr.To(false), + }, + { + name: "if there is a preset, then we should enforce org and group membership in all cases", + includePreset: []bool{true}, + preExistingOrgMembership: []bool{true, false}, + preExistingGroup: []bool{true, false}, + preExistingGroupMembership: []bool{true, false}, + expectOrgMembershipExists: ptr.To(true), + expectGroupExists: ptr.To(true), + expectUserInGroup: ptr.To(true), + }, } for _, tc := range tests { - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - db, _ := dbtestutil.NewDB(t) - - defaultOrg, err := db.GetDefaultOrganization(ctx) - require.NoError(t, err) - - // introduce an unrelated organization to ensure that the membership reconciler don't interfere with it. - unrelatedOrg := dbgen.Organization(t, db, database.Organization{}) - targetOrg := dbgen.Organization(t, db, database.Organization{}) - - if !dbtestutil.WillUsePostgres() { - // dbmem doesn't ensure membership to the default organization - dbgen.OrganizationMember(t, db, database.OrganizationMember{ - OrganizationID: defaultOrg.ID, - UserID: database.PrebuildsSystemUserID, - }) - } - - dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: unrelatedOrg.ID, UserID: database.PrebuildsSystemUserID}) - if tc.preExistingMembership { - // System user already a member of both orgs. - dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: targetOrg.ID, UserID: database.PrebuildsSystemUserID}) + tc := tc + for _, includePreset := range tc.includePreset { + includePreset := includePreset + for _, preExistingOrgMembership := range tc.preExistingOrgMembership { + preExistingOrgMembership := preExistingOrgMembership + for _, preExistingGroup := range tc.preExistingGroup { + preExistingGroup := preExistingGroup + for _, preExistingGroupMembership := range tc.preExistingGroupMembership { + preExistingGroupMembership := preExistingGroupMembership + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + // nolint:gocritic // Reconciliation happens as prebuilds system user, not a human user. + ctx := dbauthz.AsPrebuildsOrchestrator(testutil.Context(t, testutil.WaitLong)) + _, db := coderdtest.NewWithDatabase(t, nil) + + defaultOrg, err := db.GetDefaultOrganization(ctx) + require.NoError(t, err) + + // introduce an unrelated organization to ensure that the membership reconciler don't interfere with it. + unrelatedOrg := dbgen.Organization(t, db, database.Organization{}) + targetOrg := dbgen.Organization(t, db, database.Organization{}) + + if !dbtestutil.WillUsePostgres() { + // dbmem doesn't ensure membership to the default organization + dbgen.OrganizationMember(t, db, database.OrganizationMember{ + OrganizationID: defaultOrg.ID, + UserID: database.PrebuildsSystemUserID, + }) + } + + // Ensure membership to unrelated org. + dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: unrelatedOrg.ID, UserID: database.PrebuildsSystemUserID}) + + if preExistingOrgMembership { + // System user already a member of both orgs. + dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: targetOrg.ID, UserID: database.PrebuildsSystemUserID}) + } + + // Create pre-existing prebuilds group if required by test case + var prebuildsGroup database.Group + if preExistingGroup { + prebuildsGroup = dbgen.Group(t, db, database.Group{ + Name: prebuilds.PrebuiltWorkspacesGroupName, + DisplayName: prebuilds.PrebuiltWorkspacesGroupDisplayName, + OrganizationID: targetOrg.ID, + QuotaAllowance: 0, + }) + + // Add the system user to the group if preExistingGroupMembership is true + if preExistingGroupMembership { + dbgen.GroupMember(t, db, database.GroupMemberTable{ + GroupID: prebuildsGroup.ID, + UserID: database.PrebuildsSystemUserID, + }) + } + } + + presets := []database.GetTemplatePresetsWithPrebuildsRow{newPresetRow(unrelatedOrg.ID)} + if includePreset { + presets = append(presets, newPresetRow(targetOrg.ID)) + } + + // Verify memberships before reconciliation. + preReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ + UserID: database.PrebuildsSystemUserID, + }) + require.NoError(t, err) + expectedMembershipsBefore := []uuid.UUID{defaultOrg.ID, unrelatedOrg.ID} + if preExistingOrgMembership { + expectedMembershipsBefore = append(expectedMembershipsBefore, targetOrg.ID) + } + require.ElementsMatch(t, expectedMembershipsBefore, extractOrgIDs(preReconcileMemberships)) + + // Reconcile + reconciler := prebuilds.NewStoreMembershipReconciler(db, clock) + require.NoError(t, reconciler.ReconcileAll(ctx, database.PrebuildsSystemUserID, presets)) + + // Verify memberships after reconciliation. + postReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ + UserID: database.PrebuildsSystemUserID, + }) + require.NoError(t, err) + expectedMembershipsAfter := expectedMembershipsBefore + if !preExistingOrgMembership && tc.expectOrgMembershipExists != nil && *tc.expectOrgMembershipExists { + expectedMembershipsAfter = append(expectedMembershipsAfter, targetOrg.ID) + } + require.ElementsMatch(t, expectedMembershipsAfter, extractOrgIDs(postReconcileMemberships)) + + // Verify prebuilds group behavior based on expected outcomes + prebuildsGroup, err = db.GetGroupByOrgAndName(ctx, database.GetGroupByOrgAndNameParams{ + OrganizationID: targetOrg.ID, + Name: prebuilds.PrebuiltWorkspacesGroupName, + }) + if tc.expectGroupExists != nil && *tc.expectGroupExists { + require.NoError(t, err) + require.Equal(t, prebuilds.PrebuiltWorkspacesGroupName, prebuildsGroup.Name) + require.Equal(t, prebuilds.PrebuiltWorkspacesGroupDisplayName, prebuildsGroup.DisplayName) + require.Equal(t, int32(0), prebuildsGroup.QuotaAllowance) // Default quota should be 0 + + if tc.expectUserInGroup != nil && *tc.expectUserInGroup { + // Check that the system user is a member of the prebuilds group + groupMembers, err := db.GetGroupMembersByGroupID(ctx, database.GetGroupMembersByGroupIDParams{ + GroupID: prebuildsGroup.ID, + IncludeSystem: true, + }) + require.NoError(t, err) + require.Len(t, groupMembers, 1) + require.Equal(t, database.PrebuildsSystemUserID, groupMembers[0].UserID) + } + + // If no preset exists, then we do not enforce group membership: + if tc.expectUserInGroup != nil && !*tc.expectUserInGroup { + // Check that the system user is NOT a member of the prebuilds group + groupMembers, err := db.GetGroupMembersByGroupID(ctx, database.GetGroupMembersByGroupIDParams{ + GroupID: prebuildsGroup.ID, + IncludeSystem: true, + }) + require.NoError(t, err) + require.Len(t, groupMembers, 0) + } + } + + if !preExistingGroup && tc.expectGroupExists != nil && !*tc.expectGroupExists { + // Verify that no prebuilds group exists + require.Error(t, err) + require.True(t, errors.Is(err, sql.ErrNoRows)) + } + }) + } + } } - - presets := []database.GetTemplatePresetsWithPrebuildsRow{newPresetRow(unrelatedOrg.ID)} - if tc.includePreset { - presets = append(presets, newPresetRow(targetOrg.ID)) - } - - // Verify memberships before reconciliation. - preReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ - UserID: database.PrebuildsSystemUserID, - }) - require.NoError(t, err) - expectedMembershipsBefore := []uuid.UUID{defaultOrg.ID, unrelatedOrg.ID} - if tc.preExistingMembership { - expectedMembershipsBefore = append(expectedMembershipsBefore, targetOrg.ID) - } - require.ElementsMatch(t, expectedMembershipsBefore, extractOrgIDs(preReconcileMemberships)) - - // Reconcile - reconciler := prebuilds.NewStoreMembershipReconciler(db, clock) - require.NoError(t, reconciler.ReconcileAll(ctx, database.PrebuildsSystemUserID, presets)) - - // Verify memberships after reconciliation. - postReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ - UserID: database.PrebuildsSystemUserID, - }) - require.NoError(t, err) - expectedMembershipsAfter := expectedMembershipsBefore - if !tc.preExistingMembership && tc.includePreset { - expectedMembershipsAfter = append(expectedMembershipsAfter, targetOrg.ID) - } - require.ElementsMatch(t, expectedMembershipsAfter, extractOrgIDs(postReconcileMemberships)) - }) + } } } diff --git a/enterprise/coderd/workspacequota_test.go b/enterprise/coderd/workspacequota_test.go index f49e135ad55b3..c6a891b6ce12b 100644 --- a/enterprise/coderd/workspacequota_test.go +++ b/enterprise/coderd/workspacequota_test.go @@ -395,6 +395,265 @@ func TestWorkspaceQuota(t *testing.T) { verifyQuotaUser(ctx, t, client, second.Org.ID.String(), user.ID.String(), consumed, 35) }) + + // ZeroQuota tests that a user with a zero quota allowance can't create a workspace. + // Although relevant for all users, this test ensures that the prebuilds system user + // cannot create workspaces in an organization for which it has exhausted its quota. + t.Run("ZeroQuota", func(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + + // Create a client with no quota allowance + client, _, api, user := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ + UserWorkspaceQuota: 0, // Set user workspace quota to 0 + LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureTemplateRBAC: 1, + }, + }, + }) + coderdtest.NewProvisionerDaemon(t, api.AGPL) + + // Verify initial quota is 0 + verifyQuota(ctx, t, client, user.OrganizationID.String(), 0, 0) + + // Create a template with a workspace that costs 1 credit + authToken := uuid.NewString() + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: []*proto.Response{{ + Type: &proto.Response_Apply{ + Apply: &proto.ApplyComplete{ + Resources: []*proto.Resource{{ + Name: "example", + Type: "aws_instance", + DailyCost: 1, + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Name: "example", + Auth: &proto.Agent_Token{ + Token: authToken, + }, + }}, + }}, + }, + }, + }}, + }) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + // Attempt to create a workspace with zero quota - should fail + workspace := coderdtest.CreateWorkspace(t, client, template.ID) + build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + + // Verify the build failed due to quota + require.Equal(t, codersdk.WorkspaceStatusFailed, build.Status) + require.Contains(t, build.Job.Error, "quota") + + // Verify quota consumption remains at 0 + verifyQuota(ctx, t, client, user.OrganizationID.String(), 0, 0) + + // Test with a template that has zero cost - should pass + versionZeroCost := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: []*proto.Response{{ + Type: &proto.Response_Apply{ + Apply: &proto.ApplyComplete{ + Resources: []*proto.Resource{{ + Name: "example", + Type: "aws_instance", + DailyCost: 0, // Zero cost workspace + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Name: "example", + Auth: &proto.Agent_Token{ + Token: uuid.NewString(), + }, + }}, + }}, + }, + }, + }}, + }) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, versionZeroCost.ID) + templateZeroCost := coderdtest.CreateTemplate(t, client, user.OrganizationID, versionZeroCost.ID) + + // Workspace with zero cost should pass + workspaceZeroCost := coderdtest.CreateWorkspace(t, client, templateZeroCost.ID) + buildZeroCost := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspaceZeroCost.LatestBuild.ID) + + require.Equal(t, codersdk.WorkspaceStatusRunning, buildZeroCost.Status) + require.Empty(t, buildZeroCost.Job.Error) + + // Verify quota consumption remains at 0 + verifyQuota(ctx, t, client, user.OrganizationID.String(), 0, 0) + }) + + // MultiOrg tests that a user can create workspaces in multiple organizations + // as long as they have enough quota in each organization. Specifically, + // in exhausted quota in one organization does not affect the ability to + // create workspaces in other organizations. This test is relevant to all users + // but is particularly relevant for the prebuilds system user. + t.Run("MultiOrg", func(t *testing.T) { + t.Parallel() + + ctx := testutil.Context(t, testutil.WaitLong) + + // Create a setup with multiple organizations + owner, _, api, first := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ + LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureTemplateRBAC: 1, + codersdk.FeatureMultipleOrganizations: 1, + codersdk.FeatureExternalProvisionerDaemons: 1, + }, + }, + }) + coderdtest.NewProvisionerDaemon(t, api.AGPL) + + // Create a second organization + second := coderdenttest.CreateOrganization(t, owner, coderdenttest.CreateOrganizationOptions{ + IncludeProvisionerDaemon: true, + }) + + // Create a user that will be a member of both organizations + user, _ := coderdtest.CreateAnotherUser(t, owner, first.OrganizationID, rbac.ScopedRoleOrgMember(second.ID)) + + // Set up quota allowances for both organizations + // First org: 2 credits total + _, err := owner.PatchGroup(ctx, first.OrganizationID, codersdk.PatchGroupRequest{ + QuotaAllowance: ptr.Ref(2), + }) + require.NoError(t, err) + + // Second org: 3 credits total + _, err = owner.PatchGroup(ctx, second.ID, codersdk.PatchGroupRequest{ + QuotaAllowance: ptr.Ref(3), + }) + require.NoError(t, err) + + // Verify initial quotas + verifyQuota(ctx, t, user, first.OrganizationID.String(), 0, 2) + verifyQuota(ctx, t, user, second.ID.String(), 0, 3) + + // Create templates for both organizations + authToken := uuid.NewString() + version1 := coderdtest.CreateTemplateVersion(t, owner, first.OrganizationID, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: []*proto.Response{{ + Type: &proto.Response_Apply{ + Apply: &proto.ApplyComplete{ + Resources: []*proto.Resource{{ + Name: "example", + Type: "aws_instance", + DailyCost: 1, + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Name: "example", + Auth: &proto.Agent_Token{ + Token: authToken, + }, + }}, + }}, + }, + }, + }}, + }) + coderdtest.AwaitTemplateVersionJobCompleted(t, owner, version1.ID) + template1 := coderdtest.CreateTemplate(t, owner, first.OrganizationID, version1.ID) + + version2 := coderdtest.CreateTemplateVersion(t, owner, second.ID, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionApply: []*proto.Response{{ + Type: &proto.Response_Apply{ + Apply: &proto.ApplyComplete{ + Resources: []*proto.Resource{{ + Name: "example", + Type: "aws_instance", + DailyCost: 1, + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Name: "example", + Auth: &proto.Agent_Token{ + Token: uuid.NewString(), + }, + }}, + }}, + }, + }, + }}, + }) + coderdtest.AwaitTemplateVersionJobCompleted(t, owner, version2.ID) + template2 := coderdtest.CreateTemplate(t, owner, second.ID, version2.ID) + + // Exhaust quota in the first organization by creating 2 workspaces + var workspaces1 []codersdk.Workspace + for i := 0; i < 2; i++ { + workspace := coderdtest.CreateWorkspace(t, user, template1.ID) + build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) + require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status) + workspaces1 = append(workspaces1, workspace) + } + + // Verify first org quota is exhausted + verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) + + // Try to create another workspace in the first org - should fail + workspace := coderdtest.CreateWorkspace(t, user, template1.ID) + build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) + require.Equal(t, codersdk.WorkspaceStatusFailed, build.Status) + require.Contains(t, build.Job.Error, "quota") + + // Verify first org quota consumption didn't increase + verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) + + // Verify second org quota is still available + verifyQuota(ctx, t, user, second.ID.String(), 0, 3) + + // Create workspaces in the second organization - should succeed + for i := 0; i < 3; i++ { + workspace := coderdtest.CreateWorkspace(t, user, template2.ID) + build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) + require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status) + } + + // Verify second org quota is now exhausted + verifyQuota(ctx, t, user, second.ID.String(), 3, 3) + + // Try to create another workspace in the second org - should fail + workspace = coderdtest.CreateWorkspace(t, user, template2.ID) + build = coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) + require.Equal(t, codersdk.WorkspaceStatusFailed, build.Status) + require.Contains(t, build.Job.Error, "quota") + + // Verify second org quota consumption didn't increase + verifyQuota(ctx, t, user, second.ID.String(), 3, 3) + + // Verify first org quota is still exhausted + verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) + + // Delete one workspace from the first org to free up quota + build = coderdtest.CreateWorkspaceBuild(t, user, workspaces1[0], database.WorkspaceTransitionDelete) + build = coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, build.ID) + require.Equal(t, codersdk.WorkspaceStatusDeleted, build.Status) + + // Verify first org quota is now available again + verifyQuota(ctx, t, user, first.OrganizationID.String(), 1, 2) + + // Create a workspace in the first org - should succeed + workspace = coderdtest.CreateWorkspace(t, user, template1.ID) + build = coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) + require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status) + + // Verify first org quota is exhausted again + verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) + + // Verify second org quota remains exhausted + verifyQuota(ctx, t, user, second.ID.String(), 3, 3) + }) } // nolint:paralleltest,tparallel // Tests must run serially From afb54f68847f86842c81606ad68adc42c88de12e Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Fri, 8 Aug 2025 12:18:07 +0100 Subject: [PATCH 111/260] chore: revert feat(enterprise/coderd): allow system users to be added to groups (#19254) This reverts commit b200fc8e674ab68ca421de218eb54b0e9282b8f8 (https://github.com/coder/coder/pull/18341). --- coderd/database/dbauthz/dbauthz.go | 10 - coderd/database/queries.sql.go | 14 +- .../database/queries/organizationmembers.sql | 2 - coderd/members.go | 1 - .../prebuilt-workspaces.md | 8 +- enterprise/coderd/prebuilds/membership.go | 89 ++---- .../coderd/prebuilds/membership_test.go | 244 ++++++----------- enterprise/coderd/workspacequota_test.go | 259 ------------------ 8 files changed, 103 insertions(+), 524 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 517a5540b3f00..d5cc334f5ff7f 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -485,16 +485,6 @@ var ( rbac.ResourceFile.Type: { policy.ActionRead, }, - // Needs to be able to add the prebuilds system user to the "prebuilds" group in each organization that needs prebuilt workspaces - // so that prebuilt workspaces can be scheduled and owned in those organizations. - rbac.ResourceGroup.Type: { - policy.ActionRead, - policy.ActionCreate, - policy.ActionUpdate, - }, - rbac.ResourceGroupMember.Type: { - policy.ActionRead, - }, }), }, }), diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index b8363ad5b273f..74cefd09359b0 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -6592,19 +6592,16 @@ WHERE organization_id = $1 ELSE true END - -- Filter by system type - AND CASE WHEN $2::bool THEN TRUE ELSE is_system = false END ORDER BY -- Deterministic and consistent ordering of all users. This is to ensure consistent pagination. - LOWER(username) ASC OFFSET $3 + LOWER(username) ASC OFFSET $2 LIMIT -- A null limit means "no limit", so 0 means return all - NULLIF($4 :: int, 0) + NULLIF($3 :: int, 0) ` type PaginatedOrganizationMembersParams struct { OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - IncludeSystem bool `db:"include_system" json:"include_system"` OffsetOpt int32 `db:"offset_opt" json:"offset_opt"` LimitOpt int32 `db:"limit_opt" json:"limit_opt"` } @@ -6620,12 +6617,7 @@ type PaginatedOrganizationMembersRow struct { } func (q *sqlQuerier) PaginatedOrganizationMembers(ctx context.Context, arg PaginatedOrganizationMembersParams) ([]PaginatedOrganizationMembersRow, error) { - rows, err := q.db.QueryContext(ctx, paginatedOrganizationMembers, - arg.OrganizationID, - arg.IncludeSystem, - arg.OffsetOpt, - arg.LimitOpt, - ) + rows, err := q.db.QueryContext(ctx, paginatedOrganizationMembers, arg.OrganizationID, arg.OffsetOpt, arg.LimitOpt) if err != nil { return nil, err } diff --git a/coderd/database/queries/organizationmembers.sql b/coderd/database/queries/organizationmembers.sql index 1c0af011776e3..9d570bc1c49ee 100644 --- a/coderd/database/queries/organizationmembers.sql +++ b/coderd/database/queries/organizationmembers.sql @@ -89,8 +89,6 @@ WHERE organization_id = @organization_id ELSE true END - -- Filter by system type - AND CASE WHEN @include_system::bool THEN TRUE ELSE is_system = false END ORDER BY -- Deterministic and consistent ordering of all users. This is to ensure consistent pagination. LOWER(username) ASC OFFSET @offset_opt diff --git a/coderd/members.go b/coderd/members.go index 371b58015b83b..0bd5bb1fbc8bd 100644 --- a/coderd/members.go +++ b/coderd/members.go @@ -203,7 +203,6 @@ func (api *API) paginatedMembers(rw http.ResponseWriter, r *http.Request) { paginatedMemberRows, err := api.Database.PaginatedOrganizationMembers(ctx, database.PaginatedOrganizationMembersParams{ OrganizationID: organization.ID, - IncludeSystem: false, // #nosec G115 - Pagination limits are small and fit in int32 LimitOpt: int32(paginationParams.Limit), // #nosec G115 - Pagination offsets are small and fit in int32 diff --git a/docs/admin/templates/extending-templates/prebuilt-workspaces.md b/docs/admin/templates/extending-templates/prebuilt-workspaces.md index 70161f687ba76..8e61687ce0f01 100644 --- a/docs/admin/templates/extending-templates/prebuilt-workspaces.md +++ b/docs/admin/templates/extending-templates/prebuilt-workspaces.md @@ -235,18 +235,12 @@ The system always maintains the desired number of prebuilt workspaces for the ac ### Managing resource quotas -To help prevent unexpected infrastructure costs, prebuilt workspaces can be used in conjunction with [resource quotas](../../users/quotas.md). +Prebuilt workspaces can be used in conjunction with [resource quotas](../../users/quotas.md). Because unclaimed prebuilt workspaces are owned by the `prebuilds` user, you can: 1. Configure quotas for any group that includes this user. 1. Set appropriate limits to balance prebuilt workspace availability with resource constraints. -When prebuilt workspaces are configured for an organization, Coder creates a "prebuilds" group in that organization and adds the prebuilds user to it. This group has a default quota allowance of 0, which you should adjust based on your needs: - -- **Set a quota allowance** on the "prebuilds" group to control how many prebuilt workspaces can be provisioned -- **Monitor usage** to ensure the quota is appropriate for your desired number of prebuilt instances -- **Adjust as needed** based on your template costs and desired prebuilt workspace pool size - If a quota is exceeded, the prebuilt workspace will fail provisioning the same way other workspaces do. ### Template configuration best practices diff --git a/enterprise/coderd/prebuilds/membership.go b/enterprise/coderd/prebuilds/membership.go index 03328c2012534..079711bcbcc49 100644 --- a/enterprise/coderd/prebuilds/membership.go +++ b/enterprise/coderd/prebuilds/membership.go @@ -12,11 +12,6 @@ import ( "github.com/coder/quartz" ) -const ( - PrebuiltWorkspacesGroupName = "coder_prebuilt_workspaces" - PrebuiltWorkspacesGroupDisplayName = "Prebuilt Workspaces" -) - // StoreMembershipReconciler encapsulates the responsibility of ensuring that the prebuilds system user is a member of all // organizations for which prebuilt workspaces are requested. This is necessary because our data model requires that such // prebuilt workspaces belong to a member of the organization of their eventual claimant. @@ -32,16 +27,11 @@ func NewStoreMembershipReconciler(store database.Store, clock quartz.Clock) Stor } } -// ReconcileAll compares the current organization and group memberships of a user to the memberships required -// in order to create prebuilt workspaces. If the user in question is not yet a member of an organization that -// needs prebuilt workspaces, ReconcileAll will create the membership required. +// ReconcileAll compares the current membership of a user to the membership required in order to create prebuilt workspaces. +// If the user in question is not yet a member of an organization that needs prebuilt workspaces, ReconcileAll will create +// the membership required. // -// To facilitate quota management, ReconcileAll will ensure: -// * the existence of a group (defined by PrebuiltWorkspacesGroupName) in each organization that needs prebuilt workspaces -// * that the prebuilds system user belongs to the group in each organization that needs prebuilt workspaces -// * that the group has a quota of 0 by default, which users can adjust based on their needs. -// -// ReconcileAll does not have an opinion on transaction or lock management. These responsibilities are left to the caller. +// This method does not have an opinion on transaction or lock management. These responsibilities are left to the caller. func (s StoreMembershipReconciler) ReconcileAll(ctx context.Context, userID uuid.UUID, presets []database.GetTemplatePresetsWithPrebuildsRow) error { organizationMemberships, err := s.store.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ UserID: userID, @@ -54,74 +44,37 @@ func (s StoreMembershipReconciler) ReconcileAll(ctx context.Context, userID uuid return xerrors.Errorf("determine prebuild organization membership: %w", err) } - orgMemberships := make(map[uuid.UUID]struct{}, 0) + systemUserMemberships := make(map[uuid.UUID]struct{}, 0) defaultOrg, err := s.store.GetDefaultOrganization(ctx) if err != nil { return xerrors.Errorf("get default organization: %w", err) } - orgMemberships[defaultOrg.ID] = struct{}{} + systemUserMemberships[defaultOrg.ID] = struct{}{} for _, o := range organizationMemberships { - orgMemberships[o.ID] = struct{}{} + systemUserMemberships[o.ID] = struct{}{} } var membershipInsertionErrors error for _, preset := range presets { - _, alreadyOrgMember := orgMemberships[preset.OrganizationID] - if !alreadyOrgMember { - // Add the organization to our list of memberships regardless of potential failure below - // to avoid a retry that will probably be doomed anyway. - orgMemberships[preset.OrganizationID] = struct{}{} - - // Insert the missing membership - _, err = s.store.InsertOrganizationMember(ctx, database.InsertOrganizationMemberParams{ - OrganizationID: preset.OrganizationID, - UserID: userID, - CreatedAt: s.clock.Now(), - UpdatedAt: s.clock.Now(), - Roles: []string{}, - }) - if err != nil { - membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("insert membership for prebuilt workspaces: %w", err)) - continue - } + _, alreadyMember := systemUserMemberships[preset.OrganizationID] + if alreadyMember { + continue } + // Add the organization to our list of memberships regardless of potential failure below + // to avoid a retry that will probably be doomed anyway. + systemUserMemberships[preset.OrganizationID] = struct{}{} - // Create a "prebuilds" group in the organization and add the system user to it - // This group will have a quota of 0 by default, which users can adjust based on their needs - prebuildsGroup, err := s.store.InsertGroup(ctx, database.InsertGroupParams{ - ID: uuid.New(), - Name: PrebuiltWorkspacesGroupName, - DisplayName: PrebuiltWorkspacesGroupDisplayName, + // Insert the missing membership + _, err = s.store.InsertOrganizationMember(ctx, database.InsertOrganizationMemberParams{ OrganizationID: preset.OrganizationID, - AvatarURL: "", - QuotaAllowance: 0, // Default quota of 0, users should set this based on their needs - }) - if err != nil { - // If the group already exists, try to get it - if !database.IsUniqueViolation(err) { - membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("create prebuilds group: %w", err)) - continue - } - prebuildsGroup, err = s.store.GetGroupByOrgAndName(ctx, database.GetGroupByOrgAndNameParams{ - OrganizationID: preset.OrganizationID, - Name: PrebuiltWorkspacesGroupName, - }) - if err != nil { - membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("get existing prebuilds group: %w", err)) - continue - } - } - - // Add the system user to the prebuilds group - err = s.store.InsertGroupMember(ctx, database.InsertGroupMemberParams{ - GroupID: prebuildsGroup.ID, - UserID: userID, + UserID: userID, + CreatedAt: s.clock.Now(), + UpdatedAt: s.clock.Now(), + Roles: []string{}, }) if err != nil { - // Ignore unique violation errors as the user might already be in the group - if !database.IsUniqueViolation(err) { - membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("add system user to prebuilds group: %w", err)) - } + membershipInsertionErrors = errors.Join(membershipInsertionErrors, xerrors.Errorf("insert membership for prebuilt workspaces: %w", err)) + continue } } return membershipInsertionErrors diff --git a/enterprise/coderd/prebuilds/membership_test.go b/enterprise/coderd/prebuilds/membership_test.go index ae4b05515575c..82d2abf92a4d8 100644 --- a/enterprise/coderd/prebuilds/membership_test.go +++ b/enterprise/coderd/prebuilds/membership_test.go @@ -1,23 +1,18 @@ package prebuilds_test import ( - "database/sql" - "errors" + "context" "testing" "github.com/google/uuid" "github.com/stretchr/testify/require" - "tailscale.com/types/ptr" "github.com/coder/quartz" - "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" - "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/database/dbgen" "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/enterprise/coderd/prebuilds" - "github.com/coder/coder/v2/testutil" ) // TestReconcileAll verifies that StoreMembershipReconciler correctly updates membership @@ -25,6 +20,7 @@ import ( func TestReconcileAll(t *testing.T) { t.Parallel() + ctx := context.Background() clock := quartz.NewMock(t) // Helper to build a minimal Preset row belonging to a given org. @@ -36,171 +32,87 @@ func TestReconcileAll(t *testing.T) { } tests := []struct { - name string - includePreset []bool - preExistingOrgMembership []bool - preExistingGroup []bool - preExistingGroupMembership []bool - // Expected outcomes - expectOrgMembershipExists *bool - expectGroupExists *bool - expectUserInGroup *bool + name string + includePreset bool + preExistingMembership bool }{ - { - name: "if there are no presets, membership reconciliation is a no-op", - includePreset: []bool{false}, - preExistingOrgMembership: []bool{true, false}, - preExistingGroup: []bool{true, false}, - preExistingGroupMembership: []bool{true, false}, - expectOrgMembershipExists: ptr.To(false), - expectGroupExists: ptr.To(false), - }, - { - name: "if there is a preset, then we should enforce org and group membership in all cases", - includePreset: []bool{true}, - preExistingOrgMembership: []bool{true, false}, - preExistingGroup: []bool{true, false}, - preExistingGroupMembership: []bool{true, false}, - expectOrgMembershipExists: ptr.To(true), - expectGroupExists: ptr.To(true), - expectUserInGroup: ptr.To(true), - }, + // The StoreMembershipReconciler acts based on the provided agplprebuilds.GlobalSnapshot. + // These test cases must therefore trust any valid snapshot, so the only relevant functional test cases are: + + // No presets to act on and the prebuilds user does not belong to any organizations. + // Reconciliation should be a no-op + {name: "no presets, no memberships", includePreset: false, preExistingMembership: false}, + // If we have a preset that requires prebuilds, but the prebuilds user is not a member of + // that organization, then we should add the membership. + {name: "preset, but no membership", includePreset: true, preExistingMembership: false}, + // If the prebuilds system user is already a member of the organization to which a preset belongs, + // then reconciliation should be a no-op: + {name: "preset, but already a member", includePreset: true, preExistingMembership: true}, + // If the prebuilds system user is a member of an organization that doesn't have need any prebuilds, + // then it must have required prebuilds in the past. The membership is not currently necessary, but + // the reconciler won't remove it, because there's little cost to keeping it and prebuilds might be + // enabled again. + {name: "member, but no presets", includePreset: false, preExistingMembership: true}, } for _, tc := range tests { - tc := tc - for _, includePreset := range tc.includePreset { - includePreset := includePreset - for _, preExistingOrgMembership := range tc.preExistingOrgMembership { - preExistingOrgMembership := preExistingOrgMembership - for _, preExistingGroup := range tc.preExistingGroup { - preExistingGroup := preExistingGroup - for _, preExistingGroupMembership := range tc.preExistingGroupMembership { - preExistingGroupMembership := preExistingGroupMembership - t.Run(tc.name, func(t *testing.T) { - t.Parallel() - - // nolint:gocritic // Reconciliation happens as prebuilds system user, not a human user. - ctx := dbauthz.AsPrebuildsOrchestrator(testutil.Context(t, testutil.WaitLong)) - _, db := coderdtest.NewWithDatabase(t, nil) - - defaultOrg, err := db.GetDefaultOrganization(ctx) - require.NoError(t, err) - - // introduce an unrelated organization to ensure that the membership reconciler don't interfere with it. - unrelatedOrg := dbgen.Organization(t, db, database.Organization{}) - targetOrg := dbgen.Organization(t, db, database.Organization{}) - - if !dbtestutil.WillUsePostgres() { - // dbmem doesn't ensure membership to the default organization - dbgen.OrganizationMember(t, db, database.OrganizationMember{ - OrganizationID: defaultOrg.ID, - UserID: database.PrebuildsSystemUserID, - }) - } - - // Ensure membership to unrelated org. - dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: unrelatedOrg.ID, UserID: database.PrebuildsSystemUserID}) - - if preExistingOrgMembership { - // System user already a member of both orgs. - dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: targetOrg.ID, UserID: database.PrebuildsSystemUserID}) - } - - // Create pre-existing prebuilds group if required by test case - var prebuildsGroup database.Group - if preExistingGroup { - prebuildsGroup = dbgen.Group(t, db, database.Group{ - Name: prebuilds.PrebuiltWorkspacesGroupName, - DisplayName: prebuilds.PrebuiltWorkspacesGroupDisplayName, - OrganizationID: targetOrg.ID, - QuotaAllowance: 0, - }) - - // Add the system user to the group if preExistingGroupMembership is true - if preExistingGroupMembership { - dbgen.GroupMember(t, db, database.GroupMemberTable{ - GroupID: prebuildsGroup.ID, - UserID: database.PrebuildsSystemUserID, - }) - } - } - - presets := []database.GetTemplatePresetsWithPrebuildsRow{newPresetRow(unrelatedOrg.ID)} - if includePreset { - presets = append(presets, newPresetRow(targetOrg.ID)) - } - - // Verify memberships before reconciliation. - preReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ - UserID: database.PrebuildsSystemUserID, - }) - require.NoError(t, err) - expectedMembershipsBefore := []uuid.UUID{defaultOrg.ID, unrelatedOrg.ID} - if preExistingOrgMembership { - expectedMembershipsBefore = append(expectedMembershipsBefore, targetOrg.ID) - } - require.ElementsMatch(t, expectedMembershipsBefore, extractOrgIDs(preReconcileMemberships)) - - // Reconcile - reconciler := prebuilds.NewStoreMembershipReconciler(db, clock) - require.NoError(t, reconciler.ReconcileAll(ctx, database.PrebuildsSystemUserID, presets)) - - // Verify memberships after reconciliation. - postReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ - UserID: database.PrebuildsSystemUserID, - }) - require.NoError(t, err) - expectedMembershipsAfter := expectedMembershipsBefore - if !preExistingOrgMembership && tc.expectOrgMembershipExists != nil && *tc.expectOrgMembershipExists { - expectedMembershipsAfter = append(expectedMembershipsAfter, targetOrg.ID) - } - require.ElementsMatch(t, expectedMembershipsAfter, extractOrgIDs(postReconcileMemberships)) - - // Verify prebuilds group behavior based on expected outcomes - prebuildsGroup, err = db.GetGroupByOrgAndName(ctx, database.GetGroupByOrgAndNameParams{ - OrganizationID: targetOrg.ID, - Name: prebuilds.PrebuiltWorkspacesGroupName, - }) - if tc.expectGroupExists != nil && *tc.expectGroupExists { - require.NoError(t, err) - require.Equal(t, prebuilds.PrebuiltWorkspacesGroupName, prebuildsGroup.Name) - require.Equal(t, prebuilds.PrebuiltWorkspacesGroupDisplayName, prebuildsGroup.DisplayName) - require.Equal(t, int32(0), prebuildsGroup.QuotaAllowance) // Default quota should be 0 - - if tc.expectUserInGroup != nil && *tc.expectUserInGroup { - // Check that the system user is a member of the prebuilds group - groupMembers, err := db.GetGroupMembersByGroupID(ctx, database.GetGroupMembersByGroupIDParams{ - GroupID: prebuildsGroup.ID, - IncludeSystem: true, - }) - require.NoError(t, err) - require.Len(t, groupMembers, 1) - require.Equal(t, database.PrebuildsSystemUserID, groupMembers[0].UserID) - } - - // If no preset exists, then we do not enforce group membership: - if tc.expectUserInGroup != nil && !*tc.expectUserInGroup { - // Check that the system user is NOT a member of the prebuilds group - groupMembers, err := db.GetGroupMembersByGroupID(ctx, database.GetGroupMembersByGroupIDParams{ - GroupID: prebuildsGroup.ID, - IncludeSystem: true, - }) - require.NoError(t, err) - require.Len(t, groupMembers, 0) - } - } - - if !preExistingGroup && tc.expectGroupExists != nil && !*tc.expectGroupExists { - // Verify that no prebuilds group exists - require.Error(t, err) - require.True(t, errors.Is(err, sql.ErrNoRows)) - } - }) - } - } + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + db, _ := dbtestutil.NewDB(t) + + defaultOrg, err := db.GetDefaultOrganization(ctx) + require.NoError(t, err) + + // introduce an unrelated organization to ensure that the membership reconciler don't interfere with it. + unrelatedOrg := dbgen.Organization(t, db, database.Organization{}) + targetOrg := dbgen.Organization(t, db, database.Organization{}) + + if !dbtestutil.WillUsePostgres() { + // dbmem doesn't ensure membership to the default organization + dbgen.OrganizationMember(t, db, database.OrganizationMember{ + OrganizationID: defaultOrg.ID, + UserID: database.PrebuildsSystemUserID, + }) } - } + + dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: unrelatedOrg.ID, UserID: database.PrebuildsSystemUserID}) + if tc.preExistingMembership { + // System user already a member of both orgs. + dbgen.OrganizationMember(t, db, database.OrganizationMember{OrganizationID: targetOrg.ID, UserID: database.PrebuildsSystemUserID}) + } + + presets := []database.GetTemplatePresetsWithPrebuildsRow{newPresetRow(unrelatedOrg.ID)} + if tc.includePreset { + presets = append(presets, newPresetRow(targetOrg.ID)) + } + + // Verify memberships before reconciliation. + preReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ + UserID: database.PrebuildsSystemUserID, + }) + require.NoError(t, err) + expectedMembershipsBefore := []uuid.UUID{defaultOrg.ID, unrelatedOrg.ID} + if tc.preExistingMembership { + expectedMembershipsBefore = append(expectedMembershipsBefore, targetOrg.ID) + } + require.ElementsMatch(t, expectedMembershipsBefore, extractOrgIDs(preReconcileMemberships)) + + // Reconcile + reconciler := prebuilds.NewStoreMembershipReconciler(db, clock) + require.NoError(t, reconciler.ReconcileAll(ctx, database.PrebuildsSystemUserID, presets)) + + // Verify memberships after reconciliation. + postReconcileMemberships, err := db.GetOrganizationsByUserID(ctx, database.GetOrganizationsByUserIDParams{ + UserID: database.PrebuildsSystemUserID, + }) + require.NoError(t, err) + expectedMembershipsAfter := expectedMembershipsBefore + if !tc.preExistingMembership && tc.includePreset { + expectedMembershipsAfter = append(expectedMembershipsAfter, targetOrg.ID) + } + require.ElementsMatch(t, expectedMembershipsAfter, extractOrgIDs(postReconcileMemberships)) + }) } } diff --git a/enterprise/coderd/workspacequota_test.go b/enterprise/coderd/workspacequota_test.go index c6a891b6ce12b..f49e135ad55b3 100644 --- a/enterprise/coderd/workspacequota_test.go +++ b/enterprise/coderd/workspacequota_test.go @@ -395,265 +395,6 @@ func TestWorkspaceQuota(t *testing.T) { verifyQuotaUser(ctx, t, client, second.Org.ID.String(), user.ID.String(), consumed, 35) }) - - // ZeroQuota tests that a user with a zero quota allowance can't create a workspace. - // Although relevant for all users, this test ensures that the prebuilds system user - // cannot create workspaces in an organization for which it has exhausted its quota. - t.Run("ZeroQuota", func(t *testing.T) { - t.Parallel() - - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) - defer cancel() - - // Create a client with no quota allowance - client, _, api, user := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ - UserWorkspaceQuota: 0, // Set user workspace quota to 0 - LicenseOptions: &coderdenttest.LicenseOptions{ - Features: license.Features{ - codersdk.FeatureTemplateRBAC: 1, - }, - }, - }) - coderdtest.NewProvisionerDaemon(t, api.AGPL) - - // Verify initial quota is 0 - verifyQuota(ctx, t, client, user.OrganizationID.String(), 0, 0) - - // Create a template with a workspace that costs 1 credit - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - DailyCost: 1, - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Name: "example", - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, - }, - }, - }}, - }) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - - // Attempt to create a workspace with zero quota - should fail - workspace := coderdtest.CreateWorkspace(t, client, template.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - - // Verify the build failed due to quota - require.Equal(t, codersdk.WorkspaceStatusFailed, build.Status) - require.Contains(t, build.Job.Error, "quota") - - // Verify quota consumption remains at 0 - verifyQuota(ctx, t, client, user.OrganizationID.String(), 0, 0) - - // Test with a template that has zero cost - should pass - versionZeroCost := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - DailyCost: 0, // Zero cost workspace - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Name: "example", - Auth: &proto.Agent_Token{ - Token: uuid.NewString(), - }, - }}, - }}, - }, - }, - }}, - }) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, versionZeroCost.ID) - templateZeroCost := coderdtest.CreateTemplate(t, client, user.OrganizationID, versionZeroCost.ID) - - // Workspace with zero cost should pass - workspaceZeroCost := coderdtest.CreateWorkspace(t, client, templateZeroCost.ID) - buildZeroCost := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspaceZeroCost.LatestBuild.ID) - - require.Equal(t, codersdk.WorkspaceStatusRunning, buildZeroCost.Status) - require.Empty(t, buildZeroCost.Job.Error) - - // Verify quota consumption remains at 0 - verifyQuota(ctx, t, client, user.OrganizationID.String(), 0, 0) - }) - - // MultiOrg tests that a user can create workspaces in multiple organizations - // as long as they have enough quota in each organization. Specifically, - // in exhausted quota in one organization does not affect the ability to - // create workspaces in other organizations. This test is relevant to all users - // but is particularly relevant for the prebuilds system user. - t.Run("MultiOrg", func(t *testing.T) { - t.Parallel() - - ctx := testutil.Context(t, testutil.WaitLong) - - // Create a setup with multiple organizations - owner, _, api, first := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ - LicenseOptions: &coderdenttest.LicenseOptions{ - Features: license.Features{ - codersdk.FeatureTemplateRBAC: 1, - codersdk.FeatureMultipleOrganizations: 1, - codersdk.FeatureExternalProvisionerDaemons: 1, - }, - }, - }) - coderdtest.NewProvisionerDaemon(t, api.AGPL) - - // Create a second organization - second := coderdenttest.CreateOrganization(t, owner, coderdenttest.CreateOrganizationOptions{ - IncludeProvisionerDaemon: true, - }) - - // Create a user that will be a member of both organizations - user, _ := coderdtest.CreateAnotherUser(t, owner, first.OrganizationID, rbac.ScopedRoleOrgMember(second.ID)) - - // Set up quota allowances for both organizations - // First org: 2 credits total - _, err := owner.PatchGroup(ctx, first.OrganizationID, codersdk.PatchGroupRequest{ - QuotaAllowance: ptr.Ref(2), - }) - require.NoError(t, err) - - // Second org: 3 credits total - _, err = owner.PatchGroup(ctx, second.ID, codersdk.PatchGroupRequest{ - QuotaAllowance: ptr.Ref(3), - }) - require.NoError(t, err) - - // Verify initial quotas - verifyQuota(ctx, t, user, first.OrganizationID.String(), 0, 2) - verifyQuota(ctx, t, user, second.ID.String(), 0, 3) - - // Create templates for both organizations - authToken := uuid.NewString() - version1 := coderdtest.CreateTemplateVersion(t, owner, first.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - DailyCost: 1, - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Name: "example", - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, - }, - }, - }}, - }) - coderdtest.AwaitTemplateVersionJobCompleted(t, owner, version1.ID) - template1 := coderdtest.CreateTemplate(t, owner, first.OrganizationID, version1.ID) - - version2 := coderdtest.CreateTemplateVersion(t, owner, second.ID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - DailyCost: 1, - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Name: "example", - Auth: &proto.Agent_Token{ - Token: uuid.NewString(), - }, - }}, - }}, - }, - }, - }}, - }) - coderdtest.AwaitTemplateVersionJobCompleted(t, owner, version2.ID) - template2 := coderdtest.CreateTemplate(t, owner, second.ID, version2.ID) - - // Exhaust quota in the first organization by creating 2 workspaces - var workspaces1 []codersdk.Workspace - for i := 0; i < 2; i++ { - workspace := coderdtest.CreateWorkspace(t, user, template1.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) - require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status) - workspaces1 = append(workspaces1, workspace) - } - - // Verify first org quota is exhausted - verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) - - // Try to create another workspace in the first org - should fail - workspace := coderdtest.CreateWorkspace(t, user, template1.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) - require.Equal(t, codersdk.WorkspaceStatusFailed, build.Status) - require.Contains(t, build.Job.Error, "quota") - - // Verify first org quota consumption didn't increase - verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) - - // Verify second org quota is still available - verifyQuota(ctx, t, user, second.ID.String(), 0, 3) - - // Create workspaces in the second organization - should succeed - for i := 0; i < 3; i++ { - workspace := coderdtest.CreateWorkspace(t, user, template2.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) - require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status) - } - - // Verify second org quota is now exhausted - verifyQuota(ctx, t, user, second.ID.String(), 3, 3) - - // Try to create another workspace in the second org - should fail - workspace = coderdtest.CreateWorkspace(t, user, template2.ID) - build = coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) - require.Equal(t, codersdk.WorkspaceStatusFailed, build.Status) - require.Contains(t, build.Job.Error, "quota") - - // Verify second org quota consumption didn't increase - verifyQuota(ctx, t, user, second.ID.String(), 3, 3) - - // Verify first org quota is still exhausted - verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) - - // Delete one workspace from the first org to free up quota - build = coderdtest.CreateWorkspaceBuild(t, user, workspaces1[0], database.WorkspaceTransitionDelete) - build = coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, build.ID) - require.Equal(t, codersdk.WorkspaceStatusDeleted, build.Status) - - // Verify first org quota is now available again - verifyQuota(ctx, t, user, first.OrganizationID.String(), 1, 2) - - // Create a workspace in the first org - should succeed - workspace = coderdtest.CreateWorkspace(t, user, template1.ID) - build = coderdtest.AwaitWorkspaceBuildJobCompleted(t, user, workspace.LatestBuild.ID) - require.Equal(t, codersdk.WorkspaceStatusRunning, build.Status) - - // Verify first org quota is exhausted again - verifyQuota(ctx, t, user, first.OrganizationID.String(), 2, 2) - - // Verify second org quota remains exhausted - verifyQuota(ctx, t, user, second.ID.String(), 3, 3) - }) } // nolint:paralleltest,tparallel // Tests must run serially From 155c7bbc659e54ed59fd10174535a268677ae8d9 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Fri, 8 Aug 2025 18:06:32 +0100 Subject: [PATCH 112/260] chore(coderd/provisionerdserver): avoid fk error on invalid ai_task_sidebar_app_id (#19253) This is a workaround for https://github.com/coder/coder/issues/18776 We avoid the foreign key issue by checking the previously inserted workspace applications before calling UpdateWorkspaceAITask. Now, affected workspaces will show as "not running an AI task" on the single task view, which is technically correct. We also insert a provisioner job log at WARN level to ensure that the user sees some information that they have run into this issue, as well as logging on the server side. Longer term, we plan to modify how the workspace tasks view is presented. This is a stopgap measure until we solidify that plan. NOTE: this does **not** address the fact that stopping a workspace with `has_ai_task: true` will result in the completed stop build no longer having `has_ai_task: true`, resulting in tasks "disappearing" on stop. --- .../provisionerdserver/provisionerdserver.go | 67 ++++++++++++++++--- .../provisionerdserver_test.go | 16 +++++ 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index d1b03cbd68a27..1ff6e0f2bb306 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -1925,12 +1925,16 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro return xerrors.Errorf("update workspace build deadline: %w", err) } + appIDs := make([]string, 0) agentTimeouts := make(map[time.Duration]bool) // A set of agent timeouts. // This could be a bulk insert to improve performance. for _, protoResource := range jobType.WorkspaceBuild.Resources { for _, protoAgent := range protoResource.Agents { dur := time.Duration(protoAgent.GetConnectionTimeoutSeconds()) * time.Second agentTimeouts[dur] = true + for _, app := range protoAgent.GetApps() { + appIDs = append(appIDs, app.GetId()) + } } err = InsertWorkspaceResource(ctx, db, job.ID, workspaceBuild.Transition, protoResource, telemetrySnapshot) @@ -1945,14 +1949,21 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro } var sidebarAppID uuid.NullUUID - hasAITask := len(jobType.WorkspaceBuild.AiTasks) == 1 - if hasAITask { - task := jobType.WorkspaceBuild.AiTasks[0] - if task.SidebarApp == nil { - return xerrors.Errorf("update ai task: sidebar app is nil") + var hasAITask bool + var warnUnknownSidebarAppID bool + if tasks := jobType.WorkspaceBuild.GetAiTasks(); len(tasks) > 0 { + hasAITask = true + task := tasks[0] + if task == nil || task.GetSidebarApp() == nil || len(task.GetSidebarApp().GetId()) == 0 { + return xerrors.Errorf("update ai task: sidebar app is nil or empty") + } + + sidebarTaskID := task.GetSidebarApp().GetId() + if !slices.Contains(appIDs, sidebarTaskID) { + warnUnknownSidebarAppID = true } - id, err := uuid.Parse(task.SidebarApp.Id) + id, err := uuid.Parse(task.GetSidebarApp().GetId()) if err != nil { return xerrors.Errorf("parse sidebar app id: %w", err) } @@ -1960,9 +1971,48 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro sidebarAppID = uuid.NullUUID{UUID: id, Valid: true} } + if warnUnknownSidebarAppID { + // Ref: https://github.com/coder/coder/issues/18776 + // This can happen for a number of reasons: + // 1. Misconfigured template + // 2. Count=0 on the agent due to stop transition, meaning the associated coder_app was not inserted. + // Failing the build at this point is not ideal, so log a warning instead. + s.Logger.Warn(ctx, "unknown ai_task_sidebar_app_id", + slog.F("ai_task_sidebar_app_id", sidebarAppID.UUID.String()), + slog.F("job_id", job.ID.String()), + slog.F("workspace_id", workspace.ID), + slog.F("workspace_build_id", workspaceBuild.ID), + slog.F("transition", string(workspaceBuild.Transition)), + ) + // In order to surface this to the user, we will also insert a warning into the build logs. + if _, err := db.InsertProvisionerJobLogs(ctx, database.InsertProvisionerJobLogsParams{ + JobID: jobID, + CreatedAt: []time.Time{now, now, now, now}, + Source: []database.LogSource{database.LogSourceProvisionerDaemon, database.LogSourceProvisionerDaemon, database.LogSourceProvisionerDaemon, database.LogSourceProvisionerDaemon}, + Level: []database.LogLevel{database.LogLevelWarn, database.LogLevelWarn, database.LogLevelWarn, database.LogLevelWarn}, + Stage: []string{"Cleaning Up", "Cleaning Up", "Cleaning Up", "Cleaning Up"}, + Output: []string{ + fmt.Sprintf("Unknown ai_task_sidebar_app_id %q. This workspace will be unable to run AI tasks. This may be due to a template configuration issue, please check with the template author.", sidebarAppID.UUID.String()), + "Template author: double-check the following:", + " - You have associated the coder_ai_task with a valid coder_app in your template (ref: https://registry.terraform.io/providers/coder/coder/latest/docs/resources/ai_task).", + " - You have associated the coder_agent with at least one other compute resource. Agents with no other associated resources are not inserted into the database.", + }, + }); err != nil { + s.Logger.Error(ctx, "insert provisioner job log for ai task sidebar app id warning", + slog.F("job_id", jobID), + slog.F("workspace_id", workspace.ID), + slog.F("workspace_build_id", workspaceBuild.ID), + slog.F("transition", string(workspaceBuild.Transition)), + ) + } + // Important: reset hasAITask and sidebarAppID so that we don't run into a fk constraint violation. + hasAITask = false + sidebarAppID = uuid.NullUUID{} + } + // Regardless of whether there is an AI task or not, update the field to indicate one way or the other since it // always defaults to nil. ONLY if has_ai_task=true MUST ai_task_sidebar_app_id be set. - err = db.UpdateWorkspaceBuildAITaskByID(ctx, database.UpdateWorkspaceBuildAITaskByIDParams{ + if err := db.UpdateWorkspaceBuildAITaskByID(ctx, database.UpdateWorkspaceBuildAITaskByIDParams{ ID: workspaceBuild.ID, HasAITask: sql.NullBool{ Bool: hasAITask, @@ -1970,8 +2020,7 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro }, SidebarAppID: sidebarAppID, UpdatedAt: now, - }) - if err != nil { + }); err != nil { return xerrors.Errorf("update workspace build ai tasks flag: %w", err) } diff --git a/coderd/provisionerdserver/provisionerdserver_test.go b/coderd/provisionerdserver/provisionerdserver_test.go index ec26a2b92000f..7fb351bf0c0da 100644 --- a/coderd/provisionerdserver/provisionerdserver_test.go +++ b/coderd/provisionerdserver/provisionerdserver_test.go @@ -2794,6 +2794,22 @@ func TestCompleteJob(t *testing.T) { }, expected: true, }, + // Checks regression for https://github.com/coder/coder/issues/18776 + { + name: "non-existing app", + input: &proto.CompletedJob_WorkspaceBuild{ + AiTasks: []*sdkproto.AITask{ + { + Id: uuid.NewString(), + SidebarApp: &sdkproto.AITaskSidebarApp{ + // Non-existing app ID would previously trigger a FK violation. + Id: uuid.NewString(), + }, + }, + }, + }, + expected: false, + }, } { t.Run(tc.name, func(t *testing.T) { t.Parallel() From ce935657f6cbb710ba6f26dcef476f12a9978ced Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Fri, 8 Aug 2025 13:46:24 -0500 Subject: [PATCH 113/260] test: start migrating dbauthz tests to mocked db (#19257) This PR adds a framework to move to a mocked db. And therefore massively speed up these tests. --- coderd/database/dbauthz/dbauthz_test.go | 28 +++++----- coderd/database/dbauthz/setup_test.go | 34 ++++++++++-- go.mod | 1 + go.sum | 2 + testutil/faker.go | 67 +++++++++++++++++++++++ testutil/faker_test.go | 71 +++++++++++++++++++++++++ 6 files changed, 186 insertions(+), 17 deletions(-) create mode 100644 testutil/faker.go create mode 100644 testutil/faker_test.go diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index 82b7b47c892b2..a55f9c37aa4f5 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -11,9 +11,11 @@ import ( "testing" "time" + "github.com/brianvoe/gofakeit/v7" "github.com/google/uuid" "github.com/sqlc-dev/pqtype" "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" "golang.org/x/xerrors" "cdr.dev/slog" @@ -22,6 +24,7 @@ import ( "github.com/coder/coder/v2/coderd/database/db2sdk" "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/database/dbgen" + "github.com/coder/coder/v2/coderd/database/dbmock" "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/coderd/database/dbtime" "github.com/coder/coder/v2/coderd/notifications" @@ -204,14 +207,15 @@ func defaultIPAddress() pqtype.Inet { } func (s *MethodTestSuite) TestAPIKey() { - s.Run("DeleteAPIKeyByID", s.Subtest(func(db database.Store, check *expects) { - dbtestutil.DisableForeignKeysAndTriggers(s.T(), db) - key, _ := dbgen.APIKey(s.T(), db, database.APIKey{}) + s.Run("DeleteAPIKeyByID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) { + key := testutil.Fake(s.T(), faker, database.APIKey{}) + dbm.EXPECT().GetAPIKeyByID(gomock.Any(), key.ID).Return(key, nil).AnyTimes() + dbm.EXPECT().DeleteAPIKeyByID(gomock.Any(), key.ID).Return(nil).AnyTimes() check.Args(key.ID).Asserts(key, policy.ActionDelete).Returns() })) - s.Run("GetAPIKeyByID", s.Subtest(func(db database.Store, check *expects) { - dbtestutil.DisableForeignKeysAndTriggers(s.T(), db) - key, _ := dbgen.APIKey(s.T(), db, database.APIKey{}) + s.Run("GetAPIKeyByID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) { + key := testutil.Fake(s.T(), faker, database.APIKey{}) + dbm.EXPECT().GetAPIKeyByID(gomock.Any(), key.ID).Return(key, nil).AnyTimes() check.Args(key.ID).Asserts(key, policy.ActionRead).Returns(key) })) s.Run("GetAPIKeyByName", s.Subtest(func(db database.Store, check *expects) { @@ -234,14 +238,12 @@ func (s *MethodTestSuite) TestAPIKey() { Asserts(a, policy.ActionRead, b, policy.ActionRead). Returns(slice.New(a, b)) })) - s.Run("GetAPIKeysByUserID", s.Subtest(func(db database.Store, check *expects) { - u1 := dbgen.User(s.T(), db, database.User{}) - u2 := dbgen.User(s.T(), db, database.User{}) - - keyA, _ := dbgen.APIKey(s.T(), db, database.APIKey{UserID: u1.ID, LoginType: database.LoginTypeToken, TokenName: "key-a"}) - keyB, _ := dbgen.APIKey(s.T(), db, database.APIKey{UserID: u1.ID, LoginType: database.LoginTypeToken, TokenName: "key-b"}) - _, _ = dbgen.APIKey(s.T(), db, database.APIKey{UserID: u2.ID, LoginType: database.LoginTypeToken}) + s.Run("GetAPIKeysByUserID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) { + u1 := testutil.Fake(s.T(), faker, database.User{}) + keyA := testutil.Fake(s.T(), faker, database.APIKey{UserID: u1.ID, LoginType: database.LoginTypeToken, TokenName: "key-a"}) + keyB := testutil.Fake(s.T(), faker, database.APIKey{UserID: u1.ID, LoginType: database.LoginTypeToken, TokenName: "key-b"}) + dbm.EXPECT().GetAPIKeysByUserID(gomock.Any(), gomock.Any()).Return(slice.New(keyA, keyB), nil).AnyTimes() check.Args(database.GetAPIKeysByUserIDParams{LoginType: database.LoginTypeToken, UserID: u1.ID}). Asserts(keyA, policy.ActionRead, keyB, policy.ActionRead). Returns(slice.New(keyA, keyB)) diff --git a/coderd/database/dbauthz/setup_test.go b/coderd/database/dbauthz/setup_test.go index 3fc4b06b7f69d..c9a1b2063d691 100644 --- a/coderd/database/dbauthz/setup_test.go +++ b/coderd/database/dbauthz/setup_test.go @@ -10,6 +10,7 @@ import ( "strings" "testing" + "github.com/brianvoe/gofakeit/v7" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -20,7 +21,6 @@ import ( "golang.org/x/xerrors" "cdr.dev/slog" - "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" @@ -28,6 +28,7 @@ import ( "github.com/coder/coder/v2/coderd/database/dbmock" "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/coderd/rbac" + "github.com/coder/coder/v2/coderd/rbac/policy" "github.com/coder/coder/v2/coderd/rbac/regosql" "github.com/coder/coder/v2/coderd/util/slice" ) @@ -105,11 +106,37 @@ func (s *MethodTestSuite) TearDownSuite() { var testActorID = uuid.New() -// Subtest is a helper function that returns a function that can be passed to +// Mocked runs a subtest with a mocked database. Removing the overhead of a real +// postgres database resulting in much faster tests. +func (s *MethodTestSuite) Mocked(testCaseF func(dmb *dbmock.MockStore, faker *gofakeit.Faker, check *expects)) func() { + t := s.T() + mDB := dbmock.NewMockStore(gomock.NewController(t)) + mDB.EXPECT().Wrappers().Return([]string{}).AnyTimes() + + // Use a constant seed to prevent flakes from random data generation. + faker := gofakeit.New(0) + + // The usual Subtest assumes the test setup will use a real database to populate + // with data. In this mocked case, we want to pass the underlying mocked database + // to the test case instead. + return s.SubtestWithDB(mDB, func(_ database.Store, check *expects) { + testCaseF(mDB, faker, check) + }) +} + +// Subtest starts up a real postgres database for each test case. +// Deprecated: Use 'Mocked' instead for much faster tests. +func (s *MethodTestSuite) Subtest(testCaseF func(db database.Store, check *expects)) func() { + t := s.T() + db, _ := dbtestutil.NewDB(t) + return s.SubtestWithDB(db, testCaseF) +} + +// SubtestWithDB is a helper function that returns a function that can be passed to // s.Run(). This function will run the test case for the method that is being // tested. The check parameter is used to assert the results of the method. // If the caller does not use the `check` parameter, the test will fail. -func (s *MethodTestSuite) Subtest(testCaseF func(db database.Store, check *expects)) func() { +func (s *MethodTestSuite) SubtestWithDB(db database.Store, testCaseF func(db database.Store, check *expects)) func() { return func() { t := s.T() testName := s.T().Name() @@ -117,7 +144,6 @@ func (s *MethodTestSuite) Subtest(testCaseF func(db database.Store, check *expec methodName := names[len(names)-1] s.methodAccounting[methodName]++ - db, _ := dbtestutil.NewDB(t) fakeAuthorizer := &coderdtest.FakeAuthorizer{} rec := &coderdtest.RecordingAuthorizer{ Wrapped: fakeAuthorizer, diff --git a/go.mod b/go.mod index 19fbcff8f9a1c..7a88c2dafce14 100644 --- a/go.mod +++ b/go.mod @@ -477,6 +477,7 @@ require ( ) require ( + github.com/brianvoe/gofakeit/v7 v7.3.0 github.com/coder/agentapi-sdk-go v0.0.0-20250505131810-560d1d88d225 github.com/coder/aisdk-go v0.0.9 github.com/coder/preview v1.0.3 diff --git a/go.sum b/go.sum index d86aeff72cac0..82e72848bec46 100644 --- a/go.sum +++ b/go.sum @@ -830,6 +830,8 @@ github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bramvdbogaerde/go-scp v1.5.0 h1:a9BinAjTfQh273eh7vd3qUgmBC+bx+3TRDtkZWmIpzM= github.com/bramvdbogaerde/go-scp v1.5.0/go.mod h1:on2aH5AxaFb2G0N5Vsdy6B0Ml7k9HuHSwfo1y0QzAbQ= +github.com/brianvoe/gofakeit/v7 v7.3.0 h1:TWStf7/lLpAjKw+bqwzeORo9jvrxToWEwp9b1J2vApQ= +github.com/brianvoe/gofakeit/v7 v7.3.0/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA= diff --git a/testutil/faker.go b/testutil/faker.go new file mode 100644 index 0000000000000..a984e2aa58223 --- /dev/null +++ b/testutil/faker.go @@ -0,0 +1,67 @@ +package testutil + +import ( + "reflect" + "testing" + + "github.com/brianvoe/gofakeit/v7" + "github.com/stretchr/testify/require" +) + +// Fake will populate any zero fields in the provided struct with fake data. +// Non-zero fields will remain unchanged. +// Usage: +// +// key := Fake(t, faker, database.APIKey{ +// TokenName: "keep-my-name", +// }) +func Fake[T any](t *testing.T, faker *gofakeit.Faker, seed T) T { + t.Helper() + + var tmp T + err := faker.Struct(&tmp) + require.NoError(t, err, "failed to generate fake data for type %T", tmp) + + mergeZero(&seed, tmp) + return seed +} + +// mergeZero merges the fields of src into dst, but only if the field in dst is +// currently the zero value. +// Make sure `dst` is a pointer to a struct, otherwise the fields are not assignable. +func mergeZero(dst any, src any) { + srcv := reflect.ValueOf(src) + if srcv.Kind() == reflect.Ptr { + srcv = srcv.Elem() + } + remain := [][2]reflect.Value{ + {reflect.ValueOf(dst).Elem(), srcv}, + } + + // Traverse the struct fields and set them only if they are currently zero. + // This is a breadth-first traversal of the struct fields. Struct definitions + // Should not be that deep, so we should not hit any stack overflow issues. + for { + if len(remain) == 0 { + return + } + dv, sv := remain[0][0], remain[0][1] + remain = remain[1:] // + for i := 0; i < dv.NumField(); i++ { + df := dv.Field(i) + sf := sv.Field(i) + if !df.CanSet() { + continue + } + if df.IsZero() { // only write if currently zero + df.Set(sf) + continue + } + + if dv.Field(i).Kind() == reflect.Struct { + // If the field is a struct, we need to traverse it as well. + remain = append(remain, [2]reflect.Value{df, sf}) + } + } + } +} diff --git a/testutil/faker_test.go b/testutil/faker_test.go new file mode 100644 index 0000000000000..b4a2dd53ca343 --- /dev/null +++ b/testutil/faker_test.go @@ -0,0 +1,71 @@ +package testutil_test + +import ( + "testing" + + "github.com/brianvoe/gofakeit/v7" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/testutil" +) + +type simpleStruct struct { + ID uuid.UUID + Name string + Description string + Age int `fake:"{number:18,60}"` +} + +type nestedStruct struct { + Person simpleStruct + Address string +} + +func TestFake(t *testing.T) { + t.Parallel() + + t.Run("Simple", func(t *testing.T) { + t.Parallel() + + faker := gofakeit.New(0) + person := testutil.Fake(t, faker, simpleStruct{ + Name: "alice", + }) + require.Equal(t, "alice", person.Name) + require.NotEqual(t, uuid.Nil, person.ID) + require.NotEmpty(t, person.Description) + require.Greater(t, person.Age, 17, "Age should be greater than 17") + require.Less(t, person.Age, 61, "Age should be less than 61") + }) + + t.Run("Nested", func(t *testing.T) { + t.Parallel() + + faker := gofakeit.New(0) + person := testutil.Fake(t, faker, nestedStruct{ + Person: simpleStruct{ + Name: "alice", + }, + }) + require.Equal(t, "alice", person.Person.Name) + require.NotEqual(t, uuid.Nil, person.Person.ID) + require.NotEmpty(t, person.Person.Description) + require.Greater(t, person.Person.Age, 17, "Age should be greater than 17") + require.NotEmpty(t, person.Address) + }) + + t.Run("DatabaseType", func(t *testing.T) { + t.Parallel() + + faker := gofakeit.New(0) + id := uuid.New() + key := testutil.Fake(t, faker, database.APIKey{ + UserID: id, + TokenName: "keep-my-name", + }) + require.Equal(t, id, key.UserID) + require.NotEmpty(t, key.TokenName) + }) +} From 4f1db8b86637ef047f0c708e85133b8ff871670e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Fri, 8 Aug 2025 14:36:27 -0600 Subject: [PATCH 114/260] chore: upgrade to storybook 9 (#18983) --- site/.storybook/main.js | 10 +- site/.storybook/preview.jsx | 4 +- site/e2e/setup/addUsersAndLicense.spec.ts | 2 +- site/package.json | 26 +- site/pnpm-lock.yaml | 1042 +++++------------ site/src/@types/storybook.d.ts | 2 +- site/src/App.tsx | 2 +- site/src/components/Abbr/Abbr.stories.tsx | 2 +- .../ActiveUserChart.stories.tsx | 2 +- site/src/components/Alert/Alert.stories.tsx | 2 +- .../components/Alert/ErrorAlert.stories.tsx | 2 +- site/src/components/Avatar/Avatar.stories.tsx | 2 +- .../components/Avatar/AvatarCard.stories.tsx | 2 +- .../components/Avatar/AvatarData.stories.tsx | 2 +- .../Avatar/AvatarDataSkeleton.stories.tsx | 2 +- site/src/components/Badge/Badge.stories.tsx | 2 +- site/src/components/Badges/Badges.stories.tsx | 2 +- .../Breadcrumb/Breadcrumb.stories.tsx | 2 +- .../BuildIcon/BuildIcon.stories.tsx | 2 +- site/src/components/Button/Button.stories.tsx | 2 +- site/src/components/Chart/Chart.stories.tsx | 2 +- .../components/Checkbox/Checkbox.stories.tsx | 2 +- .../CodeExample/CodeExample.stories.tsx | 2 +- .../Collapsible/Collapsible.stories.tsx | 2 +- .../CollapsibleSummary.stories.tsx | 2 +- .../components/Combobox/Combobox.stories.tsx | 8 +- .../Conditionals/ChooseOne.stories.tsx | 2 +- .../CopyButton/CopyButton.stories.tsx | 2 +- .../CopyableValue/CopyableValue.stories.tsx | 2 +- site/src/components/Dialog/Dialog.stories.tsx | 4 +- .../ConfirmDialog/ConfirmDialog.stories.tsx | 4 +- .../DeleteDialog/DeleteDialog.stories.tsx | 6 +- .../DropdownArrow/DropdownArrow.stories.tsx | 2 +- .../DropdownMenu/DropdownMenu.stories.tsx | 4 +- .../DurationField/DurationField.stories.tsx | 4 +- .../EmptyState/EmptyState.stories.tsx | 2 +- .../GlobalErrorBoundary.stories.tsx | 6 +- .../ErrorBoundary/GlobalErrorBoundary.tsx | 2 +- .../components/Expander/Expander.stories.tsx | 2 +- .../FeatureStageBadge.stories.tsx | 2 +- .../FileUpload/FileUpload.stories.tsx | 2 +- site/src/components/Filter/Filter.tsx | 2 +- .../Filter/SelectFilter.stories.tsx | 6 +- site/src/components/Filter/storyHelpers.ts | 2 +- site/src/components/Form/Form.stories.tsx | 2 +- .../FullPageForm/FullPageForm.stories.tsx | 2 +- .../src/components/FullPageLayout/Sidebar.tsx | 2 +- .../EnterpriseSnackbar.stories.tsx | 2 +- .../HelpTooltip/HelpTooltip.stories.tsx | 2 +- .../IconField/IconField.stories.tsx | 4 +- .../InfoTooltip/InfoTooltip.stories.tsx | 4 +- site/src/components/Input/Input.stories.tsx | 2 +- .../InputGroup/InputGroup.stories.tsx | 2 +- site/src/components/Label/Label.stories.tsx | 2 +- .../components/LastSeen/LastSeen.stories.tsx | 2 +- .../components/Latency/Latency.stories.tsx | 2 +- site/src/components/Link/Link.stories.tsx | 2 +- site/src/components/Loader/Loader.stories.tsx | 2 +- site/src/components/Logs/LogLine.stories.tsx | 2 +- site/src/components/Logs/Logs.stories.tsx | 2 +- .../components/Margins/Margins.stories.tsx | 2 +- .../components/Markdown/Markdown.stories.tsx | 2 +- .../MultiSelectCombobox.stories.tsx | 4 +- .../OrganizationAutocomplete.stories.tsx | 6 +- .../OverflowY/OverflowY.stories.tsx | 2 +- .../PageHeader/PageHeader.stories.tsx | 2 +- .../PaginationContainer.stories.tsx | 2 +- .../PaginationWidgetBase.stories.tsx | 2 +- .../PasswordField/PasswordField.stories.tsx | 4 +- .../components/Paywall/Paywall.stories.tsx | 2 +- .../Paywall/PopoverPaywall.stories.tsx | 2 +- site/src/components/Pill/Pill.stories.tsx | 2 +- .../components/Popover/Popover.stories.tsx | 4 +- .../RadioGroup/RadioGroup.stories.tsx | 2 +- .../RichParameterInput.stories.tsx | 2 +- site/src/components/Search/Search.stories.tsx | 2 +- .../SearchField/SearchField.stories.tsx | 4 +- site/src/components/Select/Select.stories.tsx | 2 +- .../SelectMenu/SelectMenu.stories.tsx | 6 +- .../SettingsHeader/SettingsHeader.stories.tsx | 2 +- .../components/Sidebar/Sidebar.stories.tsx | 2 +- site/src/components/Sidebar/Sidebar.tsx | 2 +- site/src/components/Slider/Slider.stories.tsx | 2 +- .../components/Spinner/Spinner.stories.tsx | 2 +- site/src/components/Stack/Stack.stories.tsx | 2 +- .../StatusIndicator.stories.tsx | 2 +- site/src/components/Switch/Switch.stories.tsx | 2 +- site/src/components/Table/Table.stories.tsx | 2 +- .../TableEmpty/TableEmpty.stories.tsx | 2 +- .../TableLoader/TableLoader.stories.tsx | 2 +- .../TableToolbar/TableToolbar.stories.tsx | 2 +- site/src/components/Tabs/Tabs.stories.tsx | 2 +- site/src/components/Tabs/Tabs.tsx | 2 +- .../components/TagInput/TagInput.stories.tsx | 2 +- .../components/Textarea/Textarea.stories.tsx | 4 +- .../components/Tooltip/Tooltip.stories.tsx | 2 +- .../MemberAutocomplete.stories.tsx | 2 +- .../UserAutocomplete.stories.tsx | 2 +- .../components/Welcome/Welcome.stories.tsx | 2 +- .../deprecated/Popover/Popover.stories.tsx | 4 +- site/src/contexts/auth/RequireAuth.tsx | 2 +- site/src/hooks/usePaginatedQuery.ts | 2 +- site/src/hooks/usePagination.ts | 2 +- site/src/hooks/useSearchParamsKey.ts | 2 +- .../BuildAvatar/BuildAvatar.stories.tsx | 2 +- .../AnnouncementBannerView.stories.tsx | 2 +- .../src/modules/dashboard/DashboardLayout.tsx | 2 +- .../DeploymentBanner/DeploymentBanner.tsx | 2 +- .../DeploymentBannerView.stories.tsx | 2 +- .../DeploymentBanner/DeploymentBannerView.tsx | 2 +- .../LicenseBannerView.stories.tsx | 2 +- .../dashboard/Navbar/DeploymentDropdown.tsx | 2 +- .../dashboard/Navbar/MobileMenu.stories.tsx | 8 +- .../modules/dashboard/Navbar/MobileMenu.tsx | 2 +- .../dashboard/Navbar/NavbarView.stories.tsx | 4 +- .../modules/dashboard/Navbar/NavbarView.tsx | 2 +- .../dashboard/Navbar/ProxyMenu.stories.tsx | 4 +- .../modules/dashboard/Navbar/ProxyMenu.tsx | 2 +- .../UserDropdown/UserDropdown.stories.tsx | 4 +- .../UserDropdown/UserDropdownContent.tsx | 2 +- .../management/DeploymentConfigProvider.tsx | 2 +- .../management/DeploymentSettingsLayout.tsx | 2 +- .../DeploymentSidebarView.stories.tsx | 2 +- .../management/OrganizationSettingsLayout.tsx | 2 +- .../management/OrganizationSidebarLayout.tsx | 2 +- .../OrganizationSidebarView.stories.tsx | 4 +- .../management/OrganizationSidebarView.tsx | 2 +- .../InboxAvatar.stories.tsx | 2 +- .../InboxButton.stories.tsx | 2 +- .../NotificationsInbox/InboxItem.stories.tsx | 4 +- .../NotificationsInbox/InboxItem.tsx | 2 +- .../InboxPopover.stories.tsx | 4 +- .../NotificationsInbox/InboxPopover.tsx | 2 +- .../NotificationsInbox.stories.tsx | 4 +- .../UnreadBadge.stories.tsx | 2 +- .../JobStatusIndicator.stories.tsx | 2 +- .../provisioners/ProvisionerAlert.stories.tsx | 2 +- .../ProvisionerStatusAlert.stories.tsx | 2 +- .../provisioners/ProvisionerTags.stories.tsx | 2 +- .../ProvisionerTagsField.stories.tsx | 4 +- .../AgentDevcontainerCard.stories.tsx | 2 +- .../resources/AgentLogs/AgentLogs.stories.tsx | 2 +- .../resources/AgentMetadata.stories.tsx | 2 +- .../modules/resources/AgentRow.stories.tsx | 4 +- .../resources/AgentRowPreview.stories.tsx | 2 +- .../resources/AppLink/AppLink.stories.tsx | 2 +- .../DownloadAgentLogsButton.stories.tsx | 4 +- .../resources/PortForwardButton.stories.tsx | 4 +- .../PortForwardPopoverView.stories.tsx | 4 +- .../resources/ResourceAvatar.stories.tsx | 2 +- .../resources/ResourceCard.stories.tsx | 2 +- .../modules/resources/Resources.stories.tsx | 2 +- .../resources/SSHButton/SSHButton.stories.tsx | 4 +- .../TerminalLink/TerminalLink.stories.tsx | 2 +- .../VSCodeDesktopButton.stories.tsx | 2 +- .../VSCodeDevContainerButton.stories.tsx | 2 +- .../TemplateExampleCard.stories.tsx | 2 +- .../TemplateExampleCard.tsx | 2 +- .../TemplateFileTree.stories.tsx | 2 +- .../TemplateFiles/TemplateFiles.stories.tsx | 2 +- .../templates/TemplateFiles/TemplateFiles.tsx | 2 +- .../TemplateResourcesTable.stories.tsx | 2 +- .../TemplateUpdateMessage.stories.tsx | 2 +- .../DynamicParameter.stories.tsx | 2 +- .../EphemeralParametersDialog.tsx | 2 +- .../ErrorDialog/WorkspaceErrorDialog.tsx | 2 +- .../WorkspaceAppStatus.stories.tsx | 2 +- .../WorkspaceBuildData.stories.tsx | 2 +- .../WorkspaceBuildLogs.stories.tsx | 2 +- .../WorkspaceDormantBadge.stories.tsx | 4 +- .../ChangeWorkspaceVersionDialog.stories.tsx | 2 +- .../DownloadLogsDialog.stories.tsx | 4 +- ...pdateBuildParametersDialogExperimental.tsx | 2 +- .../WorkspaceDeleteDialog.stories.tsx | 2 +- .../WorkspaceMoreActions.tsx | 4 +- .../useWorkspaceDuplication.ts | 2 +- .../WorkspaceOutdatedTooltip.stories.tsx | 4 +- .../WorkspaceStatusIndicator.stories.tsx | 2 +- .../WorkspaceTiming/Chart/Tooltip.tsx | 2 +- .../WorkspaceTimings.stories.tsx | 4 +- site/src/pages/404Page/404Page.stories.tsx | 2 +- .../AuditLogDescription.stories.tsx | 2 +- .../AuditLogDescription.tsx | 2 +- .../BuildAuditDescription.tsx | 2 +- .../AuditLogRow/AuditLogRow.stories.tsx | 2 +- .../AuditPage/AuditLogRow/AuditLogRow.tsx | 2 +- site/src/pages/AuditPage/AuditPage.tsx | 2 +- .../pages/AuditPage/AuditPageView.stories.tsx | 2 +- .../CliAuthPage/CliAuthPageView.stories.tsx | 2 +- .../src/pages/CliAuthPage/CliAuthPageView.tsx | 2 +- .../CliInstallPageView.stories.tsx | 2 +- .../CliInstallPage/CliInstallPageView.tsx | 2 +- .../ConnectionLogPage/ConnectionLogPage.tsx | 2 +- .../ConnectionLogPageView.stories.tsx | 2 +- .../ConnectionLogDescription.stories.tsx | 2 +- .../ConnectionLogDescription.tsx | 2 +- .../ConnectionLogRow.stories.tsx | 2 +- .../ConnectionLogRow/ConnectionLogRow.tsx | 2 +- .../CreateTemplateGalleryPage.test.tsx | 2 +- .../CreateTemplateGalleryPageView.stories.tsx | 2 +- .../CreateTemplateGalleryPageView.tsx | 2 +- .../StarterTemplates.tsx | 2 +- .../BuildLogsDrawer.stories.tsx | 2 +- .../CreateTemplateForm.stories.tsx | 6 +- .../CreateTemplatePage/CreateTemplateForm.tsx | 2 +- .../CreateTemplatePage/CreateTemplatePage.tsx | 2 +- .../DuplicateTemplateView.tsx | 2 +- .../ImportStarterTemplateView.tsx | 2 +- .../CreateTemplatePage/TemplateUpload.tsx | 2 +- .../CreateTemplatePage/UploadTemplateView.tsx | 2 +- .../pages/CreateTokenPage/CreateTokenForm.tsx | 2 +- .../CreateTokenPage.stories.tsx | 2 +- .../pages/CreateTokenPage/CreateTokenPage.tsx | 2 +- .../CreateUserPage/CreateUserForm.stories.tsx | 6 +- .../pages/CreateUserPage/CreateUserPage.tsx | 2 +- .../CreateWorkspaceExperimentRouter.tsx | 2 +- .../CreateWorkspacePage.tsx | 2 +- .../CreateWorkspacePageExperimental.tsx | 2 +- .../CreateWorkspacePageView.stories.tsx | 6 +- .../CreateWorkspacePageView.tsx | 2 +- ...eWorkspacePageViewExperimental.stories.tsx | 2 +- .../CreateWorkspacePageViewExperimental.tsx | 2 +- .../ExternalAuthButton.stories.tsx | 2 +- .../SelectedTemplate.stories.tsx | 2 +- .../AnnouncementBannerDialog.stories.tsx | 4 +- .../AppearanceSettingsPageView.stories.tsx | 2 +- .../ExternalAuthSettingsPageView.stories.tsx | 2 +- .../ExportPolicyButton.stories.tsx | 4 +- .../IdpOrgSyncPageView.stories.tsx | 4 +- .../AddNewLicensePage.tsx | 2 +- .../AddNewLicensePageView.tsx | 2 +- .../LicenseSeatConsumptionChart.stories.tsx | 2 +- .../LicenseSeatConsumptionChart.tsx | 2 +- .../LicensesSettingsPage.tsx | 2 +- .../LicensesSettingsPageView.tsx | 2 +- .../ManagedAgentsConsumption.stories.tsx | 2 +- .../NetworkSettingsPageView.stories.tsx | 2 +- .../NotificationEvents.stories.tsx | 4 +- .../NotificationsPage.stories.tsx | 4 +- .../Troubleshooting.stories.tsx | 4 +- .../NotificationsPage/storybookUtils.ts | 2 +- .../CreateOAuth2AppPage.tsx | 2 +- .../CreateOAuth2AppPageView.stories.tsx | 2 +- .../CreateOAuth2AppPageView.tsx | 2 +- .../EditOAuth2AppPage.tsx | 2 +- .../EditOAuth2AppPageView.stories.tsx | 2 +- .../EditOAuth2AppPageView.tsx | 2 +- .../OAuth2AppsSettingsPageView.stories.tsx | 2 +- .../OAuth2AppsSettingsPageView.tsx | 2 +- .../ObservabilitySettingsPageView.stories.tsx | 2 +- .../OverviewPage/OverviewPageView.stories.tsx | 2 +- .../UserEngagementChart.stories.tsx | 2 +- .../OverviewPage/UserEngagementChart.tsx | 2 +- .../SecuritySettingsPageView.stories.tsx | 2 +- .../UserAuthSettingsPageView.stories.tsx | 2 +- .../ExternalAuthPage/ExternalAuthPage.tsx | 2 +- .../ExternalAuthPageView.stories.tsx | 242 ++-- .../ExternalAuthPage/ExternalAuthPageView.tsx | 2 +- site/src/pages/GroupsPage/CreateGroupPage.tsx | 2 +- .../CreateGroupPageView.stories.tsx | 4 +- .../pages/GroupsPage/CreateGroupPageView.tsx | 2 +- .../pages/GroupsPage/GroupPage.stories.tsx | 4 +- site/src/pages/GroupsPage/GroupPage.tsx | 2 +- .../pages/GroupsPage/GroupSettingsPage.tsx | 2 +- .../GroupSettingsPageView.stories.tsx | 4 +- site/src/pages/GroupsPage/GroupsPage.tsx | 2 +- .../pages/GroupsPage/GroupsPageProvider.tsx | 2 +- .../GroupsPage/GroupsPageView.stories.tsx | 2 +- site/src/pages/GroupsPage/GroupsPageView.tsx | 2 +- .../HealthPage/AccessURLPage.stories.tsx | 2 +- site/src/pages/HealthPage/AccessURLPage.tsx | 2 +- .../src/pages/HealthPage/DERPPage.stories.tsx | 2 +- site/src/pages/HealthPage/DERPPage.tsx | 2 +- .../HealthPage/DERPRegionPage.stories.tsx | 2 +- site/src/pages/HealthPage/DERPRegionPage.tsx | 2 +- .../pages/HealthPage/DatabasePage.stories.tsx | 2 +- site/src/pages/HealthPage/DatabasePage.tsx | 2 +- site/src/pages/HealthPage/HealthLayout.tsx | 2 +- .../ProvisionerDaemonsPage.stories.tsx | 2 +- .../HealthPage/ProvisionerDaemonsPage.tsx | 2 +- .../HealthPage/WebsocketPage.stories.tsx | 2 +- site/src/pages/HealthPage/WebsocketPage.tsx | 2 +- .../HealthPage/WorkspaceProxyPage.stories.tsx | 2 +- .../pages/HealthPage/WorkspaceProxyPage.tsx | 2 +- site/src/pages/HealthPage/storybook.tsx | 2 +- .../src/pages/IconsPage/IconsPage.stories.tsx | 2 +- .../LoginOAuthDevicePage.tsx | 2 +- site/src/pages/LoginPage/LoginPage.test.tsx | 2 +- site/src/pages/LoginPage/LoginPage.tsx | 2 +- .../pages/LoginPage/LoginPageView.stories.tsx | 2 +- site/src/pages/LoginPage/LoginPageView.tsx | 2 +- .../pages/LoginPage/PasswordSignInForm.tsx | 2 +- .../pages/LoginPage/SignInForm.stories.tsx | 2 +- .../CreateOrganizationPage.tsx | 2 +- .../CreateOrganizationPageView.stories.tsx | 2 +- .../CreateOrganizationPageView.tsx | 4 +- .../CustomRolesPage/CreateEditRolePage.tsx | 2 +- .../CreateEditRolePageView.stories.tsx | 4 +- .../CreateEditRolePageView.tsx | 2 +- .../CustomRolesPage/CustomRolesPage.tsx | 2 +- .../CustomRolesPageView.stories.tsx | 2 +- .../CustomRolesPage/CustomRolesPageView.tsx | 2 +- .../PermissionPillsList.stories.tsx | 4 +- .../ExportPolicyButton.stories.tsx | 4 +- .../IdpSyncPage/IdpSyncPage.tsx | 2 +- .../IdpSyncPage/IdpSyncPageView.stories.tsx | 4 +- .../OrganizationMembersPage.tsx | 2 +- .../OrganizationMembersPageView.stories.tsx | 2 +- .../CancelJobButton.stories.tsx | 4 +- .../CancelJobConfirmationDialog.stories.tsx | 4 +- .../JobRow.stories.tsx | 4 +- .../JobRow.tsx | 2 +- .../OrganizationProvisionerJobsPage.tsx | 2 +- ...izationProvisionerJobsPageView.stories.tsx | 4 +- .../OrganizationProvisionerKeysPage.tsx | 2 +- ...izationProvisionerKeysPageView.stories.tsx | 2 +- .../ProvisionerKeyRow.tsx | 2 +- .../LastConnectionHead.stories.tsx | 4 +- .../OrganizationProvisionersPage.tsx | 2 +- ...ganizationProvisionersPageView.stories.tsx | 2 +- .../ProvisionerKey.stories.tsx | 4 +- .../ProvisionerRow.stories.tsx | 4 +- .../ProvisionerRow.tsx | 2 +- .../ProvisionerVersion.stories.tsx | 4 +- .../OrganizationRedirect.test.tsx | 4 +- .../OrganizationRedirect.tsx | 2 +- .../OrganizationSettingsPage.tsx | 2 +- .../OrganizationSettingsPageView.stories.tsx | 2 +- .../UserTable/EditRolesButton.stories.tsx | 4 +- .../ChangePasswordPage.stories.tsx | 4 +- .../ResetPasswordPage/ChangePasswordPage.tsx | 6 +- .../RequestOTPPage.stories.tsx | 4 +- .../ResetPasswordPage/RequestOTPPage.tsx | 2 +- site/src/pages/SetupPage/SetupPage.test.tsx | 6 +- site/src/pages/SetupPage/SetupPage.tsx | 15 +- .../pages/SetupPage/SetupPageView.stories.tsx | 2 +- .../StarterTemplatePage.tsx | 2 +- .../StarterTemplatePageView.stories.tsx | 2 +- .../StarterTemplatePageView.tsx | 2 +- site/src/pages/TaskPage/TaskAppIframe.tsx | 2 +- site/src/pages/TaskPage/TaskApps.stories.tsx | 2 +- site/src/pages/TaskPage/TaskApps.tsx | 2 +- site/src/pages/TaskPage/TaskPage.stories.tsx | 4 +- site/src/pages/TaskPage/TaskPage.tsx | 4 +- site/src/pages/TaskPage/TaskSidebar.tsx | 2 +- .../pages/TaskPage/TaskStatusLink.stories.tsx | 2 +- .../src/pages/TasksPage/TasksPage.stories.tsx | 4 +- site/src/pages/TasksPage/TasksPage.tsx | 2 +- .../TemplateEmbedExperimentRouter.tsx | 2 +- .../TemplateEmbedPageView.stories.tsx | 2 +- .../TemplateFilesPage.test.tsx | 2 +- .../TemplateFilesPage/TemplateFilesPage.tsx | 2 +- .../TemplateInsightsPage.stories.tsx | 2 +- .../TemplateInsightsPage.tsx | 2 +- .../src/pages/TemplatePage/TemplateLayout.tsx | 2 +- .../TemplatePageHeader.stories.tsx | 2 +- .../pages/TemplatePage/TemplatePageHeader.tsx | 2 +- .../TemplateRedirectController.tsx | 2 +- .../TemplateResourcesPageView.stories.tsx | 2 +- .../TemplateResourcesPageView.tsx | 2 +- .../TemplatePage/TemplateStats.stories.tsx | 2 +- site/src/pages/TemplatePage/TemplateStats.tsx | 2 +- .../TemplateVersionsPage/VersionRow.tsx | 2 +- .../VersionsTable.stories.tsx | 4 +- .../TemplateSettingsPage.tsx | 2 +- .../TemplateSettingsPageView.stories.tsx | 4 +- .../TemplatePermissionsPageView.stories.tsx | 2 +- .../ScheduleDialog.stories.tsx | 4 +- .../TemplateScheduleAutostart.stories.tsx | 4 +- .../TemplateSchedulePage.tsx | 2 +- .../TemplateSchedulePageView.stories.tsx | 4 +- .../TemplateSettingsLayout.tsx | 2 +- .../TemplateVariablesPage.tsx | 2 +- .../TemplateVariablesPageView.stories.tsx | 4 +- .../ProvisionerTagsPopover.stories.tsx | 4 +- .../TemplateVersionEditor.stories.tsx | 4 +- .../TemplateVersionEditor.tsx | 2 +- .../TemplateVersionEditorPage.test.tsx | 2 +- .../TemplateVersionEditorPage.tsx | 2 +- .../TemplateVersionPage.tsx | 2 +- .../TemplateVersionPageView.stories.tsx | 2 +- .../TemplateVersionPageView.tsx | 2 +- .../pages/TemplatesPage/EmptyTemplates.tsx | 2 +- .../src/pages/TemplatesPage/TemplatesPage.tsx | 2 +- .../TemplatesPageView.stories.tsx | 2 +- .../pages/TemplatesPage/TemplatesPageView.tsx | 2 +- .../TerminalPage/TerminalPage.stories.tsx | 2 +- site/src/pages/TerminalPage/TerminalPage.tsx | 2 +- .../AccountPage/AccountForm.stories.tsx | 2 +- .../AccountPage/AccountUserGroups.stories.tsx | 2 +- .../AppearancePage/AppearanceForm.stories.tsx | 4 +- .../ExternalAuthPageView.stories.tsx | 2 +- site/src/pages/UserSettingsPage/Layout.tsx | 2 +- .../NotificationsPage.stories.tsx | 4 +- .../NotificationsPage/NotificationsPage.tsx | 2 +- .../OAuth2ProviderPageView.stories.tsx | 2 +- .../SSHKeysPage/SSHKeysPageView.stories.tsx | 2 +- .../SchedulePage/ScheduleForm.stories.tsx | 4 +- .../SecurityPage/SecurityForm.stories.tsx | 2 +- .../SecurityPage/SecurityPageView.stories.tsx | 4 +- .../ConfirmDeleteDialog.stories.tsx | 2 +- .../TokensPage/TokensPage.tsx | 2 +- .../TokensPage/TokensPageView.stories.tsx | 2 +- .../WorkspaceProxyView.stories.tsx | 2 +- .../UsersPage/ResetPasswordDialog.stories.tsx | 2 +- .../src/pages/UsersPage/UsersPage.stories.tsx | 4 +- site/src/pages/UsersPage/UsersPage.tsx | 2 +- .../pages/UsersPage/UsersPageView.stories.tsx | 2 +- site/src/pages/UsersPage/UsersPageView.tsx | 2 +- .../UsersTable/UsersTable.stories.tsx | 2 +- .../WorkspaceBuildPage/WorkspaceBuildPage.tsx | 2 +- .../WorkspaceBuildPageView.stories.tsx | 2 +- .../WorkspaceBuildPageView.tsx | 2 +- .../WorkspacePage/AppStatuses.stories.tsx | 4 +- site/src/pages/WorkspacePage/AppStatuses.tsx | 2 +- .../ResourceMetadata.stories.tsx | 2 +- .../pages/WorkspacePage/Workspace.stories.tsx | 4 +- site/src/pages/WorkspacePage/Workspace.tsx | 2 +- .../BuildParametersPopover.tsx | 2 +- .../WorkspaceActions/DebugButton.stories.tsx | 4 +- .../WorkspaceActions/RetryButton.stories.tsx | 4 +- .../WorkspaceActions.stories.tsx | 4 +- .../WorkspaceBuildProgress.stories.tsx | 2 +- .../WorkspaceDeletedBanner.stories.tsx | 2 +- .../WorkspaceNotifications.stories.tsx | 4 +- .../WorkspacePage/WorkspacePage.test.tsx | 18 +- .../src/pages/WorkspacePage/WorkspacePage.tsx | 2 +- .../WorkspaceScheduleControls.tsx | 2 +- .../WorkspacePage/WorkspaceTopbar.stories.tsx | 4 +- .../pages/WorkspacePage/WorkspaceTopbar.tsx | 2 +- .../WorkspacePage/useResourcesNav.test.tsx | 2 +- .../WorkspaceParametersPage.stories.tsx | 4 +- .../WorkspaceParametersPage.tsx | 2 +- .../WorkspaceParametersPageExperimental.tsx | 2 +- .../WorkspaceScheduleForm.stories.tsx | 4 +- .../WorkspaceSchedulePage.stories.tsx | 2 +- .../WorkspaceSchedulePage.tsx | 2 +- .../WorkspaceSettingsLayout.tsx | 2 +- .../WorkspaceSettingsPage.tsx | 2 +- .../WorkspaceSettingsPageView.stories.tsx | 4 +- .../BatchDeleteConfirmation.stories.tsx | 4 +- .../BatchUpdateConfirmation.stories.tsx | 4 +- .../pages/WorkspacesPage/WorkspacesButton.tsx | 2 +- .../pages/WorkspacesPage/WorkspacesEmpty.tsx | 2 +- .../pages/WorkspacesPage/WorkspacesPage.tsx | 2 +- .../WorkspacesPageView.stories.tsx | 4 +- .../pages/WorkspacesPage/WorkspacesTable.tsx | 2 +- site/src/router.tsx | 2 +- site/src/testHelpers/hooks.tsx | 2 +- site/src/testHelpers/renderHelpers.tsx | 2 +- site/src/testHelpers/storybook.tsx | 2 +- site/src/utils/formUtils.stories.tsx | 4 +- site/src/utils/schedule.tsx | 2 +- 453 files changed, 999 insertions(+), 1474 deletions(-) diff --git a/site/.storybook/main.js b/site/.storybook/main.js index 0f3bf46e3a0b7..7a275f0ef90ee 100644 --- a/site/.storybook/main.js +++ b/site/.storybook/main.js @@ -5,17 +5,9 @@ module.exports = { addons: [ "@chromatic-com/storybook", - { - name: "@storybook/addon-essentials", - options: { - backgrounds: false, - }, - }, + "@storybook/addon-docs", "@storybook/addon-links", - "@storybook/addon-mdx-gfm", "@storybook/addon-themes", - "@storybook/addon-actions", - "@storybook/addon-interactions", "storybook-addon-remix-react-router", ], diff --git a/site/.storybook/preview.jsx b/site/.storybook/preview.jsx index 8d8a37ecd2fbf..f7a5407c457c1 100644 --- a/site/.storybook/preview.jsx +++ b/site/.storybook/preview.jsx @@ -9,8 +9,8 @@ * @typedef {import("react").PropsWithChildren} PropsWithChildren * @typedef {import("react").FC} FC * - * @typedef {import("@storybook/react").StoryContext} StoryContext - * @typedef {import("@storybook/react").Preview} Preview + * @typedef {import("@storybook/react-vite").StoryContext} StoryContext + * @typedef {import("@storybook/react-vite").Preview} Preview * * @typedef {(Story: FC, Context: StoryContext) => React.JSX.Element} Decorator A * Storybook decorator function used to inject baseline data dependencies into diff --git a/site/e2e/setup/addUsersAndLicense.spec.ts b/site/e2e/setup/addUsersAndLicense.spec.ts index 1e227438c2843..f59d081dfbc95 100644 --- a/site/e2e/setup/addUsersAndLicense.spec.ts +++ b/site/e2e/setup/addUsersAndLicense.spec.ts @@ -20,7 +20,7 @@ test("setup deployment", async ({ page }) => { await page.getByLabel(Language.passwordLabel).fill(users.owner.password); await page.getByTestId("create").click(); - await expectUrl(page).toHavePathName("/workspaces"); + await expectUrl(page).toHavePathName("/templates"); await page.getByTestId("button-select-template").isVisible(); for (const user of Object.values(users)) { diff --git a/site/package.json b/site/package.json index b05cd6a890562..534087e25b81f 100644 --- a/site/package.json +++ b/site/package.json @@ -14,7 +14,7 @@ "format": "biome format --write .", "format:check": "biome format .", "lint": "pnpm run lint:check && pnpm run lint:types && pnpm run lint:circular-deps && knip", - "lint:check": " biome lint --error-on-warnings .", + "lint:check": "biome lint --error-on-warnings .", "lint:circular-deps": "dpdm --no-tree --no-warning -T ./src/App.tsx", "lint:knip": "knip", "lint:fix": "biome lint --error-on-warnings --write . && knip --fix", @@ -103,7 +103,7 @@ "react-markdown": "9.0.3", "react-query": "npm:@tanstack/react-query@5.77.0", "react-resizable-panels": "3.0.3", - "react-router-dom": "6.26.2", + "react-router": "7.8.0", "react-syntax-highlighter": "15.6.1", "react-textarea-autosize": "8.5.9", "react-virtualized-auto-sizer": "1.0.24", @@ -125,19 +125,13 @@ }, "devDependencies": { "@biomejs/biome": "1.9.4", - "@chromatic-com/storybook": "3.2.2", + "@chromatic-com/storybook": "4.0.1", "@octokit/types": "12.3.0", "@playwright/test": "1.47.0", - "@storybook/addon-actions": "8.5.2", - "@storybook/addon-essentials": "8.4.6", - "@storybook/addon-interactions": "8.5.3", - "@storybook/addon-links": "8.5.2", - "@storybook/addon-mdx-gfm": "8.5.2", - "@storybook/addon-themes": "8.4.6", - "@storybook/preview-api": "8.5.3", - "@storybook/react": "8.4.6", - "@storybook/react-vite": "8.4.6", - "@storybook/test": "8.4.6", + "@storybook/addon-docs": "9.0.17", + "@storybook/addon-links": "9.0.17", + "@storybook/addon-themes": "9.0.17", + "@storybook/react-vite": "9.0.17", "@swc/core": "1.3.38", "@swc/jest": "0.2.37", "@tailwindcss/typography": "0.5.16", @@ -182,8 +176,8 @@ "rollup-plugin-visualizer": "5.14.0", "rxjs": "7.8.1", "ssh2": "1.16.0", - "storybook": "8.5.3", - "storybook-addon-remix-react-router": "3.1.0", + "storybook": "9.0.17", + "storybook-addon-remix-react-router": "5.0.0", "tailwindcss": "3.4.17", "ts-proto": "1.164.0", "typescript": "5.6.3", @@ -197,7 +191,7 @@ "semver": "7.6.2" }, "engines": { - "npm": ">=9.0.0 <10.0.0", + "pnpm": ">=9.0.0 <10.0.0", "node": ">=18.0.0 <21.0.0" }, "pnpm": { diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index 2039cc3e62bae..e815515146754 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -224,9 +224,9 @@ importers: react-resizable-panels: specifier: 3.0.3 version: 3.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-router-dom: - specifier: 6.26.2 - version: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router: + specifier: 7.8.0 + version: 7.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-syntax-highlighter: specifier: 15.6.1 version: 15.6.1(react@18.3.1) @@ -286,44 +286,26 @@ importers: specifier: 1.9.4 version: 1.9.4 '@chromatic-com/storybook': - specifier: 3.2.2 - version: 3.2.2(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)) + specifier: 4.0.1 + version: 4.0.1(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) '@octokit/types': specifier: 12.3.0 version: 12.3.0 '@playwright/test': specifier: 1.47.0 version: 1.47.0 - '@storybook/addon-actions': - specifier: 8.5.2 - version: 8.5.2(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-essentials': - specifier: 8.4.6 - version: 8.4.6(@types/react@18.3.12)(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-interactions': - specifier: 8.5.3 - version: 8.5.3(storybook@8.5.3(prettier@3.4.1)) + '@storybook/addon-docs': + specifier: 9.0.17 + version: 9.0.17(@types/react@18.3.12)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) '@storybook/addon-links': - specifier: 8.5.2 - version: 8.5.2(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-mdx-gfm': - specifier: 8.5.2 - version: 8.5.2(storybook@8.5.3(prettier@3.4.1)) + specifier: 9.0.17 + version: 9.0.17(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) '@storybook/addon-themes': - specifier: 8.4.6 - version: 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/preview-api': - specifier: 8.5.3 - version: 8.5.3(storybook@8.5.3(prettier@3.4.1)) - '@storybook/react': - specifier: 8.4.6 - version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.3(prettier@3.4.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1))(typescript@5.6.3) + specifier: 9.0.17 + version: 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) '@storybook/react-vite': - specifier: 8.4.6 - version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.3(prettier@3.4.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.1)(storybook@8.5.3(prettier@3.4.1))(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) - '@storybook/test': - specifier: 8.4.6 - version: 8.4.6(storybook@8.5.3(prettier@3.4.1)) + specifier: 9.0.17 + version: 9.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) '@swc/core': specifier: 1.3.38 version: 1.3.38 @@ -457,11 +439,11 @@ importers: specifier: 1.16.0 version: 1.16.0 storybook: - specifier: 8.5.3 - version: 8.5.3(prettier@3.4.1) + specifier: 9.0.17 + version: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) storybook-addon-remix-react-router: - specifier: 3.1.0 - version: 3.1.0(@storybook/blocks@8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)))(@storybook/channels@8.1.11)(@storybook/components@8.4.6(storybook@8.5.3(prettier@3.4.1)))(@storybook/core-events@8.1.11)(@storybook/manager-api@8.4.6(storybook@8.5.3(prettier@3.4.1)))(@storybook/preview-api@8.5.3(storybook@8.5.3(prettier@3.4.1)))(@storybook/theming@8.4.6(storybook@8.5.3(prettier@3.4.1)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + specifier: 5.0.0 + version: 5.0.0(react-dom@18.3.1(react@18.3.1))(react-router@7.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) tailwindcss: specifier: 3.4.17 version: 3.4.17(ts-node@10.9.2(@swc/core@1.3.38)(@types/node@20.17.16)(typescript@5.6.3)) @@ -736,10 +718,6 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, tarball: https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz} engines: {node: '>=6.9.0'} @@ -748,10 +726,6 @@ packages: resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz} engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==, tarball: https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz} - engines: {node: '>=6.9.0'} - '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==, tarball: https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz} engines: {node: '>=6.9.0'} @@ -829,11 +803,11 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==, tarball: https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz} - '@chromatic-com/storybook@3.2.2': - resolution: {integrity: sha512-xmXt/GW0hAPbzNTrxYuVo43Adrtjue4DeVrsoIIEeJdGaPNNeNf+DHMlJKOBdlHmCnFUoe9R/0mLM9zUp5bKWw==, tarball: https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-3.2.2.tgz} - engines: {node: '>=16.0.0', yarn: '>=1.22.18'} + '@chromatic-com/storybook@4.0.1': + resolution: {integrity: sha512-GQXe5lyZl3yLewLJQyFXEpOp2h+mfN2bPrzYaOFNCJjO4Js9deKbRHTOSaiP2FRwZqDLdQwy2+SEGeXPZ94yYw==, tarball: https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-4.0.1.tgz} + engines: {node: '>=20.0.0', yarn: '>=1.22.18'} peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + storybook: ^0.0.0-0 || ^9.0.0 || ^9.1.0-0 '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, tarball: https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz} @@ -1241,11 +1215,11 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, tarball: https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2': - resolution: {integrity: sha512-feQ+ntr+8hbVudnsTUapiMN9q8T90XA1d5jn9QzY09sNoj4iD9wi0PY1vsBFTda4ZjEaxRK9S81oarR2nj7TFQ==, tarball: https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.4.2.tgz} + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1': + resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==, tarball: https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.6.1.tgz} peerDependencies: typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true @@ -1280,6 +1254,15 @@ packages: '@types/react': '>=16' react: '>=16' + '@mjackson/form-data-parser@0.4.0': + resolution: {integrity: sha512-zDQ0sFfXqn2bJaZ/ypXfGUe0lUjCzXybBHYEoyWaO2w1dZ0nOM9nRER8tVVv3a8ZIgO/zF6p2I5ieWJAUOzt3w==, tarball: https://registry.npmjs.org/@mjackson/form-data-parser/-/form-data-parser-0.4.0.tgz} + + '@mjackson/headers@0.5.1': + resolution: {integrity: sha512-sJpFgecPT/zJvwk3GRNVWNs8EkwaJoUNU2D0VMlp+gDJs6cuSTm1q/aCZi3ZtuV6CgDEQ4l2ZjUG3A9JrQlbNA==, tarball: https://registry.npmjs.org/@mjackson/headers/-/headers-0.5.1.tgz} + + '@mjackson/multipart-parser@0.6.3': + resolution: {integrity: sha512-aQhySnM6OpAYMMG+m7LEygYye99hB1md/Cy1AFE0yD5hfNW+X4JDu7oNVY9Gc6IW8PZ45D1rjFLDIUdnkXmwrA==, tarball: https://registry.npmjs.org/@mjackson/multipart-parser/-/multipart-parser-0.6.3.tgz} + '@monaco-editor/loader@1.4.0': resolution: {integrity: sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==, tarball: https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz} peerDependencies: @@ -1406,6 +1389,9 @@ packages: '@emotion/styled': optional: true + '@neoconfetti/react@1.0.0': + resolution: {integrity: sha512-klcSooChXXOzIm+SE5IISIAn3bYzYfPjbX7D7HoqZL84oAfgREeSg5vSIaSFH+DaGzzvImTyWe1OyrJ67vik4A==, tarball: https://registry.npmjs.org/@neoconfetti/react/-/react-1.0.0.tgz} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, tarball: https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} engines: {node: '>= 8'} @@ -2052,10 +2038,6 @@ packages: '@radix-ui/rect@1.1.0': resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==, tarball: https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz} - '@remix-run/router@1.19.2': - resolution: {integrity: sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==, tarball: https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz} - engines: {node: '>=14.0.0'} - '@rolldown/pluginutils@1.0.0-beta.9': resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==, tarball: https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz} @@ -2177,138 +2159,35 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, tarball: https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz} - '@storybook/addon-actions@8.4.6': - resolution: {integrity: sha512-vbplwjMj7UXbdzoFhQkqFHLQAPJX8OVGTM9Q+yjuWDHViaKKUlgRWp0jclT7aIDNJQU2a6wJbTimHgJeF16Vhg==, tarball: https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.4.6.tgz} + '@storybook/addon-docs@9.0.17': + resolution: {integrity: sha512-LOX/kKgQGnyulrqZHsvf77+ZoH/nSUaplGr5hvZglW/U6ak6fO9seJyXAzVKEnC6p+F8n02kFBZbi3s+znQhSg==, tarball: https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.0.17.tgz} peerDependencies: - storybook: ^8.4.6 + storybook: ^9.0.17 - '@storybook/addon-actions@8.5.2': - resolution: {integrity: sha512-g0gLesVSFgstUq5QphsLeC1vEdwNHgqo2TE0m+STM47832xbxBwmK6uvBeqi416xZvnt1TTKaaBr4uCRRQ64Ww==, tarball: https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.5.2.tgz} - peerDependencies: - storybook: ^8.5.2 - - '@storybook/addon-backgrounds@8.4.6': - resolution: {integrity: sha512-RSjJ3iElxlQXebZrz1s5LeoLpAXr9LAGifX7w0abMzN5sg6QSwNeUHko2eT3V57M3k1Fa/5Eelso/QBQifFEog==, tarball: https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-controls@8.4.6': - resolution: {integrity: sha512-70pEGWh0C2g8s0DYsISElOzsMbQS6p/K9iU5EqfotDF+hvEqstjsV/bTbR5f3OK4vR/7Gxamk7j8RVd14Nql6A==, tarball: https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-docs@8.4.6': - resolution: {integrity: sha512-olxz61W7PW/EsXrKhLrYbI3rn9GMBhY3KIOF/6tumbRkh0Siu/qe4EAImaV9NNwiC1R7+De/1OIVMY6o0EIZVw==, tarball: https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-essentials@8.4.6': - resolution: {integrity: sha512-TbFqyvWFUKw8LBpVcZuGQydzVB/3kSuHxDHi+Wj3Qas3cxBl7+w4/HjwomT2D2Tni1dZ1uPDOsAtNLmwp1POsg==, tarball: https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-highlight@8.4.6': - resolution: {integrity: sha512-m8wedbqDMbwkP99dNHkHAiAUkx5E7FEEEyLPX1zfkhZWOGtTkavXHH235SGp50zD75LQ6eC/BvgegrzxSQa9Wg==, tarball: https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-interactions@8.5.3': - resolution: {integrity: sha512-nQuP65iFGgqfVp/O8NxNDUwLTWmQBW4bofUFaT4wzYn7Jk9zobOZYtgQvdqBZtNzBDYmLrfrCutEBj5jVPRyuQ==, tarball: https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.5.3.tgz} - peerDependencies: - storybook: ^8.5.3 - - '@storybook/addon-links@8.5.2': - resolution: {integrity: sha512-eDKOQoAKKUQo0JqeLNzMLu6fm1s3oxwZ6O+rAWS6n5bsrjZS2Ul8esKkRriFVwHtDtqx99wneqOscS8IzE/ENw==, tarball: https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.5.2.tgz} + '@storybook/addon-links@9.0.17': + resolution: {integrity: sha512-c4hYojq0O6n5fD8MS+Ss1njR3qs88LLlO3LLaRD4bxsIgn8WFNjgG5677M7m8WjzTgWSxFWN0KAra2kaDZ8Jlg==, tarball: https://registry.npmjs.org/@storybook/addon-links/-/addon-links-9.0.17.tgz} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.5.2 + storybook: ^9.0.17 peerDependenciesMeta: react: optional: true - '@storybook/addon-mdx-gfm@8.5.2': - resolution: {integrity: sha512-UuJDa2Asch8Z6H+vzLg+/VQQNbHhqmDtn8OSfNHo6Lr6a0uk6LofYKvP/nB7i6wMUvnaM+Qh/b5hAI/VCXitBQ==, tarball: https://registry.npmjs.org/@storybook/addon-mdx-gfm/-/addon-mdx-gfm-8.5.2.tgz} - peerDependencies: - storybook: ^8.5.2 - - '@storybook/addon-measure@8.4.6': - resolution: {integrity: sha512-N2IRpr39g5KpexCAS1vIHJT+phc9Yilwm3PULds2rQ66VMTbkxobXJDdt0NS05g5n9/eDniroNQwdCeLg4tkpw==, tarball: https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-outline@8.4.6': - resolution: {integrity: sha512-EhcWx8OpK85HxQulLWzpWUHEwQpDYuAiKzsFj9ivAbfeljkIWNTG04mierfaH1xX016uL9RtLJL/zwBS5ChnFg==, tarball: https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-themes@8.4.6': - resolution: {integrity: sha512-0Eyh7jxxQ8hc7KIO2bJF8BKY1CRJ9zPo2DKoRiUKDoSGSP8qdlj4V/ks892GcUffdhTjoFAJCRzG7Ff+TnVKrA==, tarball: https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-toolbars@8.4.6': - resolution: {integrity: sha512-+Xao/uGa8FnYsyUiREUkYXWNysm3Aba8tL/Bwd+HufHtdiKJGa9lrXaC7VLCqBUaEjwqM3aaPwqEWIROsthmPQ==, tarball: https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/addon-viewport@8.4.6': - resolution: {integrity: sha512-BuQll5YzOCpMS7p5Rsw9wcmi8hTnEKyg6+qAbkZNfiZ2JhXCa1GFUqX725fF1whpYVQULtkQxU8r+vahoRn7Yg==, tarball: https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/blocks@8.4.6': - resolution: {integrity: sha512-Gzbx8hM7ZQIHlQELcFIMbY1v+r1Po4mlinq0QVPtKS4lBcW4eZIsesbxOaL+uFNrxb583TLFzXo0DbRPzS46sg==, tarball: https://registry.npmjs.org/@storybook/blocks/-/blocks-8.4.6.tgz} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.6 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/builder-vite@8.4.6': - resolution: {integrity: sha512-PyJsaEPyuRFFEplpNUi+nbuJd7d1DC2dAZjpsaHTXyqg5iPIbkIgsbCJLUDeIXnUDqM/utjmMpN0sQKJuhIc6w==, tarball: https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - - '@storybook/channels@8.1.11': - resolution: {integrity: sha512-fu5FTqo6duOqtJFa6gFzKbiSLJoia+8Tibn3xFfB6BeifWrH81hc+AZq0lTmHo5qax2G5t8ZN8JooHjMw6k2RA==, tarball: https://registry.npmjs.org/@storybook/channels/-/channels-8.1.11.tgz} - - '@storybook/client-logger@8.1.11': - resolution: {integrity: sha512-DVMh2usz3yYmlqCLCiCKy5fT8/UR9aTh+gSqwyNFkGZrIM4otC5A8eMXajXifzotQLT5SaOEnM3WzHwmpvMIEA==, tarball: https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.1.11.tgz} - - '@storybook/components@8.4.6': - resolution: {integrity: sha512-9tKSJJCyFT5RZMRGyozTBJkr9C9Yfk1nuOE9XbDEE1Z+3/IypKR9+iwc5mfNBStDNY+rxtYWNLKBb5GPR2yhzA==, tarball: https://registry.npmjs.org/@storybook/components/-/components-8.4.6.tgz} + '@storybook/addon-themes@9.0.17': + resolution: {integrity: sha512-qQCoWig+wPVVuiibk8AuUUH/hS9hbLFt2IdjpiCIObAjStqSQMosr/1b95FcxppBCEa8uTltEkGdxQPdpdVZEQ==, tarball: https://registry.npmjs.org/@storybook/addon-themes/-/addon-themes-9.0.17.tgz} peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + storybook: ^9.0.17 - '@storybook/core-events@8.1.11': - resolution: {integrity: sha512-vXaNe2KEW9BGlLrg0lzmf5cJ0xt+suPjWmEODH5JqBbrdZ67X6ApA2nb6WcxDQhykesWCuFN5gp1l+JuDOBi7A==, tarball: https://registry.npmjs.org/@storybook/core-events/-/core-events-8.1.11.tgz} - - '@storybook/core@8.5.3': - resolution: {integrity: sha512-ZLlr2pltbj/hmC54lggJTnh09FCAJR62lIdiXNwa+V+/eJz0CfD8tfGmZGKPSmaQeZBpMwAOeRM97k2oLPF+0w==, tarball: https://registry.npmjs.org/@storybook/core/-/core-8.5.3.tgz} + '@storybook/builder-vite@9.0.17': + resolution: {integrity: sha512-lyuvgGhb0NaVk1tdB4xwzky6+YXQfxlxfNQqENYZ9uYQZdPfErMa4ZTXVQTV+CQHAa2NL+p/dG2JPAeu39e9UA==, tarball: https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.0.17.tgz} peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true + storybook: ^9.0.17 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/csf-plugin@8.4.6': - resolution: {integrity: sha512-JDIT0czC4yMgKGNf39KTZr3zm5MusAZdn6LBrTfvWb7CrTCR4iVHa4lp2yb7EJk41vHsBec0QUYDDuiFH/vV0g==, tarball: https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.6.tgz} + '@storybook/csf-plugin@9.0.17': + resolution: {integrity: sha512-6Q4eo1ObrLlsnB6bIt6T8+45XAb4to2pQGNrI7QPkLQRLrZinrJcNbLY7AGkyIoCOEsEbq08n09/nClQUbu8HA==, tarball: https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.0.17.tgz} peerDependencies: - storybook: ^8.4.6 - - '@storybook/csf@0.1.11': - resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==, tarball: https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz} - - '@storybook/csf@0.1.12': - resolution: {integrity: sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==, tarball: https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz} - - '@storybook/csf@0.1.13': - resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==, tarball: https://registry.npmjs.org/@storybook/csf/-/csf-0.1.13.tgz} + storybook: ^9.0.17 '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==, tarball: https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz} @@ -2320,77 +2199,34 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/instrumenter@8.4.6': - resolution: {integrity: sha512-snXjlgbp065A6KoK9zkjBYEIMCSlN5JefPKzt1FC0rbcbtahhD+iPpqISKhDSczwgOku/JVhVUDp/vU7AIf4mg==, tarball: https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/instrumenter@8.5.3': - resolution: {integrity: sha512-pxaTbGeju8MkwouIiaWX5DMWtpRruxqig8W3nZPOvzoSCCbQY+sLMQoyXxFlpGxLBjcvXivkL7AMVBKps5sFEQ==, tarball: https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.5.3.tgz} - peerDependencies: - storybook: ^8.5.3 - - '@storybook/manager-api@8.4.6': - resolution: {integrity: sha512-TsXlQ5m5rTl2KNT9icPFyy822AqXrx1QplZBt/L7cFn7SpqQKDeSta21FH7MG0piAvzOweXebVSqKngJ6cCWWQ==, tarball: https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.6.tgz} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/preview-api@8.4.6': - resolution: {integrity: sha512-LbD+lR1FGvWaJBXteVx5xdgs1x1D7tyidBg2CsW2ex+cP0iJ176JgjPfutZxlWOfQnhfRYNnJ3WKoCIfxFOTKA==, tarball: https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.6.tgz} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/preview-api@8.5.3': - resolution: {integrity: sha512-dUsuXW+KgDg4tWXOB6dk5j5gwwRUzbPvicHAY9mzbpSVScbWXuE5T/S/9hHlbtfkhFroWQgPx2eB8z3rai+7RQ==, tarball: https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.5.3.tgz} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/react-dom-shim@8.4.6': - resolution: {integrity: sha512-f7RM8GO++fqMxbjNdEzeGS1P821jXuwRnAraejk5hyjB5SqetauFxMwoFYEYfJXPaLX2qIubnIJ78hdJ/IBaEA==, tarball: https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.6.tgz} + '@storybook/react-dom-shim@9.0.17': + resolution: {integrity: sha512-ak/x/m6MDDxdE6rCDymTltaiQF3oiKrPHSwfM+YPgQR6MVmzTTs4+qaPfeev7FZEHq23IkfDMTmSTTJtX7Vs9A==, tarball: https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.0.17.tgz} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.6 + storybook: ^9.0.17 - '@storybook/react-vite@8.4.6': - resolution: {integrity: sha512-bVoYj3uJRz0SknK2qN3vBVSoEXsvyARQLuHjP9eX0lWBd9XSxZinmVbexPdD0OeJYcJIdmbli2/Gw7/hu5CjFA==, tarball: https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.4.6.tgz} - engines: {node: '>=18.0.0'} + '@storybook/react-vite@9.0.17': + resolution: {integrity: sha512-wx1yKScni4ifOC/ccqpnnpceQbyF2xto+jHGsyua+M4UUCQdS2NYPDR8JFWp1YvBhVt2cQiD6SAltVGM9QLGnQ==, tarball: https://registry.npmjs.org/@storybook/react-vite/-/react-vite-9.0.17.tgz} + engines: {node: '>=20.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.6 - vite: ^4.0.0 || ^5.0.0 || ^6.0.0 + storybook: ^9.0.17 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@storybook/react@8.4.6': - resolution: {integrity: sha512-QAT23beoYNLhFGAXPimtuMErvpcI7eZbZ4AlLqW1fhiTZrRYw06cjC1bs9H3tODMcHH9LS5p3Wz9b29jtV2XGw==, tarball: https://registry.npmjs.org/@storybook/react/-/react-8.4.6.tgz} - engines: {node: '>=18.0.0'} + '@storybook/react@9.0.17': + resolution: {integrity: sha512-wssao+uXg72OHtEJdQmmQJGdX90x/aU/6avoP3fgVgepWdZXVgciS9mnqHjKRF/vP+vPOlNQcJjojF/zTtq5qg==, tarball: https://registry.npmjs.org/@storybook/react/-/react-9.0.17.tgz} + engines: {node: '>=20.0.0'} peerDependencies: - '@storybook/test': 8.4.6 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.4.6 - typescript: '>= 4.2.x' + storybook: ^9.0.17 + typescript: '>= 4.9.x' peerDependenciesMeta: - '@storybook/test': - optional: true typescript: optional: true - '@storybook/test@8.4.6': - resolution: {integrity: sha512-MeU1g65YgU66M2NtmEIL9gVeHk+en0k9Hp0wfxEO7NT/WLfaOD5RXLRDJVhbAlrH/6tLeWKIPNh/D26y27vO/g==, tarball: https://registry.npmjs.org/@storybook/test/-/test-8.4.6.tgz} - peerDependencies: - storybook: ^8.4.6 - - '@storybook/test@8.5.3': - resolution: {integrity: sha512-2smoDbtU6Qh4yk0uD18qGfW6ll7lZBzKlF58Ha1CgWR4o+jpeeTQcfDLH9gG6sNrpojF7AVzMh/aN9BDHD+Chg==, tarball: https://registry.npmjs.org/@storybook/test/-/test-8.5.3.tgz} - peerDependencies: - storybook: ^8.5.3 - - '@storybook/theming@8.4.6': - resolution: {integrity: sha512-q7vDPN/mgj7cXIVQ9R1/V75hrzNgKkm2G0LjMo57//9/djQ+7LxvBsR1iScbFIRSEqppvMiBFzkts+2uXidySA==, tarball: https://registry.npmjs.org/@storybook/theming/-/theming-8.4.6.tgz} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@swc/core-darwin-arm64@1.3.38': resolution: {integrity: sha512-4ZTJJ/cR0EsXW5UxFCifZoGfzQ07a8s4ayt1nLvLQ5QoB1GTAf9zsACpvWG8e7cmCR0L76R5xt8uJuyr+noIXA==, tarball: https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.38.tgz} engines: {node: '>=10'} @@ -2494,10 +2330,6 @@ packages: resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==, tarball: https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz} engines: {node: '>=14'} - '@testing-library/jest-dom@6.5.0': - resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==, tarball: https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/jest-dom@6.6.3': resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==, tarball: https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} @@ -2509,12 +2341,6 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==, tarball: https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - '@testing-library/user-event@14.6.1': resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==, tarball: https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz} engines: {node: '>=12', npm: '>=6'} @@ -2555,6 +2381,9 @@ packages: '@types/body-parser@1.19.2': resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==, tarball: https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==, tarball: https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz} + '@types/chroma-js@2.4.0': resolution: {integrity: sha512-JklMxityrwjBTjGY2anH8JaTx3yjRU3/sEHSblLH1ba5lqcSh1LnImXJZO5peJfXyqKYWjHTGy4s5Wz++hARrw==, tarball: https://registry.npmjs.org/@types/chroma-js/-/chroma-js-2.4.0.tgz} @@ -2600,6 +2429,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, tarball: https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, tarball: https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz} + '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==, tarball: https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz} @@ -2813,23 +2645,17 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz} - - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz} - - '@vitest/pretty-format@2.1.8': - resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, tarball: https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz} - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, tarball: https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz} - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, tarball: https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz} - '@vitest/utils@2.1.8': - resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, tarball: https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz} '@xterm/addon-canvas@0.7.0': resolution: {integrity: sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw==, tarball: https://registry.npmjs.org/@xterm/addon-canvas/-/addon-canvas-0.7.0.tgz} @@ -3062,9 +2888,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, tarball: https://registry.npmjs.org/braces/-/braces-3.0.3.tgz} engines: {node: '>=8'} - browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==, tarball: https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz} - browserslist@4.24.2: resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==, tarball: https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3134,9 +2957,9 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, tarball: https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz} - chai@5.1.2: - resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==, tarball: https://registry.npmjs.org/chai/-/chai-5.1.2.tgz} - engines: {node: '>=12'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==, tarball: https://registry.npmjs.org/chai/-/chai-5.2.1.tgz} + engines: {node: '>=18'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, tarball: https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz} @@ -3202,6 +3025,18 @@ packages: '@chromatic-com/playwright': optional: true + chromatic@12.2.0: + resolution: {integrity: sha512-GswmBW9ZptAoTns1BMyjbm55Z7EsIJnUvYKdQqXIBZIKbGErmpA+p4c0BYA+nzw5B0M+rb3Iqp1IaH8TFwIQew==, tarball: https://registry.npmjs.org/chromatic/-/chromatic-12.2.0.tgz} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, tarball: https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz} engines: {node: '>=8'} @@ -3310,6 +3145,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, tarball: https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz} engines: {node: '>= 0.6'} + cookie@1.0.2: + resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==, tarball: https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz} + engines: {node: '>=18'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, tarball: https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz} @@ -3722,9 +3561,6 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, tarball: https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, tarball: https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, tarball: https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz} engines: {node: '>=0.10.0'} @@ -3819,6 +3655,10 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, tarball: https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz} engines: {node: '>=10'} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==, tarball: https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz} + engines: {node: '>=18'} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, tarball: https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz} engines: {node: ^10.12.0 || >=12.0.0} @@ -4142,9 +3982,6 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, tarball: https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz} engines: {node: '>= 0.4'} - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, tarball: https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, tarball: https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz} engines: {node: '>= 0.4'} @@ -4176,10 +4013,6 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, tarball: https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz} engines: {node: '>=6'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, tarball: https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, tarball: https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz} engines: {node: '>=0.10.0'} @@ -4223,10 +4056,6 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==, tarball: https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz} engines: {node: '>= 0.4'} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, tarball: https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz} - engines: {node: '>= 0.4'} - is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==, tarball: https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz} @@ -4498,10 +4327,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, tarball: https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz} hasBin: true - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==, tarball: https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz} - engines: {node: '>=12.0.0'} - jsdom@20.0.3: resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==, tarball: https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz} engines: {node: '>=14'} @@ -4583,6 +4408,10 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, tarball: https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==, tarball: https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, tarball: https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz} @@ -4612,12 +4441,12 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, tarball: https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz} hasBin: true - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==, tarball: https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==, tarball: https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz} + loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==, tarball: https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz} + lowlight@1.20.0: resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==, tarball: https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz} @@ -4640,10 +4469,6 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, tarball: https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz} hasBin: true - magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz} - engines: {node: '>=12'} - magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz} engines: {node: '>=12'} @@ -4658,9 +4483,6 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, tarball: https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz} - map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==, tarball: https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz} - markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, tarball: https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz} @@ -4732,9 +4554,6 @@ packages: memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==, tarball: https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz} - memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==, tarball: https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz} - merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, tarball: https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz} @@ -5063,6 +4882,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, tarball: https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==, tarball: https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, tarball: https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz} engines: {node: '>=8'} @@ -5071,6 +4894,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, tarball: https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==, tarball: https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, tarball: https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz} engines: {node: '>=6'} @@ -5110,6 +4937,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, tarball: https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==, tarball: https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, tarball: https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz} engines: {node: '>=0.10.0'} @@ -5176,10 +5007,6 @@ packages: engines: {node: '>=18'} hasBin: true - polished@4.3.1: - resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==, tarball: https://registry.npmjs.org/polished/-/polished-4.3.1.tgz} - engines: {node: '>=10'} - possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, tarball: https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz} engines: {node: '>= 0.4'} @@ -5265,10 +5092,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, tarball: https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz} - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==, tarball: https://registry.npmjs.org/process/-/process-0.11.10.tgz} - engines: {node: '>= 0.6.0'} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, tarball: https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz} engines: {node: '>= 6'} @@ -5349,9 +5172,9 @@ packages: peerDependencies: typescript: '>= 4.3.x' - react-docgen@7.0.3: - resolution: {integrity: sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==, tarball: https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz} - engines: {node: '>=16.14.0'} + react-docgen@8.0.0: + resolution: {integrity: sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==, tarball: https://registry.npmjs.org/react-docgen/-/react-docgen-8.0.0.tgz} + engines: {node: ^20.9.0 || >=22} react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, tarball: https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz} @@ -5437,18 +5260,15 @@ packages: react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-router-dom@6.26.2: - resolution: {integrity: sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==, tarball: https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - react-router@6.26.2: - resolution: {integrity: sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==, tarball: https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz} - engines: {node: '>=14.0.0'} + react-router@7.8.0: + resolution: {integrity: sha512-r15M3+LHKgM4SOapNmsH3smAizWds1vJ0Z9C4mWaKnT9/wD7+d/0jYcj6LmOvonkrO4Rgdyp4KQ/29gWN2i1eg==, tarball: https://registry.npmjs.org/react-router/-/react-router-7.8.0.tgz} + engines: {node: '>=20.0.0'} peerDependencies: - react: '>=16.8' + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true react-smooth@4.0.4: resolution: {integrity: sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==, tarball: https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz} @@ -5594,10 +5414,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, tarball: https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz} - hasBin: true - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, tarball: https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz} engines: {node: '>=8'} @@ -5641,10 +5457,6 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, tarball: https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz} - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, tarball: https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, tarball: https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz} @@ -5668,6 +5480,9 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, tarball: https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz} engines: {node: '>= 0.8.0'} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==, tarball: https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, tarball: https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz} engines: {node: '>= 0.4'} @@ -5777,27 +5592,21 @@ packages: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==, tarball: https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz} engines: {node: '>= 0.4'} - storybook-addon-remix-react-router@3.1.0: - resolution: {integrity: sha512-h6cOD+afyAddNrDz5ezoJGV6GBSeH7uh92VAPDz+HLuay74Cr9Ozz+aFmlzMEyVJ1hhNIMOIWDsmK56CueZjsw==, tarball: https://registry.npmjs.org/storybook-addon-remix-react-router/-/storybook-addon-remix-react-router-3.1.0.tgz} + storybook-addon-remix-react-router@5.0.0: + resolution: {integrity: sha512-XjNGLD8vhI7DhjPgkjkU9rjqjF6YSRvRjBignwo2kCGiz5HIR4TZTDRRABuwYo35/GoC2aMtxFs7zybJ4pVlsg==, tarball: https://registry.npmjs.org/storybook-addon-remix-react-router/-/storybook-addon-remix-react-router-5.0.0.tgz} peerDependencies: - '@storybook/blocks': ^8.0.0 - '@storybook/channels': ^8.0.0 - '@storybook/components': ^8.0.0 - '@storybook/core-events': ^8.0.0 - '@storybook/manager-api': ^8.0.0 - '@storybook/preview-api': ^8.0.0 - '@storybook/theming': ^8.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-router-dom: ^6.4.0 || ^7.0.0 + react-router: ^7.0.2 + storybook: ^9.0.0 peerDependenciesMeta: react: optional: true react-dom: optional: true - storybook@8.5.3: - resolution: {integrity: sha512-2WtNBZ45u1AhviRU+U+ld588tH8gDa702dNSq5C8UBaE9PlOsazGsyp90dw1s9YRvi+ejrjKAupQAU0GwwUiVg==, tarball: https://registry.npmjs.org/storybook/-/storybook-8.5.3.tgz} + storybook@9.0.17: + resolution: {integrity: sha512-O+9jgJ+Trlq9VGD1uY4OBLKQWHHDKM/A/pA8vMW6PVehhGHNvpzcIC1bngr6mL5gGHZP2nBv+9XG8pTMcggMmg==, tarball: https://registry.npmjs.org/storybook/-/storybook-9.0.17.tgz} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -5912,9 +5721,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, tarball: https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz} engines: {node: '>=6'} - telejson@7.2.0: - resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==, tarball: https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz} - test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, tarball: https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz} engines: {node: '>=8'} @@ -5945,12 +5751,12 @@ packages: resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==, tarball: https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz} engines: {node: '>=12.0.0'} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==, tarball: https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, tarball: https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==, tarball: https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==, tarball: https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz} engines: {node: '>=14.0.0'} tmpl@1.0.5: @@ -6091,6 +5897,10 @@ packages: resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==, tarball: https://registry.npmjs.org/undici/-/undici-6.21.2.tgz} engines: {node: '>=18.17'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, tarball: https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz} + engines: {node: '>=18'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==, tarball: https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz} engines: {node: '>=18'} @@ -6212,9 +6022,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz} - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, tarball: https://registry.npmjs.org/util/-/util-0.12.5.tgz} - utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, tarball: https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz} engines: {node: '>= 0.4.0'} @@ -6460,6 +6267,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, tarball: https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz} engines: {node: '>=10'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==, tarball: https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz} + engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==, tarball: https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz} engines: {node: '>=18'} @@ -6775,18 +6586,6 @@ snapshots: '@babel/parser': 7.27.2 '@babel/types': 7.27.1 - '@babel/traverse@7.25.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.3 - '@babel/parser': 7.26.3 - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 @@ -6811,11 +6610,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.26.0': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -6881,18 +6675,17 @@ snapshots: '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 - '@chromatic-com/storybook@3.2.2(react@18.3.1)(storybook@8.5.3(prettier@3.4.1))': + '@chromatic-com/storybook@4.0.1(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))': dependencies: - chromatic: 11.25.2 + '@neoconfetti/react': 1.0.0 + chromatic: 12.2.0 filesize: 10.1.2 jsonfile: 6.1.0 - react-confetti: 6.2.2(react@18.3.1) - storybook: 8.5.3(prettier@3.4.1) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) strip-ansi: 7.1.0 transitivePeerDependencies: - '@chromatic-com/cypress' - '@chromatic-com/playwright' - - react '@cspotcode/source-map-support@0.8.1': dependencies: @@ -7393,9 +7186,10 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - magic-string: 0.27.0 + glob: 10.4.5 + magic-string: 0.30.5 react-docgen-typescript: 2.2.2(typescript@5.6.3) vite: 6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0) optionalDependencies: @@ -7432,6 +7226,16 @@ snapshots: '@types/react': 18.3.12 react: 18.3.1 + '@mjackson/form-data-parser@0.4.0': + dependencies: + '@mjackson/multipart-parser': 0.6.3 + + '@mjackson/headers@0.5.1': {} + + '@mjackson/multipart-parser@0.6.3': + dependencies: + '@mjackson/headers': 0.5.1 + '@monaco-editor/loader@1.4.0(monaco-editor@0.52.0)': dependencies: monaco-editor: 0.52.0 @@ -7563,6 +7367,8 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@neoconfetti/react@1.0.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8200,13 +8006,11 @@ snapshots: '@radix-ui/rect@1.1.0': {} - '@remix-run/router@1.19.2': {} - '@rolldown/pluginutils@1.0.0-beta.9': {} '@rollup/pluginutils@5.0.5(rollup@4.40.1)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: @@ -8282,200 +8086,43 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.0 - '@storybook/addon-actions@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - '@types/uuid': 9.0.2 - dequal: 2.0.3 - polished: 4.3.1 - storybook: 8.5.3(prettier@3.4.1) - uuid: 9.0.1 - - '@storybook/addon-actions@8.5.2(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - '@types/uuid': 9.0.2 - dequal: 2.0.3 - polished: 4.3.1 - storybook: 8.5.3(prettier@3.4.1) - uuid: 9.0.1 - - '@storybook/addon-backgrounds@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 - - '@storybook/addon-controls@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - dequal: 2.0.3 - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 - - '@storybook/addon-docs@8.4.6(@types/react@18.3.12)(storybook@8.5.3(prettier@3.4.1))': + '@storybook/addon-docs@9.0.17(@types/react@18.3.12)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))': dependencies: '@mdx-js/react': 3.0.1(@types/react@18.3.12)(react@18.3.1) - '@storybook/blocks': 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)) - '@storybook/csf-plugin': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/react-dom-shim': 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)) + '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) + '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@storybook/react-dom-shim': 9.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-essentials@8.4.6(@types/react@18.3.12)(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/addon-actions': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-backgrounds': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-controls': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-docs': 8.4.6(@types/react@18.3.12)(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-highlight': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-measure': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-outline': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-toolbars': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/addon-viewport': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - storybook: 8.5.3(prettier@3.4.1) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-highlight@8.4.6(storybook@8.5.3(prettier@3.4.1))': + '@storybook/addon-links@9.0.17(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/addon-interactions@8.5.3(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.5.3(storybook@8.5.3(prettier@3.4.1)) - '@storybook/test': 8.5.3(storybook@8.5.3(prettier@3.4.1)) - polished: 4.3.1 - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 - - '@storybook/addon-links@8.5.2(react@18.3.1)(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/csf': 0.1.12 - '@storybook/global': 5.0.0 - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) optionalDependencies: react: 18.3.1 - '@storybook/addon-mdx-gfm@8.5.2(storybook@8.5.3(prettier@3.4.1))': + '@storybook/addon-themes@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))': dependencies: - remark-gfm: 4.0.0 - storybook: 8.5.3(prettier@3.4.1) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) ts-dedent: 2.2.0 - transitivePeerDependencies: - - supports-color - '@storybook/addon-measure@8.4.6(storybook@8.5.3(prettier@3.4.1))': + '@storybook/builder-vite@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@storybook/global': 5.0.0 - storybook: 8.5.3(prettier@3.4.1) - tiny-invariant: 1.3.3 - - '@storybook/addon-outline@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 - - '@storybook/addon-themes@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 - - '@storybook/addon-toolbars@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/addon-viewport@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - memoizerific: 1.11.3 - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/blocks@8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/csf': 0.1.13 - '@storybook/icons': 1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - storybook: 8.5.3(prettier@3.4.1) - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@storybook/builder-vite@8.4.6(storybook@8.5.3(prettier@3.4.1))(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0))': - dependencies: - '@storybook/csf-plugin': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - browser-assert: 1.2.1 - storybook: 8.5.3(prettier@3.4.1) + '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) ts-dedent: 2.2.0 vite: 6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0) - '@storybook/channels@8.1.11': - dependencies: - '@storybook/client-logger': 8.1.11 - '@storybook/core-events': 8.1.11 - '@storybook/global': 5.0.0 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - - '@storybook/client-logger@8.1.11': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/components@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/core-events@8.1.11': - dependencies: - '@storybook/csf': 0.1.13 - ts-dedent: 2.2.0 - - '@storybook/core@8.5.3(prettier@3.4.1)': - dependencies: - '@storybook/csf': 0.1.12 - better-opn: 3.0.2 - browser-assert: 1.2.1 - esbuild: 0.25.3 - esbuild-register: 3.6.0(esbuild@0.25.3) - jsdoc-type-pratt-parser: 4.1.0 - process: 0.11.10 - recast: 0.23.9 - semver: 7.6.2 - util: 0.12.5 - ws: 8.18.0 - optionalDependencies: - prettier: 3.4.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@storybook/csf-plugin@8.4.6(storybook@8.5.3(prettier@3.4.1))': + '@storybook/csf-plugin@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))': dependencies: - storybook: 8.5.3(prettier@3.4.1) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) unplugin: 1.5.0 - '@storybook/csf@0.1.11': - dependencies: - type-fest: 2.19.0 - - '@storybook/csf@0.1.12': - dependencies: - type-fest: 2.19.0 - - '@storybook/csf@0.1.13': - dependencies: - type-fest: 2.19.0 - '@storybook/global@5.0.0': {} '@storybook/icons@1.2.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -8483,100 +8130,42 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/instrumenter@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.8 - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/instrumenter@8.5.3(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.8 - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/manager-api@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/preview-api@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/preview-api@8.5.3(storybook@8.5.3(prettier@3.4.1))': - dependencies: - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/react-dom-shim@8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1))': + '@storybook/react-dom-shim@9.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.5.3(prettier@3.4.1) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) - '@storybook/react-vite@8.4.6(@storybook/test@8.4.6(storybook@8.5.3(prettier@3.4.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.1)(storybook@8.5.3(prettier@3.4.1))(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0))': + '@storybook/react-vite@9.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.40.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) '@rollup/pluginutils': 5.0.5(rollup@4.40.1) - '@storybook/builder-vite': 8.4.6(storybook@8.5.3(prettier@3.4.1))(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) - '@storybook/react': 8.4.6(@storybook/test@8.4.6(storybook@8.5.3(prettier@3.4.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1))(typescript@5.6.3) - find-up: 5.0.0 + '@storybook/builder-vite': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) + '@storybook/react': 9.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))(typescript@5.6.3) + find-up: 7.0.0 magic-string: 0.30.5 react: 18.3.1 - react-docgen: 7.0.3 + react-docgen: 8.0.0 react-dom: 18.3.1(react@18.3.1) - resolve: 1.22.8 - storybook: 8.5.3(prettier@3.4.1) + resolve: 1.22.10 + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) tsconfig-paths: 4.2.0 vite: 6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0) transitivePeerDependencies: - - '@storybook/test' - rollup - supports-color - typescript - '@storybook/react@8.4.6(@storybook/test@8.4.6(storybook@8.5.3(prettier@3.4.1)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1))(typescript@5.6.3)': + '@storybook/react@9.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1))(typescript@5.6.3)': dependencies: - '@storybook/components': 8.4.6(storybook@8.5.3(prettier@3.4.1)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/preview-api': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/react-dom-shim': 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)) - '@storybook/theming': 8.4.6(storybook@8.5.3(prettier@3.4.1)) + '@storybook/react-dom-shim': 9.0.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.5.3(prettier@3.4.1) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) optionalDependencies: - '@storybook/test': 8.4.6(storybook@8.5.3(prettier@3.4.1)) typescript: 5.6.3 - '@storybook/test@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/csf': 0.1.11 - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@testing-library/dom': 10.4.0 - '@testing-library/jest-dom': 6.5.0 - '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/expect': 2.0.5 - '@vitest/spy': 2.0.5 - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/test@8.5.3(storybook@8.5.3(prettier@3.4.1))': - dependencies: - '@storybook/csf': 0.1.12 - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.5.3(storybook@8.5.3(prettier@3.4.1)) - '@testing-library/dom': 10.4.0 - '@testing-library/jest-dom': 6.5.0 - '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) - '@vitest/expect': 2.0.5 - '@vitest/spy': 2.0.5 - storybook: 8.5.3(prettier@3.4.1) - - '@storybook/theming@8.4.6(storybook@8.5.3(prettier@3.4.1))': - dependencies: - storybook: 8.5.3(prettier@3.4.1) - '@swc/core-darwin-arm64@1.3.38': optional: true @@ -8654,7 +8243,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 '@babel/runtime': 7.26.10 '@types/aria-query': 5.0.3 aria-query: 5.3.0 @@ -8674,16 +8263,6 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.5.0': - dependencies: - '@adobe/css-tools': 4.4.1 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - '@testing-library/jest-dom@6.6.3': dependencies: '@adobe/css-tools': 4.4.1 @@ -8702,10 +8281,6 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': - dependencies: - '@testing-library/dom': 10.4.0 - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: '@testing-library/dom': 10.4.0 @@ -8752,6 +8327,10 @@ snapshots: '@types/connect': 3.4.35 '@types/node': 20.17.16 + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + '@types/chroma-js@2.4.0': {} '@types/color-convert@2.0.4': @@ -8794,6 +8373,8 @@ snapshots: dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/doctrine@0.0.9': {} '@types/estree-jsx@1.0.5': @@ -9022,37 +8603,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@2.0.5': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.1.2 - tinyrainbow: 1.2.0 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + tinyrainbow: 2.0.0 - '@vitest/pretty-format@2.0.5': + '@vitest/pretty-format@3.2.4': dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/pretty-format@2.1.8': + '@vitest/spy@3.2.4': dependencies: - tinyrainbow: 1.2.0 + tinyspy: 4.0.3 - '@vitest/spy@2.0.5': + '@vitest/utils@3.2.4': dependencies: - tinyspy: 3.0.2 - - '@vitest/utils@2.0.5': - dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 - loupe: 3.1.2 - tinyrainbow: 1.2.0 - - '@vitest/utils@2.1.8': - dependencies: - '@vitest/pretty-format': 2.1.8 - loupe: 3.1.3 - tinyrainbow: 1.2.0 + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.0 + tinyrainbow: 2.0.0 '@xterm/addon-canvas@0.7.0(@xterm/xterm@5.5.0)': dependencies: @@ -9099,8 +8670,7 @@ snapshots: acorn@8.14.0: {} - acorn@8.14.1: - optional: true + acorn@8.14.1: {} agent-base@6.0.2: dependencies: @@ -9326,8 +8896,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browser-assert@1.2.1: {} - browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001717 @@ -9397,12 +8965,12 @@ snapshots: ccount@2.0.1: {} - chai@5.1.2: + chai@5.2.1: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.2 + loupe: 3.1.3 pathval: 2.0.0 chalk@2.4.2: @@ -9459,6 +9027,8 @@ snapshots: chromatic@11.25.2: {} + chromatic@12.2.0: {} + ci-info@3.9.0: {} cjs-module-lexer@1.3.1: {} @@ -9545,6 +9115,8 @@ snapshots: cookie@0.7.2: {} + cookie@1.0.2: {} + core-util-is@1.0.3: {} cosmiconfig@7.1.0: @@ -9668,7 +9240,6 @@ snapshots: debug@4.4.1: dependencies: ms: 2.1.3 - optional: true decimal.js-light@2.5.1: {} @@ -9868,7 +9439,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.25.3): dependencies: - debug: 4.4.0 + debug: 4.4.1 esbuild: 0.25.3 transitivePeerDependencies: - supports-color @@ -9999,10 +9570,6 @@ snapshots: estree-walker@2.0.2: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.7 - esutils@2.0.3: {} etag@1.8.1: {} @@ -10139,6 +9706,13 @@ snapshots: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + optional: true + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 flat-cache@3.2.0: dependencies: @@ -10484,10 +10058,6 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.13.1: - dependencies: - hasown: 2.0.2 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -10508,13 +10078,6 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.3 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -10547,13 +10110,6 @@ snapshots: call-bind: 1.0.7 has-tostringtag: 1.0.2 - is-regex@1.2.1: - dependencies: - call-bound: 1.0.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - is-set@2.0.2: {} is-shared-array-buffer@1.0.2: @@ -11039,8 +10595,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@4.1.0: {} - jsdom@20.0.3: dependencies: abab: 2.0.6 @@ -11153,6 +10707,11 @@ snapshots: locate-path@6.0.0: dependencies: p-locate: 5.0.0 + optional: true + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 lodash-es@4.17.21: {} @@ -11177,10 +10736,10 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.2: {} - loupe@3.1.3: {} + loupe@3.2.0: {} + lowlight@1.20.0: dependencies: fault: 1.0.4 @@ -11200,10 +10759,6 @@ snapshots: lz-string@1.5.0: {} - magic-string@0.27.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -11219,8 +10774,6 @@ snapshots: dependencies: tmpl: 1.0.5 - map-or-similar@1.5.0: {} - markdown-table@3.0.3: {} material-colors@1.2.6: {} @@ -11417,10 +10970,6 @@ snapshots: memoize-one@5.2.1: {} - memoizerific@1.11.3: - dependencies: - map-or-similar: 1.5.0 - merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -11916,6 +11465,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -11923,6 +11476,11 @@ snapshots: p-locate@5.0.0: dependencies: p-limit: 3.1.0 + optional: true + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 p-try@2.2.0: {} @@ -11970,6 +11528,8 @@ snapshots: path-exists@4.0.0: {} + path-exists@5.0.0: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -12013,10 +11573,6 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - polished@4.3.1: - dependencies: - '@babel/runtime': 7.26.10 - possible-typed-array-names@1.0.0: {} postcss-import@15.1.0(postcss@8.5.1): @@ -12096,8 +11652,6 @@ snapshots: process-nextick-args@2.0.1: {} - process@0.11.10: {} - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -12195,17 +11749,17 @@ snapshots: dependencies: typescript: 5.6.3 - react-docgen@7.0.3: + react-docgen@8.0.0: dependencies: - '@babel/core': 7.26.0 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/core': 7.27.1 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 '@types/doctrine': 0.0.9 '@types/resolve': 1.20.4 doctrine: 3.0.0 - resolve: 1.22.8 + resolve: 1.22.10 strip-indent: 4.0.0 transitivePeerDependencies: - supports-color @@ -12298,17 +11852,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router@7.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@remix-run/router': 1.19.2 + cookie: 1.0.2 react: 18.3.1 + set-cookie-parser: 2.7.1 + optionalDependencies: react-dom: 18.3.1(react@18.3.1) - react-router: 6.26.2(react@18.3.1) - - react-router@6.26.2(react@18.3.1): - dependencies: - '@remix-run/router': 1.19.2 - react: 18.3.1 react-smooth@4.0.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: @@ -12501,12 +12051,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.8: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -12566,12 +12110,6 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.3 - es-errors: 1.3.0 - is-regex: 1.2.1 - safer-buffer@2.1.2: {} saxes@6.0.0: @@ -12611,6 +12149,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -12717,28 +12257,34 @@ snapshots: dependencies: internal-slot: 1.0.6 - storybook-addon-remix-react-router@3.1.0(@storybook/blocks@8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)))(@storybook/channels@8.1.11)(@storybook/components@8.4.6(storybook@8.5.3(prettier@3.4.1)))(@storybook/core-events@8.1.11)(@storybook/manager-api@8.4.6(storybook@8.5.3(prettier@3.4.1)))(@storybook/preview-api@8.5.3(storybook@8.5.3(prettier@3.4.1)))(@storybook/theming@8.4.6(storybook@8.5.3(prettier@3.4.1)))(react-dom@18.3.1(react@18.3.1))(react-router-dom@6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + storybook-addon-remix-react-router@5.0.0(react-dom@18.3.1(react@18.3.1))(react-router@7.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)): dependencies: - '@storybook/blocks': 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.3(prettier@3.4.1)) - '@storybook/channels': 8.1.11 - '@storybook/components': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/core-events': 8.1.11 - '@storybook/manager-api': 8.4.6(storybook@8.5.3(prettier@3.4.1)) - '@storybook/preview-api': 8.5.3(storybook@8.5.3(prettier@3.4.1)) - '@storybook/theming': 8.4.6(storybook@8.5.3(prettier@3.4.1)) + '@mjackson/form-data-parser': 0.4.0 compare-versions: 6.1.0 react-inspector: 6.0.2(react@18.3.1) - react-router-dom: 6.26.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router: 7.8.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1) optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook@8.5.3(prettier@3.4.1): + storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1): dependencies: - '@storybook/core': 8.5.3(prettier@3.4.1) + '@storybook/global': 5.0.0 + '@testing-library/jest-dom': 6.6.3 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + better-opn: 3.0.2 + esbuild: 0.25.3 + esbuild-register: 3.6.0(esbuild@0.25.3) + recast: 0.23.9 + semver: 7.6.2 + ws: 8.18.0 optionalDependencies: prettier: 3.4.1 transitivePeerDependencies: + - '@testing-library/dom' - bufferutil - supports-color - utf-8-validate @@ -12868,10 +12414,6 @@ snapshots: tapable@2.2.1: {} - telejson@7.2.0: - dependencies: - memoizerific: 1.11.3 - test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -12902,9 +12444,9 @@ snapshots: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 - tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.3: {} tmpl@1.0.5: {} @@ -13032,6 +12574,8 @@ snapshots: undici@6.21.2: {} + unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} unified@11.0.4: @@ -13087,7 +12631,7 @@ snapshots: unplugin@1.5.0: dependencies: - acorn: 8.14.0 + acorn: 8.14.1 chokidar: 3.6.0 webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 @@ -13162,14 +12706,6 @@ snapshots: util-deprecate@1.0.2: {} - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.0 - is-typed-array: 1.1.15 - which-typed-array: 1.1.18 - utils-merge@1.0.1: {} uuid@9.0.1: {} @@ -13367,6 +12903,8 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.1: {} + yoctocolors-cjs@2.1.2: {} yup@1.6.1: diff --git a/site/src/@types/storybook.d.ts b/site/src/@types/storybook.d.ts index 836728d170b9f..ccdecd690c9c8 100644 --- a/site/src/@types/storybook.d.ts +++ b/site/src/@types/storybook.d.ts @@ -9,7 +9,7 @@ import type { import type { Permissions } from "modules/permissions"; import type { QueryKey } from "react-query"; -declare module "@storybook/react" { +declare module "@storybook/react-vite" { type WebSocketEvent = | { event: "message"; data: string } | { event: "error" | "close" }; diff --git a/site/src/App.tsx b/site/src/App.tsx index e4e6d4a665996..4c0d15d436a0f 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -9,7 +9,7 @@ import { } from "react"; import { HelmetProvider } from "react-helmet-async"; import { QueryClient, QueryClientProvider } from "react-query"; -import { RouterProvider } from "react-router-dom"; +import { RouterProvider } from "react-router"; import { GlobalSnackbar } from "./components/GlobalSnackbar/GlobalSnackbar"; import { ThemeProvider } from "./contexts/ThemeProvider"; import { AuthProvider } from "./contexts/auth/AuthProvider"; diff --git a/site/src/components/Abbr/Abbr.stories.tsx b/site/src/components/Abbr/Abbr.stories.tsx index 2b64d5885c205..b32138ad54fd5 100644 --- a/site/src/components/Abbr/Abbr.stories.tsx +++ b/site/src/components/Abbr/Abbr.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Abbr } from "./Abbr"; const meta: Meta = { diff --git a/site/src/components/ActiveUserChart/ActiveUserChart.stories.tsx b/site/src/components/ActiveUserChart/ActiveUserChart.stories.tsx index f4961f0cedba8..b1f2878c95975 100644 --- a/site/src/components/ActiveUserChart/ActiveUserChart.stories.tsx +++ b/site/src/components/ActiveUserChart/ActiveUserChart.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ActiveUserChart } from "./ActiveUserChart"; const meta: Meta = { diff --git a/site/src/components/Alert/Alert.stories.tsx b/site/src/components/Alert/Alert.stories.tsx index a170f0b29d244..e122c0c07c5a6 100644 --- a/site/src/components/Alert/Alert.stories.tsx +++ b/site/src/components/Alert/Alert.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; import { Alert } from "./Alert"; diff --git a/site/src/components/Alert/ErrorAlert.stories.tsx b/site/src/components/Alert/ErrorAlert.stories.tsx index e62314c622cc6..c4f3767097326 100644 --- a/site/src/components/Alert/ErrorAlert.stories.tsx +++ b/site/src/components/Alert/ErrorAlert.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; import { mockApiError } from "testHelpers/entities"; import { ErrorAlert } from "./ErrorAlert"; diff --git a/site/src/components/Avatar/Avatar.stories.tsx b/site/src/components/Avatar/Avatar.stories.tsx index 55deeb9073dbe..256da41bfd645 100644 --- a/site/src/components/Avatar/Avatar.stories.tsx +++ b/site/src/components/Avatar/Avatar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Avatar } from "./Avatar"; const meta: Meta = { diff --git a/site/src/components/Avatar/AvatarCard.stories.tsx b/site/src/components/Avatar/AvatarCard.stories.tsx index cc8fb56e16c05..b067877e3c8dc 100644 --- a/site/src/components/Avatar/AvatarCard.stories.tsx +++ b/site/src/components/Avatar/AvatarCard.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AvatarCard } from "./AvatarCard"; const meta: Meta = { diff --git a/site/src/components/Avatar/AvatarData.stories.tsx b/site/src/components/Avatar/AvatarData.stories.tsx index 53fc4d8f17555..22f8cb45d7699 100644 --- a/site/src/components/Avatar/AvatarData.stories.tsx +++ b/site/src/components/Avatar/AvatarData.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AvatarData } from "./AvatarData"; const meta: Meta = { diff --git a/site/src/components/Avatar/AvatarDataSkeleton.stories.tsx b/site/src/components/Avatar/AvatarDataSkeleton.stories.tsx index 0df5ca083b98b..99b19a47657d6 100644 --- a/site/src/components/Avatar/AvatarDataSkeleton.stories.tsx +++ b/site/src/components/Avatar/AvatarDataSkeleton.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AvatarDataSkeleton } from "./AvatarDataSkeleton"; const meta: Meta = { diff --git a/site/src/components/Badge/Badge.stories.tsx b/site/src/components/Badge/Badge.stories.tsx index 7d900b49ff6f6..524d0e3642588 100644 --- a/site/src/components/Badge/Badge.stories.tsx +++ b/site/src/components/Badge/Badge.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Settings, TriangleAlert } from "lucide-react"; import { Badge } from "./Badge"; diff --git a/site/src/components/Badges/Badges.stories.tsx b/site/src/components/Badges/Badges.stories.tsx index 2a0a60498f487..36c8fddb37ea9 100644 --- a/site/src/components/Badges/Badges.stories.tsx +++ b/site/src/components/Badges/Badges.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AlphaBadge, Badges, diff --git a/site/src/components/Breadcrumb/Breadcrumb.stories.tsx b/site/src/components/Breadcrumb/Breadcrumb.stories.tsx index 0b02b2ebb9939..d9f8b3f97d8b5 100644 --- a/site/src/components/Breadcrumb/Breadcrumb.stories.tsx +++ b/site/src/components/Breadcrumb/Breadcrumb.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Breadcrumb, BreadcrumbEllipsis, diff --git a/site/src/components/BuildIcon/BuildIcon.stories.tsx b/site/src/components/BuildIcon/BuildIcon.stories.tsx index b2f01ad5ae38b..22481719bb4b8 100644 --- a/site/src/components/BuildIcon/BuildIcon.stories.tsx +++ b/site/src/components/BuildIcon/BuildIcon.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { BuildIcon } from "./BuildIcon"; const meta: Meta = { diff --git a/site/src/components/Button/Button.stories.tsx b/site/src/components/Button/Button.stories.tsx index ceeb395cf8006..0cfd4707f5f85 100644 --- a/site/src/components/Button/Button.stories.tsx +++ b/site/src/components/Button/Button.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { PlusIcon } from "lucide-react"; import { Button } from "./Button"; diff --git a/site/src/components/Chart/Chart.stories.tsx b/site/src/components/Chart/Chart.stories.tsx index 74fded80d2b4d..a351ba3f24ed6 100644 --- a/site/src/components/Chart/Chart.stories.tsx +++ b/site/src/components/Chart/Chart.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; import { type ChartConfig, diff --git a/site/src/components/Checkbox/Checkbox.stories.tsx b/site/src/components/Checkbox/Checkbox.stories.tsx index 2c7582dcfe901..b4cceb5ea535d 100644 --- a/site/src/components/Checkbox/Checkbox.stories.tsx +++ b/site/src/components/Checkbox/Checkbox.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import React from "react"; import { Checkbox } from "./Checkbox"; diff --git a/site/src/components/CodeExample/CodeExample.stories.tsx b/site/src/components/CodeExample/CodeExample.stories.tsx index 93283e4df74a3..0213762fd31e2 100644 --- a/site/src/components/CodeExample/CodeExample.stories.tsx +++ b/site/src/components/CodeExample/CodeExample.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { CodeExample } from "./CodeExample"; const meta: Meta = { diff --git a/site/src/components/Collapsible/Collapsible.stories.tsx b/site/src/components/Collapsible/Collapsible.stories.tsx index cb391c4d83135..ad099b03c23f0 100644 --- a/site/src/components/Collapsible/Collapsible.stories.tsx +++ b/site/src/components/Collapsible/Collapsible.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; import { ChevronsUpDown } from "lucide-react"; import { diff --git a/site/src/components/CollapsibleSummary/CollapsibleSummary.stories.tsx b/site/src/components/CollapsibleSummary/CollapsibleSummary.stories.tsx index 98f63c24ccbc7..c33a151774532 100644 --- a/site/src/components/CollapsibleSummary/CollapsibleSummary.stories.tsx +++ b/site/src/components/CollapsibleSummary/CollapsibleSummary.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "../Button/Button"; import { CollapsibleSummary } from "./CollapsibleSummary"; diff --git a/site/src/components/Combobox/Combobox.stories.tsx b/site/src/components/Combobox/Combobox.stories.tsx index 2207f4e64686f..49fafd9ab3c79 100644 --- a/site/src/components/Combobox/Combobox.stories.tsx +++ b/site/src/components/Combobox/Combobox.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, screen, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; +import { expect, screen, userEvent, waitFor, within } from "storybook/test"; import { Combobox } from "./Combobox"; const simpleOptions = ["Go", "Gleam", "Kotlin", "Rust"]; @@ -31,7 +31,9 @@ const advancedOptions = [ const ComboboxWithHooks = ({ options = advancedOptions, -}: { options?: React.ComponentProps["options"] }) => { +}: { + options?: React.ComponentProps["options"]; +}) => { const [value, setValue] = useState(""); const [open, setOpen] = useState(false); const [inputValue, setInputValue] = useState(""); diff --git a/site/src/components/Conditionals/ChooseOne.stories.tsx b/site/src/components/Conditionals/ChooseOne.stories.tsx index 4650b8a1ec1fa..8d228a3178eda 100644 --- a/site/src/components/Conditionals/ChooseOne.stories.tsx +++ b/site/src/components/Conditionals/ChooseOne.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ChooseOne, Cond } from "./ChooseOne"; const meta: Meta = { diff --git a/site/src/components/CopyButton/CopyButton.stories.tsx b/site/src/components/CopyButton/CopyButton.stories.tsx index c9c2de328f718..fc52fac242a97 100644 --- a/site/src/components/CopyButton/CopyButton.stories.tsx +++ b/site/src/components/CopyButton/CopyButton.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { CopyButton } from "./CopyButton"; const meta: Meta = { diff --git a/site/src/components/CopyableValue/CopyableValue.stories.tsx b/site/src/components/CopyableValue/CopyableValue.stories.tsx index 05cb09d57fffb..cc673e0e505ee 100644 --- a/site/src/components/CopyableValue/CopyableValue.stories.tsx +++ b/site/src/components/CopyableValue/CopyableValue.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { CopyableValue } from "./CopyableValue"; const meta: Meta = { diff --git a/site/src/components/Dialog/Dialog.stories.tsx b/site/src/components/Dialog/Dialog.stories.tsx index f0b555055d111..3385ad2774bb8 100644 --- a/site/src/components/Dialog/Dialog.stories.tsx +++ b/site/src/components/Dialog/Dialog.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; +import { userEvent, within } from "storybook/test"; import { Dialog, DialogContent, diff --git a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.stories.tsx b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.stories.tsx index dc257e7250b52..99895cb5b9567 100644 --- a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.stories.tsx +++ b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { ConfirmDialog } from "./ConfirmDialog"; const meta: Meta = { diff --git a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.stories.tsx b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.stories.tsx index 68f00eaa5c7e0..a86eee62b95ed 100644 --- a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.stories.tsx +++ b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.stories.tsx @@ -1,7 +1,7 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { within } from "@testing-library/react"; +import { action } from "storybook/actions"; +import { userEvent } from "storybook/test"; import { DeleteDialog } from "./DeleteDialog"; const meta: Meta = { diff --git a/site/src/components/DropdownArrow/DropdownArrow.stories.tsx b/site/src/components/DropdownArrow/DropdownArrow.stories.tsx index a6a0f182427a3..1221e5f091e6a 100644 --- a/site/src/components/DropdownArrow/DropdownArrow.stories.tsx +++ b/site/src/components/DropdownArrow/DropdownArrow.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { DropdownArrow } from "./DropdownArrow"; diff --git a/site/src/components/DropdownMenu/DropdownMenu.stories.tsx b/site/src/components/DropdownMenu/DropdownMenu.stories.tsx index f9ba8cd290902..3276a5fbed97a 100644 --- a/site/src/components/DropdownMenu/DropdownMenu.stories.tsx +++ b/site/src/components/DropdownMenu/DropdownMenu.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; +import { userEvent, within } from "storybook/test"; import { DropdownMenu, DropdownMenuContent, diff --git a/site/src/components/DurationField/DurationField.stories.tsx b/site/src/components/DurationField/DurationField.stories.tsx index 60c441aa85d79..a68f3454ff838 100644 --- a/site/src/components/DurationField/DurationField.stories.tsx +++ b/site/src/components/DurationField/DurationField.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; +import { expect, userEvent, within } from "storybook/test"; import { DurationField } from "./DurationField"; const meta: Meta = { diff --git a/site/src/components/EmptyState/EmptyState.stories.tsx b/site/src/components/EmptyState/EmptyState.stories.tsx index 8b9780bb44fca..5497ab8cbad01 100644 --- a/site/src/components/EmptyState/EmptyState.stories.tsx +++ b/site/src/components/EmptyState/EmptyState.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; import { EmptyState } from "./EmptyState"; diff --git a/site/src/components/ErrorBoundary/GlobalErrorBoundary.stories.tsx b/site/src/components/ErrorBoundary/GlobalErrorBoundary.stories.tsx index 9c6deed539c21..c013b1cfa543e 100644 --- a/site/src/components/ErrorBoundary/GlobalErrorBoundary.stories.tsx +++ b/site/src/components/ErrorBoundary/GlobalErrorBoundary.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { within } from "@testing-library/react"; -import type { ErrorResponse } from "react-router-dom"; +import type { ErrorResponse } from "react-router"; +import { expect, userEvent } from "storybook/test"; import { GlobalErrorBoundaryInner } from "./GlobalErrorBoundary"; /** diff --git a/site/src/components/ErrorBoundary/GlobalErrorBoundary.tsx b/site/src/components/ErrorBoundary/GlobalErrorBoundary.tsx index 009a87ba254e0..e9042eefb7d6b 100644 --- a/site/src/components/ErrorBoundary/GlobalErrorBoundary.tsx +++ b/site/src/components/ErrorBoundary/GlobalErrorBoundary.tsx @@ -9,7 +9,7 @@ import { isRouteErrorResponse, useLocation, useRouteError, -} from "react-router-dom"; +} from "react-router"; const errorPageTitle = "Something went wrong"; diff --git a/site/src/components/Expander/Expander.stories.tsx b/site/src/components/Expander/Expander.stories.tsx index 0f3e8f26e7029..b4f768e14df6b 100644 --- a/site/src/components/Expander/Expander.stories.tsx +++ b/site/src/components/Expander/Expander.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Expander } from "./Expander"; const meta: Meta = { diff --git a/site/src/components/FeatureStageBadge/FeatureStageBadge.stories.tsx b/site/src/components/FeatureStageBadge/FeatureStageBadge.stories.tsx index c0f3aad774473..7804dcd77433f 100644 --- a/site/src/components/FeatureStageBadge/FeatureStageBadge.stories.tsx +++ b/site/src/components/FeatureStageBadge/FeatureStageBadge.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { FeatureStageBadge } from "./FeatureStageBadge"; const meta: Meta = { diff --git a/site/src/components/FileUpload/FileUpload.stories.tsx b/site/src/components/FileUpload/FileUpload.stories.tsx index ab40e794bf76b..286a345b29f5f 100644 --- a/site/src/components/FileUpload/FileUpload.stories.tsx +++ b/site/src/components/FileUpload/FileUpload.stories.tsx @@ -1,5 +1,5 @@ import Link from "@mui/material/Link"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { FileUpload } from "./FileUpload"; const meta: Meta = { diff --git a/site/src/components/Filter/Filter.tsx b/site/src/components/Filter/Filter.tsx index 736592116730d..b253c947ca486 100644 --- a/site/src/components/Filter/Filter.tsx +++ b/site/src/components/Filter/Filter.tsx @@ -16,7 +16,7 @@ import { useDebouncedFunction } from "hooks/debounce"; import { ExternalLinkIcon } from "lucide-react"; import { ChevronDownIcon } from "lucide-react"; import { type FC, type ReactNode, useEffect, useRef, useState } from "react"; -import type { useSearchParams } from "react-router-dom"; +import type { useSearchParams } from "react-router"; type PresetFilter = { name: string; diff --git a/site/src/components/Filter/SelectFilter.stories.tsx b/site/src/components/Filter/SelectFilter.stories.tsx index fcb187c1c098c..4947ed20dc4f7 100644 --- a/site/src/components/Filter/SelectFilter.stories.tsx +++ b/site/src/components/Filter/SelectFilter.stories.tsx @@ -1,8 +1,8 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Avatar } from "components/Avatar/Avatar"; import { useState } from "react"; +import { action } from "storybook/actions"; +import { expect, userEvent, within } from "storybook/test"; import { withDesktopViewport } from "testHelpers/storybook"; import { SelectFilter, diff --git a/site/src/components/Filter/storyHelpers.ts b/site/src/components/Filter/storyHelpers.ts index 9ee1bfaef96ac..a499fe2072521 100644 --- a/site/src/components/Filter/storyHelpers.ts +++ b/site/src/components/Filter/storyHelpers.ts @@ -1,4 +1,4 @@ -import { action } from "@storybook/addon-actions"; +import { action } from "storybook/actions"; import type { UseFilterResult } from "./Filter"; import type { UseFilterMenuResult } from "./menu"; diff --git a/site/src/components/Form/Form.stories.tsx b/site/src/components/Form/Form.stories.tsx index 46c783347b374..7ba89fa440747 100644 --- a/site/src/components/Form/Form.stories.tsx +++ b/site/src/components/Form/Form.stories.tsx @@ -1,5 +1,5 @@ import TextField from "@mui/material/TextField"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Form, FormFields, FormSection } from "./Form"; const meta: Meta = { diff --git a/site/src/components/FullPageForm/FullPageForm.stories.tsx b/site/src/components/FullPageForm/FullPageForm.stories.tsx index cb15173f07e46..5ef859d4c6a33 100644 --- a/site/src/components/FullPageForm/FullPageForm.stories.tsx +++ b/site/src/components/FullPageForm/FullPageForm.stories.tsx @@ -1,5 +1,5 @@ import TextField from "@mui/material/TextField"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; import { FormFooter } from "components/Form/Form"; import type { FC } from "react"; diff --git a/site/src/components/FullPageLayout/Sidebar.tsx b/site/src/components/FullPageLayout/Sidebar.tsx index 8852d796abaa0..8a5eaf9b4f6be 100644 --- a/site/src/components/FullPageLayout/Sidebar.tsx +++ b/site/src/components/FullPageLayout/Sidebar.tsx @@ -1,6 +1,6 @@ import { type Interpolation, type Theme, useTheme } from "@emotion/react"; import type { ComponentProps, FC, HTMLAttributes } from "react"; -import { Link, type LinkProps } from "react-router-dom"; +import { Link, type LinkProps } from "react-router"; import { TopbarIconButton } from "./Topbar"; export const Sidebar: FC> = (props) => { diff --git a/site/src/components/GlobalSnackbar/EnterpriseSnackbar.stories.tsx b/site/src/components/GlobalSnackbar/EnterpriseSnackbar.stories.tsx index a24a10446ff9a..d2f50edcc7512 100644 --- a/site/src/components/GlobalSnackbar/EnterpriseSnackbar.stories.tsx +++ b/site/src/components/GlobalSnackbar/EnterpriseSnackbar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { EnterpriseSnackbar } from "./EnterpriseSnackbar"; const meta: Meta = { diff --git a/site/src/components/HelpTooltip/HelpTooltip.stories.tsx b/site/src/components/HelpTooltip/HelpTooltip.stories.tsx index da95b526312ab..a0c1d7522916e 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.stories.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { HelpTooltip, HelpTooltipLink, diff --git a/site/src/components/IconField/IconField.stories.tsx b/site/src/components/IconField/IconField.stories.tsx index 47d0c46bd6314..698c1d6d356d3 100644 --- a/site/src/components/IconField/IconField.stories.tsx +++ b/site/src/components/IconField/IconField.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { IconField } from "./IconField"; const meta: Meta = { diff --git a/site/src/components/InfoTooltip/InfoTooltip.stories.tsx b/site/src/components/InfoTooltip/InfoTooltip.stories.tsx index 28e0072b8cedd..b531e052fd356 100644 --- a/site/src/components/InfoTooltip/InfoTooltip.stories.tsx +++ b/site/src/components/InfoTooltip/InfoTooltip.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { InfoTooltip } from "./InfoTooltip"; const meta = { diff --git a/site/src/components/Input/Input.stories.tsx b/site/src/components/Input/Input.stories.tsx index ba88692f66c49..b7fabf506a27e 100644 --- a/site/src/components/Input/Input.stories.tsx +++ b/site/src/components/Input/Input.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Input } from "./Input"; const meta: Meta = { diff --git a/site/src/components/InputGroup/InputGroup.stories.tsx b/site/src/components/InputGroup/InputGroup.stories.tsx index 53c451b31a4d1..77c86e52344ae 100644 --- a/site/src/components/InputGroup/InputGroup.stories.tsx +++ b/site/src/components/InputGroup/InputGroup.stories.tsx @@ -1,6 +1,6 @@ import Button from "@mui/material/Button"; import TextField from "@mui/material/TextField"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { InputGroup } from "./InputGroup"; const meta: Meta = { diff --git a/site/src/components/Label/Label.stories.tsx b/site/src/components/Label/Label.stories.tsx index 11d3f928212cd..0c4360fd0c5c9 100644 --- a/site/src/components/Label/Label.stories.tsx +++ b/site/src/components/Label/Label.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Label } from "./Label"; const meta: Meta = { diff --git a/site/src/components/LastSeen/LastSeen.stories.tsx b/site/src/components/LastSeen/LastSeen.stories.tsx index 1f0fc5674e2c2..f75cc4c8a74b2 100644 --- a/site/src/components/LastSeen/LastSeen.stories.tsx +++ b/site/src/components/LastSeen/LastSeen.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import dayjs from "dayjs"; import { LastSeen } from "./LastSeen"; diff --git a/site/src/components/Latency/Latency.stories.tsx b/site/src/components/Latency/Latency.stories.tsx index 7ee0174bfd3fb..370873c05636b 100644 --- a/site/src/components/Latency/Latency.stories.tsx +++ b/site/src/components/Latency/Latency.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Latency } from "./Latency"; const meta: Meta = { diff --git a/site/src/components/Link/Link.stories.tsx b/site/src/components/Link/Link.stories.tsx index 30cd346878877..57d2a03146757 100644 --- a/site/src/components/Link/Link.stories.tsx +++ b/site/src/components/Link/Link.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Link } from "./Link"; const meta: Meta = { diff --git a/site/src/components/Loader/Loader.stories.tsx b/site/src/components/Loader/Loader.stories.tsx index f0b6c5105a43d..c8994aaafd6b8 100644 --- a/site/src/components/Loader/Loader.stories.tsx +++ b/site/src/components/Loader/Loader.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Loader } from "./Loader"; const meta: Meta = { diff --git a/site/src/components/Logs/LogLine.stories.tsx b/site/src/components/Logs/LogLine.stories.tsx index c862755485b04..dcbca361526d0 100644 --- a/site/src/components/Logs/LogLine.stories.tsx +++ b/site/src/components/Logs/LogLine.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { LogLine, LogLinePrefix } from "./LogLine"; diff --git a/site/src/components/Logs/Logs.stories.tsx b/site/src/components/Logs/Logs.stories.tsx index 93ef23671bf84..01b9b6fa8c297 100644 --- a/site/src/components/Logs/Logs.stories.tsx +++ b/site/src/components/Logs/Logs.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockWorkspaceBuildLogs } from "testHelpers/entities"; import type { Line } from "./LogLine"; diff --git a/site/src/components/Margins/Margins.stories.tsx b/site/src/components/Margins/Margins.stories.tsx index 2fe910aeb6904..83cdd72b8f70b 100644 --- a/site/src/components/Margins/Margins.stories.tsx +++ b/site/src/components/Margins/Margins.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Margins } from "./Margins"; const meta: Meta = { diff --git a/site/src/components/Markdown/Markdown.stories.tsx b/site/src/components/Markdown/Markdown.stories.tsx index 37a0670c73fdb..b2351c1d43153 100644 --- a/site/src/components/Markdown/Markdown.stories.tsx +++ b/site/src/components/Markdown/Markdown.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Markdown } from "./Markdown"; const meta: Meta = { diff --git a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx index 7c2a4e4d60057..1c557eda5601b 100644 --- a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx +++ b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockOrganization, MockOrganization2 } from "testHelpers/entities"; import { MultiSelectCombobox } from "./MultiSelectCombobox"; diff --git a/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx b/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx index 949b293dfce04..0ce78c7cd5cbc 100644 --- a/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx +++ b/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx @@ -1,6 +1,6 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; +import { userEvent, within } from "storybook/test"; import { MockOrganization, MockOrganization2, diff --git a/site/src/components/OverflowY/OverflowY.stories.tsx b/site/src/components/OverflowY/OverflowY.stories.tsx index dfa35331b2ecd..65a76755ef3a2 100644 --- a/site/src/components/OverflowY/OverflowY.stories.tsx +++ b/site/src/components/OverflowY/OverflowY.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { OverflowY } from "./OverflowY"; const numbers: number[] = []; diff --git a/site/src/components/PageHeader/PageHeader.stories.tsx b/site/src/components/PageHeader/PageHeader.stories.tsx index e5f21d779b887..f377e14eb1c6e 100644 --- a/site/src/components/PageHeader/PageHeader.stories.tsx +++ b/site/src/components/PageHeader/PageHeader.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { PageHeader, PageHeaderSubtitle, PageHeaderTitle } from "./PageHeader"; const meta: Meta = { diff --git a/site/src/components/PaginationWidget/PaginationContainer.stories.tsx b/site/src/components/PaginationWidget/PaginationContainer.stories.tsx index 0a678d36de3c7..a07800108fe59 100644 --- a/site/src/components/PaginationWidget/PaginationContainer.stories.tsx +++ b/site/src/components/PaginationWidget/PaginationContainer.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { ComponentProps, FC, diff --git a/site/src/components/PaginationWidget/PaginationWidgetBase.stories.tsx b/site/src/components/PaginationWidget/PaginationWidgetBase.stories.tsx index f3ea83100e7aa..0eea6923a3cb7 100644 --- a/site/src/components/PaginationWidget/PaginationWidgetBase.stories.tsx +++ b/site/src/components/PaginationWidget/PaginationWidgetBase.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { PaginationWidgetBase } from "./PaginationWidgetBase"; const meta: Meta = { diff --git a/site/src/components/PasswordField/PasswordField.stories.tsx b/site/src/components/PasswordField/PasswordField.stories.tsx index 4eba909c4c6ef..ae860b442b627 100644 --- a/site/src/components/PasswordField/PasswordField.stories.tsx +++ b/site/src/components/PasswordField/PasswordField.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, spyOn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import { useState } from "react"; +import { expect, spyOn, userEvent, waitFor, within } from "storybook/test"; import { PasswordField } from "./PasswordField"; const meta: Meta = { diff --git a/site/src/components/Paywall/Paywall.stories.tsx b/site/src/components/Paywall/Paywall.stories.tsx index c75c74c402af1..d5ff40d854ef6 100644 --- a/site/src/components/Paywall/Paywall.stories.tsx +++ b/site/src/components/Paywall/Paywall.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Paywall } from "./Paywall"; const meta: Meta = { diff --git a/site/src/components/Paywall/PopoverPaywall.stories.tsx b/site/src/components/Paywall/PopoverPaywall.stories.tsx index 2d9b1c7c4b577..9937328314b97 100644 --- a/site/src/components/Paywall/PopoverPaywall.stories.tsx +++ b/site/src/components/Paywall/PopoverPaywall.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { PopoverPaywall } from "./PopoverPaywall"; const meta: Meta = { diff --git a/site/src/components/Pill/Pill.stories.tsx b/site/src/components/Pill/Pill.stories.tsx index 0786216146862..24740fd8417e9 100644 --- a/site/src/components/Pill/Pill.stories.tsx +++ b/site/src/components/Pill/Pill.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { InfoIcon } from "lucide-react"; import { Pill, PillSpinner } from "./Pill"; diff --git a/site/src/components/Popover/Popover.stories.tsx b/site/src/components/Popover/Popover.stories.tsx index f0e57902175b4..43fe64e770079 100644 --- a/site/src/components/Popover/Popover.stories.tsx +++ b/site/src/components/Popover/Popover.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, screen, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; +import { expect, screen, userEvent, waitFor, within } from "storybook/test"; import { Popover, PopoverContent, PopoverTrigger } from "./Popover"; const meta: Meta = { diff --git a/site/src/components/RadioGroup/RadioGroup.stories.tsx b/site/src/components/RadioGroup/RadioGroup.stories.tsx index c175de242ca2f..f44a9b4f3d297 100644 --- a/site/src/components/RadioGroup/RadioGroup.stories.tsx +++ b/site/src/components/RadioGroup/RadioGroup.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { RadioGroup, RadioGroupItem } from "./RadioGroup"; const meta: Meta = { diff --git a/site/src/components/RichParameterInput/RichParameterInput.stories.tsx b/site/src/components/RichParameterInput/RichParameterInput.stories.tsx index 1ee5206ee43e6..e2d23ba13311a 100644 --- a/site/src/components/RichParameterInput/RichParameterInput.stories.tsx +++ b/site/src/components/RichParameterInput/RichParameterInput.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { TemplateVersionParameter } from "api/typesGenerated"; import { chromatic } from "testHelpers/chromatic"; import { RichParameterInput } from "./RichParameterInput"; diff --git a/site/src/components/Search/Search.stories.tsx b/site/src/components/Search/Search.stories.tsx index d66e8a0142ce2..b923a2895273e 100644 --- a/site/src/components/Search/Search.stories.tsx +++ b/site/src/components/Search/Search.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Search, SearchInput } from "./Search"; const meta: Meta = { diff --git a/site/src/components/SearchField/SearchField.stories.tsx b/site/src/components/SearchField/SearchField.stories.tsx index 79e76d4d6ad82..239b8f27ce21b 100644 --- a/site/src/components/SearchField/SearchField.stories.tsx +++ b/site/src/components/SearchField/SearchField.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; +import { userEvent, within } from "storybook/test"; import { SearchField } from "./SearchField"; const meta: Meta = { diff --git a/site/src/components/Select/Select.stories.tsx b/site/src/components/Select/Select.stories.tsx index 12854a0478fd0..2a40eb0c08a71 100644 --- a/site/src/components/Select/Select.stories.tsx +++ b/site/src/components/Select/Select.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Select, SelectContent, diff --git a/site/src/components/SelectMenu/SelectMenu.stories.tsx b/site/src/components/SelectMenu/SelectMenu.stories.tsx index 4cbcb465db4bd..c55c16e2103b5 100644 --- a/site/src/components/SelectMenu/SelectMenu.stories.tsx +++ b/site/src/components/SelectMenu/SelectMenu.stories.tsx @@ -1,7 +1,7 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Avatar } from "components/Avatar/Avatar"; +import { action } from "storybook/actions"; +import { userEvent, within } from "storybook/test"; import { withDesktopViewport } from "testHelpers/storybook"; import { SelectMenu, diff --git a/site/src/components/SettingsHeader/SettingsHeader.stories.tsx b/site/src/components/SettingsHeader/SettingsHeader.stories.tsx index 75381d419c4dc..c5e90e1fbd817 100644 --- a/site/src/components/SettingsHeader/SettingsHeader.stories.tsx +++ b/site/src/components/SettingsHeader/SettingsHeader.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { docs } from "utils/docs"; import { SettingsHeader, diff --git a/site/src/components/Sidebar/Sidebar.stories.tsx b/site/src/components/Sidebar/Sidebar.stories.tsx index 075de1e584ca2..083bffa423fe4 100644 --- a/site/src/components/Sidebar/Sidebar.stories.tsx +++ b/site/src/components/Sidebar/Sidebar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Avatar } from "components/Avatar/Avatar"; import { CalendarCogIcon, diff --git a/site/src/components/Sidebar/Sidebar.tsx b/site/src/components/Sidebar/Sidebar.tsx index 7e3b09d811b1b..813835baeb277 100644 --- a/site/src/components/Sidebar/Sidebar.tsx +++ b/site/src/components/Sidebar/Sidebar.tsx @@ -3,7 +3,7 @@ import type { CSSObject, Interpolation, Theme } from "@emotion/react"; import { Stack } from "components/Stack/Stack"; import { type ClassName, useClassName } from "hooks/useClassName"; import type { ElementType, FC, ReactNode } from "react"; -import { Link, NavLink } from "react-router-dom"; +import { Link, NavLink } from "react-router"; import { cn } from "utils/cn"; interface SidebarProps { diff --git a/site/src/components/Slider/Slider.stories.tsx b/site/src/components/Slider/Slider.stories.tsx index 480e12c090382..4984bdac68171 100644 --- a/site/src/components/Slider/Slider.stories.tsx +++ b/site/src/components/Slider/Slider.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import React from "react"; import { Slider } from "./Slider"; diff --git a/site/src/components/Spinner/Spinner.stories.tsx b/site/src/components/Spinner/Spinner.stories.tsx index f1cd9e1b24ff2..08618e9f54da0 100644 --- a/site/src/components/Spinner/Spinner.stories.tsx +++ b/site/src/components/Spinner/Spinner.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { PlusIcon } from "lucide-react"; import { Spinner } from "./Spinner"; diff --git a/site/src/components/Stack/Stack.stories.tsx b/site/src/components/Stack/Stack.stories.tsx index 33e7a47496696..7931b96aa5804 100644 --- a/site/src/components/Stack/Stack.stories.tsx +++ b/site/src/components/Stack/Stack.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Stack } from "./Stack"; const meta: Meta = { diff --git a/site/src/components/StatusIndicator/StatusIndicator.stories.tsx b/site/src/components/StatusIndicator/StatusIndicator.stories.tsx index f291089916060..8653fc37a23c7 100644 --- a/site/src/components/StatusIndicator/StatusIndicator.stories.tsx +++ b/site/src/components/StatusIndicator/StatusIndicator.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { StatusIndicator, StatusIndicatorDot } from "./StatusIndicator"; const meta: Meta = { diff --git a/site/src/components/Switch/Switch.stories.tsx b/site/src/components/Switch/Switch.stories.tsx index 8563a23c9c5ca..39c8fe0e42a4c 100644 --- a/site/src/components/Switch/Switch.stories.tsx +++ b/site/src/components/Switch/Switch.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Switch } from "./Switch"; const meta: Meta = { diff --git a/site/src/components/Table/Table.stories.tsx b/site/src/components/Table/Table.stories.tsx index 41361f3ab59fe..ee9369c8a3347 100644 --- a/site/src/components/Table/Table.stories.tsx +++ b/site/src/components/Table/Table.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Table, TableBody, diff --git a/site/src/components/TableEmpty/TableEmpty.stories.tsx b/site/src/components/TableEmpty/TableEmpty.stories.tsx index e9a91c707bc0e..51295c63d2607 100644 --- a/site/src/components/TableEmpty/TableEmpty.stories.tsx +++ b/site/src/components/TableEmpty/TableEmpty.stories.tsx @@ -1,7 +1,7 @@ import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableContainer from "@mui/material/TableContainer"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { CodeExample } from "components/CodeExample/CodeExample"; import { TableEmpty } from "./TableEmpty"; diff --git a/site/src/components/TableLoader/TableLoader.stories.tsx b/site/src/components/TableLoader/TableLoader.stories.tsx index 92045c92686a9..645b4e343c493 100644 --- a/site/src/components/TableLoader/TableLoader.stories.tsx +++ b/site/src/components/TableLoader/TableLoader.stories.tsx @@ -1,7 +1,7 @@ import Table from "@mui/material/Table"; import TableBody from "@mui/material/TableBody"; import TableContainer from "@mui/material/TableContainer"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TableLoader } from "./TableLoader"; const meta: Meta = { diff --git a/site/src/components/TableToolbar/TableToolbar.stories.tsx b/site/src/components/TableToolbar/TableToolbar.stories.tsx index 6f3ccbf781907..c99d7199624ae 100644 --- a/site/src/components/TableToolbar/TableToolbar.stories.tsx +++ b/site/src/components/TableToolbar/TableToolbar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { PaginationStatus, TableToolbar } from "./TableToolbar"; const meta: Meta = { diff --git a/site/src/components/Tabs/Tabs.stories.tsx b/site/src/components/Tabs/Tabs.stories.tsx index b7679dccd4bba..aa38e54776b55 100644 --- a/site/src/components/Tabs/Tabs.stories.tsx +++ b/site/src/components/Tabs/Tabs.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TabLink, Tabs, TabsList } from "./Tabs"; const meta: Meta = { diff --git a/site/src/components/Tabs/Tabs.tsx b/site/src/components/Tabs/Tabs.tsx index bdb5aa063da69..e18db55871b1d 100644 --- a/site/src/components/Tabs/Tabs.tsx +++ b/site/src/components/Tabs/Tabs.tsx @@ -1,5 +1,5 @@ import { type FC, type HTMLAttributes, createContext, useContext } from "react"; -import { Link, type LinkProps } from "react-router-dom"; +import { Link, type LinkProps } from "react-router"; import { cn } from "utils/cn"; // Keeping this for now because of a workaround in WorkspaceBUildPageView diff --git a/site/src/components/TagInput/TagInput.stories.tsx b/site/src/components/TagInput/TagInput.stories.tsx index 5b1a9f8b14229..207ce08aacbc4 100644 --- a/site/src/components/TagInput/TagInput.stories.tsx +++ b/site/src/components/TagInput/TagInput.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TagInput } from "./TagInput"; const meta: Meta = { diff --git a/site/src/components/Textarea/Textarea.stories.tsx b/site/src/components/Textarea/Textarea.stories.tsx index fff9f22770548..13d41c7433397 100644 --- a/site/src/components/Textarea/Textarea.stories.tsx +++ b/site/src/components/Textarea/Textarea.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; +import { expect, userEvent, within } from "storybook/test"; import { Textarea } from "./Textarea"; const meta: Meta = { diff --git a/site/src/components/Tooltip/Tooltip.stories.tsx b/site/src/components/Tooltip/Tooltip.stories.tsx index 9af79ca76c099..eba8de52461fd 100644 --- a/site/src/components/Tooltip/Tooltip.stories.tsx +++ b/site/src/components/Tooltip/Tooltip.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; import { Tooltip, diff --git a/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx b/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx index 9e2c78e41d8df..1b8b21b90ca61 100644 --- a/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx +++ b/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockOrganizationMember } from "testHelpers/entities"; import { MemberAutocomplete } from "./UserAutocomplete"; diff --git a/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx b/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx index 06c16e22fdebe..44fb632c8698e 100644 --- a/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx +++ b/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockUserOwner } from "testHelpers/entities"; import { UserAutocomplete } from "./UserAutocomplete"; diff --git a/site/src/components/Welcome/Welcome.stories.tsx b/site/src/components/Welcome/Welcome.stories.tsx index 9150f84e1357f..c365548d58c2f 100644 --- a/site/src/components/Welcome/Welcome.stories.tsx +++ b/site/src/components/Welcome/Welcome.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Welcome } from "./Welcome"; const meta: Meta = { diff --git a/site/src/components/deprecated/Popover/Popover.stories.tsx b/site/src/components/deprecated/Popover/Popover.stories.tsx index ad1c9d4b346cf..8661044c5187a 100644 --- a/site/src/components/deprecated/Popover/Popover.stories.tsx +++ b/site/src/components/deprecated/Popover/Popover.stories.tsx @@ -1,6 +1,6 @@ import Button from "@mui/material/Button"; -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, screen, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, screen, userEvent, waitFor, within } from "storybook/test"; import { Popover, PopoverContent, PopoverTrigger } from "./Popover"; const meta: Meta = { diff --git a/site/src/contexts/auth/RequireAuth.tsx b/site/src/contexts/auth/RequireAuth.tsx index 0476d99a168ed..134d3d0c1d926 100644 --- a/site/src/contexts/auth/RequireAuth.tsx +++ b/site/src/contexts/auth/RequireAuth.tsx @@ -4,7 +4,7 @@ import { Loader } from "components/Loader/Loader"; import { ProxyProvider as ProductionProxyProvider } from "contexts/ProxyContext"; import { DashboardProvider as ProductionDashboardProvider } from "modules/dashboard/DashboardProvider"; import { type FC, useEffect } from "react"; -import { Navigate, Outlet, useLocation } from "react-router-dom"; +import { Navigate, Outlet, useLocation } from "react-router"; import { embedRedirect } from "utils/redirect"; import { useAuthContext } from "./AuthProvider"; diff --git a/site/src/hooks/usePaginatedQuery.ts b/site/src/hooks/usePaginatedQuery.ts index e1869f1575181..e5a49a7245c75 100644 --- a/site/src/hooks/usePaginatedQuery.ts +++ b/site/src/hooks/usePaginatedQuery.ts @@ -9,7 +9,7 @@ import { useQuery, useQueryClient, } from "react-query"; -import { type SetURLSearchParams, useSearchParams } from "react-router-dom"; +import { type SetURLSearchParams, useSearchParams } from "react-router"; import { useEffectEvent } from "./hookPolyfills"; const DEFAULT_RECORDS_PER_PAGE = 25; diff --git a/site/src/hooks/usePagination.ts b/site/src/hooks/usePagination.ts index 72ea70868fb30..146ad9707da25 100644 --- a/site/src/hooks/usePagination.ts +++ b/site/src/hooks/usePagination.ts @@ -1,5 +1,5 @@ import { DEFAULT_RECORDS_PER_PAGE } from "components/PaginationWidget/utils"; -import type { useSearchParams } from "react-router-dom"; +import type { useSearchParams } from "react-router"; export const usePagination = ({ searchParamsResult, diff --git a/site/src/hooks/useSearchParamsKey.ts b/site/src/hooks/useSearchParamsKey.ts index b2c452c8a00d7..8852644375cc5 100644 --- a/site/src/hooks/useSearchParamsKey.ts +++ b/site/src/hooks/useSearchParamsKey.ts @@ -1,4 +1,4 @@ -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; type UseSearchParamsKeyConfig = Readonly<{ key: string; diff --git a/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx b/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx index ef7f1c49cc7d4..faa46ab5142cd 100644 --- a/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx +++ b/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceBuild } from "testHelpers/entities"; import { BuildAvatar } from "./BuildAvatar"; diff --git a/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.stories.tsx b/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.stories.tsx index a6836cbd9b86c..a7821fc608aa1 100644 --- a/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.stories.tsx +++ b/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AnnouncementBannerView } from "./AnnouncementBannerView"; const meta: Meta = { diff --git a/site/src/modules/dashboard/DashboardLayout.tsx b/site/src/modules/dashboard/DashboardLayout.tsx index 095be6523275c..140d8602b2b32 100644 --- a/site/src/modules/dashboard/DashboardLayout.tsx +++ b/site/src/modules/dashboard/DashboardLayout.tsx @@ -7,7 +7,7 @@ import { InfoIcon } from "lucide-react"; import { AnnouncementBanners } from "modules/dashboard/AnnouncementBanners/AnnouncementBanners"; import { LicenseBanner } from "modules/dashboard/LicenseBanner/LicenseBanner"; import { type FC, type HTMLAttributes, Suspense } from "react"; -import { Outlet } from "react-router-dom"; +import { Outlet } from "react-router"; import { docs } from "utils/docs"; import { DeploymentBanner } from "./DeploymentBanner/DeploymentBanner"; import { Navbar } from "./Navbar/Navbar"; diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx index 189e1b8039cd6..46a08d6dd6b17 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBanner.tsx @@ -3,7 +3,7 @@ import { deploymentStats } from "api/queries/deployment"; import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { useLocation } from "react-router-dom"; +import { useLocation } from "react-router"; import { DeploymentBannerView } from "./DeploymentBannerView"; const HIDE_DEPLOYMENT_BANNER_PATHS = [ diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx index 15cf7f64ee1b2..6d8e4c98552b3 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DeploymentHealthUnhealthy, MockDeploymentStats, diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx index 1a5ef6ebb4cfb..e6e4c8e32be84 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx @@ -31,7 +31,7 @@ import { useMemo, useState, } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { MONOSPACE_FONT_FAMILY } from "theme/constants"; import colors from "theme/tailwindColors"; import { getDisplayWorkspaceStatus } from "utils/workspace"; diff --git a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx index d5ea963d1f176..15046ebfd1cb2 100644 --- a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx +++ b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { LicenseBannerView } from "./LicenseBannerView"; diff --git a/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx b/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx index f7376d99dd387..fe71c20d67fa3 100644 --- a/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx +++ b/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx @@ -10,7 +10,7 @@ import { import { ChevronDownIcon } from "lucide-react"; import { linkToAuditing } from "modules/navigation"; import type { FC } from "react"; -import { NavLink } from "react-router-dom"; +import { NavLink } from "react-router"; interface DeploymentDropdownProps { canViewDeployment: boolean; diff --git a/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx b/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx index cb186dcb973b0..0a86742f485a9 100644 --- a/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx +++ b/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { fn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { PointerEventsCheckLevel } from "@testing-library/user-event"; import type { FC } from "react"; +import { fn, userEvent, within } from "storybook/test"; import { MockPrimaryWorkspaceProxy, MockProxyLatencies, @@ -135,7 +135,9 @@ function setupUser() { async function openAdminSettings({ canvasElement, -}: { canvasElement: HTMLElement }) { +}: { + canvasElement: HTMLElement; +}) { const user = setupUser(); const body = within(canvasElement.ownerDocument.body); const menuItem = await body.findByRole("menuitem", { diff --git a/site/src/modules/dashboard/Navbar/MobileMenu.tsx b/site/src/modules/dashboard/Navbar/MobileMenu.tsx index 8bdbc04a49c46..eb40230c91d4e 100644 --- a/site/src/modules/dashboard/Navbar/MobileMenu.tsx +++ b/site/src/modules/dashboard/Navbar/MobileMenu.tsx @@ -23,7 +23,7 @@ import { XIcon, } from "lucide-react"; import { type FC, useState } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; import { cn } from "utils/cn"; import { sortProxiesByLatency } from "./proxyUtils"; diff --git a/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx b/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx index 6bd076a1c1c68..af6ba75ff38f4 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { chromaticWithTablet } from "testHelpers/chromatic"; import { MockUserMember, MockUserOwner } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; diff --git a/site/src/modules/dashboard/Navbar/NavbarView.tsx b/site/src/modules/dashboard/Navbar/NavbarView.tsx index 7b1bd9fc535ed..14ecbe660d4a6 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.tsx @@ -8,7 +8,7 @@ import { useWebpushNotifications } from "contexts/useWebpushNotifications"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { NotificationsInbox } from "modules/notifications/NotificationsInbox/NotificationsInbox"; import type { FC } from "react"; -import { NavLink, useLocation } from "react-router-dom"; +import { NavLink, useLocation } from "react-router"; import { cn } from "utils/cn"; import { DeploymentDropdown } from "./DeploymentDropdown"; import { MobileMenu } from "./MobileMenu"; diff --git a/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx b/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx index 15dbb18471c3f..e7b29284f7f6e 100644 --- a/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx +++ b/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx @@ -1,9 +1,9 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { fn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getAuthorizationKey } from "api/queries/authCheck"; import { getPreferredProxy } from "contexts/ProxyContext"; import { AuthProvider } from "contexts/auth/AuthProvider"; import { permissionChecks } from "modules/permissions"; +import { fn, userEvent, within } from "storybook/test"; import { MockAuthMethodsAll, MockPermissions, diff --git a/site/src/modules/dashboard/Navbar/ProxyMenu.tsx b/site/src/modules/dashboard/Navbar/ProxyMenu.tsx index 97e360984357f..3f41b5e51cde9 100644 --- a/site/src/modules/dashboard/Navbar/ProxyMenu.tsx +++ b/site/src/modules/dashboard/Navbar/ProxyMenu.tsx @@ -13,7 +13,7 @@ import type { ProxyContextValue } from "contexts/ProxyContext"; import { useAuthenticated } from "hooks"; import { ChevronDownIcon } from "lucide-react"; import { type FC, useRef, useState } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { sortProxiesByLatency } from "./proxyUtils"; interface ProxyMenuProps { diff --git a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx index 24ffe6adf8ca6..bb5c518e342f8 100644 --- a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx +++ b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, screen, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, screen, userEvent, waitFor, within } from "storybook/test"; import { MockBuildInfo, MockUserOwner } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; import { UserDropdown } from "./UserDropdown"; diff --git a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx index 7ebf1bdd00fba..99bd655b252f1 100644 --- a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx +++ b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx @@ -20,7 +20,7 @@ import { LogOutIcon } from "lucide-react"; import { MessageSquareIcon } from "lucide-react"; import { MonitorDownIcon, SquareArrowOutUpRightIcon } from "lucide-react"; import type { FC } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; export const Language = { accountLabel: "Account", diff --git a/site/src/modules/management/DeploymentConfigProvider.tsx b/site/src/modules/management/DeploymentConfigProvider.tsx index a6de49974d86e..ab3bfc7ddd124 100644 --- a/site/src/modules/management/DeploymentConfigProvider.tsx +++ b/site/src/modules/management/DeploymentConfigProvider.tsx @@ -4,7 +4,7 @@ import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Loader } from "components/Loader/Loader"; import { type FC, createContext, useContext } from "react"; import { useQuery } from "react-query"; -import { Outlet } from "react-router-dom"; +import { Outlet } from "react-router"; export const DeploymentConfigContext = createContext< DeploymentConfigValue | undefined diff --git a/site/src/modules/management/DeploymentSettingsLayout.tsx b/site/src/modules/management/DeploymentSettingsLayout.tsx index d060deda621fc..82e49a3a234b6 100644 --- a/site/src/modules/management/DeploymentSettingsLayout.tsx +++ b/site/src/modules/management/DeploymentSettingsLayout.tsx @@ -10,7 +10,7 @@ import { useAuthenticated } from "hooks"; import { canViewDeploymentSettings } from "modules/permissions"; import { RequirePermission } from "modules/permissions/RequirePermission"; import { type FC, Suspense } from "react"; -import { Navigate, Outlet, useLocation } from "react-router-dom"; +import { Navigate, Outlet, useLocation } from "react-router"; import { DeploymentSidebar } from "./DeploymentSidebar"; const DeploymentSettingsLayout: FC = () => { diff --git a/site/src/modules/management/DeploymentSidebarView.stories.tsx b/site/src/modules/management/DeploymentSidebarView.stories.tsx index 2465556110e98..65d2dca1349f7 100644 --- a/site/src/modules/management/DeploymentSidebarView.stories.tsx +++ b/site/src/modules/management/DeploymentSidebarView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockBuildInfo, MockNoPermissions, diff --git a/site/src/modules/management/OrganizationSettingsLayout.tsx b/site/src/modules/management/OrganizationSettingsLayout.tsx index c103bf47bf4e7..fb0d0c722db51 100644 --- a/site/src/modules/management/OrganizationSettingsLayout.tsx +++ b/site/src/modules/management/OrganizationSettingsLayout.tsx @@ -18,7 +18,7 @@ import { import NotFoundPage from "pages/404Page/404Page"; import { type FC, Suspense, createContext, useContext } from "react"; import { useQuery } from "react-query"; -import { Outlet, useParams } from "react-router-dom"; +import { Outlet, useParams } from "react-router"; export const OrganizationSettingsContext = createContext< OrganizationSettingsValue | undefined diff --git a/site/src/modules/management/OrganizationSidebarLayout.tsx b/site/src/modules/management/OrganizationSidebarLayout.tsx index 279ed61186bdc..d007ae53cb1e9 100644 --- a/site/src/modules/management/OrganizationSidebarLayout.tsx +++ b/site/src/modules/management/OrganizationSidebarLayout.tsx @@ -1,6 +1,6 @@ import { Loader } from "components/Loader/Loader"; import { type FC, Suspense } from "react"; -import { Outlet } from "react-router-dom"; +import { Outlet } from "react-router"; import { OrganizationSidebar } from "./OrganizationSidebar"; const OrganizationSidebarLayout: FC = () => { diff --git a/site/src/modules/management/OrganizationSidebarView.stories.tsx b/site/src/modules/management/OrganizationSidebarView.stories.tsx index 0a3ebef493239..37d2c9ab17c37 100644 --- a/site/src/modules/management/OrganizationSidebarView.stories.tsx +++ b/site/src/modules/management/OrganizationSidebarView.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Organization } from "api/typesGenerated"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockNoOrganizationPermissions, MockNoPermissions, diff --git a/site/src/modules/management/OrganizationSidebarView.tsx b/site/src/modules/management/OrganizationSidebarView.tsx index 745268278da49..3f1d489afb343 100644 --- a/site/src/modules/management/OrganizationSidebarView.tsx +++ b/site/src/modules/management/OrganizationSidebarView.tsx @@ -20,7 +20,7 @@ import { Check, ChevronDown, Plus } from "lucide-react"; import type { Permissions } from "modules/permissions"; import type { OrganizationPermissions } from "modules/permissions/organizations"; import { type FC, useState } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; interface OrganizationsSettingsNavigationProps { /** The organization selected from the dropdown */ diff --git a/site/src/modules/notifications/NotificationsInbox/InboxAvatar.stories.tsx b/site/src/modules/notifications/NotificationsInbox/InboxAvatar.stories.tsx index 85199a335d662..f0d43de425b1c 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxAvatar.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxAvatar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { InboxAvatar } from "./InboxAvatar"; const meta: Meta = { diff --git a/site/src/modules/notifications/NotificationsInbox/InboxButton.stories.tsx b/site/src/modules/notifications/NotificationsInbox/InboxButton.stories.tsx index 0a7c3af728e9e..19a703b597f84 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxButton.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxButton.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { InboxButton } from "./InboxButton"; const meta: Meta = { diff --git a/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx b/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx index c9ed8bb632e03..4b031fe6a158a 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, fn, userEvent, within } from "storybook/test"; import { MockNotification } from "testHelpers/entities"; import { daysAgo } from "utils/time"; import { InboxItem } from "./InboxItem"; diff --git a/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx b/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx index e1817bf3b99ce..656cf7c14ac8a 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxItem.tsx @@ -4,7 +4,7 @@ import { Link } from "components/Link/Link"; import { SquareCheckBig } from "lucide-react"; import type { FC } from "react"; import Markdown from "react-markdown"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { relativeTime } from "utils/time"; import { InboxAvatar } from "./InboxAvatar"; diff --git a/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx b/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx index 8e18efd042ab4..765f9b079a484 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, fn, userEvent, within } from "storybook/test"; import { MockNotifications } from "testHelpers/entities"; import { InboxPopover } from "./InboxPopover"; diff --git a/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx b/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx index 3a5cd92248b91..28900fad525e6 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxPopover.tsx @@ -9,7 +9,7 @@ import { ScrollArea } from "components/ScrollArea/ScrollArea"; import { Spinner } from "components/Spinner/Spinner"; import { RefreshCwIcon, SettingsIcon } from "lucide-react"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { cn } from "utils/cn"; import { InboxButton } from "./InboxButton"; import { InboxItem } from "./InboxItem"; diff --git a/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx b/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx index edc7edaa6d400..78585beafa827 100644 --- a/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockNotifications, mockApiError } from "testHelpers/entities"; import { withGlobalSnackbar } from "testHelpers/storybook"; import { NotificationsInbox } from "./NotificationsInbox"; diff --git a/site/src/modules/notifications/NotificationsInbox/UnreadBadge.stories.tsx b/site/src/modules/notifications/NotificationsInbox/UnreadBadge.stories.tsx index d3bb608fb7d24..2714c29726182 100644 --- a/site/src/modules/notifications/NotificationsInbox/UnreadBadge.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/UnreadBadge.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { UnreadBadge } from "./UnreadBadge"; const meta: Meta = { diff --git a/site/src/modules/provisioners/JobStatusIndicator.stories.tsx b/site/src/modules/provisioners/JobStatusIndicator.stories.tsx index 25c0fa273ce09..e08c6438d1214 100644 --- a/site/src/modules/provisioners/JobStatusIndicator.stories.tsx +++ b/site/src/modules/provisioners/JobStatusIndicator.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { JobStatusIndicator } from "./JobStatusIndicator"; const meta: Meta = { diff --git a/site/src/modules/provisioners/ProvisionerAlert.stories.tsx b/site/src/modules/provisioners/ProvisionerAlert.stories.tsx index 496934bf2275e..2f1ae820d6abe 100644 --- a/site/src/modules/provisioners/ProvisionerAlert.stories.tsx +++ b/site/src/modules/provisioners/ProvisionerAlert.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { AlertVariant, ProvisionerAlert } from "./ProvisionerAlert"; diff --git a/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx b/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx index ec3e7ed20f953..9d012e7c5c38a 100644 --- a/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx +++ b/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateVersion } from "testHelpers/entities"; import { AlertVariant } from "./ProvisionerAlert"; diff --git a/site/src/modules/provisioners/ProvisionerTags.stories.tsx b/site/src/modules/provisioners/ProvisionerTags.stories.tsx index a47ab734ae4aa..4307a36788292 100644 --- a/site/src/modules/provisioners/ProvisionerTags.stories.tsx +++ b/site/src/modules/provisioners/ProvisionerTags.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ProvisionerTag, ProvisionerTags, diff --git a/site/src/modules/provisioners/ProvisionerTagsField.stories.tsx b/site/src/modules/provisioners/ProvisionerTagsField.stories.tsx index 168fb72c2140e..ec96d45ddbcec 100644 --- a/site/src/modules/provisioners/ProvisionerTagsField.stories.tsx +++ b/site/src/modules/provisioners/ProvisionerTagsField.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { ProvisionerDaemon } from "api/typesGenerated"; import { type FC, useState } from "react"; +import { expect, userEvent, within } from "storybook/test"; import { ProvisionerTagsField } from "./ProvisionerTagsField"; const meta: Meta = { diff --git a/site/src/modules/resources/AgentDevcontainerCard.stories.tsx b/site/src/modules/resources/AgentDevcontainerCard.stories.tsx index 33f9f0e49594d..c3e17d44eb0db 100644 --- a/site/src/modules/resources/AgentDevcontainerCard.stories.tsx +++ b/site/src/modules/resources/AgentDevcontainerCard.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getPreferredProxy } from "contexts/ProxyContext"; import { chromatic } from "testHelpers/chromatic"; import { diff --git a/site/src/modules/resources/AgentLogs/AgentLogs.stories.tsx b/site/src/modules/resources/AgentLogs/AgentLogs.stories.tsx index 106bc67bfca94..081ffdc506564 100644 --- a/site/src/modules/resources/AgentLogs/AgentLogs.stories.tsx +++ b/site/src/modules/resources/AgentLogs/AgentLogs.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AGENT_LOG_LINE_HEIGHT } from "./AgentLogLine"; import { AgentLogs } from "./AgentLogs"; import { MockLogs, MockSources } from "./mocks"; diff --git a/site/src/modules/resources/AgentMetadata.stories.tsx b/site/src/modules/resources/AgentMetadata.stories.tsx index 3531eebc4d1a8..525c09f0bd5ab 100644 --- a/site/src/modules/resources/AgentMetadata.stories.tsx +++ b/site/src/modules/resources/AgentMetadata.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { WorkspaceAgentMetadataDescription, WorkspaceAgentMetadataResult, diff --git a/site/src/modules/resources/AgentRow.stories.tsx b/site/src/modules/resources/AgentRow.stories.tsx index c1bc40e98eb1d..6717c0e6043ab 100644 --- a/site/src/modules/resources/AgentRow.stories.tsx +++ b/site/src/modules/resources/AgentRow.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import { getPreferredProxy } from "contexts/ProxyContext"; +import { spyOn, userEvent, within } from "storybook/test"; import { chromatic } from "testHelpers/chromatic"; import * as M from "testHelpers/entities"; import { diff --git a/site/src/modules/resources/AgentRowPreview.stories.tsx b/site/src/modules/resources/AgentRowPreview.stories.tsx index fdcd84093bddb..e27c4f7a55c6e 100644 --- a/site/src/modules/resources/AgentRowPreview.stories.tsx +++ b/site/src/modules/resources/AgentRowPreview.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceAgent, MockWorkspaceApp } from "testHelpers/entities"; import { AgentRowPreview } from "./AgentRowPreview"; diff --git a/site/src/modules/resources/AppLink/AppLink.stories.tsx b/site/src/modules/resources/AppLink/AppLink.stories.tsx index 891ddd3c2af7d..5ce9f6ff4ca1a 100644 --- a/site/src/modules/resources/AppLink/AppLink.stories.tsx +++ b/site/src/modules/resources/AppLink/AppLink.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getPreferredProxy } from "contexts/ProxyContext"; import { MockPrimaryWorkspaceProxy, diff --git a/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx b/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx index 74b1df7258059..e5627bac8dda1 100644 --- a/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx +++ b/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { agentLogsKey } from "api/queries/workspaces"; import type { WorkspaceAgentLog } from "api/typesGenerated"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; import { DownloadAgentLogsButton } from "./DownloadAgentLogsButton"; diff --git a/site/src/modules/resources/PortForwardButton.stories.tsx b/site/src/modules/resources/PortForwardButton.stories.tsx index 5f13ae6e7a6e4..fbe1398fb69e7 100644 --- a/site/src/modules/resources/PortForwardButton.stories.tsx +++ b/site/src/modules/resources/PortForwardButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { MockListeningPortsResponse, MockSharedPortsResponse, diff --git a/site/src/modules/resources/PortForwardPopoverView.stories.tsx b/site/src/modules/resources/PortForwardPopoverView.stories.tsx index d6acb0571d43d..fb5efc6855f81 100644 --- a/site/src/modules/resources/PortForwardPopoverView.stories.tsx +++ b/site/src/modules/resources/PortForwardPopoverView.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { MockListeningPortsResponse, MockSharedPortsResponse, diff --git a/site/src/modules/resources/ResourceAvatar.stories.tsx b/site/src/modules/resources/ResourceAvatar.stories.tsx index 0a3f97fe58f97..a6f244a49d00f 100644 --- a/site/src/modules/resources/ResourceAvatar.stories.tsx +++ b/site/src/modules/resources/ResourceAvatar.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceResource } from "testHelpers/entities"; import { ResourceAvatar } from "./ResourceAvatar"; diff --git a/site/src/modules/resources/ResourceCard.stories.tsx b/site/src/modules/resources/ResourceCard.stories.tsx index d2cf56ef57483..3eacd524aece9 100644 --- a/site/src/modules/resources/ResourceCard.stories.tsx +++ b/site/src/modules/resources/ResourceCard.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceResource } from "testHelpers/entities"; import { withProxyProvider } from "testHelpers/storybook"; import { AgentRowPreview } from "./AgentRowPreview"; diff --git a/site/src/modules/resources/Resources.stories.tsx b/site/src/modules/resources/Resources.stories.tsx index 4487d0bba7fd0..1e12c53a33855 100644 --- a/site/src/modules/resources/Resources.stories.tsx +++ b/site/src/modules/resources/Resources.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceResource, MockWorkspaceResourceMultipleAgents, diff --git a/site/src/modules/resources/SSHButton/SSHButton.stories.tsx b/site/src/modules/resources/SSHButton/SSHButton.stories.tsx index 0ac246e349ca2..2f53dd03a5af7 100644 --- a/site/src/modules/resources/SSHButton/SSHButton.stories.tsx +++ b/site/src/modules/resources/SSHButton/SSHButton.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; +import { spyOn, userEvent, within } from "storybook/test"; import { MockDeploymentSSH, MockWorkspace, diff --git a/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx b/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx index 0073a732e6228..d5522e1daedaf 100644 --- a/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx +++ b/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspace } from "testHelpers/entities"; import { TerminalLink } from "./TerminalLink"; diff --git a/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx b/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx index fe3f274b17d24..3555ac0ce582b 100644 --- a/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx +++ b/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; import { VSCodeDesktopButton } from "./VSCodeDesktopButton"; diff --git a/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx b/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx index 0a3838e4251c0..f8ae3a284e67a 100644 --- a/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx +++ b/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; import { VSCodeDevContainerButton } from "./VSCodeDevContainerButton"; diff --git a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx index 248da641b0c29..8b235e2aa4641 100644 --- a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx +++ b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateExample, diff --git a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx index bf5c03f96bd2d..6ecdc11ed84d9 100644 --- a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx +++ b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.tsx @@ -5,7 +5,7 @@ import { Button } from "components/Button/Button"; import { ExternalImage } from "components/ExternalImage/ExternalImage"; import { Pill } from "components/Pill/Pill"; import type { FC, HTMLAttributes } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; type TemplateExampleCardProps = HTMLAttributes & { example: TemplateExample; diff --git a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx index 3f3fcc4badfff..bea0d1746b543 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx @@ -1,5 +1,5 @@ import { useTheme } from "@emotion/react"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import type { FileTree } from "utils/filetree"; import { TemplateFileTree } from "./TemplateFileTree"; diff --git a/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx b/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx index 71361d7ac03f0..e9fb48ca3fc1f 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { withDashboardProvider } from "testHelpers/storybook"; import { TemplateFiles } from "./TemplateFiles"; diff --git a/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx b/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx index 95716e38827aa..a7abe1c7bc3e8 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFiles.tsx @@ -5,7 +5,7 @@ import { SyntaxHighlighter } from "components/SyntaxHighlighter/SyntaxHighlighte import set from "lodash/set"; import { linkToTemplate, useLinks } from "modules/navigation"; import { type FC, useCallback, useMemo } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; import type { FileTree } from "utils/filetree"; import type { TemplateVersionFiles } from "utils/templateVersion"; import { TemplateFileTree } from "./TemplateFileTree"; diff --git a/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx b/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx index 5e75547b1bdc2..d2b74e4a3c733 100644 --- a/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx +++ b/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceAgent, MockWorkspaceAgentConnecting, diff --git a/site/src/modules/templates/TemplateUpdateMessage.stories.tsx b/site/src/modules/templates/TemplateUpdateMessage.stories.tsx index 22484a5200e70..2a299385338fd 100644 --- a/site/src/modules/templates/TemplateUpdateMessage.stories.tsx +++ b/site/src/modules/templates/TemplateUpdateMessage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TemplateUpdateMessage } from "./TemplateUpdateMessage"; const meta: Meta = { diff --git a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx index 5e077df642855..e961d3bbc1803 100644 --- a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx +++ b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockPreviewParameter } from "testHelpers/entities"; import { DynamicParameter } from "./DynamicParameter"; diff --git a/site/src/modules/workspaces/EphemeralParametersDialog/EphemeralParametersDialog.tsx b/site/src/modules/workspaces/EphemeralParametersDialog/EphemeralParametersDialog.tsx index d1713d920f4a9..39fc52de730f4 100644 --- a/site/src/modules/workspaces/EphemeralParametersDialog/EphemeralParametersDialog.tsx +++ b/site/src/modules/workspaces/EphemeralParametersDialog/EphemeralParametersDialog.tsx @@ -9,7 +9,7 @@ import { DialogTitle, } from "components/Dialog/Dialog"; import type { FC } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; interface EphemeralParametersDialogProps { open: boolean; diff --git a/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx b/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx index 6d0390fbf902b..deeecb19ac4eb 100644 --- a/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx +++ b/site/src/modules/workspaces/ErrorDialog/WorkspaceErrorDialog.tsx @@ -9,7 +9,7 @@ import { DialogTitle, } from "components/Dialog/Dialog"; import type { FC } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; interface WorkspaceErrorDialogProps { open: boolean; diff --git a/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx b/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx index 9327ff6b46e98..c2f7da9aa21e5 100644 --- a/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceAppStatus } from "testHelpers/entities"; import { withProxyProvider } from "testHelpers/storybook"; import { WorkspaceAppStatus } from "./WorkspaceAppStatus"; diff --git a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx index 442cb9b6da5aa..66a5a26f4066e 100644 --- a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceBuild } from "testHelpers/entities"; import { WorkspaceBuildData } from "./WorkspaceBuildData"; diff --git a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx index c7b0138fb4c1b..ed8f9bdd35fab 100644 --- a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockWorkspaceBuildLogs } from "testHelpers/entities"; import { WorkspaceBuildLogs } from "./WorkspaceBuildLogs"; diff --git a/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx b/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx index 94c380b3d1e23..308b038f91d33 100644 --- a/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { MockDormantWorkspace } from "testHelpers/entities"; import { WorkspaceDormantBadge } from "./WorkspaceDormantBadge"; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx index 45e85c3288292..7f2df8cd9c072 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { templateVersionsQueryKey } from "api/queries/templates"; import { MockTemplateVersion, diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx index c8eab563c58ef..9e27d1800d511 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { agentLogsKey, buildLogsKey } from "api/queries/workspaces"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; import { withDesktopViewport } from "testHelpers/storybook"; import { DownloadLogsDialog } from "./DownloadLogsDialog"; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialogExperimental.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialogExperimental.tsx index 850f31185af2c..042379ca888f9 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialogExperimental.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/UpdateBuildParametersDialogExperimental.tsx @@ -9,7 +9,7 @@ import { DialogTitle, } from "components/Dialog/Dialog"; import type { FC } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; type UpdateBuildParametersDialogExperimentalProps = { open: boolean; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx index e7b168e57e973..dfee8134af496 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockFailedWorkspace, MockWorkspace } from "testHelpers/entities"; import { daysAgo } from "utils/time"; import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx index 19d12ab2a394e..8e7b9e33b93d2 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx @@ -26,7 +26,7 @@ import { } from "lucide-react"; import { type FC, useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { WorkspaceErrorDialog } from "../ErrorDialog/WorkspaceErrorDialog"; import { ChangeWorkspaceVersionDialog } from "./ChangeWorkspaceVersionDialog"; import { DownloadLogsDialog } from "./DownloadLogsDialog"; @@ -205,7 +205,7 @@ export const WorkspaceMoreActions: FC = ({ workspaceName={workspace.name} templateVersionId={ changeVersionMutation.error instanceof ParameterValidationError - ? changeVersionMutation.error?.versionId + ? changeVersionMutation.error.versionId : undefined } /> diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts index abb34a44e5ad1..b2d104decebfc 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts +++ b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.ts @@ -3,7 +3,7 @@ import type { Workspace, WorkspaceBuildParameter } from "api/typesGenerated"; import { linkToTemplate, useLinks } from "modules/navigation"; import { useCallback } from "react"; import { useQuery } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import type { CreateWorkspaceMode } from "../../../pages/CreateWorkspacePage/CreateWorkspacePage"; function getDuplicationUrlParams( diff --git a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx index 843f8131b793f..92d1a8e30c899 100644 --- a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockTemplate, MockTemplateVersion, diff --git a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx index 5bdb870708447..0b4bf3d9d881e 100644 --- a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Workspace, WorkspaceStatus } from "api/typesGenerated"; import { MockWorkspace } from "testHelpers/entities"; import { WorkspaceStatusIndicator } from "./WorkspaceStatusIndicator"; diff --git a/site/src/modules/workspaces/WorkspaceTiming/Chart/Tooltip.tsx b/site/src/modules/workspaces/WorkspaceTiming/Chart/Tooltip.tsx index 85b556c786a07..ad86ce9d59ce0 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/Chart/Tooltip.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/Chart/Tooltip.tsx @@ -5,7 +5,7 @@ import MUITooltip, { } from "@mui/material/Tooltip"; import { ExternalLinkIcon } from "lucide-react"; import type { FC, HTMLProps } from "react"; -import { Link, type LinkProps } from "react-router-dom"; +import { Link, type LinkProps } from "react-router"; export type TooltipProps = MUITooltipProps; diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx index 36f08b36c0ca0..6b7de2d76bbf3 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { chromatic } from "testHelpers/chromatic"; import { WorkspaceTimings } from "./WorkspaceTimings"; import { WorkspaceTimingsResponse } from "./storybookData"; diff --git a/site/src/pages/404Page/404Page.stories.tsx b/site/src/pages/404Page/404Page.stories.tsx index 8273db09c4da7..8f1b52ab7b629 100644 --- a/site/src/pages/404Page/404Page.stories.tsx +++ b/site/src/pages/404Page/404Page.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import NotFoundPage from "./404Page"; const meta: Meta = { diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx index 99d4f900ca0d6..8b5ecef7a09a1 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockAuditLog, MockAuditLogRequestPasswordReset, diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.tsx index ed105989f1f02..81f4be980634e 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.tsx @@ -1,7 +1,7 @@ import Link from "@mui/material/Link"; import type { AuditLog } from "api/typesGenerated"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { BuildAuditDescription } from "./BuildAuditDescription"; interface AuditLogDescriptionProps { diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx index 354eb59713174..1451177e4c14d 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/BuildAuditDescription.tsx @@ -1,7 +1,7 @@ import Link from "@mui/material/Link"; import type { AuditLog } from "api/typesGenerated"; import { type FC, useMemo } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { systemBuildReasons } from "utils/workspace"; interface BuildAuditDescriptionProps { diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx index ab5e55f8bbd84..cb059c7a1cbaf 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx @@ -4,7 +4,7 @@ import TableCell from "@mui/material/TableCell"; import TableContainer from "@mui/material/TableContainer"; import TableHead from "@mui/material/TableHead"; import TableRow from "@mui/material/TableRow"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockAuditLog, diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx index cccdcdf5e6e49..b88ec000719c5 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx @@ -12,7 +12,7 @@ import { TimelineEntry } from "components/Timeline/TimelineEntry"; import { InfoIcon } from "lucide-react"; import { NetworkIcon } from "lucide-react"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import userAgentParser from "ua-parser-js"; import { buildReasonLabels } from "utils/workspace"; import { AuditLogDescription } from "./AuditLogDescription/AuditLogDescription"; diff --git a/site/src/pages/AuditPage/AuditPage.tsx b/site/src/pages/AuditPage/AuditPage.tsx index f63adbcd4136b..02adf36186999 100644 --- a/site/src/pages/AuditPage/AuditPage.tsx +++ b/site/src/pages/AuditPage/AuditPage.tsx @@ -8,7 +8,7 @@ import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; import { useOrganizationsFilterMenu } from "modules/tableFiltering/options"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { useActionFilterMenu, useResourceTypeFilterMenu } from "./AuditFilter"; import { AuditPageView } from "./AuditPageView"; diff --git a/site/src/pages/AuditPage/AuditPageView.stories.tsx b/site/src/pages/AuditPage/AuditPageView.stories.tsx index 323ae6d78bde8..96ab7f7456a3c 100644 --- a/site/src/pages/AuditPage/AuditPageView.stories.tsx +++ b/site/src/pages/AuditPage/AuditPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockMenu, getDefaultFilterProps, diff --git a/site/src/pages/CliAuthPage/CliAuthPageView.stories.tsx b/site/src/pages/CliAuthPage/CliAuthPageView.stories.tsx index a38a1de7513f3..d0c17aba91546 100644 --- a/site/src/pages/CliAuthPage/CliAuthPageView.stories.tsx +++ b/site/src/pages/CliAuthPage/CliAuthPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { CliAuthPageView } from "./CliAuthPageView"; const meta: Meta = { diff --git a/site/src/pages/CliAuthPage/CliAuthPageView.tsx b/site/src/pages/CliAuthPage/CliAuthPageView.tsx index 716f97a70c888..e836127f61fc8 100644 --- a/site/src/pages/CliAuthPage/CliAuthPageView.tsx +++ b/site/src/pages/CliAuthPage/CliAuthPageView.tsx @@ -5,7 +5,7 @@ import { Welcome } from "components/Welcome/Welcome"; import { useClipboard } from "hooks"; import { CheckIcon, CopyIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; interface CliAuthPageViewProps { sessionToken?: string; diff --git a/site/src/pages/CliInstallPage/CliInstallPageView.stories.tsx b/site/src/pages/CliInstallPage/CliInstallPageView.stories.tsx index 25acfa457ff78..4dd303ba10c18 100644 --- a/site/src/pages/CliInstallPage/CliInstallPageView.stories.tsx +++ b/site/src/pages/CliInstallPage/CliInstallPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { CliInstallPageView } from "./CliInstallPageView"; const meta: Meta = { diff --git a/site/src/pages/CliInstallPage/CliInstallPageView.tsx b/site/src/pages/CliInstallPage/CliInstallPageView.tsx index db77abcb28f04..0dc7240870759 100644 --- a/site/src/pages/CliInstallPage/CliInstallPageView.tsx +++ b/site/src/pages/CliInstallPage/CliInstallPageView.tsx @@ -2,7 +2,7 @@ import type { Interpolation, Theme } from "@emotion/react"; import { CodeExample } from "components/CodeExample/CodeExample"; import { Welcome } from "components/Welcome/Welcome"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; type CliInstallPageViewProps = { origin: string; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx index 9cd27bac95bf4..aeb34d7bebd40 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPage.tsx @@ -8,7 +8,7 @@ import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; import { useOrganizationsFilterMenu } from "modules/tableFiltering/options"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { useStatusFilterMenu, useTypeFilterMenu } from "./ConnectionLogFilter"; import { ConnectionLogPageView } from "./ConnectionLogPageView"; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx index 393127280409b..444c38ab14287 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockMenu, getDefaultFilterProps, diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx index 8c8263e7dbc68..004e466147c50 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockConnectedSSHConnectionLog, MockWebConnectionLog, diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx index b862134624189..fba3a9c20cb27 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.tsx @@ -1,7 +1,7 @@ import Link from "@mui/material/Link"; import type { ConnectionLog } from "api/typesGenerated"; import type { FC, ReactNode } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { connectionTypeToFriendlyName } from "utils/connection"; interface ConnectionLogDescriptionProps { diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx index 4e9dd49ed3edf..73ed836f7d470 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx @@ -1,5 +1,5 @@ import TableContainer from "@mui/material/TableContainer"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Table, TableBody } from "components/Table/Table"; import { MockConnectedSSHConnectionLog, diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx index ac847cff73b39..b3936a3a2850b 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx @@ -10,7 +10,7 @@ import { TimelineEntry } from "components/Timeline/TimelineEntry"; import { InfoIcon } from "lucide-react"; import { NetworkIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import userAgentParser from "ua-parser-js"; import { connectionTypeIsWeb } from "utils/connection"; import { ConnectionLogDescription } from "./ConnectionLogDescription/ConnectionLogDescription"; diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx index 61cf4d353e053..0be2557856dbd 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx @@ -2,7 +2,7 @@ import { render, screen } from "@testing-library/react"; import { AppProviders } from "App"; import { RequireAuth } from "contexts/auth/RequireAuth"; import { http, HttpResponse } from "msw"; -import { RouterProvider, createMemoryRouter } from "react-router-dom"; +import { RouterProvider, createMemoryRouter } from "react-router"; import { MockTemplateExample, MockTemplateExample2, diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx index 4db1d58e8e20e..2496f2a335465 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateExample, diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx index 25258421eaaf2..0ac220d4bcf67 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.tsx @@ -11,7 +11,7 @@ import { Margins } from "components/Margins/Margins"; import { PageHeader, PageHeaderTitle } from "components/PageHeader/PageHeader"; import { ExternalLinkIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import type { StarterTemplatesByTag } from "utils/starterTemplates"; import { StarterTemplates } from "./StarterTemplates"; diff --git a/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx b/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx index c293fea854abd..6cc78bf83754d 100644 --- a/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/StarterTemplates.tsx @@ -3,7 +3,7 @@ import type { TemplateExample } from "api/typesGenerated"; import { Stack } from "components/Stack/Stack"; import { TemplateExampleCard } from "modules/templates/TemplateExampleCard/TemplateExampleCard"; import type { FC } from "react"; -import { Link, useSearchParams } from "react-router-dom"; +import { Link, useSearchParams } from "react-router"; import type { StarterTemplatesByTag } from "utils/starterTemplates"; const getTagLabel = (tag: string) => { diff --git a/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx b/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx index f2a773c09c099..890bc4af96fb0 100644 --- a/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx +++ b/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { JobError } from "api/queries/templates"; import { MockProvisionerJob, diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx index de5bba05bb303..a9dfd6de3b4c4 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx @@ -1,10 +1,10 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; -import { screen, userEvent } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getProvisionerDaemonsKey, organizationsKey, } from "api/queries/organizations"; +import { action } from "storybook/actions"; +import { screen, userEvent } from "storybook/test"; import { MockDefaultOrganization, MockOrganization2, diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index 33cd89286fe75..ba5a76f6b4e2f 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -29,7 +29,7 @@ import { ProvisionerTagsField } from "modules/provisioners/ProvisionerTagsField" import { SelectedTemplate } from "pages/CreateWorkspacePage/SelectedTemplate"; import { type FC, useState } from "react"; import { useQuery } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { docs } from "utils/docs"; import { displayNameValidator, diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx index 71d45d2ab148b..f4b37209609fc 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx @@ -5,7 +5,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import { type FC, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation } from "react-query"; -import { useNavigate, useSearchParams } from "react-router-dom"; +import { useNavigate, useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { BuildLogsDrawer } from "./BuildLogsDrawer"; import { DuplicateTemplateView } from "./DuplicateTemplateView"; diff --git a/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx b/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx index 61410452ea61d..bf9f1c51fe8c1 100644 --- a/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/DuplicateTemplateView.tsx @@ -11,7 +11,7 @@ import { Loader } from "components/Loader/Loader"; import { useDashboard } from "modules/dashboard/useDashboard"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { useNavigate, useSearchParams } from "react-router-dom"; +import { useNavigate, useSearchParams } from "react-router"; import { CreateTemplateForm } from "./CreateTemplateForm"; import type { CreateTemplatePageViewProps } from "./types"; import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils"; diff --git a/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx b/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx index cfc62e44d0cec..a1c095f6855ac 100644 --- a/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/ImportStarterTemplateView.tsx @@ -9,7 +9,7 @@ import { Loader } from "components/Loader/Loader"; import { useDashboard } from "modules/dashboard/useDashboard"; import type { FC } from "react"; import { keepPreviousData, useQuery } from "react-query"; -import { useNavigate, useSearchParams } from "react-router-dom"; +import { useNavigate, useSearchParams } from "react-router"; import { CreateTemplateForm } from "./CreateTemplateForm"; import type { CreateTemplatePageViewProps } from "./types"; import { diff --git a/site/src/pages/CreateTemplatePage/TemplateUpload.tsx b/site/src/pages/CreateTemplatePage/TemplateUpload.tsx index 800cab0ce0512..bc0160dca50b9 100644 --- a/site/src/pages/CreateTemplatePage/TemplateUpload.tsx +++ b/site/src/pages/CreateTemplatePage/TemplateUpload.tsx @@ -1,7 +1,7 @@ import Link from "@mui/material/Link"; import { FileUpload } from "components/FileUpload/FileUpload"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; export interface TemplateUploadProps { isUploading: boolean; diff --git a/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx b/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx index 2b5f673c449d8..ccc44d879c489 100644 --- a/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx +++ b/site/src/pages/CreateTemplatePage/UploadTemplateView.tsx @@ -9,7 +9,7 @@ import { displayError } from "components/GlobalSnackbar/utils"; import { useDashboard } from "modules/dashboard/useDashboard"; import type { FC } from "react"; import { useMutation, useQuery } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { CreateTemplateForm } from "./CreateTemplateForm"; import type { CreateTemplatePageViewProps } from "./types"; import { firstVersionFromFile, getFormPermissions, newTemplate } from "./utils"; diff --git a/site/src/pages/CreateTokenPage/CreateTokenForm.tsx b/site/src/pages/CreateTokenPage/CreateTokenForm.tsx index 57d1587e92590..117994ff8489a 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenForm.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenForm.tsx @@ -14,7 +14,7 @@ import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import type { FormikContextType } from "formik"; import { type FC, useEffect, useState } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { getFormHelpers, onChangeTrimmed } from "utils/formUtils"; import { type CreateTokenData, diff --git a/site/src/pages/CreateTokenPage/CreateTokenPage.stories.tsx b/site/src/pages/CreateTokenPage/CreateTokenPage.stories.tsx index 2bca00577dac3..8885dc584180e 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenPage.stories.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenPage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import CreateTokenPage from "./CreateTokenPage"; const meta: Meta = { diff --git a/site/src/pages/CreateTokenPage/CreateTokenPage.tsx b/site/src/pages/CreateTokenPage/CreateTokenPage.tsx index 57e68600e0bf8..f80e152a58bbe 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenPage.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenPage.tsx @@ -9,7 +9,7 @@ import { useFormik } from "formik"; import { type FC, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { pageTitle } from "utils/page"; import { CreateTokenForm } from "./CreateTokenForm"; import { type CreateTokenData, NANO_HOUR } from "./utils"; diff --git a/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx b/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx index f836a7bde8fc7..2ceb599529a3e 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx @@ -1,8 +1,8 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { organizationsKey } from "api/queries/organizations"; import type { Organization } from "api/typesGenerated"; +import { action } from "storybook/actions"; +import { userEvent, within } from "storybook/test"; import { MockOrganization, MockOrganization2, diff --git a/site/src/pages/CreateUserPage/CreateUserPage.tsx b/site/src/pages/CreateUserPage/CreateUserPage.tsx index a90059fea6410..6444b6d1213b6 100644 --- a/site/src/pages/CreateUserPage/CreateUserPage.tsx +++ b/site/src/pages/CreateUserPage/CreateUserPage.tsx @@ -5,7 +5,7 @@ import { useDashboard } from "modules/dashboard/useDashboard"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { pageTitle } from "utils/page"; import { CreateUserForm } from "./CreateUserForm"; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspaceExperimentRouter.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspaceExperimentRouter.tsx index a0dd3dbf715c4..601bf77ca951e 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspaceExperimentRouter.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspaceExperimentRouter.tsx @@ -3,7 +3,7 @@ import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Loader } from "components/Loader/Loader"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import CreateWorkspacePage from "./CreateWorkspacePage"; import CreateWorkspacePageExperimental from "./CreateWorkspacePageExperimental"; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx index b4c4c281c1b0d..c3685f9735cbb 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.tsx @@ -22,7 +22,7 @@ import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName" import { type FC, useCallback, useEffect, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate, useParams, useSearchParams } from "react-router-dom"; +import { useNavigate, useParams, useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import type { AutofillBuildParameter } from "utils/richParameters"; import { paramsUsedToCreateWorkspace } from "utils/workspace"; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx index b69ef084a77f7..3afb50fe05d0e 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.tsx @@ -28,7 +28,7 @@ import { } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate, useParams, useSearchParams } from "react-router-dom"; +import { useNavigate, useParams, useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import type { AutofillBuildParameter } from "utils/richParameters"; import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental"; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx index 44bc21951fcb9..956ee72f2ee83 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx @@ -1,8 +1,8 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, screen, waitFor } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; +import { action } from "storybook/actions"; +import { expect, screen, waitFor } from "storybook/test"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplate, diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx index 8b5d4dabe675c..2f15f0e097a08 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.tsx @@ -32,7 +32,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import { ClassicParameterFlowDeprecationWarning } from "modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning"; import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName"; import { type FC, useCallback, useEffect, useMemo, useState } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; import { getFormHelpers, nameValidator, diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx index 0fcf5d7fbb854..214ac58d80697 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DetailedError } from "api/errors"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplate, MockUserOwner } from "testHelpers/entities"; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index b0298630776d2..9b4bb9608e90b 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -37,7 +37,7 @@ import { useRef, useState, } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { docs } from "utils/docs"; import { nameValidator } from "utils/formUtils"; import type { AutofillBuildParameter } from "utils/richParameters"; diff --git a/site/src/pages/CreateWorkspacePage/ExternalAuthButton.stories.tsx b/site/src/pages/CreateWorkspacePage/ExternalAuthButton.stories.tsx index 0345bc34a2e74..ac0e3a28d988c 100644 --- a/site/src/pages/CreateWorkspacePage/ExternalAuthButton.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/ExternalAuthButton.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { TemplateVersionExternalAuth } from "api/typesGenerated"; import { ExternalAuthButton } from "./ExternalAuthButton"; diff --git a/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx b/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx index 142a809654b51..4e24d2d478c60 100644 --- a/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplate } from "testHelpers/entities"; import { SelectedTemplate } from "./SelectedTemplate"; diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.stories.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.stories.tsx index 619a20ec9d69c..1c2a3e9de61b1 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AnnouncementBannerDialog.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { AnnouncementBannerDialog } from "./AnnouncementBannerDialog"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.stories.tsx index 1670006dbf060..72c5bd4f59d2f 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AppearanceSettingsPageView } from "./AppearanceSettingsPageView"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.stories.tsx index 38a74a8e735f4..5184219b38cca 100644 --- a/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/ExternalAuthSettingsPage/ExternalAuthSettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ExternalAuthSettingsPageView } from "./ExternalAuthSettingsPageView"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx index a4206c3b04a1e..fea284ca4e666 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockOrganizationSyncSettings } from "testHelpers/entities"; import { ExportPolicyButton } from "./ExportPolicyButton"; diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx index 430fce3a2ee05..b28cd7ef3a3d4 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, within } from "storybook/test"; import { MockOrganization, MockOrganization2, diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx index bb08c37218e18..aaa1f1706101d 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePage.tsx @@ -3,7 +3,7 @@ import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { pageTitle } from "utils/page"; import { AddNewLicensePageView } from "./AddNewLicensePageView"; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx index e46c43fb7e05f..2815bfe15aa83 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/AddNewLicensePageView.tsx @@ -11,7 +11,7 @@ import { import { Stack } from "components/Stack/Stack"; import { ChevronLeftIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { Fieldset } from "../Fieldset"; import { DividerWithText } from "./DividerWithText"; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.stories.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.stories.tsx index 4a872d2470b7e..e45bfa0d74cb4 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { LicenseSeatConsumptionChart } from "./LicenseSeatConsumptionChart"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx index 73fa3508aa58b..5175aab8e38c2 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx @@ -14,7 +14,7 @@ import { Link } from "components/Link/Link"; import { Spinner } from "components/Spinner/Spinner"; import { ChevronRightIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { Area, AreaChart, diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx index 4cc6f52523edf..fe3fe0975e69f 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPage.tsx @@ -7,7 +7,7 @@ import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import LicensesSettingsPageView from "./LicensesSettingsPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx index c631ed178b9a3..2a0b7f8d39b55 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicensesSettingsPageView.tsx @@ -17,7 +17,7 @@ import { useWindowSize } from "hooks/useWindowSize"; import { PlusIcon, RotateCwIcon } from "lucide-react"; import type { FC } from "react"; import Confetti from "react-confetti"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; import { LicenseCard } from "./LicenseCard"; import { LicenseSeatConsumptionChart } from "./LicenseSeatConsumptionChart"; import { ManagedAgentsConsumption } from "./ManagedAgentsConsumption"; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx index 8b526914edd50..2073ff5bf2a7f 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/ManagedAgentsConsumption.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ManagedAgentsConsumption } from "./ManagedAgentsConsumption"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.stories.tsx index f9d0610a7dfa4..f8b1b1cad2166 100644 --- a/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/NetworkSettingsPage/NetworkSettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { SerpentGroup } from "api/typesGenerated"; import { NetworkSettingsPageView } from "./NetworkSettingsPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.stories.tsx b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.stories.tsx index 61a1eddcd1a78..353a076463ad3 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationEvents.stories.tsx @@ -1,8 +1,8 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import { selectTemplatesByGroup } from "api/queries/notifications"; import type { DeploymentValues } from "api/typesGenerated"; +import { spyOn, userEvent, within } from "storybook/test"; import { MockNotificationTemplates } from "testHelpers/entities"; import { NotificationEvents } from "./NotificationEvents"; import { baseMeta } from "./storybookUtils"; diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.stories.tsx b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.stories.tsx index c7d57e5ff0d53..538e3e80d93a4 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/NotificationsPage.stories.tsx @@ -1,9 +1,9 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { notificationDispatchMethodsKey, systemNotificationTemplatesKey, } from "api/queries/notifications"; +import { userEvent, within } from "storybook/test"; import { MockNotificationMethodsResponse, MockNotificationTemplates, diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.stories.tsx b/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.stories.tsx index bd3deeeee7c26..4acd43e8064a7 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/Troubleshooting.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; +import { spyOn, userEvent, within } from "storybook/test"; import { Troubleshooting } from "./Troubleshooting"; import { baseMeta } from "./storybookUtils"; diff --git a/site/src/pages/DeploymentSettingsPage/NotificationsPage/storybookUtils.ts b/site/src/pages/DeploymentSettingsPage/NotificationsPage/storybookUtils.ts index f27535d5b5397..bf4845a47e904 100644 --- a/site/src/pages/DeploymentSettingsPage/NotificationsPage/storybookUtils.ts +++ b/site/src/pages/DeploymentSettingsPage/NotificationsPage/storybookUtils.ts @@ -1,4 +1,4 @@ -import type { Meta } from "@storybook/react"; +import type { Meta } from "@storybook/react-vite"; import { notificationDispatchMethodsKey, systemNotificationTemplatesKey, diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx index a1f651be5cdc9..82636e0b7a76b 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPage.tsx @@ -3,7 +3,7 @@ import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueryClient } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { pageTitle } from "utils/page"; import { CreateOAuth2AppPageView } from "./CreateOAuth2AppPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.stories.tsx index fc11ce2ecdce2..d39cf5c4c442c 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { mockApiError } from "testHelpers/entities"; import { CreateOAuth2AppPageView } from "./CreateOAuth2AppPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.tsx index b7204f4a8557a..c4bcfb25cda0a 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/CreateOAuth2AppPageView.tsx @@ -9,7 +9,7 @@ import { import { Stack } from "components/Stack/Stack"; import { ChevronLeftIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { OAuth2AppForm } from "./OAuth2AppForm"; type CreateOAuth2AppProps = { diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx index fa9f0adada71c..dcffe9e196d82 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPage.tsx @@ -4,7 +4,7 @@ import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; import { type FC, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import { EditOAuth2AppPageView } from "./EditOAuth2AppPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.stories.tsx index ad86d81f3243e..923e482e06c70 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockOAuth2ProviderAppSecrets, MockOAuth2ProviderApps, diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx index 6c5490275baea..36aebfb57a5bd 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/EditOAuth2AppPageView.tsx @@ -26,7 +26,7 @@ import { TableLoader } from "components/TableLoader/TableLoader"; import { CopyIcon } from "lucide-react"; import { ChevronLeftIcon } from "lucide-react"; import { type FC, useState } from "react"; -import { Link as RouterLink, useSearchParams } from "react-router-dom"; +import { Link as RouterLink, useSearchParams } from "react-router"; import { createDayString } from "utils/createDayString"; import { OAuth2AppForm } from "./OAuth2AppForm"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.stories.tsx index 3e2d175487694..2aa01386b5ee9 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockOAuth2ProviderApps } from "testHelpers/entities"; import OAuth2AppsSettingsPageView from "./OAuth2AppsSettingsPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx index 7aaadc5afeb15..71a914b3d1378 100644 --- a/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/OAuth2AppsSettingsPage/OAuth2AppsSettingsPageView.tsx @@ -19,7 +19,7 @@ import { TableLoader } from "components/TableLoader/TableLoader"; import { useClickableTableRow } from "hooks/useClickableTableRow"; import { ChevronRightIcon, PlusIcon } from "lucide-react"; import type { FC } from "react"; -import { Link, useNavigate } from "react-router-dom"; +import { Link, useNavigate } from "react-router"; type OAuth2AppsSettingsProps = { apps?: TypesGen.OAuth2ProviderApp[]; diff --git a/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.stories.tsx index 6467ef0830010..2fb5af8d75838 100644 --- a/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/ObservabilitySettingsPage/ObservabilitySettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { SerpentGroup } from "api/typesGenerated"; import { ObservabilitySettingsPageView } from "./ObservabilitySettingsPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.stories.tsx index 24e121b9ff0f5..7c770aca02e9a 100644 --- a/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/OverviewPage/OverviewPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockDeploymentDAUResponse } from "testHelpers/entities"; import { OverviewPageView } from "./OverviewPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.stories.tsx b/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.stories.tsx index e2e2a99111db5..80f025bf76ff6 100644 --- a/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { UserEngagementChart } from "./UserEngagementChart"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx b/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx index c89295dbfabee..ae2691c8bf26f 100644 --- a/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx +++ b/site/src/pages/DeploymentSettingsPage/OverviewPage/UserEngagementChart.tsx @@ -14,7 +14,7 @@ import { Link } from "components/Link/Link"; import { Spinner } from "components/Spinner/Spinner"; import { ChevronRightIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts"; const chartConfig = { diff --git a/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.stories.tsx index c14f2d0a09f2b..cd6cacfddf21d 100644 --- a/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/SecuritySettingsPage/SecuritySettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { SerpentGroup, SerpentOption } from "api/typesGenerated"; import { SecuritySettingsPageView } from "./SecuritySettingsPageView"; diff --git a/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.stories.tsx index 5756f11748800..d8c3e0d49b056 100644 --- a/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/UserAuthSettingsPage/UserAuthSettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { SerpentGroup } from "api/typesGenerated"; import { UserAuthSettingsPageView } from "./UserAuthSettingsPageView"; diff --git a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx index 0523a5da750d4..105e7ee501b38 100644 --- a/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx +++ b/site/src/pages/ExternalAuthPage/ExternalAuthPage.tsx @@ -16,7 +16,7 @@ import { useAuthenticated } from "hooks"; import type { FC } from "react"; import { useMemo } from "react"; import { useQuery, useQueryClient } from "react-query"; -import { useParams, useSearchParams } from "react-router-dom"; +import { useParams, useSearchParams } from "react-router"; import ExternalAuthPageView from "./ExternalAuthPageView"; const ExternalAuthPage: FC = () => { diff --git a/site/src/pages/ExternalAuthPage/ExternalAuthPageView.stories.tsx b/site/src/pages/ExternalAuthPage/ExternalAuthPageView.stories.tsx index aa976ab4a63a3..483600853fec6 100644 --- a/site/src/pages/ExternalAuthPage/ExternalAuthPageView.stories.tsx +++ b/site/src/pages/ExternalAuthPage/ExternalAuthPageView.stories.tsx @@ -1,149 +1,149 @@ -import type { Meta, StoryFn } from "@storybook/react"; -import ExternalAuthPageView, { - type ExternalAuthPageViewProps, -} from "./ExternalAuthPageView"; +import type { Meta } from "@storybook/react-vite"; +import ExternalAuthPageView from "./ExternalAuthPageView"; export default { title: "pages/ExternalAuthPage", component: ExternalAuthPageView, } as Meta; -const Template: StoryFn = (args) => ( - -); - -export const WebAuthenticated = Template.bind({}); -WebAuthenticated.args = { - externalAuth: { - authenticated: true, - device: false, - installations: [], - app_install_url: "", - app_installable: false, - display_name: "BitBucket", - user: { - id: 0, - avatar_url: "https://avatars.githubusercontent.com/u/7122116?v=4", - login: "kylecarbs", - name: "Kyle Carberry", - profile_url: "", +export const WebAuthenticated = { + args: { + externalAuth: { + authenticated: true, + device: false, + installations: [], + app_install_url: "", + app_installable: false, + display_name: "BitBucket", + user: { + id: 0, + avatar_url: "https://avatars.githubusercontent.com/u/7122116?v=4", + login: "kylecarbs", + name: "Kyle Carberry", + profile_url: "", + }, }, }, }; -export const DeviceUnauthenticated = Template.bind({}); -DeviceUnauthenticated.args = { - externalAuth: { - display_name: "GitHub", - authenticated: false, - device: true, - installations: [], - app_install_url: "", - app_installable: false, - user: null, - }, - externalAuthDevice: { - device_code: "1234-5678", - expires_in: 900, - interval: 5, - user_code: "ABCD-EFGH", - verification_uri: "", +export const DeviceUnauthenticated = { + args: { + externalAuth: { + display_name: "GitHub", + authenticated: false, + device: true, + installations: [], + app_install_url: "", + app_installable: false, + user: null, + }, + externalAuthDevice: { + device_code: "1234-5678", + expires_in: 900, + interval: 5, + user_code: "ABCD-EFGH", + verification_uri: "", + }, }, }; -export const Device429Error = Template.bind({}); -Device429Error.args = { - externalAuth: { - display_name: "GitHub", - authenticated: false, - device: true, - installations: [], - app_install_url: "", - app_installable: false, - user: null, - }, - // This is intentionally undefined. - // If we get a 429 on the first /device call, then this - // is undefined with a 429 error. - externalAuthDevice: undefined, - deviceExchangeError: { - message: "Failed to authorize device.", - detail: - "rate limit hit, unable to authorize device. please try again later", +export const Device429Error = { + args: { + externalAuth: { + display_name: "GitHub", + authenticated: false, + device: true, + installations: [], + app_install_url: "", + app_installable: false, + user: null, + }, + // This is intentionally undefined. + // If we get a 429 on the first /device call, then this + // is undefined with a 429 error. + externalAuthDevice: undefined, + deviceExchangeError: { + message: "Failed to authorize device.", + detail: + "rate limit hit, unable to authorize device. please try again later", + }, }, }; -export const DeviceUnauthenticatedError = Template.bind({}); -DeviceUnauthenticatedError.args = { - externalAuth: { - display_name: "GitHub", - authenticated: false, - device: true, - installations: [], - app_install_url: "", - app_installable: false, - user: null, - }, - externalAuthDevice: { - device_code: "1234-5678", - expires_in: 900, - interval: 5, - user_code: "ABCD-EFGH", - verification_uri: "", - }, - deviceExchangeError: { - message: "Error exchanging device code.", - detail: "expired_token", +export const DeviceUnauthenticatedError = { + args: { + externalAuth: { + display_name: "GitHub", + authenticated: false, + device: true, + installations: [], + app_install_url: "", + app_installable: false, + user: null, + }, + externalAuthDevice: { + device_code: "1234-5678", + expires_in: 900, + interval: 5, + user_code: "ABCD-EFGH", + verification_uri: "", + }, + deviceExchangeError: { + message: "Error exchanging device code.", + detail: "expired_token", + }, }, }; -export const DeviceAuthenticatedNotInstalled = Template.bind({}); -DeviceAuthenticatedNotInstalled.args = { - viewExternalAuthConfig: true, - externalAuth: { - display_name: "GitHub", - authenticated: true, - device: true, - installations: [], - app_install_url: "https://example.com", - app_installable: true, - user: { - id: 0, - avatar_url: "https://avatars.githubusercontent.com/u/7122116?v=4", - login: "kylecarbs", - name: "Kyle Carberry", - profile_url: "", +export const DeviceAuthenticatedNotInstalled = { + args: { + viewExternalAuthConfig: true, + externalAuth: { + display_name: "GitHub", + authenticated: true, + device: true, + installations: [], + app_install_url: "https://example.com", + app_installable: true, + user: { + id: 0, + avatar_url: "https://avatars.githubusercontent.com/u/7122116?v=4", + login: "kylecarbs", + name: "Kyle Carberry", + profile_url: "", + }, }, }, }; -export const DeviceAuthenticatedInstalled = Template.bind({}); -DeviceAuthenticatedInstalled.args = { - externalAuth: { - display_name: "GitHub", - authenticated: true, - device: true, - installations: [ - { - configure_url: "https://example.com", - id: 1, - account: { - id: 0, - avatar_url: "https://github.com/coder.png", - login: "coder", - name: "Coder", - profile_url: "https://github.com/coder", +export const DeviceAuthenticatedInstalled = { + args: { + externalAuth: { + display_name: "GitHub", + authenticated: true, + device: true, + installations: [ + { + configure_url: "https://example.com", + id: 1, + account: { + id: 0, + avatar_url: "https://github.com/coder.png", + login: "coder", + name: "Coder", + profile_url: "https://github.com/coder", + }, }, + ], + app_install_url: "https://example.com", + app_installable: true, + user: { + id: 0, + avatar_url: "https://avatars.githubusercontent.com/u/7122116?v=4", + login: "kylecarbs", + name: "Kyle Carberry", + profile_url: "", }, - ], - app_install_url: "https://example.com", - app_installable: true, - user: { - id: 0, - avatar_url: "https://avatars.githubusercontent.com/u/7122116?v=4", - login: "kylecarbs", - name: "Kyle Carberry", - profile_url: "", }, }, }; diff --git a/site/src/pages/ExternalAuthPage/ExternalAuthPageView.tsx b/site/src/pages/ExternalAuthPage/ExternalAuthPageView.tsx index 798116145dd78..639fc4a4d0bdd 100644 --- a/site/src/pages/ExternalAuthPage/ExternalAuthPageView.tsx +++ b/site/src/pages/ExternalAuthPage/ExternalAuthPageView.tsx @@ -12,7 +12,7 @@ import { ExternalLinkIcon } from "lucide-react"; import { RotateCwIcon } from "lucide-react"; import type { FC, ReactNode } from "react"; -export interface ExternalAuthPageViewProps { +interface ExternalAuthPageViewProps { externalAuth: ExternalAuth; viewExternalAuthConfig: boolean; diff --git a/site/src/pages/GroupsPage/CreateGroupPage.tsx b/site/src/pages/GroupsPage/CreateGroupPage.tsx index b256861c6827b..07dcea0e5e0ef 100644 --- a/site/src/pages/GroupsPage/CreateGroupPage.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPage.tsx @@ -2,7 +2,7 @@ import { createGroup } from "api/queries/groups"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueryClient } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import { CreateGroupPageView } from "./CreateGroupPageView"; diff --git a/site/src/pages/GroupsPage/CreateGroupPageView.stories.tsx b/site/src/pages/GroupsPage/CreateGroupPageView.stories.tsx index ea8dfcc3f3e02..5d71884a57038 100644 --- a/site/src/pages/GroupsPage/CreateGroupPageView.stories.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPageView.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { mockApiError } from "testHelpers/entities"; import { CreateGroupPageView } from "./CreateGroupPageView"; diff --git a/site/src/pages/GroupsPage/CreateGroupPageView.tsx b/site/src/pages/GroupsPage/CreateGroupPageView.tsx index 6a3230e7ae646..4fdf78eadb1a1 100644 --- a/site/src/pages/GroupsPage/CreateGroupPageView.tsx +++ b/site/src/pages/GroupsPage/CreateGroupPageView.tsx @@ -18,7 +18,7 @@ import { import { Spinner } from "components/Spinner/Spinner"; import { useFormik } from "formik"; import type { FC } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { getFormHelpers, nameValidator, diff --git a/site/src/pages/GroupsPage/GroupPage.stories.tsx b/site/src/pages/GroupsPage/GroupPage.stories.tsx index 2325567dd4607..d834caee90630 100644 --- a/site/src/pages/GroupsPage/GroupPage.stories.tsx +++ b/site/src/pages/GroupsPage/GroupPage.stories.tsx @@ -1,9 +1,9 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import { getGroupQueryKey, groupPermissionsKey } from "api/queries/groups"; import { organizationMembersKey } from "api/queries/organizations"; import { reactRouterParameters } from "storybook-addon-remix-react-router"; +import { spyOn, userEvent, within } from "storybook/test"; import { MockDefaultOrganization, MockGroup, diff --git a/site/src/pages/GroupsPage/GroupPage.tsx b/site/src/pages/GroupsPage/GroupPage.tsx index ca15b80e4d259..f2a8470b61e33 100644 --- a/site/src/pages/GroupsPage/GroupPage.tsx +++ b/site/src/pages/GroupsPage/GroupPage.tsx @@ -54,7 +54,7 @@ import { EllipsisVertical, TrashIcon } from "lucide-react"; import { type FC, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { Link as RouterLink, useNavigate, useParams } from "react-router-dom"; +import { Link as RouterLink, useNavigate, useParams } from "react-router"; import { isEveryoneGroup } from "utils/groups"; import { pageTitle } from "utils/page"; diff --git a/site/src/pages/GroupsPage/GroupSettingsPage.tsx b/site/src/pages/GroupsPage/GroupSettingsPage.tsx index 570877e1d8681..b210e82f464db 100644 --- a/site/src/pages/GroupsPage/GroupSettingsPage.tsx +++ b/site/src/pages/GroupsPage/GroupSettingsPage.tsx @@ -6,7 +6,7 @@ import { Loader } from "components/Loader/Loader"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import GroupSettingsPageView from "./GroupSettingsPageView"; diff --git a/site/src/pages/GroupsPage/GroupSettingsPageView.stories.tsx b/site/src/pages/GroupsPage/GroupSettingsPageView.stories.tsx index 148b044f18217..4673e81a6e27e 100644 --- a/site/src/pages/GroupsPage/GroupSettingsPageView.stories.tsx +++ b/site/src/pages/GroupsPage/GroupSettingsPageView.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { MockGroup } from "testHelpers/entities"; import GroupSettingsPageView from "./GroupSettingsPageView"; diff --git a/site/src/pages/GroupsPage/GroupsPage.tsx b/site/src/pages/GroupsPage/GroupsPage.tsx index 616e99fe15404..c5089cbad1e6b 100644 --- a/site/src/pages/GroupsPage/GroupsPage.tsx +++ b/site/src/pages/GroupsPage/GroupsPage.tsx @@ -17,7 +17,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import { type FC, useEffect } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { pageTitle } from "utils/page"; import { useGroupsSettings } from "./GroupsPageProvider"; import { GroupsPageView } from "./GroupsPageView"; diff --git a/site/src/pages/GroupsPage/GroupsPageProvider.tsx b/site/src/pages/GroupsPage/GroupsPageProvider.tsx index be4913c194dc1..09b59e0a36719 100644 --- a/site/src/pages/GroupsPage/GroupsPageProvider.tsx +++ b/site/src/pages/GroupsPage/GroupsPageProvider.tsx @@ -1,7 +1,7 @@ import type { Organization } from "api/typesGenerated"; import { useDashboard } from "modules/dashboard/useDashboard"; import { type FC, createContext, useContext } from "react"; -import { Navigate, Outlet, useParams } from "react-router-dom"; +import { Navigate, Outlet, useParams } from "react-router"; const GroupsPageContext = createContext( undefined, diff --git a/site/src/pages/GroupsPage/GroupsPageView.stories.tsx b/site/src/pages/GroupsPage/GroupsPageView.stories.tsx index 466ee2b149524..47c7833a285f7 100644 --- a/site/src/pages/GroupsPage/GroupsPageView.stories.tsx +++ b/site/src/pages/GroupsPage/GroupsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockGroup } from "testHelpers/entities"; import { GroupsPageView } from "./GroupsPageView"; diff --git a/site/src/pages/GroupsPage/GroupsPageView.tsx b/site/src/pages/GroupsPage/GroupsPageView.tsx index b3c4d35d8c41c..d8de2507d19d7 100644 --- a/site/src/pages/GroupsPage/GroupsPageView.tsx +++ b/site/src/pages/GroupsPage/GroupsPageView.tsx @@ -24,7 +24,7 @@ import { import { useClickableTableRow } from "hooks"; import { ChevronRightIcon, PlusIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink, useNavigate } from "react-router-dom"; +import { Link as RouterLink, useNavigate } from "react-router"; import { docs } from "utils/docs"; type GroupsPageViewProps = { diff --git a/site/src/pages/HealthPage/AccessURLPage.stories.tsx b/site/src/pages/HealthPage/AccessURLPage.stories.tsx index 776abd22c25e1..bd0188beb4a5e 100644 --- a/site/src/pages/HealthPage/AccessURLPage.stories.tsx +++ b/site/src/pages/HealthPage/AccessURLPage.stories.tsx @@ -1,4 +1,4 @@ -import type { StoryObj } from "@storybook/react"; +import type { StoryObj } from "@storybook/react-vite"; import { HEALTH_QUERY_KEY } from "api/queries/debug"; import type { HealthcheckReport } from "api/typesGenerated"; import { MockHealth } from "testHelpers/entities"; diff --git a/site/src/pages/HealthPage/AccessURLPage.tsx b/site/src/pages/HealthPage/AccessURLPage.tsx index f9b0242be556e..12b11e50374f5 100644 --- a/site/src/pages/HealthPage/AccessURLPage.tsx +++ b/site/src/pages/HealthPage/AccessURLPage.tsx @@ -1,7 +1,7 @@ import type { HealthcheckReport } from "api/typesGenerated"; import { Alert } from "components/Alert/Alert"; import { Helmet } from "react-helmet-async"; -import { useOutletContext } from "react-router-dom"; +import { useOutletContext } from "react-router"; import { pageTitle } from "utils/page"; import { GridData, diff --git a/site/src/pages/HealthPage/DERPPage.stories.tsx b/site/src/pages/HealthPage/DERPPage.stories.tsx index 30f02840f7db5..7dd8c2031e1fb 100644 --- a/site/src/pages/HealthPage/DERPPage.stories.tsx +++ b/site/src/pages/HealthPage/DERPPage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import DERPPage from "./DERPPage"; import { generateMeta } from "./storybook"; diff --git a/site/src/pages/HealthPage/DERPPage.tsx b/site/src/pages/HealthPage/DERPPage.tsx index 6cd96321e1d62..b2fdcd698fef1 100644 --- a/site/src/pages/HealthPage/DERPPage.tsx +++ b/site/src/pages/HealthPage/DERPPage.tsx @@ -10,7 +10,7 @@ import type { import { Alert } from "components/Alert/Alert"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; -import { Link, useOutletContext } from "react-router-dom"; +import { Link, useOutletContext } from "react-router"; import { pageTitle } from "utils/page"; import { BooleanPill, diff --git a/site/src/pages/HealthPage/DERPRegionPage.stories.tsx b/site/src/pages/HealthPage/DERPRegionPage.stories.tsx index a834d6e40212a..cffe0d411e0ba 100644 --- a/site/src/pages/HealthPage/DERPRegionPage.stories.tsx +++ b/site/src/pages/HealthPage/DERPRegionPage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockHealth } from "testHelpers/entities"; import DERPRegionPage from "./DERPRegionPage"; import { generateMeta } from "./storybook"; diff --git a/site/src/pages/HealthPage/DERPRegionPage.tsx b/site/src/pages/HealthPage/DERPRegionPage.tsx index afdc34d43cf66..7c84272319d26 100644 --- a/site/src/pages/HealthPage/DERPRegionPage.tsx +++ b/site/src/pages/HealthPage/DERPRegionPage.tsx @@ -11,7 +11,7 @@ import { Alert } from "components/Alert/Alert"; import { ChevronLeftIcon, CodeIcon, HashIcon } from "lucide-react"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; -import { Link, useOutletContext, useParams } from "react-router-dom"; +import { Link, useOutletContext, useParams } from "react-router"; import { getLatencyColor } from "utils/latency"; import { pageTitle } from "utils/page"; import { diff --git a/site/src/pages/HealthPage/DatabasePage.stories.tsx b/site/src/pages/HealthPage/DatabasePage.stories.tsx index e283fdebda16b..38f742bfc1c4d 100644 --- a/site/src/pages/HealthPage/DatabasePage.stories.tsx +++ b/site/src/pages/HealthPage/DatabasePage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import DatabasePage from "./DatabasePage"; import { generateMeta } from "./storybook"; diff --git a/site/src/pages/HealthPage/DatabasePage.tsx b/site/src/pages/HealthPage/DatabasePage.tsx index 5bf0b4cb1fe4c..e7b4cc9578288 100644 --- a/site/src/pages/HealthPage/DatabasePage.tsx +++ b/site/src/pages/HealthPage/DatabasePage.tsx @@ -1,7 +1,7 @@ import type { HealthcheckReport } from "api/typesGenerated"; import { Alert } from "components/Alert/Alert"; import { Helmet } from "react-helmet-async"; -import { useOutletContext } from "react-router-dom"; +import { useOutletContext } from "react-router"; import { pageTitle } from "utils/page"; import { GridData, diff --git a/site/src/pages/HealthPage/HealthLayout.tsx b/site/src/pages/HealthPage/HealthLayout.tsx index a5d76ebd8d7c9..e1bdec0973b83 100644 --- a/site/src/pages/HealthPage/HealthLayout.tsx +++ b/site/src/pages/HealthPage/HealthLayout.tsx @@ -15,7 +15,7 @@ import { DashboardFullPage } from "modules/dashboard/DashboardLayout"; import { type FC, Suspense } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { NavLink, Outlet } from "react-router-dom"; +import { NavLink, Outlet } from "react-router"; import { createDayString } from "utils/createDayString"; import { pageTitle } from "utils/page"; import { HealthIcon } from "./Content"; diff --git a/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx b/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx index 33aa4563019db..6838cd992c6d0 100644 --- a/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx +++ b/site/src/pages/HealthPage/ProvisionerDaemonsPage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import ProvisionerDaemonsPage from "./ProvisionerDaemonsPage"; import { generateMeta } from "./storybook"; diff --git a/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx b/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx index feb569f158ffd..fb473b8d6cae7 100644 --- a/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx +++ b/site/src/pages/HealthPage/ProvisionerDaemonsPage.tsx @@ -3,7 +3,7 @@ import { Alert } from "components/Alert/Alert"; import { Provisioner } from "modules/provisioners/Provisioner"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; -import { useOutletContext } from "react-router-dom"; +import { useOutletContext } from "react-router"; import { pageTitle } from "utils/page"; import { Header, diff --git a/site/src/pages/HealthPage/WebsocketPage.stories.tsx b/site/src/pages/HealthPage/WebsocketPage.stories.tsx index 90577f8aa0d5e..0ac53cbce57f2 100644 --- a/site/src/pages/HealthPage/WebsocketPage.stories.tsx +++ b/site/src/pages/HealthPage/WebsocketPage.stories.tsx @@ -1,4 +1,4 @@ -import type { StoryObj } from "@storybook/react"; +import type { StoryObj } from "@storybook/react-vite"; import { HEALTH_QUERY_KEY } from "api/queries/debug"; import type { HealthcheckReport } from "api/typesGenerated"; import { MockHealth } from "testHelpers/entities"; diff --git a/site/src/pages/HealthPage/WebsocketPage.tsx b/site/src/pages/HealthPage/WebsocketPage.tsx index fed223163e8e1..f7406c8806f00 100644 --- a/site/src/pages/HealthPage/WebsocketPage.tsx +++ b/site/src/pages/HealthPage/WebsocketPage.tsx @@ -4,7 +4,7 @@ import type { HealthcheckReport } from "api/typesGenerated"; import { Alert } from "components/Alert/Alert"; import { CodeIcon } from "lucide-react"; import { Helmet } from "react-helmet-async"; -import { useOutletContext } from "react-router-dom"; +import { useOutletContext } from "react-router"; import { MONOSPACE_FONT_FAMILY } from "theme/constants"; import { pageTitle } from "utils/page"; import { diff --git a/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx b/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx index b2eaad45a28a8..2b60624dc7f1a 100644 --- a/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx +++ b/site/src/pages/HealthPage/WorkspaceProxyPage.stories.tsx @@ -1,4 +1,4 @@ -import type { StoryObj } from "@storybook/react"; +import type { StoryObj } from "@storybook/react-vite"; import { HEALTH_QUERY_KEY } from "api/queries/debug"; import type { HealthcheckReport } from "api/typesGenerated"; import { MockHealth } from "testHelpers/entities"; diff --git a/site/src/pages/HealthPage/WorkspaceProxyPage.tsx b/site/src/pages/HealthPage/WorkspaceProxyPage.tsx index f37b2721eb4b1..25188463d0126 100644 --- a/site/src/pages/HealthPage/WorkspaceProxyPage.tsx +++ b/site/src/pages/HealthPage/WorkspaceProxyPage.tsx @@ -6,7 +6,7 @@ import { Alert } from "components/Alert/Alert"; import { HashIcon } from "lucide-react"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; -import { useOutletContext } from "react-router-dom"; +import { useOutletContext } from "react-router"; import { createDayString } from "utils/createDayString"; import { pageTitle } from "utils/page"; import { diff --git a/site/src/pages/HealthPage/storybook.tsx b/site/src/pages/HealthPage/storybook.tsx index 9e8b84f1c53f9..037f33ffd69f6 100644 --- a/site/src/pages/HealthPage/storybook.tsx +++ b/site/src/pages/HealthPage/storybook.tsx @@ -1,4 +1,4 @@ -import type { Meta } from "@storybook/react"; +import type { Meta } from "@storybook/react-vite"; import { HEALTH_QUERY_KEY, HEALTH_QUERY_SETTINGS_KEY } from "api/queries/debug"; import { type RouteDefinition, diff --git a/site/src/pages/IconsPage/IconsPage.stories.tsx b/site/src/pages/IconsPage/IconsPage.stories.tsx index c0f824bd0c8e6..e2827e0564e92 100644 --- a/site/src/pages/IconsPage/IconsPage.stories.tsx +++ b/site/src/pages/IconsPage/IconsPage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import IconsPage from "./IconsPage"; diff --git a/site/src/pages/LoginOAuthDevicePage/LoginOAuthDevicePage.tsx b/site/src/pages/LoginOAuthDevicePage/LoginOAuthDevicePage.tsx index 908e21461c5b0..6cd8f4f549ba7 100644 --- a/site/src/pages/LoginOAuthDevicePage/LoginOAuthDevicePage.tsx +++ b/site/src/pages/LoginOAuthDevicePage/LoginOAuthDevicePage.tsx @@ -13,7 +13,7 @@ import { Welcome } from "components/Welcome/Welcome"; import { useEffect, useMemo } from "react"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import LoginOAuthDevicePageView from "./LoginOAuthDevicePageView"; // The page is hardcoded to only use GitHub, diff --git a/site/src/pages/LoginPage/LoginPage.test.tsx b/site/src/pages/LoginPage/LoginPage.test.tsx index 30847cd2e79cc..4e763c447433e 100644 --- a/site/src/pages/LoginPage/LoginPage.test.tsx +++ b/site/src/pages/LoginPage/LoginPage.test.tsx @@ -1,7 +1,7 @@ import { fireEvent, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { http, HttpResponse } from "msw"; -import { createMemoryRouter } from "react-router-dom"; +import { createMemoryRouter } from "react-router"; import { render, renderWithRouter, diff --git a/site/src/pages/LoginPage/LoginPage.tsx b/site/src/pages/LoginPage/LoginPage.tsx index 85f3d24d47fbb..e476c3579f116 100644 --- a/site/src/pages/LoginPage/LoginPage.tsx +++ b/site/src/pages/LoginPage/LoginPage.tsx @@ -5,7 +5,7 @@ import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { type FC, useEffect } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { Navigate, useLocation, useNavigate } from "react-router-dom"; +import { Navigate, useLocation, useNavigate } from "react-router"; import { getApplicationName } from "utils/appearance"; import { retrieveRedirect } from "utils/redirect"; import { sendDeploymentEvent } from "utils/telemetry"; diff --git a/site/src/pages/LoginPage/LoginPageView.stories.tsx b/site/src/pages/LoginPage/LoginPageView.stories.tsx index c82392511394f..ba3c6fedba7c2 100644 --- a/site/src/pages/LoginPage/LoginPageView.stories.tsx +++ b/site/src/pages/LoginPage/LoginPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockAuthMethodsAll, MockAuthMethodsExternal, diff --git a/site/src/pages/LoginPage/LoginPageView.tsx b/site/src/pages/LoginPage/LoginPageView.tsx index 1ef0cdf8f7d73..c6714218ab0c8 100644 --- a/site/src/pages/LoginPage/LoginPageView.tsx +++ b/site/src/pages/LoginPage/LoginPageView.tsx @@ -4,7 +4,7 @@ import { Button } from "components/Button/Button"; import { CustomLogo } from "components/CustomLogo/CustomLogo"; import { Loader } from "components/Loader/Loader"; import { type FC, useState } from "react"; -import { useLocation } from "react-router-dom"; +import { useLocation } from "react-router"; import { SignInForm } from "./SignInForm"; import { TermsOfServiceLink } from "./TermsOfServiceLink"; diff --git a/site/src/pages/LoginPage/PasswordSignInForm.tsx b/site/src/pages/LoginPage/PasswordSignInForm.tsx index 34c753e67bb18..4ba897464d31c 100644 --- a/site/src/pages/LoginPage/PasswordSignInForm.tsx +++ b/site/src/pages/LoginPage/PasswordSignInForm.tsx @@ -5,7 +5,7 @@ import { Spinner } from "components/Spinner/Spinner"; import { Stack } from "components/Stack/Stack"; import { useFormik } from "formik"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { getFormHelpers, onChangeTrimmed } from "utils/formUtils"; import * as Yup from "yup"; import { Language } from "./Language"; diff --git a/site/src/pages/LoginPage/SignInForm.stories.tsx b/site/src/pages/LoginPage/SignInForm.stories.tsx index 125e912e08e70..67c18e240d22f 100644 --- a/site/src/pages/LoginPage/SignInForm.stories.tsx +++ b/site/src/pages/LoginPage/SignInForm.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { mockApiError } from "testHelpers/entities"; import { SignInForm } from "./SignInForm"; diff --git a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx index eeb958b040dca..bd84205befe2b 100644 --- a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPage.tsx @@ -5,7 +5,7 @@ import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility"; import { RequirePermission } from "modules/permissions/RequirePermission"; import type { FC } from "react"; import { useMutation, useQueryClient } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { CreateOrganizationPageView } from "./CreateOrganizationPageView"; const CreateOrganizationPage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.stories.tsx index 491fea3a14239..79533ec9a120d 100644 --- a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { mockApiError } from "testHelpers/entities"; import { CreateOrganizationPageView } from "./CreateOrganizationPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx index cdb70c3158c06..ab2c15186b86a 100644 --- a/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/CreateOrganizationPageView.tsx @@ -17,8 +17,8 @@ import { import { useFormik } from "formik"; import { ArrowLeft } from "lucide-react"; import type { FC } from "react"; -import { useNavigate } from "react-router-dom"; -import { Link } from "react-router-dom"; +import { useNavigate } from "react-router"; +import { Link } from "react-router"; import { docs } from "utils/docs"; import { displayNameValidator, diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx index 16878929e5190..89cac66f7c851 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePage.tsx @@ -13,7 +13,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import CreateEditRolePageView from "./CreateEditRolePageView"; diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.stories.tsx index 94111752422a2..a6ceb5cf56efc 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, within } from "storybook/test"; import { MockRole2WithOrgPermissions, MockRoleWithOrgPermissions, diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx index 294f5f28d92a6..93ebabdae4ccb 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CreateEditRolePageView.tsx @@ -32,7 +32,7 @@ import { Stack } from "components/Stack/Stack"; import { useFormik } from "formik"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import { type ChangeEvent, type FC, useState } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { getFormHelpers, nameValidator } from "utils/formUtils"; import * as Yup from "yup"; diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx index ccdc5103c6977..ff197cc52aad6 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPage.tsx @@ -16,7 +16,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { pageTitle } from "utils/page"; import { CustomRolesPageView } from "./CustomRolesPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.stories.tsx index 14ffbfa85bc90..f4706d822f115 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockOrganizationAuditorRole, MockRoleWithOrgPermissions, diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx index 91ca7b5fa2732..cd94b6a18e669 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/CustomRolesPageView.tsx @@ -27,7 +27,7 @@ import { } from "components/TableLoader/TableLoader"; import { EllipsisVertical, PlusIcon } from "lucide-react"; import type { FC } from "react"; -import { Link as RouterLink, useNavigate } from "react-router-dom"; +import { Link as RouterLink, useNavigate } from "react-router"; import { docs } from "utils/docs"; import { PermissionPillsList } from "./PermissionPillsList"; diff --git a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/PermissionPillsList.stories.tsx b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/PermissionPillsList.stories.tsx index 7a62a8f955747..3da3b25c768b3 100644 --- a/site/src/pages/OrganizationSettingsPage/CustomRolesPage/PermissionPillsList.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/CustomRolesPage/PermissionPillsList.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { MockRoleWithOrgPermissions } from "testHelpers/entities"; import { PermissionPillsList } from "./PermissionPillsList"; diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/ExportPolicyButton.stories.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/ExportPolicyButton.stories.tsx index 6c25f170d629e..978776593f23b 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/ExportPolicyButton.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/ExportPolicyButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockGroupSyncSettings, MockOrganization, diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx index 8132318fb96c7..815971c16fe73 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPage.tsx @@ -20,7 +20,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import { type FC, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueries, useQuery, useQueryClient } from "react-query"; -import { useParams, useSearchParams } from "react-router-dom"; +import { useParams, useSearchParams } from "react-router"; import { docs } from "utils/docs"; import { pageTitle } from "utils/page"; import IdpSyncPageView from "./IdpSyncPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPageView.stories.tsx index e5a77d1c7f779..a38a56c790b71 100644 --- a/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/IdpSyncPage/IdpSyncPageView.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent } from "storybook/test"; import { MockGroup, MockGroup2, diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx index 3c24404f24205..f2c270cd929af 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.tsx @@ -20,7 +20,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import { type FC, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useParams, useSearchParams } from "react-router-dom"; +import { useParams, useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { OrganizationMembersPageView } from "./OrganizationMembersPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.stories.tsx index 566bebfe7f3af..e8d50e3672f5a 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { mockSuccessResult } from "components/PaginationWidget/PaginationContainer.mocks"; import type { UsePaginatedQueryResult } from "hooks/usePaginatedQuery"; import { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobButton.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobButton.stories.tsx index 713a7fdc299c1..a9ad6448c3994 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobButton.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, waitFor, within } from "storybook/test"; import { MockProvisionerJob } from "testHelpers/entities"; import { CancelJobButton } from "./CancelJobButton"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobConfirmationDialog.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobConfirmationDialog.stories.tsx index f0c117360d53a..ec3563c131f09 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobConfirmationDialog.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/CancelJobConfirmationDialog.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Response } from "api/typesGenerated"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockProvisionerJob } from "testHelpers/entities"; import { withGlobalSnackbar } from "testHelpers/storybook"; import { CancelJobConfirmationDialog } from "./CancelJobConfirmationDialog"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx index 8fcc52e4957a6..eea806e47c960 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Table, TableBody } from "components/Table/Table"; +import { expect, userEvent, within } from "storybook/test"; import { MockProvisionerJob } from "testHelpers/entities"; import { daysAgo } from "utils/time"; import { JobRow } from "./JobRow"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx index 2073f75ca3558..e9f7170693a2c 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/JobRow.tsx @@ -15,7 +15,7 @@ import { ProvisionerTruncateTags, } from "modules/provisioners/ProvisionerTags"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { cn } from "utils/cn"; import { relativeTime } from "utils/time"; import { CancelJobButton } from "./CancelJobButton"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPage.tsx index e64feaf2e31c6..cbc36203ca225 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPage.tsx @@ -2,7 +2,7 @@ import { provisionerJobs } from "api/queries/organizations"; import { useOrganizationSettings } from "modules/management/OrganizationSettingsLayout"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import OrganizationProvisionerJobsPageView from "./OrganizationProvisionerJobsPageView"; const OrganizationProvisionerJobsPage: FC = () => { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx index 35a96a1b3bd5f..4b39e379348e9 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerJobsPage/OrganizationProvisionerJobsPageView.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { ProvisionerJob } from "api/typesGenerated"; import { useState } from "react"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockOrganization, MockProvisionerJob } from "testHelpers/entities"; import { daysAgo } from "utils/time"; import OrganizationProvisionerJobsPageView from "./OrganizationProvisionerJobsPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx index 77bcfe10cb229..f757b48830ca8 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPage.tsx @@ -6,7 +6,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { pageTitle } from "utils/page"; import { OrganizationProvisionerKeysPageView } from "./OrganizationProvisionerKeysPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.stories.tsx index f30ea66175e07..0401e30dd920a 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/OrganizationProvisionerKeysPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { type ProvisionerKeyDaemons, ProvisionerKeyIDBuiltIn, diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx index dd0a2e2aeb954..9402a64acc90d 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionerKeysPage/ProvisionerKeyRow.tsx @@ -9,7 +9,7 @@ import { ProvisionerTruncateTags, } from "modules/provisioners/ProvisionerTags"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { cn } from "utils/cn"; import { relativeTime } from "utils/time"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/LastConnectionHead.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/LastConnectionHead.stories.tsx index 8f67f6f92cff8..43468d59c087e 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/LastConnectionHead.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/LastConnectionHead.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent } from "storybook/test"; import { LastConnectionHead } from "./LastConnectionHead"; const meta: Meta = { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx index 242c0acdf842b..997621cdece10 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx @@ -8,7 +8,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useParams, useSearchParams } from "react-router-dom"; +import { useParams, useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { OrganizationProvisionersPageView } from "./OrganizationProvisionersPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx index a559af512bbe3..2bab4f262cfe2 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockBuildInfo, MockProvisioner, diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey.stories.tsx index 4d75ad83587fb..5555d1048c3b9 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey.stories.tsx @@ -1,10 +1,10 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ProvisionerKeyNameBuiltIn, ProvisionerKeyNamePSK, ProvisionerKeyNameUserAuth, } from "api/typesGenerated"; +import { userEvent } from "storybook/test"; import { ProvisionerKey } from "./ProvisionerKey"; const meta: Meta = { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.stories.tsx index eecba0494eac9..2781839d1f94b 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Table, TableBody } from "components/Table/Table"; +import { expect, userEvent, within } from "storybook/test"; import { MockBuildInfo, MockProvisioner } from "testHelpers/entities"; import { ProvisionerRow } from "./ProvisionerRow"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx index ca5af240d1b02..9508c1a261b85 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerRow.tsx @@ -18,7 +18,7 @@ import { } from "modules/provisioners/ProvisionerTags"; import { ProvisionerKey } from "pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerKey"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { cn } from "utils/cn"; import { relativeTime } from "utils/time"; import { ProvisionerVersion } from "./ProvisionerVersion"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerVersion.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerVersion.stories.tsx index 305fbd441fa7f..5cb681e8054cd 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerVersion.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/ProvisionerVersion.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, within } from "storybook/test"; import { MockBuildInfo, MockProvisioner } from "testHelpers/entities"; import { ProvisionerVersion } from "./ProvisionerVersion"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx index 2572ba0076999..70da9ad445b23 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx @@ -69,7 +69,7 @@ describe("OrganizationRedirect", () => { }), ); const router = await renderPage(); - const form = screen.getByText("Organization Settings"); + const form = await screen.findByText("Organization Settings"); expect(form).toBeInTheDocument(); expect(router.state.location.pathname).toBe( `/organizations/${MockDefaultOrganization.name}`, @@ -94,7 +94,7 @@ describe("OrganizationRedirect", () => { }), ); const router = await renderPage(); - const form = screen.getByText("Organization Settings"); + const form = await screen.findByText("Organization Settings"); expect(form).toBeInTheDocument(); expect(router.state.location.pathname).toBe( `/organizations/${MockOrganization2.name}`, diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.tsx index d01c9d1cda29f..88634ec672b5c 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.tsx @@ -2,7 +2,7 @@ import { EmptyState } from "components/EmptyState/EmptyState"; import { useOrganizationSettings } from "modules/management/OrganizationSettingsLayout"; import { canEditOrganization } from "modules/permissions/organizations"; import type { FC } from "react"; -import { Navigate } from "react-router-dom"; +import { Navigate } from "react-router"; const OrganizationRedirect: FC = () => { const { diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx index 4a0395d984952..d417ac6343ff6 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPage.tsx @@ -11,7 +11,7 @@ import { RequirePermission } from "modules/permissions/RequirePermission"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueryClient } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { pageTitle } from "utils/page"; import { OrganizationSettingsPageView } from "./OrganizationSettingsPageView"; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.stories.tsx index 3e8b1ad3133b7..b47a2a4246971 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationSettingsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockDefaultOrganization, diff --git a/site/src/pages/OrganizationSettingsPage/UserTable/EditRolesButton.stories.tsx b/site/src/pages/OrganizationSettingsPage/UserTable/EditRolesButton.stories.tsx index f3244898483ce..ad94f80434199 100644 --- a/site/src/pages/OrganizationSettingsPage/UserTable/EditRolesButton.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/UserTable/EditRolesButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { MockOwnerRole, MockSiteRoles, diff --git a/site/src/pages/ResetPasswordPage/ChangePasswordPage.stories.tsx b/site/src/pages/ResetPasswordPage/ChangePasswordPage.stories.tsx index ce4644ce2d48e..c2442638b03fd 100644 --- a/site/src/pages/ResetPasswordPage/ChangePasswordPage.stories.tsx +++ b/site/src/pages/ResetPasswordPage/ChangePasswordPage.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; +import { spyOn, userEvent, within } from "storybook/test"; import { mockApiError } from "testHelpers/entities"; import { withGlobalSnackbar } from "testHelpers/storybook"; import ChangePasswordPage from "./ChangePasswordPage"; diff --git a/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx b/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx index e2a8c8206e713..0b859b8c8e507 100644 --- a/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx +++ b/site/src/pages/ResetPasswordPage/ChangePasswordPage.tsx @@ -13,11 +13,7 @@ import { useFormik } from "formik"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation } from "react-query"; -import { - Link as RouterLink, - useNavigate, - useSearchParams, -} from "react-router-dom"; +import { Link as RouterLink, useNavigate, useSearchParams } from "react-router"; import { getApplicationName } from "utils/appearance"; import { getFormHelpers } from "utils/formUtils"; import * as yup from "yup"; diff --git a/site/src/pages/ResetPasswordPage/RequestOTPPage.stories.tsx b/site/src/pages/ResetPasswordPage/RequestOTPPage.stories.tsx index 5f75f607ab9d3..9c62be022152e 100644 --- a/site/src/pages/ResetPasswordPage/RequestOTPPage.stories.tsx +++ b/site/src/pages/ResetPasswordPage/RequestOTPPage.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; +import { spyOn, userEvent, within } from "storybook/test"; import { mockApiError } from "testHelpers/entities"; import { withGlobalSnackbar } from "testHelpers/storybook"; import RequestOTPPage from "./RequestOTPPage"; diff --git a/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx b/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx index 1ba5017b906aa..66eea517e090e 100644 --- a/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx +++ b/site/src/pages/ResetPasswordPage/RequestOTPPage.tsx @@ -9,7 +9,7 @@ import { Stack } from "components/Stack/Stack"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation } from "react-query"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { getApplicationName } from "utils/appearance"; const RequestOTPPage: FC = () => { diff --git a/site/src/pages/SetupPage/SetupPage.test.tsx b/site/src/pages/SetupPage/SetupPage.test.tsx index 0ab5d15c6f338..02d1c53334c81 100644 --- a/site/src/pages/SetupPage/SetupPage.test.tsx +++ b/site/src/pages/SetupPage/SetupPage.test.tsx @@ -2,7 +2,7 @@ import { screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import type { Response, User } from "api/typesGenerated"; import { http, HttpResponse } from "msw"; -import { createMemoryRouter } from "react-router-dom"; +import { createMemoryRouter } from "react-router"; import { MockBuildInfo, MockUserOwner } from "testHelpers/entities"; import { renderWithRouter, @@ -135,10 +135,6 @@ describe("Setup Page", () => { path: "/setup", element: , }, - { - path: "/templates", - element:

    Templates

    , - }, ], { initialEntries: ["/setup"] }, ), diff --git a/site/src/pages/SetupPage/SetupPage.tsx b/site/src/pages/SetupPage/SetupPage.tsx index 45d0e06eee5cd..ece2a714a7019 100644 --- a/site/src/pages/SetupPage/SetupPage.tsx +++ b/site/src/pages/SetupPage/SetupPage.tsx @@ -3,10 +3,10 @@ import { authMethods, createFirstUser } from "api/queries/users"; import { Loader } from "components/Loader/Loader"; import { useAuthContext } from "contexts/auth/AuthProvider"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; -import { type FC, useEffect } from "react"; +import { type FC, useEffect, useRef } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery } from "react-query"; -import { Navigate, useNavigate } from "react-router-dom"; +import { Navigate } from "react-router"; import { pageTitle } from "utils/page"; import { sendDeploymentEvent } from "utils/telemetry"; import { SetupPageView } from "./SetupPageView"; @@ -24,7 +24,7 @@ export const SetupPage: FC = () => { const setupIsComplete = !isConfiguringTheFirstUser; const { metadata } = useEmbeddedMetadata(); const buildInfoQuery = useQuery(buildInfo(metadata["build-info"])); - const navigate = useNavigate(); + const setupRequired = useRef(false); useEffect(() => { if (!buildInfoQuery.data) { @@ -41,7 +41,11 @@ export const SetupPage: FC = () => { // If the user is logged in, navigate to the app if (isSignedIn) { - return ; + return setupRequired.current ? ( + + ) : ( + + ); } // If we've already completed setup, navigate to the login page @@ -49,6 +53,8 @@ export const SetupPage: FC = () => { return ; } + setupRequired.current = true; + return ( <> @@ -61,7 +67,6 @@ export const SetupPage: FC = () => { onSubmit={async (firstUser) => { await createFirstUserMutation.mutateAsync(firstUser); await signIn(firstUser.email, firstUser.password); - navigate("/templates"); }} /> diff --git a/site/src/pages/SetupPage/SetupPageView.stories.tsx b/site/src/pages/SetupPage/SetupPageView.stories.tsx index e013757e93330..371a3c035cef7 100644 --- a/site/src/pages/SetupPage/SetupPageView.stories.tsx +++ b/site/src/pages/SetupPage/SetupPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { mockApiError } from "testHelpers/entities"; import { SetupPageView } from "./SetupPageView"; diff --git a/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx b/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx index d7846a6648969..3f719d8e93a22 100644 --- a/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx +++ b/site/src/pages/StarterTemplatePage/StarterTemplatePage.tsx @@ -2,7 +2,7 @@ import { templateExamples } from "api/queries/templates"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { pageTitle } from "utils/page"; import { StarterTemplatePageView } from "./StarterTemplatePageView"; diff --git a/site/src/pages/StarterTemplatePage/StarterTemplatePageView.stories.tsx b/site/src/pages/StarterTemplatePage/StarterTemplatePageView.stories.tsx index 28dede5bad03d..b214e8796cf71 100644 --- a/site/src/pages/StarterTemplatePage/StarterTemplatePageView.stories.tsx +++ b/site/src/pages/StarterTemplatePage/StarterTemplatePageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateExample, mockApiError } from "testHelpers/entities"; import { StarterTemplatePageView } from "./StarterTemplatePageView"; diff --git a/site/src/pages/StarterTemplatePage/StarterTemplatePageView.tsx b/site/src/pages/StarterTemplatePage/StarterTemplatePageView.tsx index 2da189d2523d5..c4bb59f7717ab 100644 --- a/site/src/pages/StarterTemplatePage/StarterTemplatePageView.tsx +++ b/site/src/pages/StarterTemplatePage/StarterTemplatePageView.tsx @@ -14,7 +14,7 @@ import { import { Stack } from "components/Stack/Stack"; import { ExternalLinkIcon, PlusIcon } from "lucide-react"; import type { FC } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; interface StarterTemplatePageViewProps { starterTemplate?: TemplateExample; diff --git a/site/src/pages/TaskPage/TaskAppIframe.tsx b/site/src/pages/TaskPage/TaskAppIframe.tsx index ce0223e802fd9..4cea4d7d5e936 100644 --- a/site/src/pages/TaskPage/TaskAppIframe.tsx +++ b/site/src/pages/TaskPage/TaskAppIframe.tsx @@ -11,7 +11,7 @@ import { EllipsisVertical, ExternalLinkIcon, HouseIcon } from "lucide-react"; import { useAppLink } from "modules/apps/useAppLink"; import type { Task } from "modules/tasks/tasks"; import { type FC, useRef } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { cn } from "utils/cn"; type TaskAppIFrameProps = { diff --git a/site/src/pages/TaskPage/TaskApps.stories.tsx b/site/src/pages/TaskPage/TaskApps.stories.tsx index c3006e2db0a14..d4c92f8ab1883 100644 --- a/site/src/pages/TaskPage/TaskApps.stories.tsx +++ b/site/src/pages/TaskPage/TaskApps.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { WorkspaceApp } from "api/typesGenerated"; import { MockTasks, diff --git a/site/src/pages/TaskPage/TaskApps.tsx b/site/src/pages/TaskPage/TaskApps.tsx index 83cd01f37c004..34891471731f5 100644 --- a/site/src/pages/TaskPage/TaskApps.tsx +++ b/site/src/pages/TaskPage/TaskApps.tsx @@ -14,7 +14,7 @@ import { useAppLink } from "modules/apps/useAppLink"; import type { Task } from "modules/tasks/tasks"; import type React from "react"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { cn } from "utils/cn"; import { docs } from "utils/docs"; import { TaskAppIFrame } from "./TaskAppIframe"; diff --git a/site/src/pages/TaskPage/TaskPage.stories.tsx b/site/src/pages/TaskPage/TaskPage.stories.tsx index 0799f4625c95f..16c3641f76bdc 100644 --- a/site/src/pages/TaskPage/TaskPage.stories.tsx +++ b/site/src/pages/TaskPage/TaskPage.stories.tsx @@ -1,11 +1,11 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, spyOn, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import type { Workspace, WorkspaceApp, WorkspaceResource, } from "api/typesGenerated"; +import { expect, spyOn, within } from "storybook/test"; import { MockFailedWorkspace, MockStartingWorkspace, diff --git a/site/src/pages/TaskPage/TaskPage.tsx b/site/src/pages/TaskPage/TaskPage.tsx index 19e2c5aafdcd7..38e645f910caf 100644 --- a/site/src/pages/TaskPage/TaskPage.tsx +++ b/site/src/pages/TaskPage/TaskPage.tsx @@ -12,8 +12,8 @@ import type { ReactNode } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"; -import { useParams } from "react-router-dom"; -import { Link as RouterLink } from "react-router-dom"; +import { useParams } from "react-router"; +import { Link as RouterLink } from "react-router"; import { ellipsizeText } from "utils/ellipsizeText"; import { pageTitle } from "utils/page"; import { diff --git a/site/src/pages/TaskPage/TaskSidebar.tsx b/site/src/pages/TaskPage/TaskSidebar.tsx index ca691bea08788..2309884d166b8 100644 --- a/site/src/pages/TaskPage/TaskSidebar.tsx +++ b/site/src/pages/TaskPage/TaskSidebar.tsx @@ -16,7 +16,7 @@ import { import { ArrowLeftIcon, EllipsisVerticalIcon } from "lucide-react"; import type { Task } from "modules/tasks/tasks"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { TaskAppIFrame } from "./TaskAppIframe"; import { TaskStatusLink } from "./TaskStatusLink"; diff --git a/site/src/pages/TaskPage/TaskStatusLink.stories.tsx b/site/src/pages/TaskPage/TaskStatusLink.stories.tsx index e7e96c84ba7e9..ac4023bf0c1f1 100644 --- a/site/src/pages/TaskPage/TaskStatusLink.stories.tsx +++ b/site/src/pages/TaskPage/TaskStatusLink.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TaskStatusLink } from "./TaskStatusLink"; const meta: Meta = { diff --git a/site/src/pages/TasksPage/TasksPage.stories.tsx b/site/src/pages/TasksPage/TasksPage.stories.tsx index 0bdc9d27a7eed..cfa47d3539fee 100644 --- a/site/src/pages/TasksPage/TasksPage.stories.tsx +++ b/site/src/pages/TasksPage/TasksPage.stories.tsx @@ -1,8 +1,8 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, spyOn, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import { MockUsers } from "pages/UsersPage/storybookData/users"; import { reactRouterParameters } from "storybook-addon-remix-react-router"; +import { expect, spyOn, userEvent, waitFor, within } from "storybook/test"; import { MockAIPromptPresets, MockNewTaskData, diff --git a/site/src/pages/TasksPage/TasksPage.tsx b/site/src/pages/TasksPage/TasksPage.tsx index e923f88312ba0..ce6ddea380046 100644 --- a/site/src/pages/TasksPage/TasksPage.tsx +++ b/site/src/pages/TasksPage/TasksPage.tsx @@ -59,7 +59,7 @@ import { generateWorkspaceName } from "modules/workspaces/generateWorkspaceName" import { type FC, type ReactNode, useEffect, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { Link as RouterLink, useNavigate } from "react-router-dom"; +import { Link as RouterLink, useNavigate } from "react-router"; import TextareaAutosize from "react-textarea-autosize"; import { docs } from "utils/docs"; import { pageTitle } from "utils/page"; diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedExperimentRouter.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedExperimentRouter.tsx index 85dd2e39b5452..ec834d0630d1c 100644 --- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedExperimentRouter.tsx +++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedExperimentRouter.tsx @@ -3,7 +3,7 @@ import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Loader } from "components/Loader/Loader"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import TemplateEmbedPage from "./TemplateEmbedPage"; import TemplateEmbedPageExperimental from "./TemplateEmbedPageExperimental"; diff --git a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageView.stories.tsx b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageView.stories.tsx index 571a27f6116b5..501e044525424 100644 --- a/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageView.stories.tsx +++ b/site/src/pages/TemplatePage/TemplateEmbedPage/TemplateEmbedPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplate, MockTemplateVersionParameter1, diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx index b6b6bc231ea71..a4e361f7b40cf 100644 --- a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.test.tsx @@ -2,7 +2,7 @@ import { render, screen } from "@testing-library/react"; import { AppProviders } from "App"; import { RequireAuth } from "contexts/auth/RequireAuth"; import { http, HttpResponse } from "msw"; -import { RouterProvider, createMemoryRouter } from "react-router-dom"; +import { RouterProvider, createMemoryRouter } from "react-router"; import { MockTemplate } from "testHelpers/entities"; import { server } from "testHelpers/server"; import { TemplateLayout } from "../TemplateLayout"; diff --git a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx index 23ee02d5442d4..833afbfe77c02 100644 --- a/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx +++ b/site/src/pages/TemplatePage/TemplateFilesPage/TemplateFilesPage.tsx @@ -5,7 +5,7 @@ import { useTemplateLayoutContext } from "pages/TemplatePage/TemplateLayout"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { getTemplatePageTitle } from "../utils"; const TemplateFilesPage: FC = () => { diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx index 2638308b876f4..91b51a6f2826a 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { TemplateInsightsPageView } from "./TemplateInsightsPage"; diff --git a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx index 37124431b4b41..2a0785b4cddef 100644 --- a/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx +++ b/site/src/pages/TemplatePage/TemplateInsightsPage/TemplateInsightsPage.tsx @@ -47,7 +47,7 @@ import { } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { getLatencyColor } from "utils/latency"; import { addTime, diff --git a/site/src/pages/TemplatePage/TemplateLayout.tsx b/site/src/pages/TemplatePage/TemplateLayout.tsx index 500f870579367..2a6b60e04615c 100644 --- a/site/src/pages/TemplatePage/TemplateLayout.tsx +++ b/site/src/pages/TemplatePage/TemplateLayout.tsx @@ -18,7 +18,7 @@ import { useContext, } from "react"; import { useQuery } from "react-query"; -import { Outlet, useLocation, useNavigate, useParams } from "react-router-dom"; +import { Outlet, useLocation, useNavigate, useParams } from "react-router"; import { TemplatePageHeader } from "./TemplatePageHeader"; const templatePermissions = ( diff --git a/site/src/pages/TemplatePage/TemplatePageHeader.stories.tsx b/site/src/pages/TemplatePage/TemplatePageHeader.stories.tsx index 04721a2224f0f..7d036cdaaabb2 100644 --- a/site/src/pages/TemplatePage/TemplatePageHeader.stories.tsx +++ b/site/src/pages/TemplatePage/TemplatePageHeader.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplate, MockTemplateVersion } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; import { TemplatePageHeader } from "./TemplatePageHeader"; diff --git a/site/src/pages/TemplatePage/TemplatePageHeader.tsx b/site/src/pages/TemplatePage/TemplatePageHeader.tsx index a7ebbf0ad00b1..e6d1bb2ad6fae 100644 --- a/site/src/pages/TemplatePage/TemplatePageHeader.tsx +++ b/site/src/pages/TemplatePage/TemplatePageHeader.tsx @@ -38,7 +38,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import type { WorkspacePermissions } from "modules/permissions/workspaces"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { Link as RouterLink, useNavigate } from "react-router-dom"; +import { Link as RouterLink, useNavigate } from "react-router"; import { TemplateStats } from "./TemplateStats"; import { useDeletionDialogState } from "./useDeletionDialogState"; diff --git a/site/src/pages/TemplatePage/TemplateRedirectController.tsx b/site/src/pages/TemplatePage/TemplateRedirectController.tsx index c4164746d1a6a..b81c26e343387 100644 --- a/site/src/pages/TemplatePage/TemplateRedirectController.tsx +++ b/site/src/pages/TemplatePage/TemplateRedirectController.tsx @@ -1,7 +1,7 @@ import type { Organization } from "api/typesGenerated"; import { useDashboard } from "modules/dashboard/useDashboard"; import type { FC } from "react"; -import { Navigate, Outlet, useLocation, useParams } from "react-router-dom"; +import { Navigate, Outlet, useLocation, useParams } from "react-router"; export const TemplateRedirectController: FC = () => { const { organizations, showOrganizations } = useDashboard(); diff --git a/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.stories.tsx b/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.stories.tsx index 2ad817348b5f1..a751cfb49e87b 100644 --- a/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.stories.tsx +++ b/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplate, MockWorkspaceResource, diff --git a/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.tsx b/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.tsx index 3dd0f0518ad51..a3fc97eda55c7 100644 --- a/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.tsx +++ b/site/src/pages/TemplatePage/TemplateResourcesPage/TemplateResourcesPageView.tsx @@ -2,7 +2,7 @@ import type { Template, WorkspaceResource } from "api/typesGenerated"; import { Loader } from "components/Loader/Loader"; import { TemplateResourcesTable } from "modules/templates/TemplateResourcesTable/TemplateResourcesTable"; import type { FC } from "react"; -import { Navigate, useLocation } from "react-router-dom"; +import { Navigate, useLocation } from "react-router"; interface TemplateResourcesPageViewProps { resources?: WorkspaceResource[]; diff --git a/site/src/pages/TemplatePage/TemplateStats.stories.tsx b/site/src/pages/TemplatePage/TemplateStats.stories.tsx index f1e1f694178ef..1b4796e4934a8 100644 --- a/site/src/pages/TemplatePage/TemplateStats.stories.tsx +++ b/site/src/pages/TemplatePage/TemplateStats.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplate, MockTemplateVersion } from "testHelpers/entities"; import { TemplateStats } from "./TemplateStats"; diff --git a/site/src/pages/TemplatePage/TemplateStats.tsx b/site/src/pages/TemplatePage/TemplateStats.tsx index 479cfdd14bf8d..dbd48497cc48b 100644 --- a/site/src/pages/TemplatePage/TemplateStats.tsx +++ b/site/src/pages/TemplatePage/TemplateStats.tsx @@ -1,7 +1,7 @@ import type { Template, TemplateVersion } from "api/typesGenerated"; import { Stats, StatsItem } from "components/Stats/Stats"; import type { FC } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; import { createDayString } from "utils/createDayString"; import { formatTemplateActiveDevelopers, diff --git a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx index 5c140c816067a..02115ac5a3c7a 100644 --- a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx +++ b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionRow.tsx @@ -9,7 +9,7 @@ import { Stack } from "components/Stack/Stack"; import { TimelineEntry } from "components/Timeline/TimelineEntry"; import { useClickableTableRow } from "hooks/useClickableTableRow"; import type { FC } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; interface VersionRowProps { version: TemplateVersion; diff --git a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx index 5d98328e6649d..6227abf52f2ad 100644 --- a/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx +++ b/site/src/pages/TemplatePage/TemplateVersionsPage/VersionsTable.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { MockCanceledProvisionerJob, MockCancelingProvisionerJob, diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx index be5af252aec31..73b09352feea2 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx @@ -8,7 +8,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueryClient } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSettingsPageView } from "./TemplateSettingsPageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx index dd9f930771ef9..12290312bae17 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { MockTemplate, mockApiError } from "testHelpers/entities"; import { TemplateSettingsPageView } from "./TemplateSettingsPageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.stories.tsx index f8527a63ec66d..bc7492ecea348 100644 --- a/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplatePermissionsPage/TemplatePermissionsPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplateACL, MockTemplateACLEmpty } from "testHelpers/entities"; import { TemplatePermissionsPageView } from "./TemplatePermissionsPageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/ScheduleDialog.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/ScheduleDialog.stories.tsx index fe440bf1f053b..7b73781b86415 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/ScheduleDialog.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/ScheduleDialog.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { ScheduleDialog } from "./ScheduleDialog"; const meta: Meta = { diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx index 60f209ac64cf0..89e55b3fb5258 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateScheduleAutostart.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; +import { userEvent, within } from "storybook/test"; import type { TemplateAutostartRequirementDaysValue } from "utils/schedule"; import { TemplateScheduleAutostart } from "./TemplateScheduleAutostart"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx index f322e8d451159..6f78e1d0d4a88 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.tsx @@ -7,7 +7,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueryClient } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSchedulePageView } from "./TemplateSchedulePageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.stories.tsx index e747340a93093..e54d961a7d49e 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePageView.stories.tsx @@ -1,6 +1,6 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { QueryClient, QueryClientProvider } from "react-query"; +import { action } from "storybook/actions"; import { MockTemplate } from "testHelpers/entities"; import { TemplateSchedulePageView } from "./TemplateSchedulePageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx index ae9bd4b8beeed..2236048778301 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSettingsLayout.tsx @@ -8,7 +8,7 @@ import { Stack } from "components/Stack/Stack"; import { type FC, Suspense, createContext, useContext } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { Outlet, useParams } from "react-router-dom"; +import { Outlet, useParams } from "react-router"; import { pageTitle } from "utils/page"; import { Sidebar } from "./Sidebar"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx index f2e3faf533e9e..372c1235331f2 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPage.tsx @@ -21,7 +21,7 @@ import { useQuery, useQueryClient, } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateVariablesPageView } from "./TemplateVariablesPageView"; diff --git a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPageView.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPageView.stories.tsx index ebe7247e848be..deb9541b83cc8 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPageView.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateVariablesPage/TemplateVariablesPageView.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { MockTemplateVersion, MockTemplateVersionVariable1, diff --git a/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.stories.tsx b/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.stories.tsx index 4d9517f42d90c..7aadbdebc242b 100644 --- a/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.stories.tsx +++ b/site/src/pages/TemplateVersionEditorPage/ProvisionerTagsPopover.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, fn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { useState } from "react"; +import { expect, fn, userEvent, within } from "storybook/test"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateVersion } from "testHelpers/entities"; import { ProvisionerTagsPopover } from "./ProvisionerTagsPopover"; diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx index 4b8413215c9e8..bce869ec33a0f 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { chromatic } from "testHelpers/chromatic"; import { MockFailedProvisionerJob, diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx index e6437b49d6d43..4a0e2b5c5fb60 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx @@ -39,7 +39,7 @@ import { type FC, useCallback, useEffect, useRef, useState } from "react"; import { Link as RouterLink, unstable_usePrompt as usePrompt, -} from "react-router-dom"; +} from "react-router"; import { MONOSPACE_FONT_FAMILY } from "theme/constants"; import { type FileTree, diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx index 999df793105a3..bf57a3c26b0f4 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx @@ -8,7 +8,7 @@ import { RequireAuth } from "contexts/auth/RequireAuth"; import WS from "jest-websocket-mock"; import { http, HttpResponse } from "msw"; import { QueryClient } from "react-query"; -import { RouterProvider, createMemoryRouter } from "react-router-dom"; +import { RouterProvider, createMemoryRouter } from "react-router"; import { MockTemplate, MockTemplateVersion, diff --git a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx index fdca9744fb29d..c0a26196c6b85 100644 --- a/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx +++ b/site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.tsx @@ -24,7 +24,7 @@ import { useQuery, useQueryClient, } from "react-query"; -import { useNavigate, useParams, useSearchParams } from "react-router-dom"; +import { useNavigate, useParams, useSearchParams } from "react-router"; import { type FileTree, existsFile, traverse } from "utils/filetree"; import { pageTitle } from "utils/page"; import { TarReader, TarWriter } from "utils/tar"; diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx index cd865c074dd9d..c6bd61eeec00b 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPage.tsx @@ -9,7 +9,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import { type FC, useMemo } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { pageTitle } from "utils/page"; import { TemplateVersionPageView } from "./TemplateVersionPageView"; diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.stories.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.stories.tsx index d7bbbfe2f8edb..312b556d5a422 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.stories.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplate, MockTemplateVersion, diff --git a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx index 4b45ed350dc15..f10b64fd82839 100644 --- a/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx +++ b/site/src/pages/TemplateVersionPage/TemplateVersionPageView.tsx @@ -16,7 +16,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import { TemplateFiles } from "modules/templates/TemplateFiles/TemplateFiles"; import { TemplateUpdateMessage } from "modules/templates/TemplateUpdateMessage"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { createDayString } from "utils/createDayString"; import type { TemplateVersionFiles } from "utils/templateVersion"; diff --git a/site/src/pages/TemplatesPage/EmptyTemplates.tsx b/site/src/pages/TemplatesPage/EmptyTemplates.tsx index aee7c6a5ea5b5..3be9ebec4fe70 100644 --- a/site/src/pages/TemplatesPage/EmptyTemplates.tsx +++ b/site/src/pages/TemplatesPage/EmptyTemplates.tsx @@ -7,7 +7,7 @@ import { Stack } from "components/Stack/Stack"; import { TableEmpty } from "components/TableEmpty/TableEmpty"; import { TemplateExampleCard } from "modules/templates/TemplateExampleCard/TemplateExampleCard"; import type { FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { docs } from "utils/docs"; // Those are from https://github.com/coder/coder/tree/main/examples/templates diff --git a/site/src/pages/TemplatesPage/TemplatesPage.tsx b/site/src/pages/TemplatesPage/TemplatesPage.tsx index bef25e17bb755..fb4d2a8454dc6 100644 --- a/site/src/pages/TemplatesPage/TemplatesPage.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPage.tsx @@ -6,7 +6,7 @@ import { useDashboard } from "modules/dashboard/useDashboard"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { TemplatesPageView } from "./TemplatesPageView"; diff --git a/site/src/pages/TemplatesPage/TemplatesPageView.stories.tsx b/site/src/pages/TemplatesPage/TemplatesPageView.stories.tsx index 714b5e3bbe9d1..deadabf5fe93f 100644 --- a/site/src/pages/TemplatesPage/TemplatesPageView.stories.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getDefaultFilterProps } from "components/Filter/storyHelpers"; import { chromaticWithTablet } from "testHelpers/chromatic"; import { diff --git a/site/src/pages/TemplatesPage/TemplatesPageView.tsx b/site/src/pages/TemplatesPage/TemplatesPageView.tsx index 856ce4bc5837b..c8e391a7ebc2b 100644 --- a/site/src/pages/TemplatesPage/TemplatesPageView.tsx +++ b/site/src/pages/TemplatesPage/TemplatesPageView.tsx @@ -43,7 +43,7 @@ import { PlusIcon } from "lucide-react"; import { linkToTemplate, useLinks } from "modules/navigation"; import type { WorkspacePermissions } from "modules/permissions/workspaces"; import type { FC } from "react"; -import { Link as RouterLink, useNavigate } from "react-router-dom"; +import { Link as RouterLink, useNavigate } from "react-router"; import { createDayString } from "utils/createDayString"; import { docs } from "utils/docs"; import { diff --git a/site/src/pages/TerminalPage/TerminalPage.stories.tsx b/site/src/pages/TerminalPage/TerminalPage.stories.tsx index 298f890637042..3b5e4b509b6b1 100644 --- a/site/src/pages/TerminalPage/TerminalPage.stories.tsx +++ b/site/src/pages/TerminalPage/TerminalPage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getAuthorizationKey } from "api/queries/authCheck"; import { workspaceByOwnerAndNameKey } from "api/queries/workspaces"; import type { Workspace, WorkspaceAgentLifecycle } from "api/typesGenerated"; diff --git a/site/src/pages/TerminalPage/TerminalPage.tsx b/site/src/pages/TerminalPage/TerminalPage.tsx index bde7517ef5d19..2cbd816246b3e 100644 --- a/site/src/pages/TerminalPage/TerminalPage.tsx +++ b/site/src/pages/TerminalPage/TerminalPage.tsx @@ -18,7 +18,7 @@ import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { type FC, useCallback, useEffect, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { useNavigate, useParams, useSearchParams } from "react-router-dom"; +import { useNavigate, useParams, useSearchParams } from "react-router"; import themes from "theme"; import { DEFAULT_TERMINAL_FONT, terminalFonts } from "theme/constants"; import { pageTitle } from "utils/page"; diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountForm.stories.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountForm.stories.tsx index 6c0f3e5dc29f0..a79f814d1abaf 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountForm.stories.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountForm.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { mockApiError } from "testHelpers/entities"; import { AccountForm } from "./AccountForm"; diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountUserGroups.stories.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountUserGroups.stories.tsx index a85327e420e3a..9bda00adfe1f1 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountUserGroups.stories.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountUserGroups.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockGroup as MockGroup1, MockUserOwner, diff --git a/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.stories.tsx b/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.stories.tsx index 436e2e7e38c2d..f4b605c98cde7 100644 --- a/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.stories.tsx +++ b/site/src/pages/UserSettingsPage/AppearancePage/AppearanceForm.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { AppearanceForm } from "./AppearanceForm"; const onUpdateTheme = action("update"); diff --git a/site/src/pages/UserSettingsPage/ExternalAuthPage/ExternalAuthPageView.stories.tsx b/site/src/pages/UserSettingsPage/ExternalAuthPage/ExternalAuthPageView.stories.tsx index 86a9978318a17..4fc77efebe1c8 100644 --- a/site/src/pages/UserSettingsPage/ExternalAuthPage/ExternalAuthPageView.stories.tsx +++ b/site/src/pages/UserSettingsPage/ExternalAuthPage/ExternalAuthPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockGithubAuthLink, MockGithubExternalProvider, diff --git a/site/src/pages/UserSettingsPage/Layout.tsx b/site/src/pages/UserSettingsPage/Layout.tsx index 0745771166ff5..590d7aa79f088 100644 --- a/site/src/pages/UserSettingsPage/Layout.tsx +++ b/site/src/pages/UserSettingsPage/Layout.tsx @@ -4,7 +4,7 @@ import { Stack } from "components/Stack/Stack"; import { useAuthenticated } from "hooks"; import { type FC, Suspense } from "react"; import { Helmet } from "react-helmet-async"; -import { Outlet } from "react-router-dom"; +import { Outlet } from "react-router"; import { pageTitle } from "utils/page"; import { Sidebar } from "./Sidebar"; diff --git a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx index 72f26f791e960..2af87e66a7e46 100644 --- a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx +++ b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.stories.tsx @@ -1,5 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import { notificationDispatchMethodsKey, @@ -7,6 +6,7 @@ import { userNotificationPreferencesKey, } from "api/queries/notifications"; import { reactRouterParameters } from "storybook-addon-remix-react-router"; +import { expect, spyOn, userEvent, within } from "storybook/test"; import { MockNotificationMethodsResponse, MockNotificationPreferences, diff --git a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx index 4e4b1e6bc61bd..4f47064e45355 100644 --- a/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx +++ b/site/src/pages/UserSettingsPage/NotificationsPage/NotificationsPage.tsx @@ -33,7 +33,7 @@ import { type FC, Fragment } from "react"; import { useEffect } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQueries, useQueryClient } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { Section } from "../Section"; diff --git a/site/src/pages/UserSettingsPage/OAuth2ProviderPage/OAuth2ProviderPageView.stories.tsx b/site/src/pages/UserSettingsPage/OAuth2ProviderPage/OAuth2ProviderPageView.stories.tsx index 06ccb4bd1bee2..406bf58ab6239 100644 --- a/site/src/pages/UserSettingsPage/OAuth2ProviderPage/OAuth2ProviderPageView.stories.tsx +++ b/site/src/pages/UserSettingsPage/OAuth2ProviderPage/OAuth2ProviderPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockOAuth2ProviderApps } from "testHelpers/entities"; import OAuth2ProviderPageView from "./OAuth2ProviderPageView"; diff --git a/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.stories.tsx b/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.stories.tsx index 599f6cfd30d6b..f496a6b02c4ad 100644 --- a/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.stories.tsx +++ b/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { mockApiError } from "testHelpers/entities"; import { SSHKeysPageView } from "./SSHKeysPageView"; diff --git a/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.stories.tsx b/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.stories.tsx index 4e9c12aa7c69b..d91a6e1cf9af9 100644 --- a/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.stories.tsx +++ b/site/src/pages/UserSettingsPage/SchedulePage/ScheduleForm.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { mockApiError } from "testHelpers/entities"; import { ScheduleForm } from "./ScheduleForm"; diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.stories.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.stories.tsx index 0d360f4209c32..ad075fa985d90 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.stories.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SecurityForm.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { mockApiError } from "testHelpers/entities"; import { SecurityForm } from "./SecurityForm"; diff --git a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPageView.stories.tsx b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPageView.stories.tsx index 7446f359f5e95..624cc4453612b 100644 --- a/site/src/pages/UserSettingsPage/SecurityPage/SecurityPageView.stories.tsx +++ b/site/src/pages/UserSettingsPage/SecurityPage/SecurityPageView.stories.tsx @@ -1,7 +1,7 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import set from "lodash/fp/set"; import type { ComponentProps } from "react"; +import { action } from "storybook/actions"; import { MockAuthMethodsAll, MockAuthMethodsPasswordOnly, diff --git a/site/src/pages/UserSettingsPage/TokensPage/ConfirmDeleteDialog.stories.tsx b/site/src/pages/UserSettingsPage/TokensPage/ConfirmDeleteDialog.stories.tsx index 8794b35fdcd3d..161145e2e414a 100644 --- a/site/src/pages/UserSettingsPage/TokensPage/ConfirmDeleteDialog.stories.tsx +++ b/site/src/pages/UserSettingsPage/TokensPage/ConfirmDeleteDialog.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { QueryClient, QueryClientProvider } from "react-query"; import { MockToken } from "testHelpers/entities"; import { ConfirmDeleteDialog } from "./ConfirmDeleteDialog"; diff --git a/site/src/pages/UserSettingsPage/TokensPage/TokensPage.tsx b/site/src/pages/UserSettingsPage/TokensPage/TokensPage.tsx index 9668b0fa7bb96..18bc0b4acfa63 100644 --- a/site/src/pages/UserSettingsPage/TokensPage/TokensPage.tsx +++ b/site/src/pages/UserSettingsPage/TokensPage/TokensPage.tsx @@ -4,7 +4,7 @@ import type { APIKeyWithOwner } from "api/typesGenerated"; import { Stack } from "components/Stack/Stack"; import { PlusIcon } from "lucide-react"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { Section } from "../Section"; import { ConfirmDeleteDialog } from "./ConfirmDeleteDialog"; import { TokensPageView } from "./TokensPageView"; diff --git a/site/src/pages/UserSettingsPage/TokensPage/TokensPageView.stories.tsx b/site/src/pages/UserSettingsPage/TokensPage/TokensPageView.stories.tsx index 7097d465823cf..cd84b64976f39 100644 --- a/site/src/pages/UserSettingsPage/TokensPage/TokensPageView.stories.tsx +++ b/site/src/pages/UserSettingsPage/TokensPage/TokensPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTokens, mockApiError } from "testHelpers/entities"; import { TokensPageView } from "./TokensPageView"; diff --git a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyView.stories.tsx b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyView.stories.tsx index 8892937d2e0f5..da9715f27d4b4 100644 --- a/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyView.stories.tsx +++ b/site/src/pages/UserSettingsPage/WorkspaceProxyPage/WorkspaceProxyView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockHealthyWildWorkspaceProxy, MockPrimaryWorkspaceProxy, diff --git a/site/src/pages/UsersPage/ResetPasswordDialog.stories.tsx b/site/src/pages/UsersPage/ResetPasswordDialog.stories.tsx index bd64eef6ae7e5..37300b6224157 100644 --- a/site/src/pages/UsersPage/ResetPasswordDialog.stories.tsx +++ b/site/src/pages/UsersPage/ResetPasswordDialog.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockUserOwner } from "testHelpers/entities"; import { ResetPasswordDialog } from "./ResetPasswordDialog"; diff --git a/site/src/pages/UsersPage/UsersPage.stories.tsx b/site/src/pages/UsersPage/UsersPage.stories.tsx index fdede4ec9f163..185ad19786aca 100644 --- a/site/src/pages/UsersPage/UsersPage.stories.tsx +++ b/site/src/pages/UsersPage/UsersPage.stories.tsx @@ -1,5 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { screen, spyOn, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { API } from "api/api"; import { deploymentConfigQueryKey } from "api/queries/deployment"; import { groupsQueryKey } from "api/queries/groups"; @@ -9,6 +8,7 @@ import type { User } from "api/typesGenerated"; import { MockGroups } from "pages/UsersPage/storybookData/groups"; import { MockRoles } from "pages/UsersPage/storybookData/roles"; import { MockUsers } from "pages/UsersPage/storybookData/users"; +import { screen, spyOn, userEvent, within } from "storybook/test"; import { MockAuthMethodsAll, MockUserOwner } from "testHelpers/entities"; import { withAuthProvider, diff --git a/site/src/pages/UsersPage/UsersPage.tsx b/site/src/pages/UsersPage/UsersPage.tsx index 581a9166bce3d..354e77aceac7e 100644 --- a/site/src/pages/UsersPage/UsersPage.tsx +++ b/site/src/pages/UsersPage/UsersPage.tsx @@ -23,7 +23,7 @@ import { useDashboard } from "modules/dashboard/useDashboard"; import { type FC, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate, useSearchParams } from "react-router-dom"; +import { useNavigate, useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { generateRandomString } from "utils/random"; import { ResetPasswordDialog } from "./ResetPasswordDialog"; diff --git a/site/src/pages/UsersPage/UsersPageView.stories.tsx b/site/src/pages/UsersPage/UsersPageView.stories.tsx index c15b8aefc1b23..a78b7801b877d 100644 --- a/site/src/pages/UsersPage/UsersPageView.stories.tsx +++ b/site/src/pages/UsersPage/UsersPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockMenu, getDefaultFilterProps, diff --git a/site/src/pages/UsersPage/UsersPageView.tsx b/site/src/pages/UsersPage/UsersPageView.tsx index 7f385ad2ee970..e97eb36714aab 100644 --- a/site/src/pages/UsersPage/UsersPageView.tsx +++ b/site/src/pages/UsersPage/UsersPageView.tsx @@ -12,7 +12,7 @@ import { } from "components/SettingsHeader/SettingsHeader"; import { UserPlusIcon } from "lucide-react"; import type { ComponentProps, FC } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { UsersFilter } from "./UsersFilter"; import { UsersTable } from "./UsersTable/UsersTable"; diff --git a/site/src/pages/UsersPage/UsersTable/UsersTable.stories.tsx b/site/src/pages/UsersPage/UsersTable/UsersTable.stories.tsx index 5ef7116025919..0cbb457a45100 100644 --- a/site/src/pages/UsersPage/UsersTable/UsersTable.stories.tsx +++ b/site/src/pages/UsersPage/UsersTable/UsersTable.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockAssignableSiteRoles, MockAuditorRole, diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx index 78ff4b69f98c8..551989efee8c7 100644 --- a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx +++ b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx @@ -5,7 +5,7 @@ import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { keepPreviousData, useQuery } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { pageTitle } from "utils/page"; import { WorkspaceBuildPageView } from "./WorkspaceBuildPageView"; diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.stories.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.stories.tsx index 2e61f0d24bd55..8b9fa443f8f61 100644 --- a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.stories.tsx +++ b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockFailedWorkspaceBuild, diff --git a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx index 3a45653557dcc..75849e0790f67 100644 --- a/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx +++ b/site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx @@ -35,7 +35,7 @@ import { useRef, useState, } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; import { displayWorkspaceBuildDuration } from "utils/workspace"; import { Sidebar, SidebarCaption, SidebarItem } from "./Sidebar"; diff --git a/site/src/pages/WorkspacePage/AppStatuses.stories.tsx b/site/src/pages/WorkspacePage/AppStatuses.stories.tsx index c7ec5eb56f417..062d06e1c3f20 100644 --- a/site/src/pages/WorkspacePage/AppStatuses.stories.tsx +++ b/site/src/pages/WorkspacePage/AppStatuses.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { WorkspaceAppStatus } from "api/typesGenerated"; +import { userEvent, within } from "storybook/test"; import { MockWorkspace, MockWorkspaceAgent, diff --git a/site/src/pages/WorkspacePage/AppStatuses.tsx b/site/src/pages/WorkspacePage/AppStatuses.tsx index 71547992ecd9e..55066d9094e8f 100644 --- a/site/src/pages/WorkspacePage/AppStatuses.tsx +++ b/site/src/pages/WorkspacePage/AppStatuses.tsx @@ -27,7 +27,7 @@ import { import { AppStatusStateIcon } from "modules/apps/AppStatusStateIcon"; import { useAppLink } from "modules/apps/useAppLink"; import { type FC, useState } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { truncateURI } from "utils/uri"; interface AppStatusesProps { diff --git a/site/src/pages/WorkspacePage/ResourceMetadata.stories.tsx b/site/src/pages/WorkspacePage/ResourceMetadata.stories.tsx index dde544134ce9e..20f173d5e225d 100644 --- a/site/src/pages/WorkspacePage/ResourceMetadata.stories.tsx +++ b/site/src/pages/WorkspacePage/ResourceMetadata.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceResource } from "testHelpers/entities"; import { ResourceMetadata } from "./ResourceMetadata"; diff --git a/site/src/pages/WorkspacePage/Workspace.stories.tsx b/site/src/pages/WorkspacePage/Workspace.stories.tsx index 4fb197e6b5146..77ba7d67e94de 100644 --- a/site/src/pages/WorkspacePage/Workspace.stories.tsx +++ b/site/src/pages/WorkspacePage/Workspace.stories.tsx @@ -1,6 +1,6 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { ProvisionerJobLog } from "api/typesGenerated"; +import { action } from "storybook/actions"; import * as Mocks from "testHelpers/entities"; import { withAuthProvider, diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index 5c032c04efbdf..07c5ec26d0766 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -11,7 +11,7 @@ import { ProvisionerStatusAlert } from "modules/provisioners/ProvisionerStatusAl import { AgentRow } from "modules/resources/AgentRow"; import { WorkspaceTimings } from "modules/workspaces/WorkspaceTiming/WorkspaceTimings"; import type { FC } from "react"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import type { WorkspacePermissions } from "../../modules/workspaces/permissions"; import { HistorySidebar } from "./HistorySidebar"; import { ResourceMetadata } from "./ResourceMetadata"; diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx index f084c4c200b67..56c481cc96fd5 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/BuildParametersPopover.tsx @@ -27,7 +27,7 @@ import { useFormik } from "formik"; import { ChevronDownIcon } from "lucide-react"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { docs } from "utils/docs"; import { getFormHelpers } from "utils/formUtils"; import { diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/DebugButton.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/DebugButton.stories.tsx index 4e947cf27e7bd..a9e2d398e602e 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/DebugButton.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/DebugButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockWorkspace } from "testHelpers/entities"; import { DebugButton } from "./DebugButton"; diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/RetryButton.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/RetryButton.stories.tsx index 2603cf7206a61..678158c57a3d2 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/RetryButton.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/RetryButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockWorkspace } from "testHelpers/entities"; import { RetryButton } from "./RetryButton"; diff --git a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx index 19dde8871045f..005368e336aff 100644 --- a/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { deploymentConfigQueryKey } from "api/queries/deployment"; import { agentLogsKey, buildLogsKey } from "api/queries/workspaces"; +import { expect, userEvent, within } from "storybook/test"; import * as Mocks from "testHelpers/entities"; import { withAuthProvider, diff --git a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.stories.tsx index 433f16ddd9fd3..5a91ef71c633a 100644 --- a/site/src/pages/WorkspacePage/WorkspaceBuildProgress.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceBuildProgress.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import dayjs from "dayjs"; import { MockProvisionerJob, diff --git a/site/src/pages/WorkspacePage/WorkspaceDeletedBanner.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceDeletedBanner.stories.tsx index 76eff3d6b5c77..428ff85f6a0b6 100644 --- a/site/src/pages/WorkspacePage/WorkspaceDeletedBanner.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceDeletedBanner.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { WorkspaceDeletedBanner } from "./WorkspaceDeletedBanner"; const meta: Meta = { diff --git a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.stories.tsx index a35771971b329..f5707df9a5b81 100644 --- a/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceNotifications/WorkspaceNotifications.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getWorkspaceResolveAutostartQueryKey } from "api/queries/workspaceQuota"; import type { WorkspacePermissions } from "modules/workspaces/permissions"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockOutdatedWorkspace, MockTemplate, diff --git a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx index 645c03380501a..288e80127af4a 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.test.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.test.tsx @@ -10,7 +10,6 @@ import { import type { WorkspacePermissions } from "modules/workspaces/permissions"; import { http, HttpResponse } from "msw"; import type { FC } from "react"; -import { type Location, useLocation } from "react-router-dom"; import { MockAppearanceConfig, MockBuildInfo, @@ -54,13 +53,15 @@ const renderWorkspacePage = async ( .mockResolvedValueOnce(MockDeploymentConfig); jest.spyOn(apiModule, "watchWorkspaceAgentLogs"); - renderWithAuth(, { + const result = renderWithAuth(, { ...options, route: `/@${workspace.owner_name}/${workspace.name}`, path: "/:username/:workspace", }); await screen.findByText(workspace.name); + + return result; }; /** @@ -336,7 +337,7 @@ describe("WorkspacePage", () => { // After trying to update, a new dialog asking for missed parameters should // be displayed and filled - const dialog = await screen.findByTestId("dialog"); + const dialog = await waitFor(() => screen.findByTestId("dialog")); const firstParameterInput = within(dialog).getByLabelText( MockTemplateVersionParameter1.name, { exact: false }, @@ -617,10 +618,8 @@ describe("WorkspacePage", () => { ); - let destinationLocation!: Location; const MockWorkspacesPage: FC = () => { - destinationLocation = useLocation(); - return null; + return

    Workspaces

    ; }; const workspace: Workspace = { @@ -628,7 +627,7 @@ describe("WorkspacePage", () => { organization_name: MockOrganization.name, }; - await renderWorkspacePage(workspace, { + const { router } = await renderWorkspacePage(workspace, { mockAuthProviders: { DashboardProvider: MockDashboardProvider, }, @@ -652,8 +651,9 @@ describe("WorkspacePage", () => { const user = userEvent.setup(); await user.click(quotaLink); - expect(destinationLocation.pathname).toBe("/workspaces"); - expect(destinationLocation.search).toBe( + await waitFor(() => screen.findByText("Workspaces")); + expect(router.state.location.pathname).toBe("/workspaces"); + expect(router.state.location.search).toBe( `?filter=organization:${orgName}`, ); }); diff --git a/site/src/pages/WorkspacePage/WorkspacePage.tsx b/site/src/pages/WorkspacePage/WorkspacePage.tsx index 2085fb82b0cda..ae3e5a017f6d3 100644 --- a/site/src/pages/WorkspacePage/WorkspacePage.tsx +++ b/site/src/pages/WorkspacePage/WorkspacePage.tsx @@ -13,7 +13,7 @@ import { Margins } from "components/Margins/Margins"; import { useEffectEvent } from "hooks/hookPolyfills"; import { type FC, useEffect } from "react"; import { useQuery, useQueryClient } from "react-query"; -import { useParams } from "react-router-dom"; +import { useParams } from "react-router"; import { WorkspaceReadyPage } from "./WorkspaceReadyPage"; const WorkspacePage: FC = () => { diff --git a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx index 5bced6f668d0f..c8da5c0cfba17 100644 --- a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.tsx @@ -17,7 +17,7 @@ import { ClockIcon, MinusIcon, PlusIcon } from "lucide-react"; import { getWorkspaceActivityStatus } from "modules/workspaces/activity"; import { type FC, type ReactNode, forwardRef, useRef, useState } from "react"; import { useMutation, useQueryClient } from "react-query"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { autostartDisplay, autostopDisplay, diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.stories.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.stories.tsx index 2d838ca9dc31d..9a8a1878d9369 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.stories.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.stories.tsx @@ -1,8 +1,8 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, screen, userEvent, waitFor, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getWorkspaceQuotaQueryKey } from "api/queries/workspaceQuota"; import type { Workspace, WorkspaceQuota } from "api/typesGenerated"; import dayjs from "dayjs"; +import { expect, screen, userEvent, waitFor, within } from "storybook/test"; import { MockOrganization, MockTemplate, diff --git a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx index 943b967de92c6..ff0a92761b731 100644 --- a/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceTopbar.tsx @@ -24,7 +24,7 @@ import { linkToTemplate, useLinks } from "modules/navigation"; import { WorkspaceStatusIndicator } from "modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator"; import type { FC } from "react"; import { useQuery } from "react-query"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { displayDormantDeletion } from "utils/dormant"; import type { WorkspacePermissions } from "../../modules/workspaces/permissions"; import { WorkspaceActions } from "./WorkspaceActions/WorkspaceActions"; diff --git a/site/src/pages/WorkspacePage/useResourcesNav.test.tsx b/site/src/pages/WorkspacePage/useResourcesNav.test.tsx index 7200405e3b558..693a0a90d3053 100644 --- a/site/src/pages/WorkspacePage/useResourcesNav.test.tsx +++ b/site/src/pages/WorkspacePage/useResourcesNav.test.tsx @@ -1,6 +1,6 @@ import { renderHook } from "@testing-library/react"; import type { WorkspaceResource } from "api/typesGenerated"; -import { RouterProvider, createMemoryRouter } from "react-router-dom"; +import { RouterProvider, createMemoryRouter } from "react-router"; import { MockWorkspaceResource } from "testHelpers/entities"; import { resourceOptionValue, useResourcesNav } from "./useResourcesNav"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.stories.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.stories.tsx index 34e68703cf2a4..35f80410a51d6 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.stories.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { MockOutdatedStoppedWorkspaceRequireActiveVersion, MockTemplateVersionParameter1, diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx index c0dca85aa471c..d10db1fbe159b 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.tsx @@ -10,7 +10,7 @@ import { ExternalLinkIcon } from "lucide-react"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { docs } from "utils/docs"; import { pageTitle } from "utils/page"; import { diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx index 1415b1b2bc5f1..9c1ef433f2cb0 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPageExperimental.tsx @@ -22,7 +22,7 @@ import type { FC } from "react"; import { useEffect, useMemo, useRef, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery } from "react-query"; -import { useNavigate, useSearchParams } from "react-router-dom"; +import { useNavigate, useSearchParams } from "react-router"; import { docs } from "utils/docs"; import { pageTitle } from "utils/page"; import type { AutofillBuildParameter } from "utils/richParameters"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx index 17d562387970d..961f5589df9b2 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.stories.tsx @@ -1,5 +1,4 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import dayjs from "dayjs"; import advancedFormat from "dayjs/plugin/advancedFormat"; import timezone from "dayjs/plugin/timezone"; @@ -9,6 +8,7 @@ import { emptySchedule, } from "pages/WorkspaceSettingsPage/WorkspaceSchedulePage/schedule"; import { emptyTTL } from "pages/WorkspaceSettingsPage/WorkspaceSchedulePage/ttl"; +import { action } from "storybook/actions"; import { MockTemplate, mockApiError } from "testHelpers/entities"; import { WorkspaceScheduleForm } from "./WorkspaceScheduleForm"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.stories.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.stories.tsx index e576e479d27c7..22be968323ee1 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.stories.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getAuthorizationKey } from "api/queries/authCheck"; import { templateByNameKey } from "api/queries/templates"; import { workspaceByOwnerAndNameKey } from "api/queries/workspaces"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx index 4c8526a4cda6b..161197fcb759f 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.tsx @@ -20,7 +20,7 @@ import { useWorkspaceSettings } from "pages/WorkspaceSettingsPage/WorkspaceSetti import { type FC, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { docs } from "utils/docs"; import { pageTitle } from "utils/page"; import { WorkspaceScheduleForm } from "./WorkspaceScheduleForm"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx index f3a36c98475e4..3dd53f84ad0c0 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsLayout.tsx @@ -7,7 +7,7 @@ import { Stack } from "components/Stack/Stack"; import { type FC, Suspense, createContext, useContext } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery } from "react-query"; -import { Outlet, useParams } from "react-router-dom"; +import { Outlet, useParams } from "react-router"; import { pageTitle } from "utils/page"; import { Sidebar } from "./Sidebar"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx index fbe48b0216fc1..0c25c0a19f661 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx @@ -3,7 +3,7 @@ import { displaySuccess } from "components/GlobalSnackbar/utils"; import type { FC } from "react"; import { Helmet } from "react-helmet-async"; import { useMutation } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { useNavigate, useParams } from "react-router"; import { pageTitle } from "utils/page"; import type { WorkspaceSettingsFormValues } from "./WorkspaceSettingsForm"; import { useWorkspaceSettings } from "./WorkspaceSettingsLayout"; diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx index 7b71cf293b221..911b418fc010e 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { MockWorkspace } from "testHelpers/entities"; import { WorkspaceSettingsPageView } from "./WorkspaceSettingsPageView"; diff --git a/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.stories.tsx b/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.stories.tsx index 3abb069f05d7b..9de4850a8965b 100644 --- a/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.stories.tsx +++ b/site/src/pages/WorkspacesPage/BatchDeleteConfirmation.stories.tsx @@ -1,5 +1,5 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; import { chromatic } from "testHelpers/chromatic"; import { MockUserMember, MockWorkspace } from "testHelpers/entities"; import { BatchDeleteConfirmation } from "./BatchDeleteConfirmation"; diff --git a/site/src/pages/WorkspacesPage/BatchUpdateConfirmation.stories.tsx b/site/src/pages/WorkspacesPage/BatchUpdateConfirmation.stories.tsx index 140d433d3e860..429d47e1c4eb3 100644 --- a/site/src/pages/WorkspacesPage/BatchUpdateConfirmation.stories.tsx +++ b/site/src/pages/WorkspacesPage/BatchUpdateConfirmation.stories.tsx @@ -1,7 +1,7 @@ -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Workspace } from "api/typesGenerated"; import { useQueryClient } from "react-query"; +import { action } from "storybook/actions"; import { chromatic } from "testHelpers/chromatic"; import { MockDormantOutdatedWorkspace, diff --git a/site/src/pages/WorkspacesPage/WorkspacesButton.tsx b/site/src/pages/WorkspacesPage/WorkspacesButton.tsx index 404425b56a1e0..78692b28bec69 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesButton.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesButton.tsx @@ -19,7 +19,7 @@ import type { UseQueryResult } from "react-query"; import { Link as RouterLink, type LinkProps as RouterLinkProps, -} from "react-router-dom"; +} from "react-router"; type TemplatesQuery = UseQueryResult; diff --git a/site/src/pages/WorkspacesPage/WorkspacesEmpty.tsx b/site/src/pages/WorkspacesPage/WorkspacesEmpty.tsx index 45c9b221ef743..810a2598f3d26 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesEmpty.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesEmpty.tsx @@ -4,7 +4,7 @@ import { Button } from "components/Button/Button"; import { EmptyState } from "components/EmptyState/EmptyState"; import { linkToTemplate, useLinks } from "modules/navigation"; import type { FC } from "react"; -import { Link } from "react-router-dom"; +import { Link } from "react-router"; interface WorkspacesEmptyProps { isUsingFilter: boolean; diff --git a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx index fa96191501379..22739d21dce89 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPage.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPage.tsx @@ -14,7 +14,7 @@ import { useOrganizationsFilterMenu } from "modules/tableFiltering/options"; import { type FC, useEffect, useMemo, useState } from "react"; import { Helmet } from "react-helmet-async"; import { useQuery, useQueryClient } from "react-query"; -import { useSearchParams } from "react-router-dom"; +import { useSearchParams } from "react-router"; import { pageTitle } from "utils/page"; import { BatchDeleteConfirmation } from "./BatchDeleteConfirmation"; import { BatchUpdateConfirmation } from "./BatchUpdateConfirmation"; diff --git a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx index e0178dea06c09..e0fa40027cfc7 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx @@ -1,5 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react"; -import { expect, within } from "@storybook/test"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { type Workspace, type WorkspaceStatus, @@ -13,6 +12,7 @@ import { DEFAULT_RECORDS_PER_PAGE } from "components/PaginationWidget/utils"; import dayjs from "dayjs"; import uniqueId from "lodash/uniqueId"; import type { ComponentProps } from "react"; +import { expect, within } from "storybook/test"; import { MockBuildInfo, MockOrganization, diff --git a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx index 23695d8fbc591..e45291222f5ce 100644 --- a/site/src/pages/WorkspacesPage/WorkspacesTable.tsx +++ b/site/src/pages/WorkspacesPage/WorkspacesTable.tsx @@ -81,7 +81,7 @@ import { useState, } from "react"; import { useMutation, useQuery, useQueryClient } from "react-query"; -import { useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router"; import { cn } from "utils/cn"; import { getDisplayWorkspaceTemplateName, diff --git a/site/src/router.tsx b/site/src/router.tsx index 9f92c80f35f0f..76925ba7162aa 100644 --- a/site/src/router.tsx +++ b/site/src/router.tsx @@ -7,7 +7,7 @@ import { Route, createBrowserRouter, createRoutesFromChildren, -} from "react-router-dom"; +} from "react-router"; import { Loader } from "./components/Loader/Loader"; import { RequireAuth } from "./contexts/auth/RequireAuth"; import { DashboardLayout } from "./modules/dashboard/DashboardLayout"; diff --git a/site/src/testHelpers/hooks.tsx b/site/src/testHelpers/hooks.tsx index ddb74dd33a4b1..4e8b22f5a1d1e 100644 --- a/site/src/testHelpers/hooks.tsx +++ b/site/src/testHelpers/hooks.tsx @@ -19,7 +19,7 @@ import { RouterProvider, createMemoryRouter, useLocation, -} from "react-router-dom"; +} from "react-router"; import { type RenderWithAuthOptions, createTestQueryClient, diff --git a/site/src/testHelpers/renderHelpers.tsx b/site/src/testHelpers/renderHelpers.tsx index 3dfb740b6d8f4..d40c01c0ddb05 100644 --- a/site/src/testHelpers/renderHelpers.tsx +++ b/site/src/testHelpers/renderHelpers.tsx @@ -18,7 +18,7 @@ import { type RouteObject, RouterProvider, createMemoryRouter, -} from "react-router-dom"; +} from "react-router"; import themes, { DEFAULT_THEME } from "theme"; import { MockUserOwner } from "./entities"; diff --git a/site/src/testHelpers/storybook.tsx b/site/src/testHelpers/storybook.tsx index beceaf099bf92..4a1c045b9609a 100644 --- a/site/src/testHelpers/storybook.tsx +++ b/site/src/testHelpers/storybook.tsx @@ -1,4 +1,4 @@ -import type { StoryContext } from "@storybook/react"; +import type { StoryContext } from "@storybook/react-vite"; import { withDefaultFeatures } from "api/api"; import { getAuthorizationKey } from "api/queries/authCheck"; import { hasFirstUserKey, meKey } from "api/queries/users"; diff --git a/site/src/utils/formUtils.stories.tsx b/site/src/utils/formUtils.stories.tsx index 7de6b160ee32d..281783b184ad8 100644 --- a/site/src/utils/formUtils.stories.tsx +++ b/site/src/utils/formUtils.stories.tsx @@ -1,9 +1,9 @@ import TextField from "@mui/material/TextField"; -import { action } from "@storybook/addon-actions"; -import type { Meta, StoryObj } from "@storybook/react"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { Form } from "components/Form/Form"; import { useFormik } from "formik"; import type { FC } from "react"; +import { action } from "storybook/actions"; import { getFormHelpers } from "./formUtils"; interface ExampleFormProps { diff --git a/site/src/utils/schedule.tsx b/site/src/utils/schedule.tsx index 763ce78a8867b..31ddd36893653 100644 --- a/site/src/utils/schedule.tsx +++ b/site/src/utils/schedule.tsx @@ -10,7 +10,7 @@ import timezone from "dayjs/plugin/timezone"; import utc from "dayjs/plugin/utc"; import type { WorkspaceActivityStatus } from "modules/workspaces/activity"; import type { ReactNode } from "react"; -import { Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink } from "react-router"; import { isWorkspaceOn } from "./workspace"; // REMARK: some plugins depend on utc, so it's listed first. Otherwise they're From 7b877310b5ce9f5a6c9c33b4e84d571c889c87f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 00:46:13 +0000 Subject: [PATCH 115/260] chore: bump coder/git-clone/coder from 1.1.0 to 1.1.1 in /dogfood/coder (#19271) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/git-clone/coder&package-manager=terraform&previous-version=1.1.0&new-version=1.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index c9bd9cb9633c0..853126c1cec72 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -279,7 +279,7 @@ module "dotfiles" { module "git-clone" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/git-clone/coder" - version = "1.1.0" + version = "1.1.1" agent_id = coder_agent.dev.id url = "https://github.com/coder/coder" base_dir = local.repo_base_dir From acb38b1a7e1cb488420ac3ec5cdb49f80c737308 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 00:46:38 +0000 Subject: [PATCH 116/260] chore: bump coder/jetbrains/coder from 1.0.0 to 1.0.2 in /dogfood/coder (#19272) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/jetbrains/coder&package-manager=terraform&previous-version=1.0.0&new-version=1.0.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index 853126c1cec72..ae4088ec40fe7 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -317,7 +317,7 @@ module "vscode-web" { module "jetbrains" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/jetbrains/coder" - version = "1.0.0" + version = "1.0.2" agent_id = coder_agent.dev.id agent_name = "dev" folder = local.repo_dir From 99f252f2d1333717962f9c7e07e71f11cda83a42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 00:46:54 +0000 Subject: [PATCH 117/260] chore: bump coder/dotfiles/coder from 1.2.0 to 1.2.1 in /dogfood/coder-envbuilder (#19273) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/dotfiles/coder&package-manager=terraform&previous-version=1.2.0&new-version=1.2.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder-envbuilder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder-envbuilder/main.tf b/dogfood/coder-envbuilder/main.tf index da2e70b1fef51..404bf1ee0aa77 100644 --- a/dogfood/coder-envbuilder/main.tf +++ b/dogfood/coder-envbuilder/main.tf @@ -117,7 +117,7 @@ module "slackme" { module "dotfiles" { source = "dev.registry.coder.com/coder/dotfiles/coder" - version = "1.2.0" + version = "1.2.1" agent_id = coder_agent.dev.id } From ab41e981800cb6965ce25bfc0e7634d1839540a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 00:47:58 +0000 Subject: [PATCH 118/260] chore: bump coder/slackme/coder from 1.0.30 to 1.0.31 in /dogfood/coder-envbuilder (#19274) [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=coder/slackme/coder&package-manager=terraform&previous-version=1.0.30&new-version=1.0.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- dogfood/coder-envbuilder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder-envbuilder/main.tf b/dogfood/coder-envbuilder/main.tf index 404bf1ee0aa77..73cef7dec5b9d 100644 --- a/dogfood/coder-envbuilder/main.tf +++ b/dogfood/coder-envbuilder/main.tf @@ -110,7 +110,7 @@ data "coder_workspace_owner" "me" {} module "slackme" { source = "dev.registry.coder.com/coder/slackme/coder" - version = "1.0.30" + version = "1.0.31" agent_id = coder_agent.dev.id auth_provider_id = "slack" } From dadeab881b0cc955db499e6112dd3e94742907cf Mon Sep 17 00:00:00 2001 From: Rowan Smith Date: Mon, 11 Aug 2025 13:27:30 +1000 Subject: [PATCH 119/260] docs: fix broken link (#19275) Fixed a broken link to the coder registry so that it correctly loads agent modules https://coder.com/docs/ai-coder/custom-agents --- docs/ai-coder/custom-agents.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ai-coder/custom-agents.md b/docs/ai-coder/custom-agents.md index 6709251049efa..6ab68d949a69b 100644 --- a/docs/ai-coder/custom-agents.md +++ b/docs/ai-coder/custom-agents.md @@ -1,6 +1,6 @@ # Custom Agents -Custom agents beyond the ones listed in the [Coder registry](https://registry.coder.com/modules?tag=agent) can be used with Coder Tasks. +Custom agents beyond the ones listed in the [Coder registry](https://registry.coder.com/modules?search=tag%3Aagent) can be used with Coder Tasks. ## Prerequisites From b7e026682ab6ae5918b95cd4563a117b27bb201c Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Mon, 11 Aug 2025 11:43:25 +0200 Subject: [PATCH 120/260] fix: skip bash tests on Windows (#19277) Adds Windows compatibility to toolsdk tests This PR adds Windows compatibility to the toolsdk tests by: 1. Adding build constraints to exclude bash_test.go from running on Windows 2. Skipping the WorkspaceSSHExec test on Windows platforms with a clear message These changes ensure tests run properly across all supported platforms. Related to https://github.com/coder/internal/issues/798 Signed-off-by: Thomas Kosiewski --- codersdk/toolsdk/bash_test.go | 19 +++++++++++++++++++ codersdk/toolsdk/toolsdk_test.go | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/codersdk/toolsdk/bash_test.go b/codersdk/toolsdk/bash_test.go index 0656b2d8786e6..caf54109688ea 100644 --- a/codersdk/toolsdk/bash_test.go +++ b/codersdk/toolsdk/bash_test.go @@ -2,6 +2,7 @@ package toolsdk_test import ( "context" + "runtime" "testing" "github.com/stretchr/testify/require" @@ -14,6 +15,9 @@ import ( func TestWorkspaceBash(t *testing.T) { t.Parallel() + if runtime.GOOS == "windows" { + t.Skip("Skipping on Windows: Workspace MCP bash tools rely on a Unix-like shell (bash) and POSIX/SSH semantics. Use Linux/macOS or WSL for these tests.") + } t.Run("ValidateArgs", func(t *testing.T) { t.Parallel() @@ -97,6 +101,9 @@ func TestWorkspaceBash(t *testing.T) { func TestNormalizeWorkspaceInput(t *testing.T) { t.Parallel() + if runtime.GOOS == "windows" { + t.Skip("Skipping on Windows: Workspace MCP bash tools rely on a Unix-like shell (bash) and POSIX/SSH semantics. Use Linux/macOS or WSL for these tests.") + } testCases := []struct { name string @@ -151,6 +158,9 @@ func TestNormalizeWorkspaceInput(t *testing.T) { func TestAllToolsIncludesBash(t *testing.T) { t.Parallel() + if runtime.GOOS == "windows" { + t.Skip("Skipping on Windows: Workspace MCP bash tools rely on a Unix-like shell (bash) and POSIX/SSH semantics. Use Linux/macOS or WSL for these tests.") + } // Verify that WorkspaceBash is included in the All slice found := false @@ -169,6 +179,9 @@ func TestAllToolsIncludesBash(t *testing.T) { func TestWorkspaceBashTimeout(t *testing.T) { t.Parallel() + if runtime.GOOS == "windows" { + t.Skip("Skipping on Windows: Workspace MCP bash tools rely on a Unix-like shell (bash) and POSIX/SSH semantics. Use Linux/macOS or WSL for these tests.") + } t.Run("TimeoutDefaultValue", func(t *testing.T) { t.Parallel() @@ -251,6 +264,9 @@ func TestWorkspaceBashTimeout(t *testing.T) { func TestWorkspaceBashTimeoutIntegration(t *testing.T) { t.Parallel() + if runtime.GOOS == "windows" { + t.Skip("Skipping on Windows: Workspace MCP bash tools rely on a Unix-like shell (bash) and POSIX/SSH semantics. Use Linux/macOS or WSL for these tests.") + } t.Run("ActualTimeoutBehavior", func(t *testing.T) { t.Parallel() @@ -338,6 +354,9 @@ func TestWorkspaceBashTimeoutIntegration(t *testing.T) { func TestWorkspaceBashBackgroundIntegration(t *testing.T) { t.Parallel() + if runtime.GOOS == "windows" { + t.Skip("Skipping on Windows: Workspace MCP bash tools rely on a Unix-like shell (bash) and POSIX/SSH semantics. Use Linux/macOS or WSL for these tests.") + } t.Run("BackgroundCommandCapturesOutput", func(t *testing.T) { t.Parallel() diff --git a/codersdk/toolsdk/toolsdk_test.go b/codersdk/toolsdk/toolsdk_test.go index 13e475c80609a..0754514693a0e 100644 --- a/codersdk/toolsdk/toolsdk_test.go +++ b/codersdk/toolsdk/toolsdk_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "os" + "runtime" "sort" "sync" "testing" @@ -397,6 +398,9 @@ func TestTools(t *testing.T) { }) t.Run("WorkspaceSSHExec", func(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("WorkspaceSSHExec is not supported on Windows") + } // Setup workspace exactly like main SSH tests client, workspace, agentToken := setupWorkspaceForAgent(t) From 5d42b1861ea6a6307839f7af6d2c541fea7f5176 Mon Sep 17 00:00:00 2001 From: Jakub Domeracki Date: Mon, 11 Aug 2025 12:54:44 +0200 Subject: [PATCH 121/260] fix: upload the slim binaries from the build directory to the GCS bucket (#19281) Updated the upload script to copy the slim binaries from the ./build directory to the GCS bucket (instead of the ./site/out/bin directory) --- .github/workflows/release.yaml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 23e1dfd6d2dab..05bcee392e789 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -641,20 +641,21 @@ jobs: version="$(./scripts/version.sh)" - binaries=( - "coder-darwin-amd64" - "coder-darwin-arm64" - "coder-linux-amd64" - "coder-linux-arm64" - "coder-linux-armv7" - "coder-windows-amd64.exe" - "coder-windows-arm64.exe" - ) - - for binary in "${binaries[@]}"; do - detached_signature="${binary}.asc" - gcloud storage cp "./site/out/bin/${binary}" "gs://releases.coder.com/coder-cli/${version}/${binary}" - gcloud storage cp "./site/out/bin/${detached_signature}" "gs://releases.coder.com/coder-cli/${version}/${detached_signature}" + # Source array of slim binaries + declare -A binaries + binaries["coder-darwin-amd64"]="coder-slim_${version}_darwin_amd64" + binaries["coder-darwin-arm64"]="coder-slim_${version}_darwin_arm64" + binaries["coder-linux-amd64"]="coder-slim_${version}_linux_amd64" + binaries["coder-linux-arm64"]="coder-slim_${version}_linux_arm64" + binaries["coder-linux-armv7"]="coder-slim_${version}_linux_armv7" + binaries["coder-windows-amd64.exe"]="coder-slim_${version}_windows_amd64.exe" + binaries["coder-windows-arm64.exe"]="coder-slim_${version}_windows_arm64.exe" + + for cli_name in "${!binaries[@]}"; do + slim_binary="${binaries[$cli_name]}" + detached_signature="${slim_binary}.asc" + gcloud storage cp "./build/${slim_binary}" "gs://releases.coder.com/coder-cli/${version}/${cli_name}" + gcloud storage cp "./build/${detached_signature}" "gs://releases.coder.com/coder-cli/${version}/${cli_name}.asc" done - name: Publish release From 060fb57d2891b1aa3acb1f2f82e3b37b508d034c Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Mon, 11 Aug 2025 12:32:29 +0100 Subject: [PATCH 122/260] chore(enterprise/coderd): ignore log errors in TestGetCryptoKeys/Unauthorized (#19282) Fixes https://github.com/coder/internal/issues/797 --- enterprise/coderd/workspaceproxy_test.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/enterprise/coderd/workspaceproxy_test.go b/enterprise/coderd/workspaceproxy_test.go index 23775f370f95f..7024ad2366423 100644 --- a/enterprise/coderd/workspaceproxy_test.go +++ b/enterprise/coderd/workspaceproxy_test.go @@ -15,6 +15,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "cdr.dev/slog/sloggers/slogtest" "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/buildinfo" "github.com/coder/coder/v2/coderd/coderdtest" @@ -1009,11 +1010,16 @@ func TestGetCryptoKeys(t *testing.T) { ctx := testutil.Context(t, testutil.WaitMedium) db, pubsub := dbtestutil.NewDB(t) + // IgnoreErrors is set here to avoid a test failure due to "used of closed network connection". + logger := slogtest.Make(t, &slogtest.Options{ + IgnoreErrors: true, + }) cclient, _, api, _ := coderdenttest.NewWithAPI(t, &coderdenttest.Options{ Options: &coderdtest.Options{ Database: db, Pubsub: pubsub, IncludeProvisionerDaemon: true, + Logger: &logger, }, LicenseOptions: &coderdenttest.LicenseOptions{ Features: license.Features{ From 1b66495b701263d0f8668e383f43031d27bb383a Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Mon, 11 Aug 2025 14:48:31 +0300 Subject: [PATCH 123/260] fix(coderd/prometheusmetrics)!: filter deleted wsbuilds to reduce db load (#19197) This change removes the `GetLatestWorkspaceBuilds` query which includes all workspaces for all time (including deleted). This allows us to also stop using `GetProvisionerJobsByIDs` for said builds as the job status is included in `GetWorkspaces` called separately. **BREAKING CHANGE**: The `coderd_api_workspace_latest_build` Prometheus metric no longer includes builds belonging to deleted workspaces, as such, this metric will show fewer statuses. Fixes coder/internal#717 --- coderd/database/dbauthz/dbauthz.go | 11 --- coderd/database/dbauthz/dbauthz_test.go | 6 -- coderd/database/dbmetrics/querymetrics.go | 7 -- coderd/database/dbmock/dbmock.go | 15 ---- coderd/database/querier.go | 1 - coderd/database/queries.sql.go | 59 --------------- coderd/database/queries/workspacebuilds.sql | 14 ---- coderd/prometheusmetrics/prometheusmetrics.go | 65 ++++++---------- .../prometheusmetrics_test.go | 74 +++++++++++++++++++ 9 files changed, 95 insertions(+), 157 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index d5cc334f5ff7f..a4759c8636097 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -2178,17 +2178,6 @@ func (q *querier) GetLatestWorkspaceBuildByWorkspaceID(ctx context.Context, work return q.db.GetLatestWorkspaceBuildByWorkspaceID(ctx, workspaceID) } -func (q *querier) GetLatestWorkspaceBuilds(ctx context.Context) ([]database.WorkspaceBuild, error) { - // This function is a system function until we implement a join for workspace builds. - // This is because we need to query for all related workspaces to the returned builds. - // This is a very inefficient method of fetching the latest workspace builds. - // We should just join the rbac properties. - if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil { - return nil, err - } - return q.db.GetLatestWorkspaceBuilds(ctx) -} - func (q *querier) GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceBuild, error) { // This function is a system function until we implement a join for workspace builds. if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil { diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index a55f9c37aa4f5..0638d3d007986 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -4035,12 +4035,6 @@ func (s *MethodTestSuite) TestSystemFunctions() { LoginType: l.LoginType, }).Asserts(rbac.ResourceSystem, policy.ActionRead).Returns(l) })) - s.Run("GetLatestWorkspaceBuilds", s.Subtest(func(db database.Store, check *expects) { - dbtestutil.DisableForeignKeysAndTriggers(s.T(), db) - dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{}) - dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{}) - check.Args().Asserts(rbac.ResourceSystem, policy.ActionRead) - })) s.Run("GetActiveUserCount", s.Subtest(func(db database.Store, check *expects) { check.Args(false).Asserts(rbac.ResourceSystem, policy.ActionRead).Returns(int64(0)) })) diff --git a/coderd/database/dbmetrics/querymetrics.go b/coderd/database/dbmetrics/querymetrics.go index e0606f9e40665..cb61df85db007 100644 --- a/coderd/database/dbmetrics/querymetrics.go +++ b/coderd/database/dbmetrics/querymetrics.go @@ -943,13 +943,6 @@ func (m queryMetricsStore) GetLatestWorkspaceBuildByWorkspaceID(ctx context.Cont return build, err } -func (m queryMetricsStore) GetLatestWorkspaceBuilds(ctx context.Context) ([]database.WorkspaceBuild, error) { - start := time.Now() - builds, err := m.s.GetLatestWorkspaceBuilds(ctx) - m.queryLatencies.WithLabelValues("GetLatestWorkspaceBuilds").Observe(time.Since(start).Seconds()) - return builds, err -} - func (m queryMetricsStore) GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceBuild, error) { start := time.Now() builds, err := m.s.GetLatestWorkspaceBuildsByWorkspaceIDs(ctx, ids) diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index 22807f0e3569d..0966df6acfba4 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -1966,21 +1966,6 @@ func (mr *MockStoreMockRecorder) GetLatestWorkspaceBuildByWorkspaceID(ctx, works return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLatestWorkspaceBuildByWorkspaceID", reflect.TypeOf((*MockStore)(nil).GetLatestWorkspaceBuildByWorkspaceID), ctx, workspaceID) } -// GetLatestWorkspaceBuilds mocks base method. -func (m *MockStore) GetLatestWorkspaceBuilds(ctx context.Context) ([]database.WorkspaceBuild, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetLatestWorkspaceBuilds", ctx) - ret0, _ := ret[0].([]database.WorkspaceBuild) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetLatestWorkspaceBuilds indicates an expected call of GetLatestWorkspaceBuilds. -func (mr *MockStoreMockRecorder) GetLatestWorkspaceBuilds(ctx any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLatestWorkspaceBuilds", reflect.TypeOf((*MockStore)(nil).GetLatestWorkspaceBuilds), ctx) -} - // GetLatestWorkspaceBuildsByWorkspaceIDs mocks base method. func (m *MockStore) GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceBuild, error) { m.ctrl.T.Helper() diff --git a/coderd/database/querier.go b/coderd/database/querier.go index a0f265e9658ce..042bee9d3701b 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -213,7 +213,6 @@ type sqlcQuerier interface { GetLatestCryptoKeyByFeature(ctx context.Context, feature CryptoKeyFeature) (CryptoKey, error) GetLatestWorkspaceAppStatusesByWorkspaceIDs(ctx context.Context, ids []uuid.UUID) ([]WorkspaceAppStatus, error) GetLatestWorkspaceBuildByWorkspaceID(ctx context.Context, workspaceID uuid.UUID) (WorkspaceBuild, error) - GetLatestWorkspaceBuilds(ctx context.Context) ([]WorkspaceBuild, error) GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context, ids []uuid.UUID) ([]WorkspaceBuild, error) GetLicenseByID(ctx context.Context, id int32) (License, error) GetLicenses(ctx context.Context) ([]License, error) diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 74cefd09359b0..eef7b8b6819d0 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -18664,65 +18664,6 @@ func (q *sqlQuerier) GetLatestWorkspaceBuildByWorkspaceID(ctx context.Context, w return i, err } -const getLatestWorkspaceBuilds = `-- name: GetLatestWorkspaceBuilds :many -SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.has_ai_task, wb.ai_task_sidebar_app_id, wb.initiator_by_avatar_url, wb.initiator_by_username, wb.initiator_by_name -FROM ( - SELECT - workspace_id, MAX(build_number) as max_build_number - FROM - workspace_build_with_user AS workspace_builds - GROUP BY - workspace_id -) m -JOIN - workspace_build_with_user AS wb -ON m.workspace_id = wb.workspace_id AND m.max_build_number = wb.build_number -` - -func (q *sqlQuerier) GetLatestWorkspaceBuilds(ctx context.Context) ([]WorkspaceBuild, error) { - rows, err := q.db.QueryContext(ctx, getLatestWorkspaceBuilds) - if err != nil { - return nil, err - } - defer rows.Close() - var items []WorkspaceBuild - for rows.Next() { - var i WorkspaceBuild - if err := rows.Scan( - &i.ID, - &i.CreatedAt, - &i.UpdatedAt, - &i.WorkspaceID, - &i.TemplateVersionID, - &i.BuildNumber, - &i.Transition, - &i.InitiatorID, - &i.ProvisionerState, - &i.JobID, - &i.Deadline, - &i.Reason, - &i.DailyCost, - &i.MaxDeadline, - &i.TemplateVersionPresetID, - &i.HasAITask, - &i.AITaskSidebarAppID, - &i.InitiatorByAvatarUrl, - &i.InitiatorByUsername, - &i.InitiatorByName, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getLatestWorkspaceBuildsByWorkspaceIDs = `-- name: GetLatestWorkspaceBuildsByWorkspaceIDs :many SELECT wb.id, wb.created_at, wb.updated_at, wb.workspace_id, wb.template_version_id, wb.build_number, wb.transition, wb.initiator_id, wb.provisioner_state, wb.job_id, wb.deadline, wb.reason, wb.daily_cost, wb.max_deadline, wb.template_version_preset_id, wb.has_ai_task, wb.ai_task_sidebar_app_id, wb.initiator_by_avatar_url, wb.initiator_by_username, wb.initiator_by_name FROM ( diff --git a/coderd/database/queries/workspacebuilds.sql b/coderd/database/queries/workspacebuilds.sql index be76b6642df1f..be7bec5fa08f2 100644 --- a/coderd/database/queries/workspacebuilds.sql +++ b/coderd/database/queries/workspacebuilds.sql @@ -91,20 +91,6 @@ JOIN workspace_build_with_user AS wb ON m.workspace_id = wb.workspace_id AND m.max_build_number = wb.build_number; --- name: GetLatestWorkspaceBuilds :many -SELECT wb.* -FROM ( - SELECT - workspace_id, MAX(build_number) as max_build_number - FROM - workspace_build_with_user AS workspace_builds - GROUP BY - workspace_id -) m -JOIN - workspace_build_with_user AS wb -ON m.workspace_id = wb.workspace_id AND m.max_build_number = wb.build_number; - -- name: InsertWorkspaceBuild :exec INSERT INTO workspace_builds ( diff --git a/coderd/prometheusmetrics/prometheusmetrics.go b/coderd/prometheusmetrics/prometheusmetrics.go index 4fd2cfda607ed..cda274145e159 100644 --- a/coderd/prometheusmetrics/prometheusmetrics.go +++ b/coderd/prometheusmetrics/prometheusmetrics.go @@ -150,7 +150,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R Namespace: "coderd", Subsystem: "api", Name: "workspace_latest_build", - Help: "The current number of workspace builds by status.", + Help: "The current number of workspace builds by status for all non-deleted workspaces.", }, []string{"status"}) if err := registerer.Register(workspaceLatestBuildTotals); err != nil { return nil, err @@ -159,7 +159,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R workspaceLatestBuildStatuses := prometheus.NewGaugeVec(prometheus.GaugeOpts{ Namespace: "coderd", Name: "workspace_latest_build_status", - Help: "The current workspace statuses by template, transition, and owner.", + Help: "The current workspace statuses by template, transition, and owner for all non-deleted workspaces.", }, []string{"status", "template_name", "template_version", "workspace_owner", "workspace_transition"}) if err := registerer.Register(workspaceLatestBuildStatuses); err != nil { return nil, err @@ -168,59 +168,37 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R ctx, cancelFunc := context.WithCancel(ctx) done := make(chan struct{}) - updateWorkspaceTotals := func() { - builds, err := db.GetLatestWorkspaceBuilds(ctx) - if err != nil { - if errors.Is(err, sql.ErrNoRows) { - // clear all series if there are no database entries - workspaceLatestBuildTotals.Reset() - } else { - logger.Warn(ctx, "failed to load latest workspace builds", slog.Error(err)) - } - return - } - jobIDs := make([]uuid.UUID, 0, len(builds)) - for _, build := range builds { - jobIDs = append(jobIDs, build.JobID) - } - jobs, err := db.GetProvisionerJobsByIDs(ctx, jobIDs) - if err != nil { - ids := make([]string, 0, len(jobIDs)) - for _, id := range jobIDs { - ids = append(ids, id.String()) - } - - logger.Warn(ctx, "failed to load provisioner jobs", slog.F("ids", ids), slog.Error(err)) - return - } - - workspaceLatestBuildTotals.Reset() - for _, job := range jobs { - status := codersdk.ProvisionerJobStatus(job.JobStatus) - workspaceLatestBuildTotals.WithLabelValues(string(status)).Add(1) - // TODO: deprecated: remove in the future - workspaceLatestBuildTotalsDeprecated.WithLabelValues(string(status)).Add(1) - } - } - - updateWorkspaceStatuses := func() { + updateWorkspaceMetrics := func() { ws, err := db.GetWorkspaces(ctx, database.GetWorkspacesParams{ Deleted: false, WithSummary: false, }) if err != nil { if errors.Is(err, sql.ErrNoRows) { - // clear all series if there are no database entries + workspaceLatestBuildTotals.Reset() workspaceLatestBuildStatuses.Reset() + } else { + logger.Warn(ctx, "failed to load active workspaces for metrics", slog.Error(err)) } - - logger.Warn(ctx, "failed to load active workspaces", slog.Error(err)) return } + workspaceLatestBuildTotals.Reset() workspaceLatestBuildStatuses.Reset() + for _, w := range ws { - workspaceLatestBuildStatuses.WithLabelValues(string(w.LatestBuildStatus), w.TemplateName, w.TemplateVersionName.String, w.OwnerUsername, string(w.LatestBuildTransition)).Add(1) + status := string(w.LatestBuildStatus) + workspaceLatestBuildTotals.WithLabelValues(status).Add(1) + // TODO: deprecated: remove in the future + workspaceLatestBuildTotalsDeprecated.WithLabelValues(status).Add(1) + + workspaceLatestBuildStatuses.WithLabelValues( + status, + w.TemplateName, + w.TemplateVersionName.String, + w.OwnerUsername, + string(w.LatestBuildTransition), + ).Add(1) } } @@ -230,8 +208,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R doTick := func() { defer ticker.Reset(duration) - updateWorkspaceTotals() - updateWorkspaceStatuses() + updateWorkspaceMetrics() } go func() { diff --git a/coderd/prometheusmetrics/prometheusmetrics_test.go b/coderd/prometheusmetrics/prometheusmetrics_test.go index 473dbf46bd958..28046c1dff3fb 100644 --- a/coderd/prometheusmetrics/prometheusmetrics_test.go +++ b/coderd/prometheusmetrics/prometheusmetrics_test.go @@ -247,6 +247,32 @@ func TestWorkspaceLatestBuildTotals(t *testing.T) { codersdk.ProvisionerJobSucceeded: 3, codersdk.ProvisionerJobRunning: 1, }, + }, { + Name: "MultipleWithDeleted", + Database: func() database.Store { + db, _ := dbtestutil.NewDB(t) + u := dbgen.User(t, db, database.User{}) + org := dbgen.Organization(t, db, database.Organization{}) + insertCanceled(t, db, u, org) + insertFailed(t, db, u, org) + insertSuccess(t, db, u, org) + insertRunning(t, db, u, org) + + // Verify that deleted workspaces/builds are NOT counted in metrics. + n, err := cryptorand.Intn(5) + require.NoError(t, err) + for range 1 + n { + insertDeleted(t, db, u, org) + } + return db + }, + Total: 4, // Only non-deleted workspaces should be counted + Status: map[codersdk.ProvisionerJobStatus]int{ + codersdk.ProvisionerJobCanceled: 1, + codersdk.ProvisionerJobFailed: 1, + codersdk.ProvisionerJobSucceeded: 1, + codersdk.ProvisionerJobRunning: 1, + }, }} { t.Run(tc.Name, func(t *testing.T) { t.Parallel() @@ -323,6 +349,33 @@ func TestWorkspaceLatestBuildStatuses(t *testing.T) { codersdk.ProvisionerJobSucceeded: 3, codersdk.ProvisionerJobRunning: 1, }, + }, { + Name: "MultipleWithDeleted", + Database: func() database.Store { + db, _ := dbtestutil.NewDB(t) + u := dbgen.User(t, db, database.User{}) + org := dbgen.Organization(t, db, database.Organization{}) + insertTemplates(t, db, u, org) + insertCanceled(t, db, u, org) + insertFailed(t, db, u, org) + insertSuccess(t, db, u, org) + insertRunning(t, db, u, org) + + // Verify that deleted workspaces/builds are NOT counted in metrics. + n, err := cryptorand.Intn(5) + require.NoError(t, err) + for range 1 + n { + insertDeleted(t, db, u, org) + } + return db + }, + ExpectedWorkspaces: 4, // Only non-deleted workspaces should be counted + ExpectedStatuses: map[codersdk.ProvisionerJobStatus]int{ + codersdk.ProvisionerJobCanceled: 1, + codersdk.ProvisionerJobFailed: 1, + codersdk.ProvisionerJobSucceeded: 1, + codersdk.ProvisionerJobRunning: 1, + }, }} { t.Run(tc.Name, func(t *testing.T) { t.Parallel() @@ -907,3 +960,24 @@ func insertSuccess(t *testing.T, db database.Store, u database.User, org databas }) require.NoError(t, err) } + +func insertDeleted(t *testing.T, db database.Store, u database.User, org database.Organization) { + job := insertRunning(t, db, u, org) + err := db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{ + ID: job.ID, + CompletedAt: sql.NullTime{ + Time: dbtime.Now(), + Valid: true, + }, + }) + require.NoError(t, err) + + build, err := db.GetWorkspaceBuildByJobID(context.Background(), job.ID) + require.NoError(t, err) + + err = db.UpdateWorkspaceDeletedByID(context.Background(), database.UpdateWorkspaceDeletedByIDParams{ + ID: build.WorkspaceID, + Deleted: true, + }) + require.NoError(t, err) +} From ddf3a50ac069f48854a41f8513d106af7cadd7bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:28:32 +0000 Subject: [PATCH 124/260] chore: bump google.golang.org/api from 0.242.0 to 0.246.0 (#19284) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.242.0 to 0.246.0.
    Release notes

    Sourced from google.golang.org/api's releases.

    v0.246.0

    0.246.0 (2025-08-06)

    Features

    Bug Fixes

    • idtoken: Don't assume DefaultTransport is a http.Transport (#3263) (61fba51), refs #3260

    v0.245.0

    0.245.0 (2025-08-05)

    Features

    Bug Fixes

    • gensupport: Fix transferChunk race condition by returning response with non-cancelled context. (#3258) (091d422)

    v0.244.0

    0.244.0 (2025-07-30)

    Features

    v0.243.0

    0.243.0 (2025-07-22)

    ... (truncated)

    Changelog

    Sourced from google.golang.org/api's changelog.

    0.246.0 (2025-08-06)

    Features

    Bug Fixes

    • idtoken: Don't assume DefaultTransport is a http.Transport (#3263) (61fba51), refs #3260

    0.245.0 (2025-08-05)

    Features

    Bug Fixes

    • gensupport: Fix transferChunk race condition by returning response with non-cancelled context. (#3258) (091d422)

    0.244.0 (2025-07-30)

    Features

    0.243.0 (2025-07-22)

    Features

    ... (truncated)

    Commits
    • 3341cca chore(main): release 0.246.0 (#3262)
    • 61fba51 fix(idtoken): don't assume DefaultTransport is a http.Transport (#3263)
    • b792200 feat(all): auto-regenerate discovery clients (#3261)
    • ed4d4ca chore(main): release 0.245.0 (#3253)
    • 091d422 fix(gensupport): fix transferChunk race condition by returning response with ...
    • bf38d3a feat(all): auto-regenerate discovery clients (#3259)
    • efc3371 feat(all): auto-regenerate discovery clients (#3257)
    • 83176a9 feat(all): auto-regenerate discovery clients (#3256)
    • 0f10366 feat(all): auto-regenerate discovery clients (#3255)
    • 702998a feat(all): auto-regenerate discovery clients (#3254)
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=google.golang.org/api&package-manager=go_modules&previous-version=0.242.0&new-version=0.246.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 7a88c2dafce14..46a7eac8da859 100644 --- a/go.mod +++ b/go.mod @@ -206,7 +206,7 @@ require ( golang.org/x/text v0.27.0 golang.org/x/tools v0.35.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da - google.golang.org/api v0.242.0 + google.golang.org/api v0.246.0 google.golang.org/grpc v1.74.2 google.golang.org/protobuf v1.36.6 gopkg.in/DataDog/dd-trace-go.v1 v1.74.0 @@ -219,7 +219,7 @@ require ( ) require ( - cloud.google.com/go/auth v0.16.2 // indirect + cloud.google.com/go/auth v0.16.3 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/logging v1.13.0 // indirect cloud.google.com/go/longrunning v0.6.7 // indirect @@ -326,7 +326,7 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect - github.com/googleapis/gax-go/v2 v2.14.2 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect github.com/gorilla/css v1.0.1 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect @@ -454,9 +454,9 @@ require ( golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 // indirect golang.zx2c4.com/wireguard/windows v0.5.3 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect howett.net/plist v1.0.0 // indirect diff --git a/go.sum b/go.sum index 82e72848bec46..054f51b99c3d2 100644 --- a/go.sum +++ b/go.sum @@ -101,8 +101,8 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.16.2 h1:QvBAGFPLrDeoiNjyfVunhQ10HKNYuOwZ5noee0M5df4= -cloud.google.com/go/auth v0.16.2/go.mod h1:sRBas2Y1fB1vZTdurouM0AzuYQBMZinrUYL8EufhtEA= +cloud.google.com/go/auth v0.16.3 h1:kabzoQ9/bobUmnseYnBO6qQG7q4a/CffFRlJSxv2wCc= +cloud.google.com/go/auth v0.16.3/go.mod h1:NucRGjaXfzP1ltpcQ7On/VTZ0H4kWB5Jy+Y9Dnm76fA= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= @@ -1328,8 +1328,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= -github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= @@ -2497,8 +2497,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.242.0 h1:7Lnb1nfnpvbkCiZek6IXKdJ0MFuAZNAJKQfA1ws62xg= -google.golang.org/api v0.242.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= +google.golang.org/api v0.246.0 h1:H0ODDs5PnMZVZAEtdLMn2Ul2eQi7QNjqM2DIFp8TlTM= +google.golang.org/api v0.246.0/go.mod h1:dMVhVcylamkirHdzEBAIQWUCgqY885ivNeZYd7VAVr8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2639,12 +2639,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= -google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= -google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a h1:SGktgSolFCo75dnHJF2yMvnns6jCmHFJ0vE4Vn2JKvQ= -google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 h1:MAKi5q709QWfnkkpNQ0M12hYJ1+e8qYVDyowc4U1XZM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= From 2a81449b75da601ef48380ad1425f68b1fae81b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:31:01 +0000 Subject: [PATCH 125/260] chore: bump the x group with 7 updates (#19289) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps the x group with 7 updates: | Package | From | To | | --- | --- | --- | | [golang.org/x/crypto](https://github.com/golang/crypto) | `0.40.0` | `0.41.0` | | [golang.org/x/mod](https://github.com/golang/mod) | `0.26.0` | `0.27.0` | | [golang.org/x/net](https://github.com/golang/net) | `0.42.0` | `0.43.0` | | [golang.org/x/sys](https://github.com/golang/sys) | `0.34.0` | `0.35.0` | | [golang.org/x/term](https://github.com/golang/term) | `0.33.0` | `0.34.0` | | [golang.org/x/text](https://github.com/golang/text) | `0.27.0` | `0.28.0` | | [golang.org/x/tools](https://github.com/golang/tools) | `0.35.0` | `0.36.0` | Updates `golang.org/x/crypto` from 0.40.0 to 0.41.0
    Commits
    • ef5341b go.mod: update golang.org/x dependencies
    • b999374 acme: fix pebble subprocess output data race
    • c247dea x509roots/fallback: store bundle certs directly in DER
    • 1fda731 acme: increase pebble test waitForServer attempts
    • 1b4c3d2 x509roots/fallback: update bundle
    • b903b53 acme: capture pebble test subprocess stdout/stderr
    • See full diff in compare view

    Updates `golang.org/x/mod` from 0.26.0 to 0.27.0
    Commits

    Updates `golang.org/x/net` from 0.42.0 to 0.43.0
    Commits
    • e74bc31 go.mod: update golang.org/x dependencies
    • af6926e http2: remove references to defunct http2.golang.org test server
    • See full diff in compare view

    Updates `golang.org/x/sys` from 0.34.0 to 0.35.0
    Commits
    • 5b936e1 unix/linux: update to Linux kernel 6.16, Go to 1.24.5
    • 3a82703 unix: remove redundant xnu version check for {p}readv/{p}writev
    • 9920300 unix: add missing nft conntrack constants
    • ad4e0fc unix: remove redundant word in comment
    • 084ad87 unix: fix //sys decl after CL 548795
    • See full diff in compare view

    Updates `golang.org/x/term` from 0.33.0 to 0.34.0
    Commits
    • a35244d go.mod: update golang.org/x dependencies
    • 4f53e0c term: allow multi-line bracketed paste to not create single line with verbati...
    • 27f29d8 term: remove duplicate flag and add comment on windows
    • See full diff in compare view

    Updates `golang.org/x/text` from 0.27.0 to 0.28.0
    Commits

    Updates `golang.org/x/tools` from 0.35.0 to 0.36.0
    Commits
    • 44d18e1 go.mod: update golang.org/x dependencies
    • 52b9c68 go/ast/inspector: remove obsolete unsafe import
    • b155480 gopls/doc/features: add "MCP" to index.
    • 992bf9c gopls/internal/golang/hover: show alias real type decl for types only
    • 861996a go/ssa: pass GOEXPERIMENT=aliastypeparams only on Go 1.23
    • 528efda gopls/internal/analysis/modernize/forvar: provide fix for second loop var
    • bdddfd5 gopls/internal/server: add counters for add and remove struct tags
    • 23dd839 gopls/internal/filewatcher: fix race condition on watcher shutdown
    • 3a8978c cmd/digraph: fix bug in allpaths
    • bae51bd gopls/internal/server: add windsurf and cursor as language client
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 46a7eac8da859..e1b6f3842fd0c 100644 --- a/go.mod +++ b/go.mod @@ -195,16 +195,16 @@ require ( go.uber.org/goleak v1.3.1-0.20240429205332-517bace7cc29 go.uber.org/mock v0.5.0 go4.org/netipx v0.0.0-20230728180743-ad4cb58a6516 - golang.org/x/crypto v0.40.0 + golang.org/x/crypto v0.41.0 golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 - golang.org/x/mod v0.26.0 - golang.org/x/net v0.42.0 + golang.org/x/mod v0.27.0 + golang.org/x/net v0.43.0 golang.org/x/oauth2 v0.30.0 golang.org/x/sync v0.16.0 - golang.org/x/sys v0.34.0 - golang.org/x/term v0.33.0 - golang.org/x/text v0.27.0 - golang.org/x/tools v0.35.0 + golang.org/x/sys v0.35.0 + golang.org/x/term v0.34.0 + golang.org/x/text v0.28.0 + golang.org/x/tools v0.36.0 golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da google.golang.org/api v0.246.0 google.golang.org/grpc v1.74.2 diff --git a/go.sum b/go.sum index 054f51b99c3d2..93f524bb8fc04 100644 --- a/go.sum +++ b/go.sum @@ -2014,8 +2014,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= -golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2080,8 +2080,8 @@ golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2144,8 +2144,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2296,8 +2296,8 @@ golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= -golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2316,8 +2316,8 @@ golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= -golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= -golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2340,8 +2340,8 @@ golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2414,8 +2414,8 @@ golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 894a80b86bd803595ae878411112836a32ef74b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:32:14 +0000 Subject: [PATCH 126/260] chore: bump github.com/mark3labs/mcp-go from 0.36.0 to 0.37.0 (#19290) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/mark3labs/mcp-go](https://github.com/mark3labs/mcp-go) from 0.36.0 to 0.37.0.
    Release notes

    Sourced from github.com/mark3labs/mcp-go's releases.

    Release v0.37.0

    ⚠️ Breaking Changes

    The Result.Meta field type has changed from map[string]any to *Meta. Code that directly accesses or sets this field will need to be updated:

    // Before (v0.36.0 and earlier):
    result.Meta = map[string]any{"key": "value"}
    

    // After (v0.37.0): result.Meta = &mcp.Meta{AdditionalFields: map[string]any{"key": "value"}}

    What's Changed

    New Contributors

    Full Changelog: https://github.com/mark3labs/mcp-go/compare/v0.36.0...v0.37.0

    Commits
    • 6da5cd1 feat: allow to set a custom logger in the SSE and STDIO clients (#525)
    • 9259d32 feat: add thread-safe SetExpectedState for cross-request OAuth flows (#500)
    • a63f10e Fix SSE transport not properly handling HTTP/2 NO_ERROR disconnections (#509)
    • fda6b38 feat: implement sampling support for Streamable HTTP transport (#515)
    • 6e5d6fd fix unmarshalling error for Meta property
    • 57740b6 task: add _meta field to relevant types (#429)
    • 96de112 Update server.go race condition (#524)
    • 4cca302 Replace Prompts/Resources/Resource Templates (#518)
    • See full diff in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/mark3labs/mcp-go&package-manager=go_modules&previous-version=0.36.0&new-version=0.37.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e1b6f3842fd0c..27a4979706d24 100644 --- a/go.mod +++ b/go.mod @@ -483,7 +483,7 @@ require ( github.com/coder/preview v1.0.3 github.com/fsnotify/fsnotify v1.9.0 github.com/go-git/go-git/v5 v5.16.2 - github.com/mark3labs/mcp-go v0.36.0 + github.com/mark3labs/mcp-go v0.37.0 ) require ( diff --git a/go.sum b/go.sum index 93f524bb8fc04..e9a3c9b349251 100644 --- a/go.sum +++ b/go.sum @@ -1511,8 +1511,8 @@ github.com/makeworld-the-better-one/dither/v2 v2.4.0 h1:Az/dYXiTcwcRSe59Hzw4RI1r github.com/makeworld-the-better-one/dither/v2 v2.4.0/go.mod h1:VBtN8DXO7SNtyGmLiGA7IsFeKrBkQPze1/iAeM95arc= github.com/marekm4/color-extractor v1.2.1 h1:3Zb2tQsn6bITZ8MBVhc33Qn1k5/SEuZ18mrXGUqIwn0= github.com/marekm4/color-extractor v1.2.1/go.mod h1:90VjmiHI6M8ez9eYUaXLdcKnS+BAOp7w+NpwBdkJmpA= -github.com/mark3labs/mcp-go v0.36.0 h1:rIZaijrRYPeSbJG8/qNDe0hWlGrCJ7FWHNMz2SQpTis= -github.com/mark3labs/mcp-go v0.36.0/go.mod h1:T7tUa2jO6MavG+3P25Oy/jR7iCeJPHImCZHRymCn39g= +github.com/mark3labs/mcp-go v0.37.0 h1:BywvZLPRT6Zx6mMG/MJfxLSZQkTGIcJSEGKsvr4DsoQ= +github.com/mark3labs/mcp-go v0.37.0/go.mod h1:T7tUa2jO6MavG+3P25Oy/jR7iCeJPHImCZHRymCn39g= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= From 39bcd819cc136d3041a7ac506d919d7cd3194bfb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:34:43 +0000 Subject: [PATCH 127/260] chore: bump github.com/aws/aws-sdk-go-v2/feature/rds/auth from 1.5.1 to 1.6.2 (#19291) Bumps [github.com/aws/aws-sdk-go-v2/feature/rds/auth](https://github.com/aws/aws-sdk-go-v2) from 1.5.1 to 1.6.2.
    Changelog

    Sourced from github.com/aws/aws-sdk-go-v2/feature/rds/auth's changelog.

    Release (2021-10-11)

    General Highlights

    • Dependency Update: Updated to the latest SDK module versions

    Module Highlights

    • github.com/aws/aws-sdk-go-v2/feature/ec2/imds: v1.6.0
      • Feature: Respect passed in Context Deadline/Timeout. Updates the IMDS Client operations to not override the passed in Context's Deadline or Timeout options. If an Client operation is called with a Context with a Deadline or Timeout, the client will no longer override it with the client's default timeout.
      • Bug Fix: Fix IMDS client's response handling and operation timeout race. Fixes #1253
    • github.com/aws/aws-sdk-go-v2/service/amplifybackend: v1.5.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/applicationautoscaling: v1.7.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/apprunner: v1.3.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/backup: v1.6.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/chime: v1.11.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/codebuild: v1.11.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/databrew: v1.10.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/ec2: v1.19.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/efs: v1.8.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2: v1.9.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/firehose: v1.7.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/frauddetector: v1.10.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/fsx: v1.10.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/glue: v1.12.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/grafana: v1.0.0
      • Release: New AWS service client module
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/iotevents: v1.8.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/kendra: v1.12.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/kms: v1.7.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/lexmodelsv2: v1.9.0
      • Feature: API client updated
    • github.com/aws/aws-sdk-go-v2/service/lexruntimev2: v1.6.0
      • Feature: API client updated

    ... (truncated)

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/aws/aws-sdk-go-v2/feature/rds/auth&package-manager=go_modules&previous-version=1.5.1&new-version=1.6.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 27a4979706d24..684dd137e5e68 100644 --- a/go.mod +++ b/go.mod @@ -255,11 +255,11 @@ require ( github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c // indirect github.com/atotto/clipboard v0.1.4 // indirect - github.com/aws/aws-sdk-go-v2 v1.37.1 + github.com/aws/aws-sdk-go-v2 v1.37.2 github.com/aws/aws-sdk-go-v2/config v1.30.2 github.com/aws/aws-sdk-go-v2/credentials v1.18.2 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1 // indirect - github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.1 + github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.2 github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect diff --git a/go.sum b/go.sum index e9a3c9b349251..1d3251093df71 100644 --- a/go.sum +++ b/go.sum @@ -754,16 +754,16 @@ github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.37.1 h1:SMUxeNz3Z6nqGsXv0JuJXc8w5YMtrQMuIBmDx//bBDY= -github.com/aws/aws-sdk-go-v2 v1.37.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= +github.com/aws/aws-sdk-go-v2 v1.37.2 h1:xkW1iMYawzcmYFYEV0UCMxc8gSsjCGEhBXQkdQywVbo= +github.com/aws/aws-sdk-go-v2 v1.37.2/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= github.com/aws/aws-sdk-go-v2/config v1.30.2 h1:YE1BmSc4fFYqFgN1mN8uzrtc7R9x+7oSWeX8ckoltAw= github.com/aws/aws-sdk-go-v2/config v1.30.2/go.mod h1:UNrLGZ6jfAVjgVJpkIxjLufRJqTXCVYOpkeVf83kwBo= github.com/aws/aws-sdk-go-v2/credentials v1.18.2 h1:mfm0GKY/PHLhs7KO0sUaOtFnIQ15Qqxt+wXbO/5fIfs= github.com/aws/aws-sdk-go-v2/credentials v1.18.2/go.mod h1:v0SdJX6ayPeZFQxgXUKw5RhLpAoZUuynxWDfh8+Eknc= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1 h1:owmNBboeA0kHKDcdF8KiSXmrIuXZustfMGGytv6OMkM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.1/go.mod h1:Bg1miN59SGxrZqlP8vJZSmXW+1N8Y1MjQDq1OfuNod8= -github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.1 h1:yg6nrV33ljY6CppoRnnsKLqIZ5ExNdQOGRBGNfc56Yw= -github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.1/go.mod h1:hGdIV5nndhIclFFvI1apVfQWn9ZKqedykZ1CtLZd03E= +github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.2 h1:QbFjOdplTkOgviHNKyTW/TZpvIYhD6lqEc3tkIvqMoQ= +github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.2/go.mod h1:d0pTYUeTv5/tPSlbPZZQSqssM158jZBs02jx2LDslM8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 h1:ksZXBYv80EFTcgc8OJO48aQ8XDWXIQL7gGasPeCoTzI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1/go.mod h1:HSksQyyJETVZS7uM54cir0IgxttTD+8aEoJMPGepHBI= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 h1:+dn/xF/05utS7tUhjIcndbuaPjfll2LhbH1cCDGLYUQ= From 331f85e0ac651443fd4b1f04528317124526c5bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 15:37:04 +0000 Subject: [PATCH 128/260] chore: bump github.com/chromedp/chromedp from 0.13.3 to 0.14.1 (#19292) Bumps [github.com/chromedp/chromedp](https://github.com/chromedp/chromedp) from 0.13.3 to 0.14.1.
    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/chromedp/chromedp&package-manager=go_modules&previous-version=0.13.3&new-version=0.14.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 6 +++--- go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 684dd137e5e68..0806304ca2755 100644 --- a/go.mod +++ b/go.mod @@ -92,8 +92,8 @@ require ( github.com/charmbracelet/bubbletea v1.3.4 github.com/charmbracelet/glamour v0.10.0 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 - github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8 - github.com/chromedp/chromedp v0.13.3 + github.com/chromedp/cdproto v0.0.0-20250724212937-08a3db8b4327 + github.com/chromedp/chromedp v0.14.1 github.com/cli/safeexec v1.0.1 github.com/coder/flog v1.1.0 github.com/coder/guts v1.5.0 @@ -471,7 +471,7 @@ require github.com/SherClockHolmes/webpush-go v1.4.0 require ( github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect github.com/charmbracelet/x/cellbuf v0.0.13 // indirect - github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874 // indirect + github.com/go-json-experiment/json v0.0.0-20250725192818-e39067aee2d2 // indirect github.com/golang-jwt/jwt/v5 v5.2.2 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect ) diff --git a/go.sum b/go.sum index 1d3251093df71..6fd9e0aeb56cf 100644 --- a/go.sum +++ b/go.sum @@ -867,10 +867,10 @@ github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= -github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8 h1:AqW2bDQf67Zbq6Tpop/+yJSIknxhiQecO2B8jNYTAPs= -github.com/chromedp/cdproto v0.0.0-20250319231242-a755498943c8/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= -github.com/chromedp/chromedp v0.13.3 h1:c6nTn97XQBykzcXiGYL5LLebw3h3CEyrCihm4HquYh0= -github.com/chromedp/chromedp v0.13.3/go.mod h1:khsDP9OP20GrowpJfZ7N05iGCwcAYxk7qf9AZBzR3Qw= +github.com/chromedp/cdproto v0.0.0-20250724212937-08a3db8b4327 h1:UQ4AU+BGti3Sy/aLU8KVseYKNALcX9UXY6DfpwQ6J8E= +github.com/chromedp/cdproto v0.0.0-20250724212937-08a3db8b4327/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k= +github.com/chromedp/chromedp v0.14.1 h1:0uAbnxewy/Q+Bg7oafVePE/6EXEho9hnaC38f+TTENg= +github.com/chromedp/chromedp v0.14.1/go.mod h1:rHzAv60xDE7VNy/MYtTUrYreSc0ujt2O1/C3bzctYBo= github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM= github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -1115,8 +1115,8 @@ github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY= github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw= -github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874 h1:F8d1AJ6M9UQCavhwmO6ZsrYLfG8zVFWfEfMS2MXPkSY= -github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= +github.com/go-json-experiment/json v0.0.0-20250725192818-e39067aee2d2 h1:iizUGZ9pEquQS5jTGkh4AqeeHCMbfbjeb0zMt0aEFzs= +github.com/go-json-experiment/json v0.0.0-20250725192818-e39067aee2d2/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= From cbcdda25dcb2146912c9510b5db42faa50ed16e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 16:10:46 +0000 Subject: [PATCH 129/260] ci: bump the github-actions group with 8 updates (#19293) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the github-actions group with 8 updates: | Package | From | To | | --- | --- | --- | | [actions/checkout](https://github.com/actions/checkout) | `4.2.2` | `4.3.0` | | [actions/cache](https://github.com/actions/cache) | `4.2.3` | `4.2.4` | | [crate-ci/typos](https://github.com/crate-ci/typos) | `1.34.0` | `1.35.3` | | [docker/login-action](https://github.com/docker/login-action) | `3.4.0` | `3.5.0` | | [google-github-actions/setup-gcloud](https://github.com/google-github-actions/setup-gcloud) | `2.1.5` | `2.2.0` | | [actions/download-artifact](https://github.com/actions/download-artifact) | `4.3.0` | `5.0.0` | | [tj-actions/changed-files](https://github.com/tj-actions/changed-files) | `c2ca2493190021783138cb8aac49bcee14b4bb89` | `f963b3f3562b00b6d2dd25efc390eb04e51ef6c6` | | [github/codeql-action](https://github.com/github/codeql-action) | `3.29.7` | `3.29.8` | Updates `actions/checkout` from 4.2.2 to 4.3.0
    Release notes

    Sourced from actions/checkout's releases.

    v4.3.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/checkout/compare/v4...v4.3.0

    Changelog

    Sourced from actions/checkout's changelog.

    Changelog

    V4.3.0

    v4.2.2

    v4.2.1

    v4.2.0

    v4.1.7

    v4.1.6

    v4.1.5

    v4.1.4

    v4.1.3

    ... (truncated)

    Commits

    Updates `actions/cache` from 4.2.3 to 4.2.4
    Release notes

    Sourced from actions/cache's releases.

    v4.2.4

    What's Changed

    New Contributors

    Full Changelog: https://github.com/actions/cache/compare/v4...v4.2.4

    Changelog

    Sourced from actions/cache's changelog.

    Releases

    4.2.4

    • Bump @actions/cache to v4.0.5

    4.2.3

    • Bump @actions/cache to v4.0.3 (obfuscates SAS token in debug logs for cache entries)

    4.2.2

    • Bump @actions/cache to v4.0.2

    4.2.1

    • Bump @actions/cache to v4.0.1

    4.2.0

    TLDR; The cache backend service has been rewritten from the ground up for improved performance and reliability. actions/cache now integrates with the new cache service (v2) APIs.

    The new service will gradually roll out as of February 1st, 2025. The legacy service will also be sunset on the same date. Changes in these release are fully backward compatible.

    We are deprecating some versions of this action. We recommend upgrading to version v4 or v3 as soon as possible before February 1st, 2025. (Upgrade instructions below).

    If you are using pinned SHAs, please use the SHAs of versions v4.2.0 or v3.4.0

    If you do not upgrade, all workflow runs using any of the deprecated actions/cache will fail.

    Upgrading to the recommended versions will not break your workflows.

    4.1.2

    • Add GitHub Enterprise Cloud instances hostname filters to inform API endpoint choices - #1474
    • Security fix: Bump braces from 3.0.2 to 3.0.3 - #1475

    4.1.1

    • Restore original behavior of cache-hit output - #1467

    4.1.0

    • Ensure cache-hit output is set when a cache is missed - #1404
    • Deprecate save-always input - #1452

    4.0.2

    • Fixed restore fail-on-cache-miss not working.

    ... (truncated)

    Commits
    • 0400d5f Merge pull request #1636 from actions/Link-/release-4.2.4
    • 374a27f Prepare release 4.2.4
    • 358a730 Merge pull request #1634 from actions/Link-/optimise-deps
    • 2ee706e Fix with another approach
    • 94f7b5d Fix bundle exec
    • c36116c Fix the workflow to use licensed from source
    • 320fe7d Update the licensed workflow to use the latest version
    • d81cc47 Add licensed output
    • de24398 Add licensed output
    • e7b6a9c @​protobuf-ts/plugin to dev dependencies
    • Additional commits viewable in compare view

    Updates `crate-ci/typos` from 1.34.0 to 1.35.3
    Release notes

    Sourced from crate-ci/typos's releases.

    v1.35.3

    [1.35.3] - 2025-08-08

    Fixes

    • Don't correct ratatui in Rust files

    v1.35.2

    [1.35.2] - 2025-08-07

    Fixes

    • Don't correct unmarshaling

    v1.35.1

    [1.35.1] - 2025-08-04

    Fixes

    • Fix typo in correction to apostroph
    • Fix typo in correction to cordinate
    • Fix typo in correction to reproduceability
    • Fix typo in correction to revolutionss
    • Fix typo in correction to transivity

    v1.35.0

    [1.35.0] - 2025-08-04

    Features

    • Updated the dictionary with the July 2025 changes
    Changelog

    Sourced from crate-ci/typos's changelog.

    Change Log

    All notable changes to this project will be documented in this file.

    The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

    [Unreleased] - ReleaseDate

    [1.35.3] - 2025-08-08

    Fixes

    • Don't correct ratatui in Rust files

    [1.35.2] - 2025-08-07

    Fixes

    • Don't correct unmarshaling

    [1.35.1] - 2025-08-04

    Fixes

    • Fix typo in correction to apostroph
    • Fix typo in correction to cordinate
    • Fix typo in correction to reproduceability
    • Fix typo in correction to revolutionss
    • Fix typo in correction to transivity

    [1.35.0] - 2025-08-04

    Features

    • Updated the dictionary with the July 2025 changes

    [1.34.0] - 2025-06-30

    Features

    • Updated the dictionary with the June 2025 changes

    [1.33.1] - 2025-06-02

    Fixes

    • (dict) Don't correct wasn't to wasm't

    [1.33.0] - 2025-06-02

    ... (truncated)

    Commits

    Updates `docker/login-action` from 3.4.0 to 3.5.0
    Release notes

    Sourced from docker/login-action's releases.

    v3.5.0

    Full Changelog: https://github.com/docker/login-action/compare/v3.4.0...v3.5.0

    Commits
    • 184bdaa Merge pull request #878 from docker/dependabot/npm_and_yarn/aws-sdk-dependenc...
    • 5c6bc94 chore: update generated content
    • caf4058 build(deps): bump the aws-sdk-dependencies group with 2 updates
    • ef38ec3 Merge pull request #860 from docker/dependabot/npm_and_yarn/aws-sdk-dependenc...
    • d52e8ef chore: update generated content
    • 9644ab7 build(deps): bump the aws-sdk-dependencies group with 2 updates
    • 7abd1d5 Merge pull request #875 from docker/dependabot/npm_and_yarn/form-data-2.5.5
    • 1a81202 Merge pull request #876 from crazy-max/aws-public-dual-stack
    • d1ab30d chore: update generated content
    • f25ff28 support dual-stack for aws public ecr
    • Additional commits viewable in compare view

    Updates `google-github-actions/setup-gcloud` from 2.1.5 to 2.2.0
    Release notes

    Sourced from google-github-actions/setup-gcloud's releases.

    v2.2.0

    What's Changed

    Full Changelog: https://github.com/google-github-actions/setup-gcloud/compare/v2.1.5...v2.2.0

    Commits

    Updates `actions/download-artifact` from 4.3.0 to 5.0.0
    Release notes

    Sourced from actions/download-artifact's releases.

    v5.0.0

    What's Changed

    v5.0.0

    🚨 Breaking Change

    This release fixes an inconsistency in path behavior for single artifact downloads by ID. If you're downloading single artifacts by ID, the output path may change.

    What Changed

    Previously, single artifact downloads behaved differently depending on how you specified the artifact:

    • By name: name: my-artifact → extracted to path/ (direct)
    • By ID: artifact-ids: 12345 → extracted to path/my-artifact/ (nested)

    Now both methods are consistent:

    • By name: name: my-artifact → extracted to path/ (unchanged)
    • By ID: artifact-ids: 12345 → extracted to path/ (fixed - now direct)

    Migration Guide

    ✅ No Action Needed If:
    • You download artifacts by name
    • You download multiple artifacts by ID
    • You already use merge-multiple: true as a workaround
    ⚠️ Action Required If:

    You download single artifacts by ID and your workflows expect the nested directory structure.

    Before v5 (nested structure):

    - uses: actions/download-artifact@v4
      with:
        artifact-ids: 12345
        path: dist
    # Files were in: dist/my-artifact/
    

    Where my-artifact is the name of the artifact you previously uploaded

    To maintain old behavior (if needed):

    </tr></table>
    

    ... (truncated)

    Commits
    • 634f93c Merge pull request #416 from actions/single-artifact-id-download-path
    • b19ff43 refactor: resolve download path correctly in artifact download tests (mainly ...
    • e262cbe bundle dist
    • bff23f9 update docs
    • fff8c14 fix download path logic when downloading a single artifact by id
    • 448e3f8 Merge pull request #407 from actions/nebuk89-patch-1
    • 47225c4 Update README.md
    • See full diff in compare view

    Updates `tj-actions/changed-files` from c2ca2493190021783138cb8aac49bcee14b4bb89 to f963b3f3562b00b6d2dd25efc390eb04e51ef6c6
    Changelog

    Sourced from tj-actions/changed-files's changelog.

    Changelog

    46.0.5 - (2025-04-09)

    ⚙️ Miscellaneous Tasks

    • deps: Bump yaml from 2.7.0 to 2.7.1 (#2520) (ed68ef8) - (dependabot[bot])
    • deps-dev: Bump typescript from 5.8.2 to 5.8.3 (#2516) (a7bc14b) - (dependabot[bot])
    • deps-dev: Bump @​types/node from 22.13.11 to 22.14.0 (#2517) (3d751f6) - (dependabot[bot])
    • deps-dev: Bump eslint-plugin-prettier from 5.2.3 to 5.2.6 (#2519) (e2fda4e) - (dependabot[bot])
    • deps-dev: Bump ts-jest from 29.2.6 to 29.3.1 (#2518) (0bed1b1) - (dependabot[bot])
    • deps: Bump github/codeql-action from 3.28.12 to 3.28.15 (#2530) (6802458) - (dependabot[bot])
    • deps: Bump tj-actions/branch-names from 8.0.1 to 8.1.0 (#2521) (cf2e39e) - (dependabot[bot])
    • deps: Bump tj-actions/verify-changed-files from 20.0.1 to 20.0.4 (#2523) (6abeaa5) - (dependabot[bot])

    ⬆️ Upgrades

    • Upgraded to v46.0.4 (#2511)

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (6f67ee9) - (github-actions[bot])

    46.0.4 - (2025-04-03)

    🐛 Bug Fixes

    • Bug modified_keys and changed_key outputs not set when no changes detected (#2509) (6cb76d0) - (Tonye Jack)

    📚 Documentation

    ⬆️ Upgrades

    • Upgraded to v46.0.3 (#2506)

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> Co-authored-by: Tonye Jack jtonye@ymail.com (27ae6b3) - (github-actions[bot])

    46.0.3 - (2025-03-23)

    🔄 Update

    • Updated README.md (#2501)

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (41e0de5) - (github-actions[bot])

    • Updated README.md (#2499)

    Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@​users.noreply.github.com> (9457878) - (github-actions[bot])

    📚 Documentation

    ... (truncated)

    Commits
    • f963b3f chore(deps-dev): bump @​types/node from 24.1.0 to 24.2.0 (#2640)
    • f956744 chore(deps): bump actions/download-artifact from 4.3.0 to 5.0.0 (#2641)
    • 9009bab chore(deps): bump yaml from 2.8.0 to 2.8.1 (#2642)
    • 2ecafed chore(deps-dev): bump eslint-plugin-prettier from 5.5.3 to 5.5.4 (#2643)
    • 8cdfb76 chore(deps): bump tj-actions/eslint-changed-files from 25.3.1 to 25.3.2 (#2638)
    • 087c158 chore(deps-dev): bump ts-jest from 29.4.0 to 29.4.1 (#2639)
    • See full diff in compare view

    Updates `github/codeql-action` from 3.29.7 to 3.29.8
    Release notes

    Sourced from github/codeql-action's releases.

    v3.29.8

    CodeQL Action Changelog

    See the releases page for the relevant changes to the CodeQL CLI and language packs.

    3.29.8 - 08 Aug 2025

    • Fix an issue where the Action would autodetect unsupported languages such as HTML. #3015

    See the full CHANGELOG.md for more information.

    Changelog

    Sourced from github/codeql-action's changelog.

    CodeQL Action Changelog

    See the releases page for the relevant changes to the CodeQL CLI and language packs.

    [UNRELEASED]

    No user facing changes.

    3.29.8 - 08 Aug 2025

    • Fix an issue where the Action would autodetect unsupported languages such as HTML. #3015

    3.29.7 - 07 Aug 2025

    This release rolls back 3.29.6 to address issues with language autodetection. It is identical to 3.29.5.

    3.29.6 - 07 Aug 2025

    • The cleanup-level input to the analyze Action is now deprecated. The CodeQL Action has written a limited amount of intermediate results to the database since version 2.2.5, and now automatically manages cleanup. #2999
    • Update default CodeQL bundle version to 2.22.3. #3000

    3.29.5 - 29 Jul 2025

    • Update default CodeQL bundle version to 2.22.2. #2986

    3.29.4 - 23 Jul 2025

    No user facing changes.

    3.29.3 - 21 Jul 2025

    No user facing changes.

    3.29.2 - 30 Jun 2025

    • Experimental: When the quality-queries input for the init action is provided with an argument, separate .quality.sarif files are produced and uploaded for each language with the results of the specified queries. Do not use this in production as it is part of an internal experiment and subject to change at any time. #2935

    3.29.1 - 27 Jun 2025

    • Fix bug in PR analysis where user-provided include query filter fails to exclude non-included queries. #2938
    • Update default CodeQL bundle version to 2.22.1. #2950

    3.29.0 - 11 Jun 2025

    • Update default CodeQL bundle version to 2.22.0. #2925
    • Bump minimum CodeQL bundle version to 2.16.6. #2912

    3.28.21 - 28 July 2025

    No user facing changes.

    ... (truncated)

    Commits
    • 76621b6 Merge pull request #3019 from github/update-v3.29.8-679a40d33
    • 29ac3ce Add release notes for 3.29.7
    • 737cfde Update changelog for v3.29.8
    • 679a40d Merge pull request #3014 from github/henrymercer/rebuild-dispatch
    • 6fe50b2 Merge pull request #3015 from github/henrymercer/language-autodetection-worka...
    • 6bc91d6 Add changelog note
    • 6b4fedc Bump Action patch version
    • 5794ffc Fix auto-detection of extractors that aren't languages
    • bd62bf4 Finish in-progress merges
    • 2afb4e6 Avoid specifying branch unnecessarily
    • Additional commits viewable in compare view

    Most Recent Ignore Conditions Applied to This Pull Request | Dependency Name | Ignore Conditions | | --- | --- | | crate-ci/typos | [>= 1.30.a, < 1.31] |
    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yaml | 48 ++++++++++++------------- .github/workflows/docker-base.yaml | 4 +-- .github/workflows/docs-ci.yaml | 4 +-- .github/workflows/dogfood.yaml | 6 ++-- .github/workflows/nightly-gauntlet.yaml | 2 +- .github/workflows/pr-deploy.yaml | 10 +++--- .github/workflows/release.yaml | 16 ++++----- .github/workflows/scorecard.yml | 4 +-- .github/workflows/security.yaml | 10 +++--- .github/workflows/stale.yaml | 2 +- .github/workflows/weekly-docs.yaml | 2 +- 11 files changed, 54 insertions(+), 54 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0f0a4056eea5f..0c8a11fbcbcf8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -39,7 +39,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 # For pull requests it's not necessary to checkout the code @@ -121,7 +121,7 @@ jobs: # runs-on: ${{ github.repository_owner == 'coder' && 'depot-ubuntu-22.04-8' || 'ubuntu-latest' }} # steps: # - name: Checkout - # uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + # uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 # with: # fetch-depth: 1 # # See: https://github.com/stefanzweifel/git-auto-commit-action?tab=readme-ov-file#commits-made-by-this-action-do-not-trigger-new-workflow-runs @@ -159,7 +159,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -177,7 +177,7 @@ jobs: echo "LINT_CACHE_DIR=$dir" >> $GITHUB_ENV - name: golangci-lint cache - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: path: | ${{ env.LINT_CACHE_DIR }} @@ -187,7 +187,7 @@ jobs: # Check for any typos - name: Check for typos - uses: crate-ci/typos@392b78fe18a52790c53f42456e46124f77346842 # v1.34.0 + uses: crate-ci/typos@52bd719c2c91f9d676e2aa359fc8e0db8925e6d8 # v1.35.3 with: config: .github/workflows/typos.toml @@ -231,7 +231,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -286,7 +286,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -356,7 +356,7 @@ jobs: uses: coder/setup-ramdisk-action@e1100847ab2d7bcd9d14bcda8f2d1b0f07b36f1b - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -543,7 +543,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -591,7 +591,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -650,7 +650,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -676,7 +676,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -708,7 +708,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 @@ -779,7 +779,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: # 👇 Ensures Chromatic can read your full git history fetch-depth: 0 @@ -859,7 +859,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: # 0 is required here for version.sh to work. fetch-depth: 0 @@ -956,7 +956,7 @@ jobs: steps: # Harden Runner doesn't work on macOS - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -1054,12 +1054,12 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 - name: GHCR Login - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -1134,10 +1134,10 @@ jobs: token_format: "access_token" - name: Setup GCloud SDK - uses: google-github-actions/setup-gcloud@6a7c903a70c8625ed6700fa299f5ddb4ca6022e9 # v2.1.5 + uses: google-github-actions/setup-gcloud@cb1e50a9932213ecece00a606661ae9ca44f3397 # v2.2.0 - name: Download dylibs - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 with: name: dylibs path: ./build @@ -1426,7 +1426,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -1437,7 +1437,7 @@ jobs: service_account: coder-ci@coder-dogfood.iam.gserviceaccount.com - name: Set up Google Cloud SDK - uses: google-github-actions/setup-gcloud@6a7c903a70c8625ed6700fa299f5ddb4ca6022e9 # v2.1.5 + uses: google-github-actions/setup-gcloud@cb1e50a9932213ecece00a606661ae9ca44f3397 # v2.2.0 - name: Set up Flux CLI uses: fluxcd/flux2/action@6bf37f6a560fd84982d67f853162e4b3c2235edb # v2.6.4 @@ -1490,7 +1490,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -1525,7 +1525,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 # We need golang to run the migration main.go diff --git a/.github/workflows/docker-base.yaml b/.github/workflows/docker-base.yaml index bb45d4c0a0601..dd36ab5a45ea0 100644 --- a/.github/workflows/docker-base.yaml +++ b/.github/workflows/docker-base.yaml @@ -43,10 +43,10 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Docker login - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 with: registry: ghcr.io username: ${{ github.actor }} diff --git a/.github/workflows/docs-ci.yaml b/.github/workflows/docs-ci.yaml index 294485637e528..cba5bcbcd2b42 100644 --- a/.github/workflows/docs-ci.yaml +++ b/.github/workflows/docs-ci.yaml @@ -23,12 +23,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Setup Node uses: ./.github/actions/setup-node - - uses: tj-actions/changed-files@c2ca2493190021783138cb8aac49bcee14b4bb89 # v45.0.7 + - uses: tj-actions/changed-files@f963b3f3562b00b6d2dd25efc390eb04e51ef6c6 # v45.0.7 id: changed-files with: files: | diff --git a/.github/workflows/dogfood.yaml b/.github/workflows/dogfood.yaml index b05bdc87c7419..2172f476d0217 100644 --- a/.github/workflows/dogfood.yaml +++ b/.github/workflows/dogfood.yaml @@ -32,7 +32,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Setup Nix uses: nixbuild/nix-quick-install-action@63ca48f939ee3b8d835f4126562537df0fee5b91 # v32 @@ -80,7 +80,7 @@ jobs: - name: Login to DockerHub if: github.ref == 'refs/heads/main' - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} @@ -123,7 +123,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Setup Terraform uses: ./.github/actions/setup-tf diff --git a/.github/workflows/nightly-gauntlet.yaml b/.github/workflows/nightly-gauntlet.yaml index e06da40098b6c..7b20ee92554b2 100644 --- a/.github/workflows/nightly-gauntlet.yaml +++ b/.github/workflows/nightly-gauntlet.yaml @@ -53,7 +53,7 @@ jobs: uses: coder/setup-ramdisk-action@e1100847ab2d7bcd9d14bcda8f2d1b0f07b36f1b - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 diff --git a/.github/workflows/pr-deploy.yaml b/.github/workflows/pr-deploy.yaml index c82861db22094..1a47f88791a88 100644 --- a/.github/workflows/pr-deploy.yaml +++ b/.github/workflows/pr-deploy.yaml @@ -44,7 +44,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Check if PR is open id: check_pr @@ -79,7 +79,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -223,7 +223,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -237,7 +237,7 @@ jobs: uses: ./.github/actions/setup-sqlc - name: GHCR Login - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -325,7 +325,7 @@ jobs: kubectl create namespace "pr${{ env.PR_NUMBER }}" - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Check and Create Certificate if: needs.get_info.outputs.NEW == 'true' || github.event.inputs.deploy == 'true' diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 05bcee392e789..624e279819a53 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -38,7 +38,7 @@ jobs: steps: # Harden Runner doesn't work on macOS. - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -139,7 +139,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -208,7 +208,7 @@ jobs: cat "$CODER_RELEASE_NOTES_FILE" - name: Docker Login - uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0 + uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -293,10 +293,10 @@ jobs: token_format: "access_token" - name: Setup GCloud SDK - uses: google-github-actions/setup-gcloud@6a7c903a70c8625ed6700fa299f5ddb4ca6022e9 # v2.1.5 + uses: google-github-actions/setup-gcloud@cb1e50a9932213ecece00a606661ae9ca44f3397 # v2.2.0 - name: Download dylibs - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 with: name: dylibs path: ./build @@ -703,7 +703,7 @@ jobs: service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }} - name: Setup GCloud SDK - uses: google-github-actions/setup-gcloud@6a7c903a70c8625ed6700fa299f5ddb4ca6022e9 # 2.1.5 + uses: google-github-actions/setup-gcloud@cb1e50a9932213ecece00a606661ae9ca44f3397 # 2.2.0 - name: Publish Helm Chart if: ${{ !inputs.dry_run }} @@ -851,7 +851,7 @@ jobs: GH_TOKEN: ${{ secrets.CDRCI_GITHUB_TOKEN }} - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -936,7 +936,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 1 diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 8713fce1ddfe9..87e9e6271c6ac 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -25,7 +25,7 @@ jobs: egress-policy: audit - name: "Checkout code" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: persist-credentials: false @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 + uses: github/codeql-action/upload-sarif@76621b61decf072c1cee8dd1ce2d2a82d33c17ed # v3.29.5 with: sarif_file: results.sarif diff --git a/.github/workflows/security.yaml b/.github/workflows/security.yaml index f49bd66ff2d95..27b5137738098 100644 --- a/.github/workflows/security.yaml +++ b/.github/workflows/security.yaml @@ -32,13 +32,13 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Setup Go uses: ./.github/actions/setup-go - name: Initialize CodeQL - uses: github/codeql-action/init@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 + uses: github/codeql-action/init@76621b61decf072c1cee8dd1ce2d2a82d33c17ed # v3.29.5 with: languages: go, javascript @@ -48,7 +48,7 @@ jobs: rm Makefile - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 + uses: github/codeql-action/analyze@76621b61decf072c1cee8dd1ce2d2a82d33c17ed # v3.29.5 - name: Send Slack notification on failure if: ${{ failure() }} @@ -72,7 +72,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 with: fetch-depth: 0 @@ -150,7 +150,7 @@ jobs: severity: "CRITICAL,HIGH" - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@51f77329afa6477de8c49fc9c7046c15b9a4e79d # v3.29.5 + uses: github/codeql-action/upload-sarif@76621b61decf072c1cee8dd1ce2d2a82d33c17ed # v3.29.5 with: sarif_file: trivy-results.sarif category: "Trivy" diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 00d7eef888833..c0c2494db6fbf 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -101,7 +101,7 @@ jobs: egress-policy: audit - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Run delete-old-branches-action uses: beatlabs/delete-old-branches-action@4eeeb8740ff8b3cb310296ddd6b43c3387734588 # v0.0.11 with: diff --git a/.github/workflows/weekly-docs.yaml b/.github/workflows/weekly-docs.yaml index dd83a5629ca83..8d152f73981f5 100644 --- a/.github/workflows/weekly-docs.yaml +++ b/.github/workflows/weekly-docs.yaml @@ -26,7 +26,7 @@ jobs: egress-policy: audit - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Check Markdown links uses: umbrelladocs/action-linkspector@874d01cae9fd488e3077b08952093235bd626977 # v1.3.7 From 8008c08893930d65cd67f61026331be053d9653a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 16:58:19 +0000 Subject: [PATCH 130/260] chore: bump cloud.google.com/go/compute/metadata from 0.7.0 to 0.8.0 (#19297) Bumps [cloud.google.com/go/compute/metadata](https://github.com/googleapis/google-cloud-go) from 0.7.0 to 0.8.0.
    Release notes

    Sourced from cloud.google.com/go/compute/metadata's releases.

    compute/metadata: v0.8.0

    0.8.0 (2025-08-06)

    Features

    Changelog

    Sourced from cloud.google.com/go/compute/metadata's changelog.

    v0.8.0

    • profiler package added.
    • storage:
      • Retry Objects.Insert call.
      • Add ProgressFunc to WRiter.
    • pubsub: breaking changes:
      • Publish is now asynchronous (announcement).
      • Subscription.Pull replaced by Subscription.Receive, which takes a callback (announcement).
      • Message.Done replaced with Message.Ack and Message.Nack.
    Commits
    • e11d9d1 rpcreplay: file format and I/O
    • f5c3fe2 profiler: Add Cloud Profiler runtime agent for Go.
    • 87cc1d2 rpcreplay: package doc
    • b4e9a38 storage: retry Objects.Insert call
    • 9a04fc8 trace: respond with trace context to report the sampling options
    • e8b5f2c spanner: Increased the maximum allowed sending and recieving msg size to 100 MB
    • dd88571 bigtable: Fix documentation for timestamp range filters
    • c60d02f pubsub: clarify that Topic is goroutine-safe
    • 69931d8 bigquery: get streaming buffer info
    • 7d132fe bigtable: Fix GCRuleToString when GcRule is nil
    • Additional commits viewable in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cloud.google.com/go/compute/metadata&package-manager=go_modules&previous-version=0.7.0&new-version=0.8.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 0806304ca2755..85667a2c7fec7 100644 --- a/go.mod +++ b/go.mod @@ -74,7 +74,7 @@ replace github.com/spf13/afero => github.com/aslilac/afero v0.0.0-20250403163713 require ( cdr.dev/slog v1.6.2-0.20250703074222-9df5e0a6c145 - cloud.google.com/go/compute/metadata v0.7.0 + cloud.google.com/go/compute/metadata v0.8.0 github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/adrg/xdg v0.5.0 github.com/ammario/tlru v0.4.0 diff --git a/go.sum b/go.sum index 6fd9e0aeb56cf..bd4d9155c15ed 100644 --- a/go.sum +++ b/go.sum @@ -184,8 +184,8 @@ cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZ cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= -cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/compute/metadata v0.8.0 h1:HxMRIbao8w17ZX6wBnjhcDkW6lTFpgcaobyVfZWqRLA= +cloud.google.com/go/compute/metadata v0.8.0/go.mod h1:sYOGTp851OV9bOFJ9CH7elVvyzopvWQFNNghtDQ/Biw= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= From 4238b38c4c1581364066a24cc0436fa447921ce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 16:58:46 +0000 Subject: [PATCH 131/260] chore: bump github.com/coder/terraform-provider-coder/v2 from 2.9.0 to 2.10.0 (#19296) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [github.com/coder/terraform-provider-coder/v2](https://github.com/coder/terraform-provider-coder) from 2.9.0 to 2.10.0.
    Release notes

    Sourced from github.com/coder/terraform-provider-coder/v2's releases.

    v2.10.0

    What's Changed

    New Contributors

    Full Changelog: https://github.com/coder/terraform-provider-coder/compare/v2.9.0...v2.10.0

    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/coder/terraform-provider-coder/v2&package-manager=go_modules&previous-version=2.9.0&new-version=2.10.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 85667a2c7fec7..e10c7a248db7e 100644 --- a/go.mod +++ b/go.mod @@ -101,7 +101,7 @@ require ( github.com/coder/quartz v0.2.1 github.com/coder/retry v1.5.1 github.com/coder/serpent v0.10.0 - github.com/coder/terraform-provider-coder/v2 v2.9.0 + github.com/coder/terraform-provider-coder/v2 v2.10.0 github.com/coder/websocket v1.8.13 github.com/coder/wgtunnel v0.1.13-0.20240522110300-ade90dfb2da0 github.com/coreos/go-oidc/v3 v3.15.0 diff --git a/go.sum b/go.sum index bd4d9155c15ed..3575f35177154 100644 --- a/go.sum +++ b/go.sum @@ -936,8 +936,8 @@ github.com/coder/tailscale v1.1.1-0.20250729141742-067f1e5d9716 h1:hi7o0sA+RPBq8 github.com/coder/tailscale v1.1.1-0.20250729141742-067f1e5d9716/go.mod h1:l7ml5uu7lFh5hY28lGYM4b/oFSmuPHYX6uk4RAu23Lc= github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e h1:JNLPDi2P73laR1oAclY6jWzAbucf70ASAvf5mh2cME0= github.com/coder/terraform-config-inspect v0.0.0-20250107175719-6d06d90c630e/go.mod h1:Gz/z9Hbn+4KSp8A2FBtNszfLSdT2Tn/uAKGuVqqWmDI= -github.com/coder/terraform-provider-coder/v2 v2.9.0 h1:nd9d1/qHTdx5foBLZoy0SWCc0W13GQUbPTzeGsuLlU0= -github.com/coder/terraform-provider-coder/v2 v2.9.0/go.mod h1:f8xPh0riDTRwqoPWkjas5VgIBaiRiWH+STb0TZw2fgY= +github.com/coder/terraform-provider-coder/v2 v2.10.0 h1:cGPMfARGHKb80kZsbDX/t/YKwMOwI5zkIyVCQziHR2M= +github.com/coder/terraform-provider-coder/v2 v2.10.0/go.mod h1:f8xPh0riDTRwqoPWkjas5VgIBaiRiWH+STb0TZw2fgY= github.com/coder/trivy v0.0.0-20250527170238-9416a59d7019 h1:MHkv/W7l9eRAN9gOG0qZ1TLRGWIIfNi92273vPAQ8Fs= github.com/coder/trivy v0.0.0-20250527170238-9416a59d7019/go.mod h1:eqk+w9RLBmbd/cB5XfPZFuVn77cf/A6fB7qmEVeSmXk= github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE= From 94bf1e3ae213c68cac19a698b720b8b6413c3d1b Mon Sep 17 00:00:00 2001 From: Michael Suchacz <203725896+ibetitsmike@users.noreply.github.com> Date: Mon, 11 Aug 2025 20:32:17 +0200 Subject: [PATCH 132/260] chore: symlink CLAUDE.md to AGENTS.md for Codex usage (#19298) --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) create mode 120000 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 120000 index 0000000000000..681311eb9cf45 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1 @@ +CLAUDE.md \ No newline at end of file From b8c9192d0bee03574d4372ee168d816419188a1a Mon Sep 17 00:00:00 2001 From: Andrew Aquino Date: Mon, 11 Aug 2025 15:20:02 -0400 Subject: [PATCH 133/260] fix: generalize password invalid message (#19307) fixes #19044 password over 64 characters means it's _too_ strong; now the error message is applicable to this case --- coderd/users.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coderd/users.go b/coderd/users.go index 851c52d71188e..d38d40a1fc826 100644 --- a/coderd/users.go +++ b/coderd/users.go @@ -148,7 +148,7 @@ func (api *API) postFirstUser(rw http.ResponseWriter, r *http.Request) { err = userpassword.Validate(createUser.Password) if err != nil { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ - Message: "Password not strong enough!", + Message: "Password is invalid", Validations: []codersdk.ValidationError{{ Field: "password", Detail: err.Error(), @@ -448,7 +448,7 @@ func (api *API) postUser(rw http.ResponseWriter, r *http.Request) { err = userpassword.Validate(req.Password) if err != nil { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ - Message: "Password not strong enough!", + Message: "Password is invalid", Validations: []codersdk.ValidationError{{ Field: "password", Detail: err.Error(), From 0bfe0d63aec83ae438bdcb77e306effd100dba3d Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Mon, 11 Aug 2025 20:43:50 +0100 Subject: [PATCH 134/260] feat: add tests for dynamic parameters (#18679) ## Summary by CodeRabbit * **New Features** * Added support for a new testing attribute to the multi-select combobox component, improving testability. * Expanded mock data for dynamic parameters, covering a wider range of input types and validation scenarios. * **Bug Fixes** * Improved loader and error handling on the experimental workspace creation page to better display WebSocket errors. * **Tests** * Introduced comprehensive tests for the experimental workspace creation page, including dynamic parameter updates, error handling, and form submission scenarios. --------- Co-authored-by: Michael Smith --- site/src/components/Combobox/Combobox.tsx | 3 + .../MultiSelectCombobox.tsx | 4 + .../DynamicParameter/DynamicParameter.tsx | 6 +- .../CreateWorkspacePageExperimental.test.tsx | 600 ++++++++++++++++++ .../CreateWorkspacePageExperimental.tsx | 13 +- site/src/testHelpers/entities.ts | 189 +++++- 6 files changed, 803 insertions(+), 12 deletions(-) create mode 100644 site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.test.tsx diff --git a/site/src/components/Combobox/Combobox.tsx b/site/src/components/Combobox/Combobox.tsx index f2db25b1ef31c..35a4846fcffb4 100644 --- a/site/src/components/Combobox/Combobox.tsx +++ b/site/src/components/Combobox/Combobox.tsx @@ -34,6 +34,7 @@ interface ComboboxProps { onInputChange?: (value: string) => void; onKeyDown?: KeyboardEventHandler; onSelect: (value: string) => void; + id?: string; } type ComboboxOption = { @@ -53,6 +54,7 @@ export const Combobox: FC = ({ onInputChange, onKeyDown, onSelect, + id, }) => { const [managedOpen, setManagedOpen] = useState(false); const [managedInputValue, setManagedInputValue] = useState(""); @@ -78,6 +80,7 @@ export const Combobox: FC = ({ + +
    + {builds + ? builds.map((build) => ( + + + + )) + : Array.from({ length: 15 }, (_, i) => ( + + + + ))} + {buildsQuery.hasNextPage && ( +
    + +
    + )}
    - )} +
    ); }; diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index 07c5ec26d0766..b96ddcdf7b7fe 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -1,5 +1,3 @@ -import type { Interpolation, Theme } from "@emotion/react"; -import { useTheme } from "@emotion/react"; import HistoryOutlined from "@mui/icons-material/HistoryOutlined"; import HubOutlined from "@mui/icons-material/HubOutlined"; import AlertTitle from "@mui/material/AlertTitle"; @@ -68,7 +66,6 @@ export const Workspace: FC = ({ handleDebug, }) => { const navigate = useNavigate(); - const theme = useTheme(); const transitionStats = template !== undefined ? ActiveTransition(template, workspace) : undefined; @@ -100,18 +97,7 @@ export const Workspace: FC = ({ workspacePending && !haveBuildLogs && !provisionersHealthy && !isRestarting; return ( -
    +
    = ({ handleToggleFavorite={handleToggleFavorite} /> -
    - { - setSidebarOption("resources"); - }} - > - - - { - setSidebarOption("history"); - }} - > - - -
    - - {sidebarOption.value === "resources" && ( - - )} - {sidebarOption.value === "history" && ( - - )} - -
    - {selectedResource && ( - - )} -
    - {workspace.latest_build.status === "deleted" && ( - navigate("/templates")} - /> - )} - - {shouldShowProvisionerAlert && ( - +
    +
    + { + setSidebarOption("resources"); + }} + > + + + { + setSidebarOption("history"); + }} + > + + +
    + + {sidebarOption.value === "resources" && ( + )} - - {workspace.latest_build.job.error && ( - - Workspace build failed - {workspace.latest_build.job.error} - + {sidebarOption.value === "history" && ( + )} +
    - {transitionStats !== undefined && ( - + {selectedResource && ( + )} - - {shouldShowBuildLogs && ( - - )} - - {selectedResource && ( -
    - {selectedResource.agents - // If an agent has a `parent_id`, that means it is - // child of another agent. We do not want these agents - // to be displayed at the top-level on this page. We - // want them to display _as children_ of their parents. - ?.filter((agent) => agent.parent_id === null) - .map((agent) => ( - a.parent_id === agent.id, - )} - workspace={workspace} - template={template} - onUpdateAgent={handleUpdate} // On updating the workspace the agent version is also updated - /> - ))} - - {(!selectedResource.agents || - selectedResource.agents?.length === 0) && ( -
    -
    -

    - No agents are currently assigned to this resource. -

    +
    + {workspace.latest_build.status === "deleted" && ( + navigate("/templates")} + /> + )} + + {shouldShowProvisionerAlert && ( + + )} + + {workspace.latest_build.job.error && ( + + Workspace build failed + {workspace.latest_build.job.error} + + )} + + {transitionStats !== undefined && ( + + )} + + {shouldShowBuildLogs && ( + + )} + + {selectedResource && ( +
    + {selectedResource.agents + // If an agent has a `parent_id`, that means it is + // child of another agent. We do not want these agents + // to be displayed at the top-level on this page. We + // want them to display _as children_ of their parents. + ?.filter((agent) => agent.parent_id === null) + .map((agent) => ( + a.parent_id === agent.id, + )} + workspace={workspace} + template={template} + onUpdateAgent={handleUpdate} // On updating the workspace the agent version is also updated + /> + ))} + + {(!selectedResource.agents || + selectedResource.agents?.length === 0) && ( +
    +
    +

    + No agents are currently assigned to this resource. +

    +
    -
    - )} -
    - )} - - + )} + + )} + + +
    @@ -286,33 +252,3 @@ export const Workspace: FC = ({ const countAgents = (resource: TypesGen.WorkspaceResource) => { return resource.agents ? resource.agents.length : 0; }; - -const styles = { - content: { - padding: 32, - gridArea: "content", - overflowY: "auto", - position: "relative", - }, - - dotsBackground: (theme) => ({ - "--d": "1px", - background: ` - radial-gradient( - circle at - var(--d) - var(--d), - - ${theme.palette.dots} calc(var(--d) - 1px), - ${theme.palette.background.default} var(--d) - ) - -2px -2px / 16px 16px - `, - }), - - actions: (theme) => ({ - [theme.breakpoints.down("md")]: { - flexDirection: "column", - }, - }), -} satisfies Record>; From 4926410146d55d2673ac631b72d18ff9bb8a6caa Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Thu, 14 Aug 2025 09:50:31 -0500 Subject: [PATCH 162/260] feat: keep original token refresh error in external auth (#19339) External auth refresh errors lose the original error thrown on the first refresh. This PR saves that error to the database to be raised on subsequent refresh attempts --- coderd/database/dump.sql | 5 ++- .../000358_failed_ext_auth_error.down.sql | 3 ++ .../000358_failed_ext_auth_error.up.sql | 7 +++ coderd/database/models.go | 2 + coderd/database/queries.sql.go | 43 +++++++++++------- coderd/database/queries/externalauth.sql | 9 +++- coderd/externalauth/externalauth.go | 44 ++++++++++++++++++- coderd/externalauth/externalauth_test.go | 25 +++++++---- 8 files changed, 110 insertions(+), 28 deletions(-) create mode 100644 coderd/database/migrations/000358_failed_ext_auth_error.down.sql create mode 100644 coderd/database/migrations/000358_failed_ext_auth_error.up.sql diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 7bea770248310..859cdd4b9ce6c 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -942,13 +942,16 @@ CREATE TABLE external_auth_links ( oauth_expiry timestamp with time zone NOT NULL, oauth_access_token_key_id text, oauth_refresh_token_key_id text, - oauth_extra jsonb + oauth_extra jsonb, + oauth_refresh_failure_reason text DEFAULT ''::text NOT NULL ); COMMENT ON COLUMN external_auth_links.oauth_access_token_key_id IS 'The ID of the key used to encrypt the OAuth access token. If this is NULL, the access token is not encrypted'; COMMENT ON COLUMN external_auth_links.oauth_refresh_token_key_id IS 'The ID of the key used to encrypt the OAuth refresh token. If this is NULL, the refresh token is not encrypted'; +COMMENT ON COLUMN external_auth_links.oauth_refresh_failure_reason IS 'This error means the refresh token is invalid. Cached so we can avoid calling the external provider again for the same error.'; + CREATE TABLE files ( hash character varying(64) NOT NULL, created_at timestamp with time zone NOT NULL, diff --git a/coderd/database/migrations/000358_failed_ext_auth_error.down.sql b/coderd/database/migrations/000358_failed_ext_auth_error.down.sql new file mode 100644 index 0000000000000..72cad82d36a1e --- /dev/null +++ b/coderd/database/migrations/000358_failed_ext_auth_error.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE external_auth_links + DROP COLUMN oauth_refresh_failure_reason +; diff --git a/coderd/database/migrations/000358_failed_ext_auth_error.up.sql b/coderd/database/migrations/000358_failed_ext_auth_error.up.sql new file mode 100644 index 0000000000000..f2030ecbeeca2 --- /dev/null +++ b/coderd/database/migrations/000358_failed_ext_auth_error.up.sql @@ -0,0 +1,7 @@ +ALTER TABLE external_auth_links + ADD COLUMN oauth_refresh_failure_reason TEXT NOT NULL DEFAULT '' +; + +COMMENT ON COLUMN external_auth_links.oauth_refresh_failure_reason IS + 'This error means the refresh token is invalid. Cached so we can avoid calling the external provider again for the same error.' +; diff --git a/coderd/database/models.go b/coderd/database/models.go index 75d2b941dab3c..057d7956e5bbd 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -3065,6 +3065,8 @@ type ExternalAuthLink struct { // The ID of the key used to encrypt the OAuth refresh token. If this is NULL, the refresh token is not encrypted OAuthRefreshTokenKeyID sql.NullString `db:"oauth_refresh_token_key_id" json:"oauth_refresh_token_key_id"` OAuthExtra pqtype.NullRawMessage `db:"oauth_extra" json:"oauth_extra"` + // This error means the refresh token is invalid. Cached so we can avoid calling the external provider again for the same error. + OauthRefreshFailureReason string `db:"oauth_refresh_failure_reason" json:"oauth_refresh_failure_reason"` } type File struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 58874cb7ed8c8..22aec98794fb3 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -1711,7 +1711,7 @@ func (q *sqlQuerier) DeleteExternalAuthLink(ctx context.Context, arg DeleteExter } const getExternalAuthLink = `-- name: GetExternalAuthLink :one -SELECT provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra FROM external_auth_links WHERE provider_id = $1 AND user_id = $2 +SELECT provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra, oauth_refresh_failure_reason FROM external_auth_links WHERE provider_id = $1 AND user_id = $2 ` type GetExternalAuthLinkParams struct { @@ -1733,12 +1733,13 @@ func (q *sqlQuerier) GetExternalAuthLink(ctx context.Context, arg GetExternalAut &i.OAuthAccessTokenKeyID, &i.OAuthRefreshTokenKeyID, &i.OAuthExtra, + &i.OauthRefreshFailureReason, ) return i, err } const getExternalAuthLinksByUserID = `-- name: GetExternalAuthLinksByUserID :many -SELECT provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra FROM external_auth_links WHERE user_id = $1 +SELECT provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra, oauth_refresh_failure_reason FROM external_auth_links WHERE user_id = $1 ` func (q *sqlQuerier) GetExternalAuthLinksByUserID(ctx context.Context, userID uuid.UUID) ([]ExternalAuthLink, error) { @@ -1761,6 +1762,7 @@ func (q *sqlQuerier) GetExternalAuthLinksByUserID(ctx context.Context, userID uu &i.OAuthAccessTokenKeyID, &i.OAuthRefreshTokenKeyID, &i.OAuthExtra, + &i.OauthRefreshFailureReason, ); err != nil { return nil, err } @@ -1798,7 +1800,7 @@ INSERT INTO external_auth_links ( $8, $9, $10 -) RETURNING provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra +) RETURNING provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra, oauth_refresh_failure_reason ` type InsertExternalAuthLinkParams struct { @@ -1839,6 +1841,7 @@ func (q *sqlQuerier) InsertExternalAuthLink(ctx context.Context, arg InsertExter &i.OAuthAccessTokenKeyID, &i.OAuthRefreshTokenKeyID, &i.OAuthExtra, + &i.OauthRefreshFailureReason, ) return i, err } @@ -1851,8 +1854,12 @@ UPDATE external_auth_links SET oauth_refresh_token = $6, oauth_refresh_token_key_id = $7, oauth_expiry = $8, - oauth_extra = $9 -WHERE provider_id = $1 AND user_id = $2 RETURNING provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra + oauth_extra = $9, + -- Only 'UpdateExternalAuthLinkRefreshToken' supports updating the oauth_refresh_failure_reason. + -- Any updates to the external auth link, will be assumed to change the state and clear + -- any cached errors. + oauth_refresh_failure_reason = '' +WHERE provider_id = $1 AND user_id = $2 RETURNING provider_id, user_id, created_at, updated_at, oauth_access_token, oauth_refresh_token, oauth_expiry, oauth_access_token_key_id, oauth_refresh_token_key_id, oauth_extra, oauth_refresh_failure_reason ` type UpdateExternalAuthLinkParams struct { @@ -1891,6 +1898,7 @@ func (q *sqlQuerier) UpdateExternalAuthLink(ctx context.Context, arg UpdateExter &i.OAuthAccessTokenKeyID, &i.OAuthRefreshTokenKeyID, &i.OAuthExtra, + &i.OauthRefreshFailureReason, ) return i, err } @@ -1899,27 +1907,32 @@ const updateExternalAuthLinkRefreshToken = `-- name: UpdateExternalAuthLinkRefre UPDATE external_auth_links SET - oauth_refresh_token = $1, - updated_at = $2 + -- oauth_refresh_failure_reason can be set to cache the failure reason + -- for subsequent refresh attempts. + oauth_refresh_failure_reason = $1, + oauth_refresh_token = $2, + updated_at = $3 WHERE - provider_id = $3 + provider_id = $4 AND - user_id = $4 + user_id = $5 AND -- Required for sqlc to generate a parameter for the oauth_refresh_token_key_id - $5 :: text = $5 :: text + $6 :: text = $6 :: text ` type UpdateExternalAuthLinkRefreshTokenParams struct { - OAuthRefreshToken string `db:"oauth_refresh_token" json:"oauth_refresh_token"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - ProviderID string `db:"provider_id" json:"provider_id"` - UserID uuid.UUID `db:"user_id" json:"user_id"` - OAuthRefreshTokenKeyID string `db:"oauth_refresh_token_key_id" json:"oauth_refresh_token_key_id"` + OauthRefreshFailureReason string `db:"oauth_refresh_failure_reason" json:"oauth_refresh_failure_reason"` + OAuthRefreshToken string `db:"oauth_refresh_token" json:"oauth_refresh_token"` + UpdatedAt time.Time `db:"updated_at" json:"updated_at"` + ProviderID string `db:"provider_id" json:"provider_id"` + UserID uuid.UUID `db:"user_id" json:"user_id"` + OAuthRefreshTokenKeyID string `db:"oauth_refresh_token_key_id" json:"oauth_refresh_token_key_id"` } func (q *sqlQuerier) UpdateExternalAuthLinkRefreshToken(ctx context.Context, arg UpdateExternalAuthLinkRefreshTokenParams) error { _, err := q.db.ExecContext(ctx, updateExternalAuthLinkRefreshToken, + arg.OauthRefreshFailureReason, arg.OAuthRefreshToken, arg.UpdatedAt, arg.ProviderID, diff --git a/coderd/database/queries/externalauth.sql b/coderd/database/queries/externalauth.sql index 4368ce56589f0..9ca5cf6f871ad 100644 --- a/coderd/database/queries/externalauth.sql +++ b/coderd/database/queries/externalauth.sql @@ -40,13 +40,20 @@ UPDATE external_auth_links SET oauth_refresh_token = $6, oauth_refresh_token_key_id = $7, oauth_expiry = $8, - oauth_extra = $9 + oauth_extra = $9, + -- Only 'UpdateExternalAuthLinkRefreshToken' supports updating the oauth_refresh_failure_reason. + -- Any updates to the external auth link, will be assumed to change the state and clear + -- any cached errors. + oauth_refresh_failure_reason = '' WHERE provider_id = $1 AND user_id = $2 RETURNING *; -- name: UpdateExternalAuthLinkRefreshToken :exec UPDATE external_auth_links SET + -- oauth_refresh_failure_reason can be set to cache the failure reason + -- for subsequent refresh attempts. + oauth_refresh_failure_reason = @oauth_refresh_failure_reason, oauth_refresh_token = @oauth_refresh_token, updated_at = @updated_at WHERE diff --git a/coderd/externalauth/externalauth.go b/coderd/externalauth/externalauth.go index 9b8b87748e784..24ebe13d03074 100644 --- a/coderd/externalauth/externalauth.go +++ b/coderd/externalauth/externalauth.go @@ -14,6 +14,7 @@ import ( "strings" "time" + "github.com/dustin/go-humanize" "golang.org/x/oauth2" "golang.org/x/xerrors" @@ -28,6 +29,13 @@ import ( "github.com/coder/retry" ) +const ( + // failureReasonLimit is the maximum text length of an error to be cached to the + // database for a failed refresh token. In rare cases, the error could be a large + // HTML payload. + failureReasonLimit = 400 +) + // Config is used for authentication for Git operations. type Config struct { promoauth.InstrumentedOAuth2Config @@ -121,11 +129,12 @@ func (c *Config) RefreshToken(ctx context.Context, db database.Store, externalAu return externalAuthLink, InvalidTokenError("token expired, refreshing is either disabled or refreshing failed and will not be retried") } + refreshToken := externalAuthLink.OAuthRefreshToken + // This is additional defensive programming. Because TokenSource is an interface, // we cannot be sure that the implementation will treat an 'IsZero' time // as "not-expired". The default implementation does, but a custom implementation // might not. Removing the refreshToken will guarantee a refresh will fail. - refreshToken := externalAuthLink.OAuthRefreshToken if c.NoRefresh { refreshToken = "" } @@ -136,15 +145,30 @@ func (c *Config) RefreshToken(ctx context.Context, db database.Store, externalAu Expiry: externalAuthLink.OAuthExpiry, } + // Note: The TokenSource(...) method will make no remote HTTP requests if the + // token is expired and no refresh token is set. This is important to prevent + // spamming the API, consuming rate limits, when the token is known to fail. token, err := c.TokenSource(ctx, existingToken).Token() if err != nil { // TokenSource can fail for numerous reasons. If it fails because of // a bad refresh token, then the refresh token is invalid, and we should // get rid of it. Keeping it around will cause additional refresh // attempts that will fail and cost us api rate limits. + // + // The error message is saved for debugging purposes. if isFailedRefresh(existingToken, err) { + reason := err.Error() + if len(reason) > failureReasonLimit { + // Limit the length of the error message to prevent + // spamming the database with long error messages. + reason = reason[:failureReasonLimit] + } dbExecErr := db.UpdateExternalAuthLinkRefreshToken(ctx, database.UpdateExternalAuthLinkRefreshTokenParams{ - OAuthRefreshToken: "", // It is better to clear the refresh token than to keep retrying. + // Adding a reason will prevent further attempts to try and refresh the token. + OauthRefreshFailureReason: reason, + // Remove the invalid refresh token so it is never used again. The cached + // `reason` can be used to know why this field was zeroed out. + OAuthRefreshToken: "", OAuthRefreshTokenKeyID: externalAuthLink.OAuthRefreshTokenKeyID.String, UpdatedAt: dbtime.Now(), ProviderID: externalAuthLink.ProviderID, @@ -156,12 +180,28 @@ func (c *Config) RefreshToken(ctx context.Context, db database.Store, externalAu } // The refresh token was cleared externalAuthLink.OAuthRefreshToken = "" + externalAuthLink.UpdatedAt = dbtime.Now() } // Unfortunately have to match exactly on the error message string. // Improve the error message to account refresh tokens are deleted if // invalid on our end. + // + // This error messages comes from the oauth2 package on our client side. + // So this check is not against a server generated error message. + // Error source: https://github.com/golang/oauth2/blob/master/oauth2.go#L277 if err.Error() == "oauth2: token expired and refresh token is not set" { + if externalAuthLink.OauthRefreshFailureReason != "" { + // A cached refresh failure error exists. So the refresh token was set, but was invalid, and zeroed out. + // Return this cached error for the original refresh attempt. + return externalAuthLink, InvalidTokenError(fmt.Sprintf("token expired and refreshing failed %s with: %s", + // Do not return the exact time, because then we have to know what timezone the + // user is in. This approximate time is good enough. + humanize.Time(externalAuthLink.UpdatedAt), + externalAuthLink.OauthRefreshFailureReason, + )) + } + return externalAuthLink, InvalidTokenError("token expired, refreshing is either disabled or refreshing failed and will not be retried") } diff --git a/coderd/externalauth/externalauth_test.go b/coderd/externalauth/externalauth_test.go index 81cf5aa1f21e2..484d59beabb9b 100644 --- a/coderd/externalauth/externalauth_test.go +++ b/coderd/externalauth/externalauth_test.go @@ -177,19 +177,25 @@ func TestRefreshToken(t *testing.T) { link.OAuthExpiry = expired // Make the failure a server internal error. Not related to the token + // This should be retried since this error is temporary. refreshErr = &oauth2.RetrieveError{ Response: &http.Response{ StatusCode: http.StatusInternalServerError, }, ErrorCode: "internal_error", } - _, err := config.RefreshToken(ctx, mDB, link) - require.Error(t, err) - require.True(t, externalauth.IsInvalidTokenError(err)) - require.Equal(t, refreshCount, 1) + totalRefreshes := 0 + for i := 0; i < 3; i++ { + // Each loop will hit the temporary error and retry. + _, err := config.RefreshToken(ctx, mDB, link) + require.Error(t, err) + totalRefreshes++ + require.True(t, externalauth.IsInvalidTokenError(err)) + require.Equal(t, refreshCount, totalRefreshes) + } - // Try again with a bad refresh token error - // Expect DB call to remove the refresh token + // Try again with a bad refresh token error. This will invalidate the + // refresh token, and not retry again. Expect DB call to remove the refresh token mDB.EXPECT().UpdateExternalAuthLinkRefreshToken(gomock.Any(), gomock.Any()).Return(nil).Times(1) refreshErr = &oauth2.RetrieveError{ // github error Response: &http.Response{ @@ -197,17 +203,18 @@ func TestRefreshToken(t *testing.T) { }, ErrorCode: "bad_refresh_token", } - _, err = config.RefreshToken(ctx, mDB, link) + _, err := config.RefreshToken(ctx, mDB, link) require.Error(t, err) + totalRefreshes++ require.True(t, externalauth.IsInvalidTokenError(err)) - require.Equal(t, refreshCount, 2) + require.Equal(t, refreshCount, totalRefreshes) // When the refresh token is empty, no api calls should be made link.OAuthRefreshToken = "" // mock'd db, so manually set the token to '' _, err = config.RefreshToken(ctx, mDB, link) require.Error(t, err) require.True(t, externalauth.IsInvalidTokenError(err)) - require.Equal(t, refreshCount, 2) + require.Equal(t, refreshCount, totalRefreshes) }) // ValidateFailure tests if the token is no longer valid with a 401 response. From 9cde6e6608f8533f9a58e0ce025427a2c48fdb87 Mon Sep 17 00:00:00 2001 From: Bruno Quaresma Date: Thu, 14 Aug 2025 12:39:13 -0300 Subject: [PATCH 163/260] chore: remove turbosnap plugin (#19341) Turbosnap plugin is included by default in Storybook 8, so we can remove it from our configuration. > Found 'rollup-plugin-turbosnap' which is now included by default in Storybook 8. Removing from your plugins list. Ensure you pass `--stats-json` to generate stats. > For more information, see https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#turbosnap-vite-plugin-is-no-longer-needed --- site/.storybook/main.js | 15 --------------- site/package.json | 3 +-- site/pnpm-lock.yaml | 8 -------- 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/site/.storybook/main.js b/site/.storybook/main.js index 7a275f0ef90ee..71e7508836057 100644 --- a/site/.storybook/main.js +++ b/site/.storybook/main.js @@ -1,5 +1,3 @@ -import turbosnap from "vite-plugin-turbosnap"; - module.exports = { stories: ["../src/**/*.stories.tsx"], @@ -17,17 +15,4 @@ module.exports = { name: "@storybook/react-vite", options: {}, }, - - async viteFinal(config, { configType }) { - config.plugins = config.plugins || []; - if (configType === "PRODUCTION") { - config.plugins.push( - turbosnap({ - rootDir: config.root || "", - }), - ); - } - config.server.allowedHosts = [".coder"]; - return config; - }, }; diff --git a/site/package.json b/site/package.json index d230e35163642..37ea2306feac0 100644 --- a/site/package.json +++ b/site/package.json @@ -183,8 +183,7 @@ "ts-proto": "1.164.0", "typescript": "5.6.3", "vite": "6.3.5", - "vite-plugin-checker": "0.9.3", - "vite-plugin-turbosnap": "1.0.3" + "vite-plugin-checker": "0.9.3" }, "browserslist": ["chrome 110", "firefox 111", "safari 16.0"], "resolutions": { diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index e815515146754..1341de609fe1c 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -459,9 +459,6 @@ importers: vite-plugin-checker: specifier: 0.9.3 version: 0.9.3(@biomejs/biome@1.9.4)(eslint@8.52.0)(optionator@0.9.3)(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) - vite-plugin-turbosnap: - specifier: 1.0.3 - version: 1.0.3 packages: @@ -6084,9 +6081,6 @@ packages: vue-tsc: optional: true - vite-plugin-turbosnap@1.0.3: - resolution: {integrity: sha512-p4D8CFVhZS412SyQX125qxyzOgIFouwOcvjZWk6bQbNPR1wtaEzFT6jZxAjf1dejlGqa6fqHcuCvQea6EWUkUA==, tarball: https://registry.npmjs.org/vite-plugin-turbosnap/-/vite-plugin-turbosnap-1.0.3.tgz} - vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==, tarball: https://registry.npmjs.org/vite/-/vite-6.3.5.tgz} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -12766,8 +12760,6 @@ snapshots: optionator: 0.9.3 typescript: 5.6.3 - vite-plugin-turbosnap@1.0.3: {} - vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0): dependencies: esbuild: 0.25.3 From 362c78a705778feed2d48c3c6917062ee2302ad7 Mon Sep 17 00:00:00 2001 From: Brett Kolodny Date: Thu, 14 Aug 2025 15:35:42 -0400 Subject: [PATCH 164/260] fix: ensure deployment banner is always on the bottom (#19361) --- site/src/modules/dashboard/DashboardLayout.tsx | 4 ++-- .../dashboard/DeploymentBanner/DeploymentBannerView.tsx | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/site/src/modules/dashboard/DashboardLayout.tsx b/site/src/modules/dashboard/DashboardLayout.tsx index 2fdc04d21da9d..1bbf5347e085e 100644 --- a/site/src/modules/dashboard/DashboardLayout.tsx +++ b/site/src/modules/dashboard/DashboardLayout.tsx @@ -23,10 +23,10 @@ export const DashboardLayout: FC = () => { {canViewDeployment && } -
    +
    -
    +
    }> diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx index e6e4c8e32be84..60681db06102a 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx @@ -105,6 +105,7 @@ export const DeploymentBannerView: FC = ({ return (
    Date: Thu, 14 Aug 2025 14:13:10 -0600 Subject: [PATCH 165/260] fix: fix storybook when using coder desktop (#19364) --- site/.storybook/main.js | 18 ------------------ site/.storybook/main.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 18 deletions(-) delete mode 100644 site/.storybook/main.js create mode 100644 site/.storybook/main.ts diff --git a/site/.storybook/main.js b/site/.storybook/main.js deleted file mode 100644 index 71e7508836057..0000000000000 --- a/site/.storybook/main.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - stories: ["../src/**/*.stories.tsx"], - - addons: [ - "@chromatic-com/storybook", - "@storybook/addon-docs", - "@storybook/addon-links", - "@storybook/addon-themes", - "storybook-addon-remix-react-router", - ], - - staticDirs: ["../static"], - - framework: { - name: "@storybook/react-vite", - options: {}, - }, -}; diff --git a/site/.storybook/main.ts b/site/.storybook/main.ts new file mode 100644 index 0000000000000..00d97a245891c --- /dev/null +++ b/site/.storybook/main.ts @@ -0,0 +1,29 @@ +export default { + stories: ["../src/**/*.stories.tsx"], + + addons: [ + "@chromatic-com/storybook", + "@storybook/addon-docs", + "@storybook/addon-links", + "@storybook/addon-themes", + "storybook-addon-remix-react-router", + ], + + staticDirs: ["../static"], + + framework: { + name: "@storybook/react-vite", + options: {}, + }, + + async viteFinal(config) { + // Storybook seems to strip this setting out of our Vite config. We need to + // put it back in order to be able to access Storybook with Coder Desktop or + // port sharing. + config.server = { + ...config.server, + allowedHosts: [".coder", ".dev.coder.com"], + }; + return config; + }, +} satisfies import("@storybook/react-vite").StorybookConfig; From accdcb8b770462204c36f64c0469282ce07f4c21 Mon Sep 17 00:00:00 2001 From: Bruno Quaresma Date: Thu, 14 Aug 2025 18:25:15 -0300 Subject: [PATCH 166/260] chore: upgrade biome to v2 (#19362) Guide for migration: https://biomejs.dev/guides/upgrade-to-biome-v2/ --- .github/workflows/typos.toml | 3 +- .vscode/settings.json | 6 +- site/.storybook/preview.jsx | 2 +- site/biome.jsonc | 58 +++++-- site/e2e/api.ts | 5 +- site/e2e/expectUrl.ts | 2 +- site/e2e/helpers.ts | 4 +- site/e2e/playwright.config.ts | 2 +- site/e2e/tests/app.spec.ts | 2 +- site/e2e/tests/auditLogs.spec.ts | 2 +- .../tests/deployment/workspaceProxies.spec.ts | 5 +- site/e2e/tests/externalAuth.spec.ts | 12 +- .../tests/organizations/idpGroupSync.spec.ts | 3 +- .../tests/organizations/idpRoleSync.spec.ts | 3 +- site/e2e/tests/roles.spec.ts | 2 +- .../users/createUserWithPassword.spec.ts | 3 +- site/e2e/tests/webTerminal.spec.ts | 2 +- .../workspaces/autoCreateWorkspace.spec.ts | 2 +- .../tests/workspaces/createWorkspace.spec.ts | 2 +- .../tests/workspaces/restartWorkspace.spec.ts | 2 +- .../tests/workspaces/startWorkspace.spec.ts | 2 +- .../tests/workspaces/updateWorkspace.spec.ts | 2 +- site/jest.setup.ts | 2 +- site/package.json | 12 +- site/pnpm-lock.yaml | 82 ++++----- site/src/@types/mui.d.ts | 2 +- site/src/App.tsx | 2 +- site/src/api/api.test.ts | 2 +- site/src/api/api.ts | 4 +- site/src/api/queries/templates.ts | 2 +- site/src/api/queries/users.ts | 2 +- .../ActiveUserChart/ActiveUserChart.tsx | 2 +- site/src/components/Alert/Alert.tsx | 2 +- .../components/Alert/ErrorAlert.stories.tsx | 2 +- site/src/components/Avatar/Avatar.tsx | 2 +- site/src/components/Badge/Badge.tsx | 2 +- site/src/components/Badges/Badges.tsx | 2 +- .../Breadcrumb/Breadcrumb.stories.tsx | 2 +- site/src/components/Breadcrumb/Breadcrumb.tsx | 2 +- site/src/components/Button/Button.tsx | 2 +- site/src/components/Chart/Chart.tsx | 2 +- .../CollapsibleSummary/CollapsibleSummary.tsx | 2 +- site/src/components/Combobox/Combobox.tsx | 3 +- site/src/components/Command/Command.tsx | 4 +- site/src/components/Dialog/Dialog.tsx | 6 +- .../ConfirmDialog/ConfirmDialog.test.tsx | 2 +- .../DeleteDialog/DeleteDialog.test.tsx | 2 +- .../DropdownArrow/DropdownArrow.stories.tsx | 2 +- .../components/DropdownMenu/DropdownMenu.tsx | 10 +- .../DurationField/DurationField.tsx | 2 +- .../ExternalImage/ExternalImage.tsx | 2 +- .../components/FileUpload/FileUpload.test.tsx | 2 +- site/src/components/FileUpload/FileUpload.tsx | 2 +- site/src/components/Filter/Filter.tsx | 3 +- .../Filter/SelectFilter.stories.tsx | 2 +- site/src/components/Form/Form.tsx | 4 +- site/src/components/FullPageLayout/Topbar.tsx | 4 +- .../GlobalSnackbar/GlobalSnackbar.tsx | 6 +- .../components/GlobalSnackbar/utils.test.ts | 6 +- site/src/components/GlobalSnackbar/utils.ts | 5 +- .../components/HelpTooltip/HelpTooltip.tsx | 9 +- site/src/components/IconField/IconField.tsx | 8 +- .../components/InfoTooltip/InfoTooltip.tsx | 2 +- site/src/components/Label/Label.tsx | 2 +- site/src/components/LastSeen/LastSeen.tsx | 2 +- site/src/components/Latency/Latency.tsx | 18 +- site/src/components/Link/Link.tsx | 2 +- site/src/components/Logs/LogLine.stories.tsx | 2 +- site/src/components/Logs/Logs.stories.tsx | 2 +- site/src/components/Markdown/Markdown.tsx | 4 +- .../MultiSelectCombobox.stories.tsx | 2 +- .../MultiSelectCombobox.tsx | 2 +- .../OrganizationAutocomplete.stories.tsx | 6 +- .../PageHeader/FullWidthPageHeader.tsx | 2 +- .../PaginationWidgetBase.test.tsx | 2 +- site/src/components/Pill/Pill.tsx | 2 +- .../RichParameterInput.stories.tsx | 2 +- .../RichParameterInput/RichParameterInput.tsx | 3 +- site/src/components/Search/Search.tsx | 2 +- .../components/SearchField/SearchField.tsx | 9 +- .../SelectMenu/SelectMenu.stories.tsx | 2 +- site/src/components/SelectMenu/SelectMenu.tsx | 12 +- .../SettingsHeader/SettingsHeader.tsx | 2 +- site/src/components/Spinner/Spinner.tsx | 2 +- .../StatusIndicator/StatusIndicator.tsx | 4 +- site/src/components/Table/Table.tsx | 6 +- .../components/TableLoader/TableLoader.tsx | 2 +- site/src/components/Tabs/Tabs.tsx | 2 +- .../MemberAutocomplete.stories.tsx | 2 +- .../UserAutocomplete.stories.tsx | 2 +- .../components/deprecated/Popover/Popover.tsx | 6 +- site/src/contexts/ProxyContext.test.tsx | 10 +- site/src/contexts/ProxyContext.tsx | 2 +- site/src/contexts/ThemeProvider.tsx | 8 +- site/src/contexts/auth/AuthProvider.test.tsx | 2 +- site/src/contexts/auth/AuthProvider.tsx | 2 +- site/src/contexts/auth/RequireAuth.test.tsx | 10 +- site/src/contexts/useProxyLatency.ts | 4 +- site/src/hooks/useEmbeddedMetadata.test.ts | 6 +- site/src/hooks/usePaginatedQuery.test.ts | 2 +- site/src/hooks/usePaginatedQuery.ts | 2 +- site/src/hooks/useSearchParamsKey.test.ts | 2 +- site/src/index.css | 8 +- site/src/modules/apps/apps.test.ts | 2 +- .../BuildAvatar/BuildAvatar.stories.tsx | 2 +- .../AnnouncementBannerView.tsx | 2 +- .../dashboard/DashboardLayout.test.tsx | 4 +- .../modules/dashboard/DashboardProvider.tsx | 2 +- .../DeploymentBannerView.stories.tsx | 2 +- .../DeploymentBanner/DeploymentBannerView.tsx | 21 ++- .../LicenseBannerView.stories.tsx | 2 +- .../LicenseBanner/LicenseBannerView.tsx | 2 +- .../dashboard/Navbar/DeploymentDropdown.tsx | 2 +- .../dashboard/Navbar/MobileMenu.stories.tsx | 8 +- .../modules/dashboard/Navbar/Navbar.test.tsx | 6 +- .../dashboard/Navbar/NavbarView.stories.tsx | 4 +- .../dashboard/Navbar/NavbarView.test.tsx | 4 +- .../dashboard/Navbar/ProxyMenu.stories.tsx | 12 +- .../UserDropdown/UserDropdown.stories.tsx | 4 +- .../UserDropdown/UserDropdownContent.test.tsx | 4 +- .../UserDropdown/UserDropdownContent.tsx | 19 ++- .../modules/dashboard/useUpdateCheck.test.tsx | 6 +- .../modules/hooks/useSyncFormParameters.ts | 3 +- .../management/DeploymentConfigProvider.tsx | 2 +- .../DeploymentSidebarView.stories.tsx | 2 +- .../management/OrganizationSettingsLayout.tsx | 4 +- .../OrganizationSidebarView.stories.tsx | 6 +- .../management/OrganizationSidebarView.tsx | 104 ++++++------ site/src/modules/navigation.ts | 2 +- .../NotificationsInbox/InboxAvatar.tsx | 2 +- .../NotificationsInbox/InboxItem.stories.tsx | 2 +- .../InboxPopover.stories.tsx | 2 +- .../NotificationsInbox.stories.tsx | 4 +- site/src/modules/notifications/utils.tsx | 3 +- site/src/modules/provisioners/Provisioner.tsx | 3 +- .../provisioners/ProvisionerAlert.stories.tsx | 2 +- .../modules/provisioners/ProvisionerAlert.tsx | 3 +- .../ProvisionerStatusAlert.stories.tsx | 2 +- .../modules/resources/AgentApps/AgentApps.tsx | 17 +- .../AgentDevcontainerCard.stories.tsx | 4 +- .../resources/AgentDevcontainerCard.tsx | 42 +++-- site/src/modules/resources/AgentLatency.tsx | 2 +- site/src/modules/resources/AgentMetadata.tsx | 2 +- .../resources/AgentOutdatedTooltip.tsx | 2 +- .../modules/resources/AgentRow.stories.tsx | 8 +- site/src/modules/resources/AgentRow.tsx | 4 +- .../resources/AgentRowPreview.stories.tsx | 2 +- .../resources/AgentRowPreview.test.tsx | 4 +- .../src/modules/resources/AgentRowPreview.tsx | 6 +- site/src/modules/resources/AgentStatus.tsx | 2 +- .../resources/AppLink/AppLink.stories.tsx | 4 +- .../DownloadAgentLogsButton.stories.tsx | 3 +- .../resources/DownloadAgentLogsButton.tsx | 2 - .../resources/PortForwardButton.stories.tsx | 4 +- .../modules/resources/PortForwardButton.tsx | 10 +- .../PortForwardPopoverView.stories.tsx | 4 +- .../resources/PortForwardPopoverView.test.tsx | 4 +- .../resources/ResourceAvatar.stories.tsx | 2 +- .../resources/ResourceCard.stories.tsx | 2 +- .../modules/resources/ResourceCard.test.tsx | 4 +- .../modules/resources/Resources.stories.tsx | 2 +- .../resources/SSHButton/SSHButton.stories.tsx | 6 +- .../modules/resources/SSHButton/SSHButton.tsx | 10 +- site/src/modules/resources/SensitiveValue.tsx | 2 +- .../TerminalLink/TerminalLink.stories.tsx | 2 +- .../VSCodeDesktopButton.stories.tsx | 2 +- .../VSCodeDevContainerButton.stories.tsx | 2 +- .../resources/useAgentContainers.test.tsx | 14 +- .../modules/resources/useAgentLogs.test.ts | 2 +- site/src/modules/tableFiltering/options.tsx | 8 +- .../TemplateExampleCard.stories.tsx | 2 +- .../TemplateFileTree.stories.tsx | 2 +- .../TemplateFiles/TemplateFiles.stories.tsx | 2 +- .../TemplateResourcesTable.stories.tsx | 2 +- .../DynamicParameter.stories.tsx | 2 +- .../DynamicParameter.test.tsx | 2 +- .../WorkspaceAppStatus.stories.tsx | 2 +- .../WorkspaceBuildData.stories.tsx | 2 +- .../WorkspaceBuildLogs.stories.tsx | 2 +- .../WorkspaceBuildLogs/WorkspaceBuildLogs.tsx | 2 +- .../WorkspaceDormantBadge.stories.tsx | 2 +- .../ChangeWorkspaceVersionDialog.stories.tsx | 4 +- .../DownloadLogsDialog.stories.tsx | 4 +- .../WorkspaceDeleteDialog.stories.tsx | 2 +- .../WorkspaceMoreActions.tsx | 5 +- .../useWorkspaceDuplication.test.tsx | 4 +- .../WorkspaceOutdatedTooltip.stories.tsx | 4 +- .../WorkspaceOutdatedTooltip.tsx | 7 +- .../WorkspaceStatusIndicator.stories.tsx | 2 +- .../WorkspaceStatusIndicator.tsx | 2 +- .../workspaces/WorkspaceTiming/Chart/Bar.tsx | 2 +- .../WorkspaceTiming/Chart/XAxis.tsx | 2 +- .../workspaces/WorkspaceTiming/Chart/utils.ts | 2 +- .../WorkspaceTiming/ResourcesChart.tsx | 16 +- .../WorkspaceTiming/ScriptsChart.tsx | 16 +- .../WorkspaceTiming/StagesChart.tsx | 19 +-- .../WorkspaceTimings.stories.tsx | 4 +- .../WorkspaceTiming/WorkspaceTimings.tsx | 10 +- .../workspaces/generateWorkspaceName.ts | 2 +- site/src/pages/AuditPage/AuditFilter.tsx | 8 +- .../AuditLogDescription.stories.tsx | 2 +- .../AuditLogRow/AuditLogRow.stories.tsx | 14 +- .../AuditPage/AuditLogRow/AuditLogRow.tsx | 3 +- site/src/pages/AuditPage/AuditPage.test.tsx | 12 +- .../pages/AuditPage/AuditPageView.stories.tsx | 16 +- .../ConnectionLogPage/ConnectionLogFilter.tsx | 8 +- .../ConnectionLogPage.test.tsx | 10 +- .../ConnectionLogPageView.stories.tsx | 14 +- .../ConnectionLogDescription.stories.tsx | 2 +- .../ConnectionLogRow.stories.tsx | 6 +- .../ConnectionLogRow/ConnectionLogRow.tsx | 3 +- .../CreateTemplateGalleryPage.test.tsx | 8 +- .../CreateTemplateGalleryPageView.stories.tsx | 2 +- .../BuildLogsDrawer.stories.tsx | 4 +- .../CreateTemplateForm.stories.tsx | 14 +- .../CreateTemplatePage/CreateTemplateForm.tsx | 2 +- .../CreateTemplatePage.test.tsx | 6 +- .../CreateTemplatePage/CreateTemplatePage.tsx | 2 +- .../pages/CreateTokenPage/CreateTokenForm.tsx | 2 +- .../CreateTokenPage/CreateTokenPage.test.tsx | 6 +- site/src/pages/CreateTokenPage/utils.test.tsx | 4 +- .../CreateUserPage/CreateUserForm.stories.tsx | 10 +- .../CreateUserPage/CreateUserPage.test.tsx | 4 +- .../pages/CreateUserPage/CreateUserPage.tsx | 2 +- .../CreateWorkspacePage.test.tsx | 6 +- .../CreateWorkspacePageExperimental.test.tsx | 8 +- .../CreateWorkspacePageView.stories.tsx | 15 +- ...eWorkspacePageViewExperimental.stories.tsx | 4 +- .../CreateWorkspacePageViewExperimental.tsx | 58 ++++--- .../SelectedTemplate.stories.tsx | 2 +- .../AppearanceSettingsPageView.tsx | 10 +- .../ExportPolicyButton.stories.tsx | 2 +- .../IdpOrgSyncPage/IdpOrgSyncPage.tsx | 3 +- .../IdpOrgSyncPageView.stories.tsx | 4 +- .../IdpOrgSyncPage/OrganizationPills.tsx | 2 +- .../LicensesSettingsPage/LicenseCard.test.tsx | 2 +- .../LicenseSeatConsumptionChart.tsx | 19 ++- .../ManagedAgentsConsumption.tsx | 22 ++- .../NotificationEvents.stories.tsx | 2 +- .../NotificationsPage/NotificationEvents.tsx | 2 +- .../NotificationsPage.stories.tsx | 8 +- .../Troubleshooting.stories.tsx | 2 +- .../NotificationsPage/storybookUtils.ts | 12 +- .../CreateOAuth2AppPageView.stories.tsx | 2 +- .../EditOAuth2AppPageView.stories.tsx | 2 +- .../EditOAuth2AppPageView.tsx | 3 +- .../OAuth2AppsSettingsPageView.stories.tsx | 2 +- .../OAuth2AppsSettingsPageView.tsx | 2 +- .../ObservabilitySettingsPageView.tsx | 122 +++++++------- .../pages/DeploymentSettingsPage/Option.tsx | 2 +- .../OverviewPage/OverviewPageView.stories.tsx | 2 +- .../OverviewPage/UserEngagementChart.tsx | 2 +- .../UserAuthSettingsPageView.tsx | 106 ++++++------ .../ExternalAuthPage/ExternalAuthPageView.tsx | 3 +- .../CreateGroupPageView.stories.tsx | 2 +- .../pages/GroupsPage/GroupPage.stories.tsx | 12 +- site/src/pages/GroupsPage/GroupPage.tsx | 9 +- .../GroupSettingsPageView.stories.tsx | 2 +- .../pages/GroupsPage/GroupsPageProvider.tsx | 2 +- .../GroupsPage/GroupsPageView.stories.tsx | 2 +- site/src/pages/GroupsPage/GroupsPageView.tsx | 114 +++++++------ .../HealthPage/AccessURLPage.stories.tsx | 2 +- site/src/pages/HealthPage/Content.tsx | 11 +- site/src/pages/HealthPage/DERPPage.tsx | 2 +- .../HealthPage/DERPRegionPage.stories.tsx | 2 +- site/src/pages/HealthPage/DERPRegionPage.tsx | 2 +- .../HealthPage/WebsocketPage.stories.tsx | 4 +- .../HealthPage/WorkspaceProxyPage.stories.tsx | 4 +- site/src/pages/HealthPage/storybook.tsx | 14 +- .../src/pages/IconsPage/IconsPage.stories.tsx | 2 +- .../LoginOAuthDevicePage.tsx | 6 +- site/src/pages/LoginPage/LoginPage.test.tsx | 8 +- .../pages/LoginPage/LoginPageView.stories.tsx | 2 +- .../pages/LoginPage/SignInForm.stories.tsx | 2 +- .../CreateOrganizationPageView.stories.tsx | 2 +- .../CreateOrganizationPageView.tsx | 11 +- .../CreateEditRolePageView.stories.tsx | 6 +- .../CustomRolesPageView.stories.tsx | 2 +- .../PermissionPillsList.stories.tsx | 2 +- .../CustomRolesPage/PermissionPillsList.tsx | 2 +- .../ExportPolicyButton.stories.tsx | 4 +- .../IdpSyncPage/IdpPillList.tsx | 2 +- .../IdpSyncPage/IdpSyncPage.tsx | 17 +- .../IdpSyncPage/IdpSyncPageView.stories.tsx | 4 +- .../OrganizationMembersPage.test.tsx | 8 +- .../OrganizationMembersPageView.stories.tsx | 6 +- .../OrganizationMembersPageView.tsx | 3 +- .../CancelJobButton.stories.tsx | 2 +- .../CancelJobConfirmationDialog.stories.tsx | 4 +- .../JobRow.stories.tsx | 2 +- ...izationProvisionerJobsPageView.stories.tsx | 2 +- ...izationProvisionerKeysPageView.stories.tsx | 10 +- ...ganizationProvisionersPageView.stories.tsx | 2 +- .../ProvisionerRow.stories.tsx | 2 +- .../ProvisionerVersion.stories.tsx | 2 +- .../OrganizationRedirect.test.tsx | 4 +- .../OrganizationSettingsPage.tsx | 3 +- .../OrganizationSettingsPageView.stories.tsx | 2 +- .../UserTable/EditRolesButton.stories.tsx | 4 +- .../UserTable/EditRolesButton.tsx | 51 +++--- .../UserTable/UserRoleCell.tsx | 4 +- .../ChangePasswordPage.stories.tsx | 4 +- .../RequestOTPPage.stories.tsx | 4 +- site/src/pages/SetupPage/SetupPage.test.tsx | 10 +- .../pages/SetupPage/SetupPageView.stories.tsx | 2 +- .../StarterTemplatePageView.stories.tsx | 2 +- site/src/pages/TaskPage/TaskApps.stories.tsx | 4 +- site/src/pages/TaskPage/TaskApps.tsx | 48 +++--- site/src/pages/TaskPage/TaskPage.stories.tsx | 18 +- site/src/pages/TaskPage/TaskPage.tsx | 5 +- site/src/pages/TaskPage/TaskStatusLink.tsx | 2 +- .../src/pages/TasksPage/TasksPage.stories.tsx | 10 +- site/src/pages/TasksPage/TasksPage.tsx | 9 +- site/src/pages/TasksPage/UsersCombobox.tsx | 2 +- .../TemplateEmbedPage.test.tsx | 8 +- .../TemplateEmbedPageExperimental.tsx | 158 +++++++++--------- .../TemplateEmbedPageView.stories.tsx | 2 +- .../TemplateFilesPage.test.tsx | 8 +- .../TemplateInsightsPage/DateRange.tsx | 2 +- .../TemplateInsightsPage/IntervalMenu.tsx | 3 +- .../TemplateInsightsPage.stories.tsx | 2 +- .../TemplateInsightsPage.tsx | 2 +- .../TemplateInsightsPage/WeekPicker.tsx | 3 +- .../src/pages/TemplatePage/TemplateLayout.tsx | 2 +- .../TemplatePageHeader.stories.tsx | 2 +- .../pages/TemplatePage/TemplatePageHeader.tsx | 3 +- .../TemplateRedirectController.test.tsx | 4 +- .../TemplateResourcesPageView.stories.tsx | 2 +- .../TemplatePage/TemplateStats.stories.tsx | 2 +- .../VersionsTable.stories.tsx | 4 +- .../useDeletionDialogState.test.ts | 2 +- .../pages/TemplateSettingsPage/Sidebar.tsx | 10 +- .../TemplateSettingsPage.test.tsx | 10 +- .../TemplateSettingsPageView.stories.tsx | 2 +- .../TemplatePermissionsPageView.stories.tsx | 2 +- .../TemplatePermissionsPageView.tsx | 3 +- .../TemplateSchedulePage/ScheduleDialog.tsx | 123 +++++++------- .../TemplateScheduleAutostart.tsx | 2 +- .../TemplateScheduleForm.tsx | 12 +- .../TemplateSchedulePage.test.tsx | 10 +- .../TemplateSchedulePageView.stories.tsx | 2 +- .../TemplateSettingsLayout.tsx | 2 +- .../TemplateVariablesForm.tsx | 2 +- .../TemplateVariablesPage.test.tsx | 6 +- .../TemplateVariablesPageView.stories.tsx | 4 +- .../ProvisionerTagsPopover.stories.tsx | 4 +- .../ProvisionerTagsPopover.tsx | 4 +- .../TemplateVersionEditor.stories.tsx | 4 +- .../TemplateVersionEditor.tsx | 21 ++- .../TemplateVersionEditorPage.test.tsx | 20 +-- .../TemplateVersionEditorPage.tsx | 2 +- .../TemplateVersionStatusBadge.tsx | 3 +- .../TemplateVersionPage.test.tsx | 2 +- .../TemplateVersionPageView.stories.tsx | 2 +- .../pages/TemplatesPage/TemplatesFilter.tsx | 2 +- .../TemplatesPageView.stories.tsx | 4 +- .../TerminalPage/TerminalPage.stories.tsx | 22 +-- .../pages/TerminalPage/TerminalPage.test.tsx | 10 +- .../AccountPage/AccountForm.stories.tsx | 2 +- .../AccountPage/AccountForm.test.tsx | 4 +- .../AccountPage/AccountPage.test.tsx | 4 +- .../AccountPage/AccountUserGroups.stories.tsx | 2 +- .../AppearancePage/AppearancePage.test.tsx | 4 +- .../AppearancePage/AppearancePage.tsx | 26 +-- .../ExternalAuthPageView.stories.tsx | 2 +- .../ExternalAuthPage/ExternalAuthPageView.tsx | 72 ++++---- .../NotificationsPage.stories.tsx | 18 +- .../NotificationsPage/NotificationsPage.tsx | 3 +- .../OAuth2ProviderPageView.stories.tsx | 2 +- .../SSHKeysPage/SSHKeysPage.test.tsx | 4 +- .../SSHKeysPage/SSHKeysPageView.stories.tsx | 2 +- .../SchedulePage/ScheduleForm.stories.tsx | 2 +- .../SchedulePage/SchedulePage.test.tsx | 8 +- .../SecurityPage/SecurityForm.stories.tsx | 2 +- .../SecurityPage/SecurityForm.tsx | 64 ++++--- .../SecurityPage/SecurityPage.test.tsx | 8 +- .../SecurityPage/SecurityPageView.stories.tsx | 8 +- .../ConfirmDeleteDialog.stories.tsx | 2 +- .../TokensPage/TokensPage.tsx | 4 +- .../TokensPage/TokensPageView.stories.tsx | 2 +- .../WorkspaceProxyPage/WorkspaceProxyRow.tsx | 3 +- .../WorkspaceProxyView.stories.tsx | 2 +- .../UsersPage/ResetPasswordDialog.stories.tsx | 2 +- site/src/pages/UsersPage/UsersFilter.tsx | 8 +- .../src/pages/UsersPage/UsersPage.stories.tsx | 12 +- .../pages/UsersPage/UsersPageView.stories.tsx | 16 +- .../UsersPage/UsersTable/UserGroupsCell.tsx | 4 +- .../UsersTable/UsersTable.stories.tsx | 2 +- .../UsersPage/UsersTable/UsersTableBody.tsx | 3 +- .../WorkspaceBuildPage.test.tsx | 6 +- .../WorkspaceBuildPageView.stories.tsx | 2 +- .../WorkspacePage/AppStatuses.stories.tsx | 8 +- site/src/pages/WorkspacePage/AppStatuses.tsx | 5 +- .../ResourceMetadata.stories.tsx | 2 +- .../pages/WorkspacePage/Workspace.stories.tsx | 6 +- site/src/pages/WorkspacePage/Workspace.tsx | 2 +- .../BuildParametersPopover.tsx | 12 +- .../WorkspaceActions/DebugButton.stories.tsx | 2 +- .../WorkspaceActions/RetryButton.stories.tsx | 2 +- .../WorkspaceActions.stories.tsx | 8 +- .../WorkspaceActions/WorkspaceActions.tsx | 2 +- .../WorkspaceBuildProgress.stories.tsx | 4 +- .../WorkspacePage/WorkspaceBuildProgress.tsx | 2 +- .../WorkspaceNotifications/Notifications.tsx | 2 +- .../WorkspaceNotifications.stories.tsx | 8 +- .../WorkspaceNotifications.tsx | 4 +- .../WorkspacePage/WorkspacePage.test.tsx | 24 +-- .../WorkspacePage/WorkspaceReadyPage.tsx | 9 +- .../WorkspaceScheduleControls.test.tsx | 8 +- .../WorkspaceScheduleControls.tsx | 2 +- .../WorkspacePage/WorkspaceTopbar.stories.tsx | 10 +- .../pages/WorkspacePage/WorkspaceTopbar.tsx | 6 +- .../WorkspacePage/useResourcesNav.test.tsx | 4 +- .../WorkspaceParametersPage.stories.tsx | 4 +- .../WorkspaceParametersPage.test.tsx | 6 +- .../WorkspaceScheduleForm.stories.tsx | 2 +- .../WorkspaceScheduleForm.test.tsx | 8 +- .../WorkspaceSchedulePage.stories.tsx | 14 +- .../WorkspaceSchedulePage.test.tsx | 16 +- .../WorkspaceSchedulePage.tsx | 2 +- .../WorkspaceSchedulePage/schedule.ts | 2 +- .../WorkspaceSettingsLayout.tsx | 2 +- .../WorkspaceSettingsPage.test.tsx | 6 +- .../WorkspaceSettingsPageView.stories.tsx | 2 +- .../BatchDeleteConfirmation.stories.tsx | 4 +- .../BatchUpdateConfirmation.stories.tsx | 8 +- .../BatchUpdateConfirmation.tsx | 22 +-- .../pages/WorkspacesPage/WorkspacesButton.tsx | 13 +- .../WorkspacesPage/WorkspacesPage.test.tsx | 10 +- .../pages/WorkspacesPage/WorkspacesPage.tsx | 4 +- .../WorkspacesPageView.stories.tsx | 30 ++-- .../WorkspacesPage/WorkspacesPageView.tsx | 13 +- .../pages/WorkspacesPage/WorkspacesTable.tsx | 10 +- .../src/pages/WorkspacesPage/filter/menus.tsx | 8 +- site/src/router.tsx | 6 +- site/src/serviceWorker.ts | 3 +- site/src/testHelpers/entities.ts | 24 +-- site/src/testHelpers/handlers.ts | 2 +- site/src/testHelpers/hooks.tsx | 10 +- site/src/testHelpers/renderHelpers.tsx | 6 +- site/src/testHelpers/storybook.tsx | 6 +- site/src/theme/dark/mui.ts | 2 +- site/src/theme/index.ts | 2 +- site/src/theme/light/mui.ts | 2 +- site/src/theme/mui.ts | 16 +- site/src/theme/roles.ts | 4 - site/src/utils/OneWayWebSocket.test.ts | 2 +- site/src/utils/dormant.test.ts | 2 +- site/src/utils/filetree.test.ts | 2 +- site/src/utils/formUtils.test.ts | 2 +- site/src/utils/portForward.ts | 4 +- site/src/utils/schedule.test.ts | 2 +- site/src/utils/workspace.test.ts | 2 +- site/src/utils/workspace.tsx | 8 +- site/vite.config.mts | 4 +- 455 files changed, 1687 insertions(+), 1703 deletions(-) diff --git a/.github/workflows/typos.toml b/.github/workflows/typos.toml index 6a9b07b475111..6f475668118c9 100644 --- a/.github/workflows/typos.toml +++ b/.github/workflows/typos.toml @@ -28,6 +28,7 @@ HELO = "HELO" LKE = "LKE" byt = "byt" typ = "typ" +Inferrable = "Inferrable" [files] extend-exclude = [ @@ -47,5 +48,5 @@ extend-exclude = [ "provisioner/terraform/testdata/**", # notifications' golden files confuse the detector because of quoted-printable encoding "coderd/notifications/testdata/**", - "agent/agentcontainers/testdata/devcontainercli/**" + "agent/agentcontainers/testdata/devcontainercli/**", ] diff --git a/.vscode/settings.json b/.vscode/settings.json index f2cf72b7d8ae0..eaea72e7501b5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -49,7 +49,7 @@ "[javascript][javascriptreact][json][jsonc][typescript][typescriptreact]": { "editor.defaultFormatter": "biomejs.biome", "editor.codeActionsOnSave": { - "quickfix.biome": "explicit" + "source.fixAll.biome": "explicit" // "source.organizeImports.biome": "explicit" } }, @@ -60,5 +60,7 @@ "typos.config": ".github/workflows/typos.toml", "[markdown]": { "editor.defaultFormatter": "DavidAnson.vscode-markdownlint" - } + }, + "biome.configurationPath": "./site/biome.jsonc", + "biome.lsp.bin": "./site/node_modules/.bin/biome" } diff --git a/site/.storybook/preview.jsx b/site/.storybook/preview.jsx index c491428178f37..8a33560a2f18b 100644 --- a/site/.storybook/preview.jsx +++ b/site/.storybook/preview.jsx @@ -22,7 +22,7 @@ import CssBaseline from "@mui/material/CssBaseline"; import { ThemeProvider as MuiThemeProvider, StyledEngineProvider, - // biome-ignore lint/nursery/noRestrictedImports: we extend the MUI theme + // biome-ignore lint/style/noRestrictedImports: we extend the MUI theme } from "@mui/material/styles"; import { DecoratorHelpers } from "@storybook/addon-themes"; import isChromatic from "chromatic/isChromatic"; diff --git a/site/biome.jsonc b/site/biome.jsonc index bc6fa8de6e946..9bb011fba8b2d 100644 --- a/site/biome.jsonc +++ b/site/biome.jsonc @@ -1,36 +1,44 @@ { "vcs": { "enabled": true, - "useIgnoreFile": true, "clientKind": "git", "root": ".." }, "files": { - "ignore": ["e2e/**/*Generated.ts", "pnpm-lock.yaml"], + "includes": ["**", "!**/e2e/**/*Generated.ts", "!**/pnpm-lock.yaml"], "ignoreUnknown": true }, "linter": { "rules": { "a11y": { - "noSvgWithoutTitle": { "level": "off" }, - "useButtonType": { "level": "off" }, - "useSemanticElements": { "level": "off" } + "noSvgWithoutTitle": "off", + "useButtonType": "off", + "useSemanticElements": "off", + "noStaticElementInteractions": "off" }, "correctness": { - "noUnusedImports": "warn" + "noUnusedImports": "warn", + "useUniqueElementIds": "off", // TODO: This is new but we want to fix it + "noNestedComponentDefinitions": "off", // TODO: Investigate, since it is used by shadcn components + "noUnusedVariables": { + "level": "warn", + "options": { + "ignoreRestSiblings": true + } + } }, "style": { - "noNonNullAssertion": { "level": "off" }, - "noParameterAssign": { "level": "off" }, - "useDefaultParameterLast": { "level": "off" }, - "useSelfClosingElements": { "level": "off" } - }, - "suspicious": { - "noArrayIndexKey": { "level": "off" }, - "noConsoleLog": { "level": "error" }, - "noThenProperty": { "level": "off" } - }, - "nursery": { + "noNonNullAssertion": "off", + "noParameterAssign": "off", + "useDefaultParameterLast": "off", + "useSelfClosingElements": "off", + "useAsConstAssertion": "error", + "useEnumInitializers": "error", + "useSingleVarDeclarator": "error", + "noUnusedTemplateLiteral": "error", + "useNumberNamespace": "error", + "noInferrableTypes": "error", + "noUselessElse": "error", "noRestrictedImports": { "level": "error", "options": { @@ -47,8 +55,22 @@ } } } + }, + "suspicious": { + "noArrayIndexKey": "off", + "noThenProperty": "off", + "noTemplateCurlyInString": "off", + "useIterableCallbackReturn": "off", + "noUnknownAtRules": "off", // Allow Tailwind directives + "noConsole": { + "level": "error", + "options": { "allow": ["error", "info", "warn"] } + } + }, + "complexity": { + "noImportantStyles": "off" // TODO: check and fix !important styles } } }, - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json" + "$schema": "https://biomejs.dev/schemas/2.2.0/schema.json" } diff --git a/site/e2e/api.ts b/site/e2e/api.ts index 4d884a73cc1ac..342b08cb28914 100644 --- a/site/e2e/api.ts +++ b/site/e2e/api.ts @@ -8,9 +8,10 @@ import relativeTime from "dayjs/plugin/relativeTime"; dayjs.extend(duration); dayjs.extend(relativeTime); + import { humanDuration } from "utils/time"; import { coderPort, defaultPassword } from "./constants"; -import { type LoginOptions, findSessionToken, randomName } from "./helpers"; +import { findSessionToken, type LoginOptions, randomName } from "./helpers"; let currentOrgId: string; @@ -57,7 +58,7 @@ export const createOrganizationMember = async ({ password = defaultPassword, orgRoles, }: CreateOrganizationMemberOptions): Promise => { - const name = randomName(); + const _name = randomName(); const user = await API.createUser({ email, username, diff --git a/site/e2e/expectUrl.ts b/site/e2e/expectUrl.ts index 6ea1cb50b3083..f6bc3b9ef51dd 100644 --- a/site/e2e/expectUrl.ts +++ b/site/e2e/expectUrl.ts @@ -1,4 +1,4 @@ -import { type Page, expect } from "@playwright/test"; +import { expect, type Page } from "@playwright/test"; type PollingOptions = { timeout?: number; intervals?: number[] }; diff --git a/site/e2e/helpers.ts b/site/e2e/helpers.ts index e771adeab3813..bd4aed8add812 100644 --- a/site/e2e/helpers.ts +++ b/site/e2e/helpers.ts @@ -3,7 +3,7 @@ import { randomUUID } from "node:crypto"; import net from "node:net"; import path from "node:path"; import { Duplex } from "node:stream"; -import { type BrowserContext, type Page, expect, test } from "@playwright/test"; +import { type BrowserContext, expect, type Page, test } from "@playwright/test"; import { API } from "api/api"; import type { UpdateTemplateMeta, @@ -29,8 +29,8 @@ import { expectUrl } from "./expectUrl"; import { Agent, type App, - AppSharingLevel, type ApplyComplete, + AppSharingLevel, type ExternalAuthProviderResource, type ParseComplete, type PlanComplete, diff --git a/site/e2e/playwright.config.ts b/site/e2e/playwright.config.ts index 4b3e5c5c86fc6..fffc80b160191 100644 --- a/site/e2e/playwright.config.ts +++ b/site/e2e/playwright.config.ts @@ -1,8 +1,8 @@ import * as path from "node:path"; import { defineConfig } from "@playwright/test"; import { - coderPort, coderdPProfPort, + coderPort, e2eFakeExperiment1, e2eFakeExperiment2, gitAuth, diff --git a/site/e2e/tests/app.spec.ts b/site/e2e/tests/app.spec.ts index 587775b4dc3f8..3cb58fcc66c34 100644 --- a/site/e2e/tests/app.spec.ts +++ b/site/e2e/tests/app.spec.ts @@ -21,7 +21,7 @@ test("app", async ({ context, page }) => { const appContent = "Hello World"; const token = randomUUID(); const srv = http - .createServer((req, res) => { + .createServer((_req, res) => { res.writeHead(200, { "Content-Type": "text/plain" }); res.end(appContent); }) diff --git a/site/e2e/tests/auditLogs.spec.ts b/site/e2e/tests/auditLogs.spec.ts index c25a828eedb64..56a27f94ad3c2 100644 --- a/site/e2e/tests/auditLogs.spec.ts +++ b/site/e2e/tests/auditLogs.spec.ts @@ -1,4 +1,4 @@ -import { type Page, expect, test } from "@playwright/test"; +import { expect, type Page, test } from "@playwright/test"; import { defaultPassword, users } from "../constants"; import { createTemplate, diff --git a/site/e2e/tests/deployment/workspaceProxies.spec.ts b/site/e2e/tests/deployment/workspaceProxies.spec.ts index 51fb036c4639b..94604de293d73 100644 --- a/site/e2e/tests/deployment/workspaceProxies.spec.ts +++ b/site/e2e/tests/deployment/workspaceProxies.spec.ts @@ -1,9 +1,8 @@ -import { type Page, expect, test } from "@playwright/test"; +import { expect, type Page, test } from "@playwright/test"; import { API } from "api/api"; import { setupApiCalls } from "../../api"; import { coderPort, workspaceProxyPort } from "../../constants"; -import { randomName, requiresLicense } from "../../helpers"; -import { login } from "../../helpers"; +import { login, randomName, requiresLicense } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; import { startWorkspaceProxy, stopWorkspaceProxy } from "../../proxy"; diff --git a/site/e2e/tests/externalAuth.spec.ts b/site/e2e/tests/externalAuth.spec.ts index ced2a7d89c95b..712fc8f1ef9c9 100644 --- a/site/e2e/tests/externalAuth.spec.ts +++ b/site/e2e/tests/externalAuth.spec.ts @@ -17,11 +17,11 @@ test.describe.skip("externalAuth", () => { const srv = await createServer(gitAuth.webPort); // The GitHub validate endpoint returns the currently authenticated user! - srv.use(gitAuth.validatePath, (req, res) => { + srv.use(gitAuth.validatePath, (_req, res) => { res.write(JSON.stringify(ghUser)); res.end(); }); - srv.use(gitAuth.tokenPath, (req, res) => { + srv.use(gitAuth.tokenPath, (_req, res) => { const r = (Math.random() + 1).toString(36).substring(7); res.write(JSON.stringify({ access_token: r })); res.end(); @@ -51,15 +51,15 @@ test.describe.skip("externalAuth", () => { // Start a server to mock the GitHub API. const srv = await createServer(gitAuth.devicePort); - srv.use(gitAuth.validatePath, (req, res) => { + srv.use(gitAuth.validatePath, (_req, res) => { res.write(JSON.stringify(ghUser)); res.end(); }); - srv.use(gitAuth.codePath, (req, res) => { + srv.use(gitAuth.codePath, (_req, res) => { res.write(JSON.stringify(device)); res.end(); }); - srv.use(gitAuth.installationsPath, (req, res) => { + srv.use(gitAuth.installationsPath, (_req, res) => { res.write(JSON.stringify(ghInstall)); res.end(); }); @@ -72,7 +72,7 @@ test.describe.skip("externalAuth", () => { // First we send a result from the API that the token hasn't been // authorized yet to ensure the UI reacts properly. const sentPending = new Awaiter(); - srv.use(gitAuth.tokenPath, (req, res) => { + srv.use(gitAuth.tokenPath, (_req, res) => { res.write(JSON.stringify(token)); res.end(); sentPending.done(); diff --git a/site/e2e/tests/organizations/idpGroupSync.spec.ts b/site/e2e/tests/organizations/idpGroupSync.spec.ts index a6128253346b7..c8fbf7fffa26e 100644 --- a/site/e2e/tests/organizations/idpGroupSync.spec.ts +++ b/site/e2e/tests/organizations/idpGroupSync.spec.ts @@ -5,8 +5,7 @@ import { deleteOrganization, setupApiCalls, } from "../../api"; -import { randomName, requiresLicense } from "../../helpers"; -import { login } from "../../helpers"; +import { login, randomName, requiresLicense } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; test.beforeEach(async ({ page }) => { diff --git a/site/e2e/tests/organizations/idpRoleSync.spec.ts b/site/e2e/tests/organizations/idpRoleSync.spec.ts index a889591026dd9..a7e7429e234ae 100644 --- a/site/e2e/tests/organizations/idpRoleSync.spec.ts +++ b/site/e2e/tests/organizations/idpRoleSync.spec.ts @@ -5,8 +5,7 @@ import { deleteOrganization, setupApiCalls, } from "../../api"; -import { randomName, requiresLicense } from "../../helpers"; -import { login } from "../../helpers"; +import { login, randomName, requiresLicense } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; test.beforeEach(async ({ page }) => { diff --git a/site/e2e/tests/roles.spec.ts b/site/e2e/tests/roles.spec.ts index e6b92bd944ba0..0bf80391c0035 100644 --- a/site/e2e/tests/roles.spec.ts +++ b/site/e2e/tests/roles.spec.ts @@ -1,4 +1,4 @@ -import { type Page, expect, test } from "@playwright/test"; +import { expect, type Page, test } from "@playwright/test"; import { createOrganization, createOrganizationMember, diff --git a/site/e2e/tests/users/createUserWithPassword.spec.ts b/site/e2e/tests/users/createUserWithPassword.spec.ts index ec6006a81dac5..b33aa67c896e0 100644 --- a/site/e2e/tests/users/createUserWithPassword.spec.ts +++ b/site/e2e/tests/users/createUserWithPassword.spec.ts @@ -1,6 +1,5 @@ import { test } from "@playwright/test"; -import { createUser } from "../../helpers"; -import { login } from "../../helpers"; +import { createUser, login } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; test.beforeEach(async ({ page }) => { diff --git a/site/e2e/tests/webTerminal.spec.ts b/site/e2e/tests/webTerminal.spec.ts index 9d502c0284b78..d03f78a8702b8 100644 --- a/site/e2e/tests/webTerminal.spec.ts +++ b/site/e2e/tests/webTerminal.spec.ts @@ -3,11 +3,11 @@ import { test } from "@playwright/test"; import { createTemplate, createWorkspace, + login, openTerminalWindow, startAgent, stopAgent, } from "../helpers"; -import { login } from "../helpers"; import { beforeCoderTest } from "../hooks"; test.beforeEach(async ({ page }) => { diff --git a/site/e2e/tests/workspaces/autoCreateWorkspace.spec.ts b/site/e2e/tests/workspaces/autoCreateWorkspace.spec.ts index a6ec00958ad78..74b3c07ca78df 100644 --- a/site/e2e/tests/workspaces/autoCreateWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/autoCreateWorkspace.spec.ts @@ -4,8 +4,8 @@ import { createTemplate, createWorkspace, echoResponsesWithParameters, + login, } from "../../helpers"; -import { login } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; import { emptyParameter } from "../../parameters"; import type { RichParameter } from "../../provisionerGenerated"; diff --git a/site/e2e/tests/workspaces/createWorkspace.spec.ts b/site/e2e/tests/workspaces/createWorkspace.spec.ts index e9d2d5efcca6f..9fcbcaf31c9dd 100644 --- a/site/e2e/tests/workspaces/createWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/createWorkspace.spec.ts @@ -1,7 +1,6 @@ import { expect, test } from "@playwright/test"; import { users } from "../../constants"; import { - StarterTemplates, createTemplate, createWorkspace, disableDynamicParameters, @@ -9,6 +8,7 @@ import { login, openTerminalWindow, requireTerraformProvisioner, + StarterTemplates, verifyParameters, } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; diff --git a/site/e2e/tests/workspaces/restartWorkspace.spec.ts b/site/e2e/tests/workspaces/restartWorkspace.spec.ts index 2ec24c6d251bf..987f3c279cc26 100644 --- a/site/e2e/tests/workspaces/restartWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/restartWorkspace.spec.ts @@ -6,9 +6,9 @@ import { createWorkspace, disableDynamicParameters, echoResponsesWithParameters, + login, verifyParameters, } from "../../helpers"; -import { login } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; import { firstBuildOption, secondBuildOption } from "../../parameters"; import type { RichParameter } from "../../provisionerGenerated"; diff --git a/site/e2e/tests/workspaces/startWorkspace.spec.ts b/site/e2e/tests/workspaces/startWorkspace.spec.ts index ea8a5c21c88bd..30a83a01d6dca 100644 --- a/site/e2e/tests/workspaces/startWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/startWorkspace.spec.ts @@ -6,10 +6,10 @@ import { createWorkspace, disableDynamicParameters, echoResponsesWithParameters, + login, stopWorkspace, verifyParameters, } from "../../helpers"; -import { login } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; import { firstBuildOption, secondBuildOption } from "../../parameters"; import type { RichParameter } from "../../provisionerGenerated"; diff --git a/site/e2e/tests/workspaces/updateWorkspace.spec.ts b/site/e2e/tests/workspaces/updateWorkspace.spec.ts index 8a242a2dc7238..b731b76abbf1a 100644 --- a/site/e2e/tests/workspaces/updateWorkspace.spec.ts +++ b/site/e2e/tests/workspaces/updateWorkspace.spec.ts @@ -5,12 +5,12 @@ import { createWorkspace, disableDynamicParameters, echoResponsesWithParameters, + login, updateTemplate, updateWorkspace, updateWorkspaceParameters, verifyParameters, } from "../../helpers"; -import { login } from "../../helpers"; import { beforeCoderTest } from "../../hooks"; import { fifthParameter, diff --git a/site/jest.setup.ts b/site/jest.setup.ts index f90f5353b1c63..f0f252afd455e 100644 --- a/site/jest.setup.ts +++ b/site/jest.setup.ts @@ -1,11 +1,11 @@ import "@testing-library/jest-dom"; import "jest-location-mock"; +import { server } from "testHelpers/server"; import crypto from "node:crypto"; import { cleanup } from "@testing-library/react"; import type { Region } from "api/typesGenerated"; import type { ProxyLatencyReport } from "contexts/useProxyLatency"; import { useMemo } from "react"; -import { server } from "testHelpers/server"; // useProxyLatency does some http requests to determine latency. // This would fail unit testing, or at least make it very slow with diff --git a/site/package.json b/site/package.json index 37ea2306feac0..e6239d8627b08 100644 --- a/site/package.json +++ b/site/package.json @@ -125,7 +125,7 @@ "yup": "1.6.1" }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.2.0", "@chromatic-com/storybook": "4.0.1", "@octokit/types": "12.3.0", "@playwright/test": "1.47.0", @@ -185,7 +185,11 @@ "vite": "6.3.5", "vite-plugin-checker": "0.9.3" }, - "browserslist": ["chrome 110", "firefox 111", "safari 16.0"], + "browserslist": [ + "chrome 110", + "firefox 111", + "safari 16.0" + ], "resolutions": { "optionator": "0.9.3", "semver": "7.6.2" @@ -202,6 +206,8 @@ "form-data": "4.0.4", "prismjs": "1.30.0" }, - "ignoredBuiltDependencies": ["storybook-addon-remix-react-router"] + "ignoredBuiltDependencies": [ + "storybook-addon-remix-react-router" + ] } } diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index 1341de609fe1c..f1ed9cc8e8825 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -283,8 +283,8 @@ importers: version: 1.6.1 devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.2.0 + version: 2.2.0 '@chromatic-com/storybook': specifier: 4.0.1 version: 4.0.1(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.4.1)) @@ -458,7 +458,7 @@ importers: version: 6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0) vite-plugin-checker: specifier: 0.9.3 - version: 0.9.3(@biomejs/biome@1.9.4)(eslint@8.52.0)(optionator@0.9.3)(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) + version: 0.9.3(@biomejs/biome@2.2.0)(eslint@8.52.0)(optionator@0.9.3)(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)) packages: @@ -738,55 +738,55 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, tarball: https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz} - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==, tarball: https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz} + '@biomejs/biome@2.2.0': + resolution: {integrity: sha512-3On3RSYLsX+n9KnoSgfoYlckYBoU6VRM22cw1gB4Y0OuUVSYd/O/2saOJMrA4HFfA1Ff0eacOvMN1yAAvHtzIw==, tarball: https://registry.npmjs.org/@biomejs/biome/-/biome-2.2.0.tgz} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==, tarball: https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz} + '@biomejs/cli-darwin-arm64@2.2.0': + resolution: {integrity: sha512-zKbwUUh+9uFmWfS8IFxmVD6XwqFcENjZvEyfOxHs1epjdH3wyyMQG80FGDsmauPwS2r5kXdEM0v/+dTIA9FXAg==, tarball: https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==, tarball: https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz} + '@biomejs/cli-darwin-x64@2.2.0': + resolution: {integrity: sha512-+OmT4dsX2eTfhD5crUOPw3RPhaR+SKVspvGVmSdZ9y9O/AgL8pla6T4hOn1q+VAFBHuHhsdxDRJgFCSC7RaMOw==, tarball: https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz} + '@biomejs/cli-linux-arm64-musl@2.2.0': + resolution: {integrity: sha512-egKpOa+4FL9YO+SMUMLUvf543cprjevNc3CAgDNFLcjknuNMcZ0GLJYa3EGTCR2xIkIUJDVneBV3O9OcIlCEZQ==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz} + '@biomejs/cli-linux-arm64@2.2.0': + resolution: {integrity: sha512-6eoRdF2yW5FnW9Lpeivh7Mayhq0KDdaDMYOJnH9aT02KuSIX5V1HmWJCQQPwIQbhDh68Zrcpl8inRlTEan0SXw==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz} + '@biomejs/cli-linux-x64-musl@2.2.0': + resolution: {integrity: sha512-I5J85yWwUWpgJyC1CcytNSGusu2p9HjDnOPAFG4Y515hwRD0jpR9sT9/T1cKHtuCvEQ/sBvx+6zhz9l9wEJGAg==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz} + '@biomejs/cli-linux-x64@2.2.0': + resolution: {integrity: sha512-5UmQx/OZAfJfi25zAnAGHUMuOd+LOsliIt119x2soA2gLggQYrVPA+2kMUxR6Mw5M1deUF/AWWP2qpxgH7Nyfw==, tarball: https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==, tarball: https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz} + '@biomejs/cli-win32-arm64@2.2.0': + resolution: {integrity: sha512-n9a1/f2CwIDmNMNkFs+JI0ZjFnMO0jdOyGNtihgUNFnlmd84yIYY2KMTBmMV58ZlVHjgmY5Y6E1hVTnSRieggA==, tarball: https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==, tarball: https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz} + '@biomejs/cli-win32-x64@2.2.0': + resolution: {integrity: sha512-Nawu5nHjP/zPKTIryh2AavzTc/KEg4um/MxWdXW0A6P/RZOyIpa7+QSjeXwAwX/utJGaCoXRPWtF3m5U/bB3Ww==, tarball: https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.2.0.tgz} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -6621,39 +6621,39 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@biomejs/biome@1.9.4': + '@biomejs/biome@2.2.0': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - - '@biomejs/cli-darwin-arm64@1.9.4': + '@biomejs/cli-darwin-arm64': 2.2.0 + '@biomejs/cli-darwin-x64': 2.2.0 + '@biomejs/cli-linux-arm64': 2.2.0 + '@biomejs/cli-linux-arm64-musl': 2.2.0 + '@biomejs/cli-linux-x64': 2.2.0 + '@biomejs/cli-linux-x64-musl': 2.2.0 + '@biomejs/cli-win32-arm64': 2.2.0 + '@biomejs/cli-win32-x64': 2.2.0 + + '@biomejs/cli-darwin-arm64@2.2.0': optional: true - '@biomejs/cli-darwin-x64@1.9.4': + '@biomejs/cli-darwin-x64@2.2.0': optional: true - '@biomejs/cli-linux-arm64-musl@1.9.4': + '@biomejs/cli-linux-arm64-musl@2.2.0': optional: true - '@biomejs/cli-linux-arm64@1.9.4': + '@biomejs/cli-linux-arm64@2.2.0': optional: true - '@biomejs/cli-linux-x64-musl@1.9.4': + '@biomejs/cli-linux-x64-musl@2.2.0': optional: true - '@biomejs/cli-linux-x64@1.9.4': + '@biomejs/cli-linux-x64@2.2.0': optional: true - '@biomejs/cli-win32-arm64@1.9.4': + '@biomejs/cli-win32-arm64@2.2.0': optional: true - '@biomejs/cli-win32-x64@1.9.4': + '@biomejs/cli-win32-x64@2.2.0': optional: true '@bundled-es-modules/cookie@2.0.1': @@ -12742,7 +12742,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-plugin-checker@0.9.3(@biomejs/biome@1.9.4)(eslint@8.52.0)(optionator@0.9.3)(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)): + vite-plugin-checker@0.9.3(@biomejs/biome@2.2.0)(eslint@8.52.0)(optionator@0.9.3)(typescript@5.6.3)(vite@6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -12755,7 +12755,7 @@ snapshots: vite: 6.3.5(@types/node@20.17.16)(jiti@2.4.2)(yaml@2.7.0) vscode-uri: 3.1.0 optionalDependencies: - '@biomejs/biome': 1.9.4 + '@biomejs/biome': 2.2.0 eslint: 8.52.0 optionator: 0.9.3 typescript: 5.6.3 diff --git a/site/src/@types/mui.d.ts b/site/src/@types/mui.d.ts index a1b4b61b07eb2..49804d33f8971 100644 --- a/site/src/@types/mui.d.ts +++ b/site/src/@types/mui.d.ts @@ -1,4 +1,4 @@ -// biome-ignore lint/nursery/noRestrictedImports: base theme types +// biome-ignore lint/style/noRestrictedImports: base theme types import type { PaletteColor, PaletteColorOptions } from "@mui/material/styles"; declare module "@mui/material/styles" { diff --git a/site/src/App.tsx b/site/src/App.tsx index 4c0d15d436a0f..2db41214a0423 100644 --- a/site/src/App.tsx +++ b/site/src/App.tsx @@ -11,8 +11,8 @@ import { HelmetProvider } from "react-helmet-async"; import { QueryClient, QueryClientProvider } from "react-query"; import { RouterProvider } from "react-router"; import { GlobalSnackbar } from "./components/GlobalSnackbar/GlobalSnackbar"; -import { ThemeProvider } from "./contexts/ThemeProvider"; import { AuthProvider } from "./contexts/auth/AuthProvider"; +import { ThemeProvider } from "./contexts/ThemeProvider"; import { router } from "./router"; const defaultQueryClient = new QueryClient({ diff --git a/site/src/api/api.test.ts b/site/src/api/api.test.ts index 04536675f8943..8c4c8556d4423 100644 --- a/site/src/api/api.test.ts +++ b/site/src/api/api.test.ts @@ -8,7 +8,7 @@ import { MockWorkspaceBuild, MockWorkspaceBuildParameter1, } from "testHelpers/entities"; -import { API, MissingBuildParameters, getURLWithSearchParams } from "./api"; +import { API, getURLWithSearchParams, MissingBuildParameters } from "./api"; import type * as TypesGen from "./typesGenerated"; const axiosInstance = API.getAxiosInstance(); diff --git a/site/src/api/api.ts b/site/src/api/api.ts index b9d5f06924519..ea97a5b46a2ef 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -22,8 +22,8 @@ import globalAxios, { type AxiosInstance, isAxiosError } from "axios"; import type dayjs from "dayjs"; import userAgentParser from "ua-parser-js"; -import { OneWayWebSocket } from "../utils/OneWayWebSocket"; import { delay } from "../utils/delay"; +import { OneWayWebSocket } from "../utils/OneWayWebSocket"; import { type FieldError, isApiError } from "./errors"; import type { DynamicParametersRequest, @@ -1222,7 +1222,7 @@ class ApiMethods { waitForBuild = (build: TypesGen.WorkspaceBuild) => { return new Promise((res, reject) => { void (async () => { - let latestJobInfo: TypesGen.ProvisionerJob | undefined = undefined; + let latestJobInfo: TypesGen.ProvisionerJob | undefined; while ( !["succeeded", "canceled"].some((status) => diff --git a/site/src/api/queries/templates.ts b/site/src/api/queries/templates.ts index 9057179a8740c..8c3b294f7fad8 100644 --- a/site/src/api/queries/templates.ts +++ b/site/src/api/queries/templates.ts @@ -310,7 +310,7 @@ const waitBuildToBeFinished = async ( onRequest?: (data: TemplateVersion) => void, ) => { let data: TemplateVersion; - let jobStatus: ProvisionerJobStatus | undefined = undefined; + let jobStatus: ProvisionerJobStatus | undefined; do { // When pending we want to poll more frequently await delay(jobStatus === "pending" ? 250 : 1000); diff --git a/site/src/api/queries/users.ts b/site/src/api/queries/users.ts index 4d87232ee698c..c7913f81565f0 100644 --- a/site/src/api/queries/users.ts +++ b/site/src/api/queries/users.ts @@ -12,8 +12,8 @@ import type { UsersRequest, } from "api/typesGenerated"; import { - type MetadataState, defaultMetadataManager, + type MetadataState, } from "hooks/useEmbeddedMetadata"; import type { UsePaginatedQueryOptions } from "hooks/usePaginatedQuery"; import type { diff --git a/site/src/components/ActiveUserChart/ActiveUserChart.tsx b/site/src/components/ActiveUserChart/ActiveUserChart.tsx index c7fe0d893bd20..ef55e06d568a4 100644 --- a/site/src/components/ActiveUserChart/ActiveUserChart.tsx +++ b/site/src/components/ActiveUserChart/ActiveUserChart.tsx @@ -68,7 +68,7 @@ export const ActiveUserChart: FC = ({ data }) => { const item = p[0]; return `${item.value} active users`; }} - formatter={(v, n, item) => { + formatter={(_v, _n, item) => { const date = new Date(item.payload.date); return date.toLocaleString(undefined, { month: "long", diff --git a/site/src/components/Alert/Alert.tsx b/site/src/components/Alert/Alert.tsx index e97b690f82833..1cbf36b2df1d2 100644 --- a/site/src/components/Alert/Alert.tsx +++ b/site/src/components/Alert/Alert.tsx @@ -1,7 +1,7 @@ import MuiAlert, { type AlertColor as MuiAlertColor, type AlertProps as MuiAlertProps, - // biome-ignore lint/nursery/noRestrictedImports: Used as base component + // biome-ignore lint/style/noRestrictedImports: Used as base component } from "@mui/material/Alert"; import Collapse from "@mui/material/Collapse"; import { Button } from "components/Button/Button"; diff --git a/site/src/components/Alert/ErrorAlert.stories.tsx b/site/src/components/Alert/ErrorAlert.stories.tsx index c4f3767097326..28120dd1054d1 100644 --- a/site/src/components/Alert/ErrorAlert.stories.tsx +++ b/site/src/components/Alert/ErrorAlert.stories.tsx @@ -1,6 +1,6 @@ +import { mockApiError } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { Button } from "components/Button/Button"; -import { mockApiError } from "testHelpers/entities"; import { ErrorAlert } from "./ErrorAlert"; const mockError = mockApiError({ diff --git a/site/src/components/Avatar/Avatar.tsx b/site/src/components/Avatar/Avatar.tsx index 8661dceda0f6a..3b9de3657d623 100644 --- a/site/src/components/Avatar/Avatar.tsx +++ b/site/src/components/Avatar/Avatar.tsx @@ -12,7 +12,7 @@ import { useTheme } from "@emotion/react"; import * as AvatarPrimitive from "@radix-ui/react-avatar"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; import { getExternalImageStylesFromUrl } from "theme/externalImages"; import { cn } from "utils/cn"; diff --git a/site/src/components/Badge/Badge.tsx b/site/src/components/Badge/Badge.tsx index 0d11c96d30433..a042b5cf7203c 100644 --- a/site/src/components/Badge/Badge.tsx +++ b/site/src/components/Badge/Badge.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/badge} */ import { Slot } from "@radix-ui/react-slot"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { forwardRef } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/Badges/Badges.tsx b/site/src/components/Badges/Badges.tsx index 278eb890cd2ee..f0db2fb0e9fbc 100644 --- a/site/src/components/Badges/Badges.tsx +++ b/site/src/components/Badges/Badges.tsx @@ -3,9 +3,9 @@ import Tooltip from "@mui/material/Tooltip"; import { Stack } from "components/Stack/Stack"; import { type FC, + forwardRef, type HTMLAttributes, type PropsWithChildren, - forwardRef, } from "react"; const styles = { diff --git a/site/src/components/Breadcrumb/Breadcrumb.stories.tsx b/site/src/components/Breadcrumb/Breadcrumb.stories.tsx index d9f8b3f97d8b5..bc14950462d9a 100644 --- a/site/src/components/Breadcrumb/Breadcrumb.stories.tsx +++ b/site/src/components/Breadcrumb/Breadcrumb.stories.tsx @@ -1,3 +1,4 @@ +import { MockOrganization } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { Breadcrumb, @@ -8,7 +9,6 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from "components/Breadcrumb/Breadcrumb"; -import { MockOrganization } from "testHelpers/entities"; const meta: Meta = { title: "components/Breadcrumb", diff --git a/site/src/components/Breadcrumb/Breadcrumb.tsx b/site/src/components/Breadcrumb/Breadcrumb.tsx index 35f90d30a5d7b..61d06c3755542 100644 --- a/site/src/components/Breadcrumb/Breadcrumb.tsx +++ b/site/src/components/Breadcrumb/Breadcrumb.tsx @@ -8,8 +8,8 @@ import { type ComponentProps, type ComponentPropsWithoutRef, type FC, - type ReactNode, forwardRef, + type ReactNode, } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/Button/Button.tsx b/site/src/components/Button/Button.tsx index 1f2c6b3b3416b..ff5200edb5883 100644 --- a/site/src/components/Button/Button.tsx +++ b/site/src/components/Button/Button.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/button} */ import { Slot } from "@radix-ui/react-slot"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { forwardRef } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/Chart/Chart.tsx b/site/src/components/Chart/Chart.tsx index c68967afe6e91..dd418bfef76c3 100644 --- a/site/src/components/Chart/Chart.tsx +++ b/site/src/components/Chart/Chart.tsx @@ -271,7 +271,7 @@ export const ChartTooltipContent = React.forwardRef< ); ChartTooltipContent.displayName = "ChartTooltip"; -const ChartLegend = RechartsPrimitive.Legend; +const _ChartLegend = RechartsPrimitive.Legend; const ChartLegendContent = React.forwardRef< HTMLDivElement, diff --git a/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx b/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx index ef68d1816dbcf..9cf45dc9d445b 100644 --- a/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx +++ b/site/src/components/CollapsibleSummary/CollapsibleSummary.tsx @@ -1,4 +1,4 @@ -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { ChevronRightIcon } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/Combobox/Combobox.tsx b/site/src/components/Combobox/Combobox.tsx index 35a4846fcffb4..2d522d6e6397c 100644 --- a/site/src/components/Combobox/Combobox.tsx +++ b/site/src/components/Combobox/Combobox.tsx @@ -18,8 +18,7 @@ import { TooltipProvider, TooltipTrigger, } from "components/Tooltip/Tooltip"; -import { Check, ChevronDown, CornerDownLeft } from "lucide-react"; -import { Info } from "lucide-react"; +import { Check, ChevronDown, CornerDownLeft, Info } from "lucide-react"; import { type FC, type KeyboardEventHandler, useState } from "react"; import { cn } from "utils/cn"; import { ExternalImage } from "../ExternalImage/ExternalImage"; diff --git a/site/src/components/Command/Command.tsx b/site/src/components/Command/Command.tsx index 88451d13b72ee..8973154f1d5c2 100644 --- a/site/src/components/Command/Command.tsx +++ b/site/src/components/Command/Command.tsx @@ -23,7 +23,7 @@ export const Command = forwardRef< /> )); -const CommandDialog: FC = ({ children, ...props }) => { +const _CommandDialog: FC = ({ children, ...props }) => { return ( @@ -132,7 +132,7 @@ export const CommandItem = forwardRef< /> )); -const CommandShortcut = ({ +const _CommandShortcut = ({ className, ...props }: React.HTMLAttributes) => { diff --git a/site/src/components/Dialog/Dialog.tsx b/site/src/components/Dialog/Dialog.tsx index 2ec5fa4dae212..13484f1840f69 100644 --- a/site/src/components/Dialog/Dialog.tsx +++ b/site/src/components/Dialog/Dialog.tsx @@ -3,13 +3,13 @@ * @see {@link https://ui.shadcn.com/docs/components/dialog} */ import * as DialogPrimitive from "@radix-ui/react-dialog"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { type ComponentPropsWithoutRef, type ElementRef, type FC, - type HTMLAttributes, forwardRef, + type HTMLAttributes, } from "react"; import { cn } from "utils/cn"; @@ -19,7 +19,7 @@ export const DialogTrigger = DialogPrimitive.Trigger; const DialogPortal = DialogPrimitive.Portal; -const DialogClose = DialogPrimitive.Close; +const _DialogClose = DialogPrimitive.Close; const DialogOverlay = forwardRef< ElementRef, diff --git a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx index b8a790dc8c167..72ce09290dfd1 100644 --- a/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx +++ b/site/src/components/Dialogs/ConfirmDialog/ConfirmDialog.test.tsx @@ -1,5 +1,5 @@ -import { fireEvent, screen } from "@testing-library/react"; import { renderComponent } from "testHelpers/renderHelpers"; +import { fireEvent, screen } from "@testing-library/react"; import { ConfirmDialog } from "./ConfirmDialog"; describe("ConfirmDialog", () => { diff --git a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx index 7dc27f977b109..ec2635ee191ce 100644 --- a/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx +++ b/site/src/components/Dialogs/DeleteDialog/DeleteDialog.test.tsx @@ -1,7 +1,7 @@ +import { renderComponent } from "testHelpers/renderHelpers"; import { screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { act } from "react-dom/test-utils"; -import { renderComponent } from "testHelpers/renderHelpers"; import { DeleteDialog } from "./DeleteDialog"; const inputTestId = "delete-dialog-name-confirmation"; diff --git a/site/src/components/DropdownArrow/DropdownArrow.stories.tsx b/site/src/components/DropdownArrow/DropdownArrow.stories.tsx index 1221e5f091e6a..7413bbc70fe39 100644 --- a/site/src/components/DropdownArrow/DropdownArrow.stories.tsx +++ b/site/src/components/DropdownArrow/DropdownArrow.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DropdownArrow } from "./DropdownArrow"; const meta: Meta = { diff --git a/site/src/components/DropdownMenu/DropdownMenu.tsx b/site/src/components/DropdownMenu/DropdownMenu.tsx index 01547c30b17a6..8e0e1fb628dcc 100644 --- a/site/src/components/DropdownMenu/DropdownMenu.tsx +++ b/site/src/components/DropdownMenu/DropdownMenu.tsx @@ -11,8 +11,8 @@ import { Check, ChevronRight, Circle } from "lucide-react"; import { type ComponentPropsWithoutRef, type ElementRef, - type HTMLAttributes, forwardRef, + type HTMLAttributes, } from "react"; import { cn } from "utils/cn"; @@ -20,13 +20,13 @@ export const DropdownMenu = DropdownMenuPrimitive.Root; export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; -const DropdownMenuGroup = DropdownMenuPrimitive.Group; +const _DropdownMenuGroup = DropdownMenuPrimitive.Group; -const DropdownMenuPortal = DropdownMenuPrimitive.Portal; +const _DropdownMenuPortal = DropdownMenuPrimitive.Portal; -const DropdownMenuSub = DropdownMenuPrimitive.Sub; +const _DropdownMenuSub = DropdownMenuPrimitive.Sub; -const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; +const _DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; const DropdownMenuSubTrigger = forwardRef< ElementRef, diff --git a/site/src/components/DurationField/DurationField.tsx b/site/src/components/DurationField/DurationField.tsx index 7ee5153964164..9f6a0fb5436a7 100644 --- a/site/src/components/DurationField/DurationField.tsx +++ b/site/src/components/DurationField/DurationField.tsx @@ -5,10 +5,10 @@ import TextField, { type TextFieldProps } from "@mui/material/TextField"; import { ChevronDownIcon } from "lucide-react"; import { type FC, useEffect, useReducer } from "react"; import { - type TimeUnit, durationInDays, durationInHours, suggestedTimeUnit, + type TimeUnit, } from "utils/time"; type DurationFieldProps = Omit & { diff --git a/site/src/components/ExternalImage/ExternalImage.tsx b/site/src/components/ExternalImage/ExternalImage.tsx index d85b227b999b4..537ad11cfb8a4 100644 --- a/site/src/components/ExternalImage/ExternalImage.tsx +++ b/site/src/components/ExternalImage/ExternalImage.tsx @@ -1,5 +1,5 @@ import { useTheme } from "@emotion/react"; -import { type ImgHTMLAttributes, forwardRef } from "react"; +import { forwardRef, type ImgHTMLAttributes } from "react"; import { getExternalImageStylesFromUrl } from "theme/externalImages"; export const ExternalImage = forwardRef< diff --git a/site/src/components/FileUpload/FileUpload.test.tsx b/site/src/components/FileUpload/FileUpload.test.tsx index 6292bc200a517..e3ebce085ce50 100644 --- a/site/src/components/FileUpload/FileUpload.test.tsx +++ b/site/src/components/FileUpload/FileUpload.test.tsx @@ -1,5 +1,5 @@ -import { fireEvent, screen } from "@testing-library/react"; import { renderComponent } from "testHelpers/renderHelpers"; +import { fireEvent, screen } from "@testing-library/react"; import { FileUpload } from "./FileUpload"; test("accepts files with the correct extension", async () => { diff --git a/site/src/components/FileUpload/FileUpload.tsx b/site/src/components/FileUpload/FileUpload.tsx index 67ec27054ade4..95c7baa816032 100644 --- a/site/src/components/FileUpload/FileUpload.tsx +++ b/site/src/components/FileUpload/FileUpload.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, css } from "@emotion/react"; +import { css, type Interpolation, type Theme } from "@emotion/react"; import CircularProgress from "@mui/material/CircularProgress"; import IconButton from "@mui/material/IconButton"; import { Stack } from "components/Stack/Stack"; diff --git a/site/src/components/Filter/Filter.tsx b/site/src/components/Filter/Filter.tsx index ea5e60ff0a7f9..1ee162acccf99 100644 --- a/site/src/components/Filter/Filter.tsx +++ b/site/src/components/Filter/Filter.tsx @@ -13,8 +13,7 @@ import { Button } from "components/Button/Button"; import { InputGroup } from "components/InputGroup/InputGroup"; import { SearchField } from "components/SearchField/SearchField"; import { useDebouncedFunction } from "hooks/debounce"; -import { ExternalLinkIcon } from "lucide-react"; -import { ChevronDownIcon } from "lucide-react"; +import { ChevronDownIcon, ExternalLinkIcon } from "lucide-react"; import { type FC, type ReactNode, useEffect, useRef, useState } from "react"; type PresetFilter = { diff --git a/site/src/components/Filter/SelectFilter.stories.tsx b/site/src/components/Filter/SelectFilter.stories.tsx index 4947ed20dc4f7..136332ccfa883 100644 --- a/site/src/components/Filter/SelectFilter.stories.tsx +++ b/site/src/components/Filter/SelectFilter.stories.tsx @@ -1,9 +1,9 @@ +import { withDesktopViewport } from "testHelpers/storybook"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { Avatar } from "components/Avatar/Avatar"; import { useState } from "react"; import { action } from "storybook/actions"; import { expect, userEvent, within } from "storybook/test"; -import { withDesktopViewport } from "testHelpers/storybook"; import { SelectFilter, type SelectFilterOption, diff --git a/site/src/components/Form/Form.tsx b/site/src/components/Form/Form.tsx index 715f5ec008c5d..d535a63642324 100644 --- a/site/src/components/Form/Form.tsx +++ b/site/src/components/Form/Form.tsx @@ -3,11 +3,11 @@ import { AlphaBadge, DeprecatedBadge } from "components/Badges/Badges"; import { Stack } from "components/Stack/Stack"; import { type ComponentProps, + createContext, type FC, + forwardRef, type HTMLProps, type ReactNode, - createContext, - forwardRef, useContext, } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/FullPageLayout/Topbar.tsx b/site/src/components/FullPageLayout/Topbar.tsx index 766a83295d124..ac972b7af04f1 100644 --- a/site/src/components/FullPageLayout/Topbar.tsx +++ b/site/src/components/FullPageLayout/Topbar.tsx @@ -4,12 +4,12 @@ import IconButton, { type IconButtonProps } from "@mui/material/IconButton"; import { Avatar, type AvatarProps } from "components/Avatar/Avatar"; import { Button, type ButtonProps } from "components/Button/Button"; import { + cloneElement, type FC, type ForwardedRef, + forwardRef, type HTMLAttributes, type ReactElement, - cloneElement, - forwardRef, } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx b/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx index 657bb5fc920ce..081bdf7f3a826 100644 --- a/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx +++ b/site/src/components/GlobalSnackbar/GlobalSnackbar.tsx @@ -5,12 +5,12 @@ import { ErrorIcon } from "../Icons/ErrorIcon"; import { EnterpriseSnackbar } from "./EnterpriseSnackbar"; import { type AdditionalMessage, - MsgType, - type NotificationMsg, - SnackbarEventType, isNotificationList, isNotificationText, isNotificationTextPrefixed, + MsgType, + type NotificationMsg, + SnackbarEventType, } from "./utils"; const variantFromMsgType = (type: MsgType) => { diff --git a/site/src/components/GlobalSnackbar/utils.test.ts b/site/src/components/GlobalSnackbar/utils.test.ts index ffb08c6844023..cc2c33b3d3025 100644 --- a/site/src/components/GlobalSnackbar/utils.test.ts +++ b/site/src/components/GlobalSnackbar/utils.test.ts @@ -1,11 +1,11 @@ import { + displayError, + displaySuccess, + isNotificationTextPrefixed, MsgType, type NotificationMsg, type NotificationTextPrefixed, SnackbarEventType, - displayError, - displaySuccess, - isNotificationTextPrefixed, } from "./utils"; describe("Snackbar", () => { diff --git a/site/src/components/GlobalSnackbar/utils.ts b/site/src/components/GlobalSnackbar/utils.ts index 5dbc747aeff7b..cc6d37504a7ab 100644 --- a/site/src/components/GlobalSnackbar/utils.ts +++ b/site/src/components/GlobalSnackbar/utils.ts @@ -28,10 +28,7 @@ export const isNotificationTextPrefixed = ( msg: AdditionalMessage | null, ): msg is NotificationTextPrefixed => { if (msg) { - return ( - typeof msg !== "string" && - Object.prototype.hasOwnProperty.call(msg, "prefix") - ); + return typeof msg !== "string" && Object.hasOwn(msg, "prefix"); } return false; }; diff --git a/site/src/components/HelpTooltip/HelpTooltip.tsx b/site/src/components/HelpTooltip/HelpTooltip.tsx index 6ab244c854d5b..2bcaef1eb6847 100644 --- a/site/src/components/HelpTooltip/HelpTooltip.tsx +++ b/site/src/components/HelpTooltip/HelpTooltip.tsx @@ -1,12 +1,11 @@ import { type CSSObject, + css, type Interpolation, type Theme, - css, useTheme, } from "@emotion/react"; import Link from "@mui/material/Link"; -import { Stack } from "components/Stack/Stack"; import { Popover, PopoverContent, @@ -15,14 +14,14 @@ import { PopoverTrigger, usePopover, } from "components/deprecated/Popover/Popover"; -import { ExternalLinkIcon } from "lucide-react"; -import { CircleHelpIcon } from "lucide-react"; +import { Stack } from "components/Stack/Stack"; +import { CircleHelpIcon, ExternalLinkIcon } from "lucide-react"; import { type FC, + forwardRef, type HTMLAttributes, type PropsWithChildren, type ReactNode, - forwardRef, } from "react"; type Icon = typeof CircleHelpIcon; diff --git a/site/src/components/IconField/IconField.tsx b/site/src/components/IconField/IconField.tsx index 5a272d44bfd80..65632ee04e10f 100644 --- a/site/src/components/IconField/IconField.tsx +++ b/site/src/components/IconField/IconField.tsx @@ -1,17 +1,17 @@ -import { Global, css, useTheme } from "@emotion/react"; +import { css, Global, useTheme } from "@emotion/react"; import InputAdornment from "@mui/material/InputAdornment"; import TextField, { type TextFieldProps } from "@mui/material/TextField"; import { visuallyHidden } from "@mui/utils"; import { Button } from "components/Button/Button"; -import { ExternalImage } from "components/ExternalImage/ExternalImage"; -import { Loader } from "components/Loader/Loader"; import { Popover, PopoverContent, PopoverTrigger, } from "components/deprecated/Popover/Popover"; +import { ExternalImage } from "components/ExternalImage/ExternalImage"; +import { Loader } from "components/Loader/Loader"; import { ChevronDownIcon } from "lucide-react"; -import { type FC, Suspense, lazy, useState } from "react"; +import { type FC, lazy, Suspense, useState } from "react"; // See: https://github.com/missive/emoji-mart/issues/51#issuecomment-287353222 const urlFromUnifiedCode = (unified: string) => diff --git a/site/src/components/InfoTooltip/InfoTooltip.tsx b/site/src/components/InfoTooltip/InfoTooltip.tsx index dc8fb7c97b96d..63a9187245859 100644 --- a/site/src/components/InfoTooltip/InfoTooltip.tsx +++ b/site/src/components/InfoTooltip/InfoTooltip.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, css, useTheme } from "@emotion/react"; +import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; import { HelpTooltip, HelpTooltipContent, diff --git a/site/src/components/Label/Label.tsx b/site/src/components/Label/Label.tsx index 2b052d0935658..47d42e11b6d7c 100644 --- a/site/src/components/Label/Label.tsx +++ b/site/src/components/Label/Label.tsx @@ -3,7 +3,7 @@ * @see {@link https://ui.shadcn.com/docs/components/label} */ import * as LabelPrimitive from "@radix-ui/react-label"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { forwardRef } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/LastSeen/LastSeen.tsx b/site/src/components/LastSeen/LastSeen.tsx index 23e9a2076984e..02c98a09bf1ce 100644 --- a/site/src/components/LastSeen/LastSeen.tsx +++ b/site/src/components/LastSeen/LastSeen.tsx @@ -12,7 +12,7 @@ interface LastSeenProps export const LastSeen: FC = ({ at, className, ...attrs }) => { const theme = useTheme(); - const t = dayjs(at); + const _t = dayjs(at); const now = new Date(); const oneHourAgo = subtractTime(now, 1, "hour"); const threeDaysAgo = subtractTime(now, 3, "day"); diff --git a/site/src/components/Latency/Latency.tsx b/site/src/components/Latency/Latency.tsx index b5509ba450847..de5c5dc2851b8 100644 --- a/site/src/components/Latency/Latency.tsx +++ b/site/src/components/Latency/Latency.tsx @@ -38,17 +38,13 @@ export const Latency: FC = ({ const notAvailableText = "Latency not available"; return ( - <> - {notAvailableText} - - - + ); } diff --git a/site/src/components/Link/Link.tsx b/site/src/components/Link/Link.tsx index f861ae2e197f7..c68ac1d70d8f7 100644 --- a/site/src/components/Link/Link.tsx +++ b/site/src/components/Link/Link.tsx @@ -1,5 +1,5 @@ import { Slot, Slottable } from "@radix-ui/react-slot"; -import { type VariantProps, cva } from "class-variance-authority"; +import { cva, type VariantProps } from "class-variance-authority"; import { SquareArrowOutUpRightIcon } from "lucide-react"; import { forwardRef } from "react"; import { cn } from "utils/cn"; diff --git a/site/src/components/Logs/LogLine.stories.tsx b/site/src/components/Logs/LogLine.stories.tsx index dcbca361526d0..e294f60ba11dc 100644 --- a/site/src/components/Logs/LogLine.stories.tsx +++ b/site/src/components/Logs/LogLine.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { LogLine, LogLinePrefix } from "./LogLine"; const meta: Meta = { diff --git a/site/src/components/Logs/Logs.stories.tsx b/site/src/components/Logs/Logs.stories.tsx index 01b9b6fa8c297..a9f8fff0f7300 100644 --- a/site/src/components/Logs/Logs.stories.tsx +++ b/site/src/components/Logs/Logs.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockWorkspaceBuildLogs } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Line } from "./LogLine"; import { Logs } from "./Logs"; diff --git a/site/src/components/Markdown/Markdown.tsx b/site/src/components/Markdown/Markdown.tsx index 6fdf9e17a6177..ba7bcbf29a903 100644 --- a/site/src/components/Markdown/Markdown.tsx +++ b/site/src/components/Markdown/Markdown.tsx @@ -11,10 +11,10 @@ import isEqual from "lodash/isEqual"; import { type FC, type HTMLProps, - type ReactElement, - type ReactNode, isValidElement, memo, + type ReactElement, + type ReactNode, } from "react"; import ReactMarkdown, { type Options } from "react-markdown"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; diff --git a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx index 1c557eda5601b..ff25209e20d7f 100644 --- a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx +++ b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.stories.tsx @@ -1,6 +1,6 @@ +import { MockOrganization, MockOrganization2 } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, userEvent, waitFor, within } from "storybook/test"; -import { MockOrganization, MockOrganization2 } from "testHelpers/entities"; import { MultiSelectCombobox } from "./MultiSelectCombobox"; const organizations = [MockOrganization, MockOrganization2]; diff --git a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx index 6d82f043968b1..8ff83f2a4583a 100644 --- a/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx +++ b/site/src/components/MultiSelectCombobox/MultiSelectCombobox.tsx @@ -22,9 +22,9 @@ import { ChevronDown, Info, X } from "lucide-react"; import { type ComponentProps, type ComponentPropsWithoutRef, + forwardRef, type KeyboardEvent, type ReactNode, - forwardRef, useCallback, useEffect, useImperativeHandle, diff --git a/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx b/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx index 0ce78c7cd5cbc..66f3dde252fff 100644 --- a/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx +++ b/site/src/components/OrganizationAutocomplete/OrganizationAutocomplete.stories.tsx @@ -1,11 +1,11 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { action } from "storybook/actions"; -import { userEvent, within } from "storybook/test"; import { MockOrganization, MockOrganization2, MockUserOwner, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { action } from "storybook/actions"; +import { userEvent, within } from "storybook/test"; import { OrganizationAutocomplete } from "./OrganizationAutocomplete"; const meta: Meta = { diff --git a/site/src/components/PageHeader/FullWidthPageHeader.tsx b/site/src/components/PageHeader/FullWidthPageHeader.tsx index 33975c0747e41..f369c88fb619e 100644 --- a/site/src/components/PageHeader/FullWidthPageHeader.tsx +++ b/site/src/components/PageHeader/FullWidthPageHeader.tsx @@ -46,7 +46,7 @@ export const FullWidthPageHeader: FC = ({ ); }; -const PageHeaderActions: FC = ({ children }) => { +const _PageHeaderActions: FC = ({ children }) => { const theme = useTheme(); return (
    = { diff --git a/site/src/components/RichParameterInput/RichParameterInput.tsx b/site/src/components/RichParameterInput/RichParameterInput.tsx index c60951df71090..1852d50af9f4e 100644 --- a/site/src/components/RichParameterInput/RichParameterInput.tsx +++ b/site/src/components/RichParameterInput/RichParameterInput.tsx @@ -12,8 +12,7 @@ import { ExternalImage } from "components/ExternalImage/ExternalImage"; import { MemoizedMarkdown } from "components/Markdown/Markdown"; import { Pill } from "components/Pill/Pill"; import { Stack } from "components/Stack/Stack"; -import { SettingsIcon } from "lucide-react"; -import { CircleAlertIcon } from "lucide-react"; +import { CircleAlertIcon, SettingsIcon } from "lucide-react"; import { type FC, type ReactNode, useState } from "react"; import type { AutofillBuildParameter, diff --git a/site/src/components/Search/Search.tsx b/site/src/components/Search/Search.tsx index 41b2655638c39..7fecd57df2bf9 100644 --- a/site/src/components/Search/Search.tsx +++ b/site/src/components/Search/Search.tsx @@ -1,5 +1,5 @@ import type { Interpolation, Theme } from "@emotion/react"; -// biome-ignore lint/nursery/noRestrictedImports: use it to have the component prop +// biome-ignore lint/style/noRestrictedImports: use it to have the component prop import Box, { type BoxProps } from "@mui/material/Box"; import visuallyHidden from "@mui/utils/visuallyHidden"; import { SearchIcon } from "lucide-react"; diff --git a/site/src/components/SearchField/SearchField.tsx b/site/src/components/SearchField/SearchField.tsx index c47b35f6fcc28..90a2499615c37 100644 --- a/site/src/components/SearchField/SearchField.tsx +++ b/site/src/components/SearchField/SearchField.tsx @@ -22,11 +22,12 @@ export const SearchField: FC = ({ const theme = useTheme(); const inputRef = useRef(null); - if (autoFocus) { - useEffect(() => { + useEffect(() => { + if (autoFocus) { inputRef.current?.focus(); - }); - } + } + }); + return ( )); -const TableFooter = React.forwardRef< +const _TableFooter = React.forwardRef< HTMLTableSectionElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( @@ -129,7 +129,7 @@ export const TableCell = React.forwardRef< /> )); -const TableCaption = React.forwardRef< +const _TableCaption = React.forwardRef< HTMLTableCaptionElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( diff --git a/site/src/components/TableLoader/TableLoader.tsx b/site/src/components/TableLoader/TableLoader.tsx index e9f6c814f767f..3efaa8bb19ca0 100644 --- a/site/src/components/TableLoader/TableLoader.tsx +++ b/site/src/components/TableLoader/TableLoader.tsx @@ -1,6 +1,6 @@ import TableCell from "@mui/material/TableCell"; import TableRow, { type TableRowProps } from "@mui/material/TableRow"; -import { type FC, type ReactNode, cloneElement, isValidElement } from "react"; +import { cloneElement, type FC, isValidElement, type ReactNode } from "react"; import { Loader } from "../Loader/Loader"; export const TableLoader: FC = () => { diff --git a/site/src/components/Tabs/Tabs.tsx b/site/src/components/Tabs/Tabs.tsx index e18db55871b1d..d1642ca504579 100644 --- a/site/src/components/Tabs/Tabs.tsx +++ b/site/src/components/Tabs/Tabs.tsx @@ -1,4 +1,4 @@ -import { type FC, type HTMLAttributes, createContext, useContext } from "react"; +import { createContext, type FC, type HTMLAttributes, useContext } from "react"; import { Link, type LinkProps } from "react-router"; import { cn } from "utils/cn"; diff --git a/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx b/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx index 1b8b21b90ca61..b9226c86ab859 100644 --- a/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx +++ b/site/src/components/UserAutocomplete/MemberAutocomplete.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockOrganizationMember } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { MemberAutocomplete } from "./UserAutocomplete"; const meta: Meta = { diff --git a/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx b/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx index 44fb632c8698e..25dd78ddff60d 100644 --- a/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx +++ b/site/src/components/UserAutocomplete/UserAutocomplete.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockUserOwner } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { UserAutocomplete } from "./UserAutocomplete"; const meta: Meta = { diff --git a/site/src/components/deprecated/Popover/Popover.tsx b/site/src/components/deprecated/Popover/Popover.tsx index a7f39810e43b2..044306f325c4f 100644 --- a/site/src/components/deprecated/Popover/Popover.tsx +++ b/site/src/components/deprecated/Popover/Popover.tsx @@ -1,8 +1,10 @@ import MuiPopover, { type PopoverProps as MuiPopoverProps, - // biome-ignore lint/nursery/noRestrictedImports: This is the base component that our custom popover is based on + // biome-ignore lint/style/noRestrictedImports: This is the base component that our custom popover is based on } from "@mui/material/Popover"; import { + cloneElement, + createContext, type FC, type HTMLAttributes, type PointerEvent, @@ -10,8 +12,6 @@ import { type ReactElement, type ReactNode, type RefObject, - cloneElement, - createContext, useContext, useEffect, useId, diff --git a/site/src/contexts/ProxyContext.test.tsx b/site/src/contexts/ProxyContext.test.tsx index 03f2662037733..36a7a85eb3068 100644 --- a/site/src/contexts/ProxyContext.test.tsx +++ b/site/src/contexts/ProxyContext.test.tsx @@ -1,8 +1,4 @@ import "testHelpers/localStorage"; -import { screen } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import type { Region } from "api/typesGenerated"; -import { http, HttpResponse } from "msw"; import { MockHealthyWildWorkspaceProxy, MockPrimaryWorkspaceProxy, @@ -14,9 +10,13 @@ import { waitForLoaderToBeRemoved, } from "testHelpers/renderHelpers"; import { server } from "testHelpers/server"; +import { screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import type { Region } from "api/typesGenerated"; +import { HttpResponse, http } from "msw"; import { - ProxyProvider, getPreferredProxy, + ProxyProvider, saveUserSelectedProxy, useProxy, } from "./ProxyContext"; diff --git a/site/src/contexts/ProxyContext.tsx b/site/src/contexts/ProxyContext.tsx index c162c2c4952ff..409dbf36737c3 100644 --- a/site/src/contexts/ProxyContext.tsx +++ b/site/src/contexts/ProxyContext.tsx @@ -4,9 +4,9 @@ import type { Region, WorkspaceProxy } from "api/typesGenerated"; import { useAuthenticated } from "hooks"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { + createContext, type FC, type PropsWithChildren, - createContext, useCallback, useContext, useEffect, diff --git a/site/src/contexts/ThemeProvider.tsx b/site/src/contexts/ThemeProvider.tsx index 4521ab71d7a74..2a3fcb22157f2 100644 --- a/site/src/contexts/ThemeProvider.tsx +++ b/site/src/contexts/ThemeProvider.tsx @@ -1,11 +1,13 @@ import createCache from "@emotion/cache"; -import { ThemeProvider as EmotionThemeProvider } from "@emotion/react"; -import { CacheProvider } from "@emotion/react"; +import { + CacheProvider, + ThemeProvider as EmotionThemeProvider, +} from "@emotion/react"; import CssBaseline from "@mui/material/CssBaseline"; import { ThemeProvider as MuiThemeProvider, StyledEngineProvider, - // biome-ignore lint/nursery/noRestrictedImports: we extend the MUI theme + // biome-ignore lint/style/noRestrictedImports: we extend the MUI theme } from "@mui/material/styles"; import { appearanceSettings } from "api/queries/users"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; diff --git a/site/src/contexts/auth/AuthProvider.test.tsx b/site/src/contexts/auth/AuthProvider.test.tsx index 147d89f724afe..bf3ea34a7992a 100644 --- a/site/src/contexts/auth/AuthProvider.test.tsx +++ b/site/src/contexts/auth/AuthProvider.test.tsx @@ -1,7 +1,7 @@ +import { createTestQueryClient } from "testHelpers/renderHelpers"; import { renderHook } from "@testing-library/react"; import type { FC, PropsWithChildren } from "react"; import { QueryClientProvider } from "react-query"; -import { createTestQueryClient } from "testHelpers/renderHelpers"; import { AuthProvider, useAuthContext } from "./AuthProvider"; const Wrapper: FC = ({ children }) => { diff --git a/site/src/contexts/auth/AuthProvider.tsx b/site/src/contexts/auth/AuthProvider.tsx index 231dcbd294082..ae06c67e5c3dd 100644 --- a/site/src/contexts/auth/AuthProvider.tsx +++ b/site/src/contexts/auth/AuthProvider.tsx @@ -12,9 +12,9 @@ import { displaySuccess } from "components/GlobalSnackbar/utils"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { type Permissions, permissionChecks } from "modules/permissions"; import { + createContext, type FC, type PropsWithChildren, - createContext, useCallback, useContext, } from "react"; diff --git a/site/src/contexts/auth/RequireAuth.test.tsx b/site/src/contexts/auth/RequireAuth.test.tsx index b24bb06cb055c..518398b5e0239 100644 --- a/site/src/contexts/auth/RequireAuth.test.tsx +++ b/site/src/contexts/auth/RequireAuth.test.tsx @@ -1,14 +1,14 @@ -import { renderHook, screen } from "@testing-library/react"; -import { useAuthenticated } from "hooks"; -import { http, HttpResponse } from "msw"; -import type { FC, PropsWithChildren } from "react"; -import { QueryClientProvider } from "react-query"; import { MockPermissions, MockUserOwner } from "testHelpers/entities"; import { createTestQueryClient, renderWithAuth, } from "testHelpers/renderHelpers"; import { server } from "testHelpers/server"; +import { renderHook, screen } from "@testing-library/react"; +import { useAuthenticated } from "hooks"; +import { HttpResponse, http } from "msw"; +import type { FC, PropsWithChildren } from "react"; +import { QueryClientProvider } from "react-query"; import { AuthContext, type AuthContextValue } from "./AuthProvider"; describe("RequireAuth", () => { diff --git a/site/src/contexts/useProxyLatency.ts b/site/src/contexts/useProxyLatency.ts index f5f3d2acb415c..a1fed6a6990d5 100644 --- a/site/src/contexts/useProxyLatency.ts +++ b/site/src/contexts/useProxyLatency.ts @@ -75,7 +75,7 @@ export const useProxyLatency = ( const [latestFetchRequest, setLatestFetchRequest] = useState( // The initial state is the current time minus the interval. Any proxies that have a latency after this // in the cache are still valid. - new Date(new Date().getTime() - proxyIntervalSeconds * 1000).toISOString(), + new Date(Date.now() - proxyIntervalSeconds * 1000).toISOString(), ); const [loaded, setLoaded] = useState(false); @@ -163,7 +163,7 @@ export const useProxyLatency = ( // https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/Resource_timing let latencyMS = 0; let accurate = false; - let nextHopProtocol: string | undefined = undefined; + let nextHopProtocol: string | undefined; if ( "requestStart" in entry && (entry as PerformanceResourceTiming).requestStart !== 0 diff --git a/site/src/hooks/useEmbeddedMetadata.test.ts b/site/src/hooks/useEmbeddedMetadata.test.ts index 316ab464a78de..60002381ac3ba 100644 --- a/site/src/hooks/useEmbeddedMetadata.test.ts +++ b/site/src/hooks/useEmbeddedMetadata.test.ts @@ -1,5 +1,3 @@ -import { act, renderHook } from "@testing-library/react"; -import type { Region, User } from "api/typesGenerated"; import { MockAppearanceConfig, MockBuildInfo, @@ -9,13 +7,15 @@ import { MockUserAppearanceSettings, MockUserOwner, } from "testHelpers/entities"; +import { act, renderHook } from "@testing-library/react"; +import type { Region, User } from "api/typesGenerated"; import { DEFAULT_METADATA_KEY, type MetadataKey, MetadataManager, type MetadataValue, - type RuntimeHtmlMetadata, makeUseEmbeddedMetadata, + type RuntimeHtmlMetadata, useEmbeddedMetadata, } from "./useEmbeddedMetadata"; diff --git a/site/src/hooks/usePaginatedQuery.test.ts b/site/src/hooks/usePaginatedQuery.test.ts index 6b15531d42135..bb62f2b4b2628 100644 --- a/site/src/hooks/usePaginatedQuery.test.ts +++ b/site/src/hooks/usePaginatedQuery.test.ts @@ -1,5 +1,5 @@ -import { waitFor } from "@testing-library/react"; import { renderHookWithAuth } from "testHelpers/hooks"; +import { waitFor } from "@testing-library/react"; import { type PaginatedData, type UsePaginatedQueryOptions, diff --git a/site/src/hooks/usePaginatedQuery.ts b/site/src/hooks/usePaginatedQuery.ts index e5a49a7245c75..200674d69c773 100644 --- a/site/src/hooks/usePaginatedQuery.ts +++ b/site/src/hooks/usePaginatedQuery.ts @@ -1,11 +1,11 @@ import clamp from "lodash/clamp"; import { useEffect } from "react"; import { + keepPreviousData, type QueryFunctionContext, type QueryKey, type UseQueryOptions, type UseQueryResult, - keepPreviousData, useQuery, useQueryClient, } from "react-query"; diff --git a/site/src/hooks/useSearchParamsKey.test.ts b/site/src/hooks/useSearchParamsKey.test.ts index 85c2ac25d74db..38117d402d4d0 100644 --- a/site/src/hooks/useSearchParamsKey.test.ts +++ b/site/src/hooks/useSearchParamsKey.test.ts @@ -1,5 +1,5 @@ -import { act, waitFor } from "@testing-library/react"; import { renderHookWithAuth } from "testHelpers/hooks"; +import { act, waitFor } from "@testing-library/react"; import { useSearchParamsKey } from "./useSearchParamsKey"; /** diff --git a/site/src/index.css b/site/src/index.css index 04b388a5cba99..854d0f4bf1cb1 100644 --- a/site/src/index.css +++ b/site/src/index.css @@ -34,7 +34,6 @@ --border-success: 142 76% 36%; --border-warning: 30.66, 97.16%, 72.35%; --border-destructive: 0 84% 60%; - --border-warning: 27 96% 61%; --border-hover: 240 5% 34%; --overlay-default: 240 5% 84% / 80%; --radius: 0.5rem; @@ -76,7 +75,6 @@ --border-success: 142 76% 36%; --border-warning: 30.66, 97.16%, 72.35%; --border-destructive: 0 91% 71%; - --border-warning: 31 97% 72%; --border-hover: 240, 5%, 34%; --overlay-default: 240 10% 4% / 80%; --highlight-purple: 252 95% 85%; @@ -104,8 +102,8 @@ https://github.com/radix-ui/primitives/issues/3251 */ html body[data-scroll-locked] { - --removed-body-scroll-bar-size: 0 !important; - margin-right: 0 !important; + --removed-body-scroll-bar-size: 0; + margin-right: 0; } /* Prevent layout shift when modals open by maintaining scrollbar width */ @@ -123,6 +121,6 @@ is likely to have set both overflow:hidden and padding-right. */ body[style*="overflow: hidden"][style*="padding-right"] { - padding-right: 0px !important; + padding-right: 0px; } } diff --git a/site/src/modules/apps/apps.test.ts b/site/src/modules/apps/apps.test.ts index e61b214a25385..96a1d1c686467 100644 --- a/site/src/modules/apps/apps.test.ts +++ b/site/src/modules/apps/apps.test.ts @@ -3,7 +3,7 @@ import { MockWorkspaceAgent, MockWorkspaceApp, } from "testHelpers/entities"; -import { SESSION_TOKEN_PLACEHOLDER, getAppHref } from "./apps"; +import { getAppHref, SESSION_TOKEN_PLACEHOLDER } from "./apps"; describe("getAppHref", () => { it("returns the URL without changes when external app has regular URL", () => { diff --git a/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx b/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx index faa46ab5142cd..2e7f77c336c7d 100644 --- a/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx +++ b/site/src/modules/builds/BuildAvatar/BuildAvatar.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceBuild } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { BuildAvatar } from "./BuildAvatar"; const meta: Meta = { diff --git a/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx b/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx index 34d67aa83ec16..84df0b97960f3 100644 --- a/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx +++ b/site/src/modules/dashboard/AnnouncementBanners/AnnouncementBannerView.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, css } from "@emotion/react"; +import { css, type Interpolation, type Theme } from "@emotion/react"; import { InlineMarkdown } from "components/Markdown/Markdown"; import type { FC } from "react"; import { readableForegroundColor } from "utils/colors"; diff --git a/site/src/modules/dashboard/DashboardLayout.test.tsx b/site/src/modules/dashboard/DashboardLayout.test.tsx index bc449a2156242..71e51825afc31 100644 --- a/site/src/modules/dashboard/DashboardLayout.test.tsx +++ b/site/src/modules/dashboard/DashboardLayout.test.tsx @@ -1,7 +1,7 @@ -import { screen } from "@testing-library/react"; -import { http, HttpResponse } from "msw"; import { renderWithAuth } from "testHelpers/renderHelpers"; import { server } from "testHelpers/server"; +import { screen } from "@testing-library/react"; +import { HttpResponse, http } from "msw"; import { DashboardLayout } from "./DashboardLayout"; test("Show the new Coder version notification", async () => { diff --git a/site/src/modules/dashboard/DashboardProvider.tsx b/site/src/modules/dashboard/DashboardProvider.tsx index 87340489d7023..c6bc31a788232 100644 --- a/site/src/modules/dashboard/DashboardProvider.tsx +++ b/site/src/modules/dashboard/DashboardProvider.tsx @@ -15,7 +15,7 @@ import { Loader } from "components/Loader/Loader"; import { useAuthenticated } from "hooks"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { canViewAnyOrganization } from "modules/permissions"; -import { type FC, type PropsWithChildren, createContext } from "react"; +import { createContext, type FC, type PropsWithChildren } from "react"; import { useQuery } from "react-query"; import { selectFeatureVisibility } from "./entitlements"; diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx index 6d8e4c98552b3..949aa0390e573 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.stories.tsx @@ -1,8 +1,8 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { DeploymentHealthUnhealthy, MockDeploymentStats, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DeploymentBannerView } from "./DeploymentBannerView"; const meta: Meta = { diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx index 60681db06102a..2c0732053fa20 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx @@ -1,5 +1,5 @@ import type { CSSInterpolation } from "@emotion/css/dist/declarations/src/create-instance"; -import { type Interpolation, type Theme, css, useTheme } from "@emotion/react"; +import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; import Button from "@mui/material/Button"; import Link from "@mui/material/Link"; import Tooltip from "@mui/material/Tooltip"; @@ -16,13 +16,16 @@ import { VSCodeIcon } from "components/Icons/VSCodeIcon"; import { Stack } from "components/Stack/Stack"; import dayjs from "dayjs"; import { type ClassName, useClassName } from "hooks/useClassName"; -import { CloudDownloadIcon } from "lucide-react"; -import { CloudUploadIcon } from "lucide-react"; -import { GitCompareArrowsIcon } from "lucide-react"; -import { GaugeIcon } from "lucide-react"; -import { AppWindowIcon } from "lucide-react"; -import { RotateCwIcon, WrenchIcon } from "lucide-react"; -import { CircleAlertIcon } from "lucide-react"; +import { + AppWindowIcon, + CircleAlertIcon, + CloudDownloadIcon, + CloudUploadIcon, + GaugeIcon, + GitCompareArrowsIcon, + RotateCwIcon, + WrenchIcon, +} from "lucide-react"; import prettyBytes from "pretty-bytes"; import { type FC, @@ -139,7 +142,7 @@ export const DeploymentBannerView: FC = ({ ) : ( - <>Status of your Coder deployment. Only visible for admins! + "Status of your Coder deployment. Only visible for admins!" ) } open={process.env.STORYBOOK === "true" ? true : undefined} diff --git a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx index 15046ebfd1cb2..faaf7c0e2275c 100644 --- a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx +++ b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { LicenseBannerView } from "./LicenseBannerView"; const meta: Meta = { diff --git a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx index f9d1f39b868ed..ee91ee81b2f76 100644 --- a/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx +++ b/site/src/modules/dashboard/LicenseBanner/LicenseBannerView.tsx @@ -1,8 +1,8 @@ import { type CSSObject, + css, type Interpolation, type Theme, - css, useTheme, } from "@emotion/react"; import Link from "@mui/material/Link"; diff --git a/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx b/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx index fe71c20d67fa3..b78e3a6954a58 100644 --- a/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx +++ b/site/src/modules/dashboard/Navbar/DeploymentDropdown.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, css, useTheme } from "@emotion/react"; +import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; import MenuItem from "@mui/material/MenuItem"; import { Button } from "components/Button/Button"; import { diff --git a/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx b/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx index 0a86742f485a9..d99a221e8ae97 100644 --- a/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx +++ b/site/src/modules/dashboard/Navbar/MobileMenu.stories.tsx @@ -1,7 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { PointerEventsCheckLevel } from "@testing-library/user-event"; -import type { FC } from "react"; -import { fn, userEvent, within } from "storybook/test"; import { MockPrimaryWorkspaceProxy, MockProxyLatencies, @@ -10,6 +6,10 @@ import { MockUserOwner, MockWorkspaceProxies, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { PointerEventsCheckLevel } from "@testing-library/user-event"; +import type { FC } from "react"; +import { fn, userEvent, within } from "storybook/test"; import { MobileMenu } from "./MobileMenu"; const meta: Meta = { diff --git a/site/src/modules/dashboard/Navbar/Navbar.test.tsx b/site/src/modules/dashboard/Navbar/Navbar.test.tsx index aa9a2c0400e10..2390d315ce9b5 100644 --- a/site/src/modules/dashboard/Navbar/Navbar.test.tsx +++ b/site/src/modules/dashboard/Navbar/Navbar.test.tsx @@ -1,12 +1,12 @@ -import { render, screen, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; import { App } from "App"; -import { http, HttpResponse } from "msw"; import { MockEntitlementsWithAuditLog, MockMemberPermissions, } from "testHelpers/entities"; import { server } from "testHelpers/server"; +import { render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { HttpResponse, http } from "msw"; /** * The LicenseBanner, mounted above the AppRouter, fetches entitlements. Thus, to test their diff --git a/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx b/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx index af6ba75ff38f4..786f595d32932 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx @@ -1,8 +1,8 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { userEvent, within } from "storybook/test"; import { chromaticWithTablet } from "testHelpers/chromatic"; import { MockUserMember, MockUserOwner } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { NavbarView } from "./NavbarView"; const meta: Meta = { diff --git a/site/src/modules/dashboard/Navbar/NavbarView.test.tsx b/site/src/modules/dashboard/Navbar/NavbarView.test.tsx index 4c43e6a0877f9..9d011089ba6c5 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.test.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.test.tsx @@ -1,8 +1,8 @@ +import { MockPrimaryWorkspaceProxy, MockUserOwner } from "testHelpers/entities"; +import { renderWithAuth } from "testHelpers/renderHelpers"; import { screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import type { ProxyContextValue } from "contexts/ProxyContext"; -import { MockPrimaryWorkspaceProxy, MockUserOwner } from "testHelpers/entities"; -import { renderWithAuth } from "testHelpers/renderHelpers"; import { NavbarView } from "./NavbarView"; const proxyContextValue: ProxyContextValue = { diff --git a/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx b/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx index e7b29284f7f6e..0adaef25eb14d 100644 --- a/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx +++ b/site/src/modules/dashboard/Navbar/ProxyMenu.stories.tsx @@ -1,9 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getAuthorizationKey } from "api/queries/authCheck"; -import { getPreferredProxy } from "contexts/ProxyContext"; -import { AuthProvider } from "contexts/auth/AuthProvider"; -import { permissionChecks } from "modules/permissions"; -import { fn, userEvent, within } from "storybook/test"; import { MockAuthMethodsAll, MockPermissions, @@ -12,6 +6,12 @@ import { MockWorkspaceProxies, } from "testHelpers/entities"; import { withDesktopViewport } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { getAuthorizationKey } from "api/queries/authCheck"; +import { AuthProvider } from "contexts/auth/AuthProvider"; +import { getPreferredProxy } from "contexts/ProxyContext"; +import { permissionChecks } from "modules/permissions"; +import { fn, userEvent, within } from "storybook/test"; import { ProxyMenu } from "./ProxyMenu"; const defaultProxyContextValue = { diff --git a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx index bb5c518e342f8..c5025a3f4d198 100644 --- a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx +++ b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { expect, screen, userEvent, waitFor, within } from "storybook/test"; import { MockBuildInfo, MockUserOwner } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, screen, userEvent, waitFor, within } from "storybook/test"; import { UserDropdown } from "./UserDropdown"; const meta: Meta = { diff --git a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx index 6a9018c4eeeca..daf1de5376f58 100644 --- a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx +++ b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.test.tsx @@ -1,7 +1,7 @@ -import { screen } from "@testing-library/react"; -import { Popover } from "components/deprecated/Popover/Popover"; import { MockUserOwner } from "testHelpers/entities"; import { render, waitForLoaderToBeRemoved } from "testHelpers/renderHelpers"; +import { screen } from "@testing-library/react"; +import { Popover } from "components/deprecated/Popover/Popover"; import { Language, UserDropdownContent } from "./UserDropdownContent"; describe("UserDropdownContent", () => { diff --git a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx index 99bd655b252f1..55b41bc3c65a5 100644 --- a/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx +++ b/site/src/modules/dashboard/Navbar/UserDropdown/UserDropdownContent.tsx @@ -1,8 +1,8 @@ import { type CSSObject, + css, type Interpolation, type Theme, - css, } from "@emotion/react"; import Divider from "@mui/material/Divider"; import MenuItem from "@mui/material/MenuItem"; @@ -10,15 +10,18 @@ import type { SvgIconProps } from "@mui/material/SvgIcon"; import Tooltip from "@mui/material/Tooltip"; import type * as TypesGen from "api/typesGenerated"; import { CopyButton } from "components/CopyButton/CopyButton"; +import { usePopover } from "components/deprecated/Popover/Popover"; import { ExternalImage } from "components/ExternalImage/ExternalImage"; import { Stack } from "components/Stack/Stack"; -import { usePopover } from "components/deprecated/Popover/Popover"; -import { BookOpenTextIcon } from "lucide-react"; -import { BugIcon } from "lucide-react"; -import { CircleUserIcon } from "lucide-react"; -import { LogOutIcon } from "lucide-react"; -import { MessageSquareIcon } from "lucide-react"; -import { MonitorDownIcon, SquareArrowOutUpRightIcon } from "lucide-react"; +import { + BookOpenTextIcon, + BugIcon, + CircleUserIcon, + LogOutIcon, + MessageSquareIcon, + MonitorDownIcon, + SquareArrowOutUpRightIcon, +} from "lucide-react"; import type { FC } from "react"; import { Link } from "react-router"; diff --git a/site/src/modules/dashboard/useUpdateCheck.test.tsx b/site/src/modules/dashboard/useUpdateCheck.test.tsx index c6ffe37cd94ba..f3ab00d434e75 100644 --- a/site/src/modules/dashboard/useUpdateCheck.test.tsx +++ b/site/src/modules/dashboard/useUpdateCheck.test.tsx @@ -1,9 +1,9 @@ +import { MockUpdateCheck } from "testHelpers/entities"; +import { server } from "testHelpers/server"; import { act, renderHook, waitFor } from "@testing-library/react"; -import { http, HttpResponse } from "msw"; +import { HttpResponse, http } from "msw"; import type { FC, PropsWithChildren } from "react"; import { QueryClient, QueryClientProvider } from "react-query"; -import { MockUpdateCheck } from "testHelpers/entities"; -import { server } from "testHelpers/server"; import { useUpdateCheck } from "./useUpdateCheck"; const createWrapper = (): FC => { diff --git a/site/src/modules/hooks/useSyncFormParameters.ts b/site/src/modules/hooks/useSyncFormParameters.ts index 4f6952331eaaf..dee1f5aef8ae6 100644 --- a/site/src/modules/hooks/useSyncFormParameters.ts +++ b/site/src/modules/hooks/useSyncFormParameters.ts @@ -1,7 +1,6 @@ import type * as TypesGen from "api/typesGenerated"; -import { useEffect, useRef } from "react"; - import type { PreviewParameter } from "api/typesGenerated"; +import { useEffect, useRef } from "react"; type UseSyncFormParametersProps = { parameters: readonly PreviewParameter[]; diff --git a/site/src/modules/management/DeploymentConfigProvider.tsx b/site/src/modules/management/DeploymentConfigProvider.tsx index ab3bfc7ddd124..51bacf22cdb2a 100644 --- a/site/src/modules/management/DeploymentConfigProvider.tsx +++ b/site/src/modules/management/DeploymentConfigProvider.tsx @@ -2,7 +2,7 @@ import type { DeploymentConfig } from "api/api"; import { deploymentConfig } from "api/queries/deployment"; import { ErrorAlert } from "components/Alert/ErrorAlert"; import { Loader } from "components/Loader/Loader"; -import { type FC, createContext, useContext } from "react"; +import { createContext, type FC, useContext } from "react"; import { useQuery } from "react-query"; import { Outlet } from "react-router"; diff --git a/site/src/modules/management/DeploymentSidebarView.stories.tsx b/site/src/modules/management/DeploymentSidebarView.stories.tsx index 65d2dca1349f7..a58268d9e7f58 100644 --- a/site/src/modules/management/DeploymentSidebarView.stories.tsx +++ b/site/src/modules/management/DeploymentSidebarView.stories.tsx @@ -1,10 +1,10 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockBuildInfo, MockNoPermissions, MockPermissions, } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DeploymentSidebarView } from "./DeploymentSidebarView"; const meta: Meta = { diff --git a/site/src/modules/management/OrganizationSettingsLayout.tsx b/site/src/modules/management/OrganizationSettingsLayout.tsx index fb0d0c722db51..edbe759e0d5fb 100644 --- a/site/src/modules/management/OrganizationSettingsLayout.tsx +++ b/site/src/modules/management/OrganizationSettingsLayout.tsx @@ -12,11 +12,11 @@ import { import { Loader } from "components/Loader/Loader"; import { useDashboard } from "modules/dashboard/useDashboard"; import { - type OrganizationPermissions, canViewOrganization, + type OrganizationPermissions, } from "modules/permissions/organizations"; import NotFoundPage from "pages/404Page/404Page"; -import { type FC, Suspense, createContext, useContext } from "react"; +import { createContext, type FC, Suspense, useContext } from "react"; import { useQuery } from "react-query"; import { Outlet, useParams } from "react-router"; diff --git a/site/src/modules/management/OrganizationSidebarView.stories.tsx b/site/src/modules/management/OrganizationSidebarView.stories.tsx index 37d2c9ab17c37..ab4c2486d37c8 100644 --- a/site/src/modules/management/OrganizationSidebarView.stories.tsx +++ b/site/src/modules/management/OrganizationSidebarView.stories.tsx @@ -1,6 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import type { Organization } from "api/typesGenerated"; -import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockNoOrganizationPermissions, MockNoPermissions, @@ -10,6 +7,9 @@ import { MockPermissions, } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import type { Organization } from "api/typesGenerated"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { OrganizationSidebarView } from "./OrganizationSidebarView"; const meta: Meta = { diff --git a/site/src/modules/management/OrganizationSidebarView.tsx b/site/src/modules/management/OrganizationSidebarView.tsx index 3f1d489afb343..5f7fb6dd3b993 100644 --- a/site/src/modules/management/OrganizationSidebarView.tsx +++ b/site/src/modules/management/OrganizationSidebarView.tsx @@ -163,60 +163,58 @@ const OrganizationSettingsNavigation: FC< OrganizationSettingsNavigationProps > = ({ organization, orgPermissions }) => { return ( - <> -
    - - Members +
    + + Members + + {orgPermissions.viewGroups && ( + + Groups - {orgPermissions.viewGroups && ( - - Groups - - )} - {orgPermissions.viewOrgRoles && ( - - Roles - - )} - {orgPermissions.viewProvisioners && - orgPermissions.viewProvisionerJobs && ( - <> - - Provisioners - - - Provisioner Keys - - - Provisioner Jobs - - - )} - {orgPermissions.viewIdpSyncSettings && ( - - IdP Sync - - )} - {orgPermissions.editSettings && ( - - Settings - + )} + {orgPermissions.viewOrgRoles && ( + + Roles + + )} + {orgPermissions.viewProvisioners && + orgPermissions.viewProvisionerJobs && ( + <> + + Provisioners + + + Provisioner Keys + + + Provisioner Jobs + + )} -
    - + {orgPermissions.viewIdpSyncSettings && ( + + IdP Sync + + )} + {orgPermissions.editSettings && ( + + Settings + + )} +
    ); }; diff --git a/site/src/modules/navigation.ts b/site/src/modules/navigation.ts index e6ec5a3096c3f..289b54a7b0fb6 100644 --- a/site/src/modules/navigation.ts +++ b/site/src/modules/navigation.ts @@ -22,7 +22,7 @@ function withFilter(path: string, filter: string) { export const linkToAuditing = "/audit"; -const linkToUsers = withFilter("/deployment/users", "status:active"); +const _linkToUsers = withFilter("/deployment/users", "status:active"); export const linkToTemplate = (organizationName: string, templateName: string): LinkThunk => diff --git a/site/src/modules/notifications/NotificationsInbox/InboxAvatar.tsx b/site/src/modules/notifications/NotificationsInbox/InboxAvatar.tsx index 9be8e2b9f74ad..4ca9085d8debc 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxAvatar.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxAvatar.tsx @@ -11,8 +11,8 @@ import { LayoutTemplateIcon, UserIcon, } from "lucide-react"; -import type { FC } from "react"; import type React from "react"; +import type { FC } from "react"; const InboxNotificationFallbackIcons = [ InboxNotificationFallbackIconAccount, diff --git a/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx b/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx index 4b031fe6a158a..1aff447b264b9 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxItem.stories.tsx @@ -1,6 +1,6 @@ +import { MockNotification } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, fn, userEvent, within } from "storybook/test"; -import { MockNotification } from "testHelpers/entities"; import { daysAgo } from "utils/time"; import { InboxItem } from "./InboxItem"; diff --git a/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx b/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx index 765f9b079a484..32432983335b1 100644 --- a/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/InboxPopover.stories.tsx @@ -1,6 +1,6 @@ +import { MockNotifications } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, fn, userEvent, within } from "storybook/test"; -import { MockNotifications } from "testHelpers/entities"; import { InboxPopover } from "./InboxPopover"; const meta: Meta = { diff --git a/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx b/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx index 78585beafa827..f042ece2662de 100644 --- a/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx +++ b/site/src/modules/notifications/NotificationsInbox/NotificationsInbox.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { MockNotifications, mockApiError } from "testHelpers/entities"; import { withGlobalSnackbar } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, fn, userEvent, waitFor, within } from "storybook/test"; import { NotificationsInbox } from "./NotificationsInbox"; const meta: Meta = { diff --git a/site/src/modules/notifications/utils.tsx b/site/src/modules/notifications/utils.tsx index c876c5b05d94f..273a68e013e65 100644 --- a/site/src/modules/notifications/utils.tsx +++ b/site/src/modules/notifications/utils.tsx @@ -1,5 +1,4 @@ -import { MailIcon } from "lucide-react"; -import { WebhookIcon } from "lucide-react"; +import { MailIcon, WebhookIcon } from "lucide-react"; // TODO: This should be provided by the auto generated types from codersdk const notificationMethods = ["smtp", "webhook"] as const; diff --git a/site/src/modules/provisioners/Provisioner.tsx b/site/src/modules/provisioners/Provisioner.tsx index 3f9e5d4cad296..35f335b1884c3 100644 --- a/site/src/modules/provisioners/Provisioner.tsx +++ b/site/src/modules/provisioners/Provisioner.tsx @@ -2,8 +2,7 @@ import { useTheme } from "@emotion/react"; import Tooltip from "@mui/material/Tooltip"; import type { HealthMessage, ProvisionerDaemon } from "api/typesGenerated"; import { Pill } from "components/Pill/Pill"; -import { Building2Icon } from "lucide-react"; -import { UserIcon } from "lucide-react"; +import { Building2Icon, UserIcon } from "lucide-react"; import type { FC } from "react"; import { createDayString } from "utils/createDayString"; import { ProvisionerTag } from "./ProvisionerTag"; diff --git a/site/src/modules/provisioners/ProvisionerAlert.stories.tsx b/site/src/modules/provisioners/ProvisionerAlert.stories.tsx index 2f1ae820d6abe..d2fd8ca9b35a4 100644 --- a/site/src/modules/provisioners/ProvisionerAlert.stories.tsx +++ b/site/src/modules/provisioners/ProvisionerAlert.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AlertVariant, ProvisionerAlert } from "./ProvisionerAlert"; const meta: Meta = { diff --git a/site/src/modules/provisioners/ProvisionerAlert.tsx b/site/src/modules/provisioners/ProvisionerAlert.tsx index 2d14237b414ed..a736e9a5b7104 100644 --- a/site/src/modules/provisioners/ProvisionerAlert.tsx +++ b/site/src/modules/provisioners/ProvisionerAlert.tsx @@ -1,7 +1,6 @@ import type { Theme } from "@emotion/react"; import AlertTitle from "@mui/material/AlertTitle"; -import { Alert, type AlertColor } from "components/Alert/Alert"; -import { AlertDetail } from "components/Alert/Alert"; +import { Alert, type AlertColor, AlertDetail } from "components/Alert/Alert"; import { ProvisionerTag } from "modules/provisioners/ProvisionerTag"; import type { FC } from "react"; diff --git a/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx b/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx index 9d012e7c5c38a..1ff98d35b6eef 100644 --- a/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx +++ b/site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateVersion } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AlertVariant } from "./ProvisionerAlert"; import { ProvisionerStatusAlert } from "./ProvisionerStatusAlert"; diff --git a/site/src/modules/resources/AgentApps/AgentApps.tsx b/site/src/modules/resources/AgentApps/AgentApps.tsx index 75793ef7a82c7..7f91f60f4efe8 100644 --- a/site/src/modules/resources/AgentApps/AgentApps.tsx +++ b/site/src/modules/resources/AgentApps/AgentApps.tsx @@ -1,5 +1,8 @@ -import type { WorkspaceApp } from "api/typesGenerated"; -import type { Workspace, WorkspaceAgent } from "api/typesGenerated"; +import type { + Workspace, + WorkspaceAgent, + WorkspaceApp, +} from "api/typesGenerated"; import { DropdownMenu, DropdownMenuContent, @@ -39,11 +42,9 @@ export const AgentApps: FC = ({ ) : ( - <> - {section.apps.map((app) => ( - - ))} - + section.apps.map((app) => ( + + )) ); }; @@ -68,7 +69,7 @@ type AgentAppSection = { export function organizeAgentApps( apps: readonly WorkspaceApp[], ): AgentAppSection[] { - let currentSection: AgentAppSection | undefined = undefined; + let currentSection: AgentAppSection | undefined; const appGroups: AgentAppSection[] = []; const groupsByName = new Map(); diff --git a/site/src/modules/resources/AgentDevcontainerCard.stories.tsx b/site/src/modules/resources/AgentDevcontainerCard.stories.tsx index c3e17d44eb0db..a06b4ba3ab8b4 100644 --- a/site/src/modules/resources/AgentDevcontainerCard.stories.tsx +++ b/site/src/modules/resources/AgentDevcontainerCard.stories.tsx @@ -1,5 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getPreferredProxy } from "contexts/ProxyContext"; import { chromatic } from "testHelpers/chromatic"; import { MockListeningPortsResponse, @@ -18,6 +16,8 @@ import { withDashboardProvider, withProxyProvider, } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { getPreferredProxy } from "contexts/ProxyContext"; import { AgentDevcontainerCard } from "./AgentDevcontainerCard"; const meta: Meta = { diff --git a/site/src/modules/resources/AgentDevcontainerCard.tsx b/site/src/modules/resources/AgentDevcontainerCard.tsx index 4f1f75feff539..25579c3c7803a 100644 --- a/site/src/modules/resources/AgentDevcontainerCard.tsx +++ b/site/src/modules/resources/AgentDevcontainerCard.tsx @@ -296,28 +296,26 @@ export const AgentDevcontainerCard: FC = ({ {showSubAgentApps && (
    - <> - {showVSCode && ( - - )} - {appSections.map((section, i) => ( - - ))} - + {showVSCode && ( + + )} + {appSections.map((section, i) => ( + + ))} {displayApps.includes("web_terminal") && ( = ({ return; } - let timeoutId: number | undefined = undefined; + let timeoutId: number | undefined; let activeSocket: OneWayWebSocket | null = null; let retries = 0; diff --git a/site/src/modules/resources/AgentOutdatedTooltip.tsx b/site/src/modules/resources/AgentOutdatedTooltip.tsx index c961def910589..03cf7ed6a7a3f 100644 --- a/site/src/modules/resources/AgentOutdatedTooltip.tsx +++ b/site/src/modules/resources/AgentOutdatedTooltip.tsx @@ -1,5 +1,6 @@ import { useTheme } from "@emotion/react"; import type { WorkspaceAgent } from "api/typesGenerated"; +import { PopoverTrigger } from "components/deprecated/Popover/Popover"; import { HelpTooltip, HelpTooltipAction, @@ -9,7 +10,6 @@ import { HelpTooltipTitle, } from "components/HelpTooltip/HelpTooltip"; import { Stack } from "components/Stack/Stack"; -import { PopoverTrigger } from "components/deprecated/Popover/Popover"; import { RotateCcwIcon } from "lucide-react"; import type { FC } from "react"; import { agentVersionStatus } from "../../utils/workspace"; diff --git a/site/src/modules/resources/AgentRow.stories.tsx b/site/src/modules/resources/AgentRow.stories.tsx index 6717c0e6043ab..abf4db3e295ae 100644 --- a/site/src/modules/resources/AgentRow.stories.tsx +++ b/site/src/modules/resources/AgentRow.stories.tsx @@ -1,7 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { API } from "api/api"; -import { getPreferredProxy } from "contexts/ProxyContext"; -import { spyOn, userEvent, within } from "storybook/test"; import { chromatic } from "testHelpers/chromatic"; import * as M from "testHelpers/entities"; import { @@ -9,6 +5,10 @@ import { withProxyProvider, withWebSocket, } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { API } from "api/api"; +import { getPreferredProxy } from "contexts/ProxyContext"; +import { spyOn, userEvent, within } from "storybook/test"; import { AgentRow } from "./AgentRow"; const defaultAgentMetadata = [ diff --git a/site/src/modules/resources/AgentRow.tsx b/site/src/modules/resources/AgentRow.tsx index 3cf757a15c2ab..495dd01f123f2 100644 --- a/site/src/modules/resources/AgentRow.tsx +++ b/site/src/modules/resources/AgentRow.tsx @@ -37,9 +37,9 @@ import { DownloadAgentLogsButton } from "./DownloadAgentLogsButton"; import { PortForwardButton } from "./PortForwardButton"; import { AgentSSHButton } from "./SSHButton/SSHButton"; import { TerminalLink } from "./TerminalLink/TerminalLink"; -import { VSCodeDesktopButton } from "./VSCodeDesktopButton/VSCodeDesktopButton"; import { useAgentContainers } from "./useAgentContainers"; import { useAgentLogs } from "./useAgentLogs"; +import { VSCodeDesktopButton } from "./VSCodeDesktopButton/VSCodeDesktopButton"; interface AgentRowProps { agent: WorkspaceAgent; @@ -335,7 +335,7 @@ export const AgentRow: FC = ({ Logs - +
    )} diff --git a/site/src/modules/resources/AgentRowPreview.stories.tsx b/site/src/modules/resources/AgentRowPreview.stories.tsx index e27c4f7a55c6e..8cd4f6bd7b78d 100644 --- a/site/src/modules/resources/AgentRowPreview.stories.tsx +++ b/site/src/modules/resources/AgentRowPreview.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceAgent, MockWorkspaceApp } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AgentRowPreview } from "./AgentRowPreview"; const meta: Meta = { diff --git a/site/src/modules/resources/AgentRowPreview.test.tsx b/site/src/modules/resources/AgentRowPreview.test.tsx index c1b876b72ef3b..23b34dc8c7fc8 100644 --- a/site/src/modules/resources/AgentRowPreview.test.tsx +++ b/site/src/modules/resources/AgentRowPreview.test.tsx @@ -1,11 +1,11 @@ +import { MockWorkspaceAgent } from "testHelpers/entities"; +import { renderComponent } from "testHelpers/renderHelpers"; import { screen } from "@testing-library/react"; import { type DisplayApp, DisplayApps, type WorkspaceAgent, } from "api/typesGenerated"; -import { MockWorkspaceAgent } from "testHelpers/entities"; -import { renderComponent } from "testHelpers/renderHelpers"; import { AgentRowPreview } from "./AgentRowPreview"; import { DisplayAppNameMap } from "./AppLink/AppLink"; diff --git a/site/src/modules/resources/AgentRowPreview.tsx b/site/src/modules/resources/AgentRowPreview.tsx index 70de1450322da..2df8b3a4d5460 100644 --- a/site/src/modules/resources/AgentRowPreview.tsx +++ b/site/src/modules/resources/AgentRowPreview.tsx @@ -93,10 +93,8 @@ export const AgentRowPreview: FC = ({ {/* We display all modules returned in agent.apps */} {agent.apps.map((app) => ( - <> - - {app.display_name} - + + {app.display_name} ))} {/* Additionally, we display any apps that are visible, e.g. diff --git a/site/src/modules/resources/AgentStatus.tsx b/site/src/modules/resources/AgentStatus.tsx index 7eb165d19f8c2..8f6b923e70d68 100644 --- a/site/src/modules/resources/AgentStatus.tsx +++ b/site/src/modules/resources/AgentStatus.tsx @@ -6,13 +6,13 @@ import type { WorkspaceAgentDevcontainer, } from "api/typesGenerated"; import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; +import { PopoverTrigger } from "components/deprecated/Popover/Popover"; import { HelpTooltip, HelpTooltipContent, HelpTooltipText, HelpTooltipTitle, } from "components/HelpTooltip/HelpTooltip"; -import { PopoverTrigger } from "components/deprecated/Popover/Popover"; import { TriangleAlertIcon } from "lucide-react"; import type { FC } from "react"; diff --git a/site/src/modules/resources/AppLink/AppLink.stories.tsx b/site/src/modules/resources/AppLink/AppLink.stories.tsx index 5ce9f6ff4ca1a..32e3ee47ebe40 100644 --- a/site/src/modules/resources/AppLink/AppLink.stories.tsx +++ b/site/src/modules/resources/AppLink/AppLink.stories.tsx @@ -1,5 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { getPreferredProxy } from "contexts/ProxyContext"; import { MockPrimaryWorkspaceProxy, MockWorkspace, @@ -8,6 +6,8 @@ import { MockWorkspaceProxies, } from "testHelpers/entities"; import { withGlobalSnackbar, withProxyProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { getPreferredProxy } from "contexts/ProxyContext"; import { AppLink } from "./AppLink"; const meta: Meta = { diff --git a/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx b/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx index e5627bac8dda1..bd3d823b7bc0d 100644 --- a/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx +++ b/site/src/modules/resources/DownloadAgentLogsButton.stories.tsx @@ -1,15 +1,14 @@ +import { MockWorkspaceAgent } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { agentLogsKey } from "api/queries/workspaces"; import type { WorkspaceAgentLog } from "api/typesGenerated"; import { expect, fn, userEvent, waitFor, within } from "storybook/test"; -import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; import { DownloadAgentLogsButton } from "./DownloadAgentLogsButton"; const meta: Meta = { title: "modules/resources/DownloadAgentLogsButton", component: DownloadAgentLogsButton, args: { - workspaceId: MockWorkspace.id, agent: MockWorkspaceAgent, }, parameters: { diff --git a/site/src/modules/resources/DownloadAgentLogsButton.tsx b/site/src/modules/resources/DownloadAgentLogsButton.tsx index fc7296b6c0ea0..7d27241f881df 100644 --- a/site/src/modules/resources/DownloadAgentLogsButton.tsx +++ b/site/src/modules/resources/DownloadAgentLogsButton.tsx @@ -8,13 +8,11 @@ import { type FC, useState } from "react"; import { useQueryClient } from "react-query"; type DownloadAgentLogsButtonProps = { - workspaceId: string; agent: Pick; download?: (file: Blob, filename: string) => void; }; export const DownloadAgentLogsButton: FC = ({ - workspaceId, agent, download = saveAs, }) => { diff --git a/site/src/modules/resources/PortForwardButton.stories.tsx b/site/src/modules/resources/PortForwardButton.stories.tsx index fbe1398fb69e7..daa7e2c4d78b8 100644 --- a/site/src/modules/resources/PortForwardButton.stories.tsx +++ b/site/src/modules/resources/PortForwardButton.stories.tsx @@ -1,5 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { userEvent, within } from "storybook/test"; import { MockListeningPortsResponse, MockSharedPortsResponse, @@ -8,6 +6,8 @@ import { MockWorkspaceAgent, } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { PortForwardButton } from "./PortForwardButton"; const meta: Meta = { diff --git a/site/src/modules/resources/PortForwardButton.tsx b/site/src/modules/resources/PortForwardButton.tsx index 52c46f151f522..665569904c870 100644 --- a/site/src/modules/resources/PortForwardButton.tsx +++ b/site/src/modules/resources/PortForwardButton.tsx @@ -26,6 +26,11 @@ import { WorkspaceAppSharingLevels, } from "api/typesGenerated"; import { Button } from "components/Button/Button"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "components/deprecated/Popover/Popover"; import { HelpTooltipLink, HelpTooltipText, @@ -38,11 +43,6 @@ import { TooltipProvider, TooltipTrigger, } from "components/Tooltip/Tooltip"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "components/deprecated/Popover/Popover"; import { useFormik } from "formik"; import { type ClassName, useClassName } from "hooks/useClassName"; import { diff --git a/site/src/modules/resources/PortForwardPopoverView.stories.tsx b/site/src/modules/resources/PortForwardPopoverView.stories.tsx index fb5efc6855f81..e1663f1db4590 100644 --- a/site/src/modules/resources/PortForwardPopoverView.stories.tsx +++ b/site/src/modules/resources/PortForwardPopoverView.stories.tsx @@ -1,5 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { userEvent, within } from "storybook/test"; import { MockListeningPortsResponse, MockSharedPortsResponse, @@ -7,6 +5,8 @@ import { MockWorkspace, MockWorkspaceAgent, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { userEvent, within } from "storybook/test"; import { PortForwardPopoverView } from "./PortForwardButton"; const meta: Meta = { diff --git a/site/src/modules/resources/PortForwardPopoverView.test.tsx b/site/src/modules/resources/PortForwardPopoverView.test.tsx index 94b0ca73d2296..80df2581b0fb2 100644 --- a/site/src/modules/resources/PortForwardPopoverView.test.tsx +++ b/site/src/modules/resources/PortForwardPopoverView.test.tsx @@ -1,5 +1,3 @@ -import { screen } from "@testing-library/react"; -import { QueryClientProvider } from "react-query"; import { MockListeningPortsResponse, MockTemplate, @@ -10,6 +8,8 @@ import { createTestQueryClient, renderComponent, } from "testHelpers/renderHelpers"; +import { screen } from "@testing-library/react"; +import { QueryClientProvider } from "react-query"; import { PortForwardPopoverView } from "./PortForwardButton"; describe("Port Forward Popover View", () => { diff --git a/site/src/modules/resources/ResourceAvatar.stories.tsx b/site/src/modules/resources/ResourceAvatar.stories.tsx index a6f244a49d00f..8ca3000eac161 100644 --- a/site/src/modules/resources/ResourceAvatar.stories.tsx +++ b/site/src/modules/resources/ResourceAvatar.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceResource } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ResourceAvatar } from "./ResourceAvatar"; const meta: Meta = { diff --git a/site/src/modules/resources/ResourceCard.stories.tsx b/site/src/modules/resources/ResourceCard.stories.tsx index 3eacd524aece9..c5885bebf79be 100644 --- a/site/src/modules/resources/ResourceCard.stories.tsx +++ b/site/src/modules/resources/ResourceCard.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceResource } from "testHelpers/entities"; import { withProxyProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AgentRowPreview } from "./AgentRowPreview"; import { ResourceCard } from "./ResourceCard"; diff --git a/site/src/modules/resources/ResourceCard.test.tsx b/site/src/modules/resources/ResourceCard.test.tsx index cca3f4288fb16..460caf51fbb33 100644 --- a/site/src/modules/resources/ResourceCard.test.tsx +++ b/site/src/modules/resources/ResourceCard.test.tsx @@ -1,7 +1,7 @@ -import { screen } from "@testing-library/react"; -import type { WorkspaceResourceMetadata } from "api/typesGenerated"; import { MockWorkspaceResource } from "testHelpers/entities"; import { renderComponent } from "testHelpers/renderHelpers"; +import { screen } from "@testing-library/react"; +import type { WorkspaceResourceMetadata } from "api/typesGenerated"; import { ResourceCard } from "./ResourceCard"; describe("Resource Card", () => { diff --git a/site/src/modules/resources/Resources.stories.tsx b/site/src/modules/resources/Resources.stories.tsx index 1e12c53a33855..0d8015f37e549 100644 --- a/site/src/modules/resources/Resources.stories.tsx +++ b/site/src/modules/resources/Resources.stories.tsx @@ -1,9 +1,9 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceResource, MockWorkspaceResourceMultipleAgents, } from "testHelpers/entities"; import { withProxyProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AgentRowPreview } from "./AgentRowPreview"; import { Resources } from "./Resources"; diff --git a/site/src/modules/resources/SSHButton/SSHButton.stories.tsx b/site/src/modules/resources/SSHButton/SSHButton.stories.tsx index 2f53dd03a5af7..2f57bfe461a87 100644 --- a/site/src/modules/resources/SSHButton/SSHButton.stories.tsx +++ b/site/src/modules/resources/SSHButton/SSHButton.stories.tsx @@ -1,12 +1,12 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { API } from "api/api"; -import { spyOn, userEvent, within } from "storybook/test"; import { MockDeploymentSSH, MockWorkspace, MockWorkspaceAgent, } from "testHelpers/entities"; import { withDesktopViewport } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { API } from "api/api"; +import { spyOn, userEvent, within } from "storybook/test"; import { AgentSSHButton } from "./SSHButton"; const meta: Meta = { diff --git a/site/src/modules/resources/SSHButton/SSHButton.tsx b/site/src/modules/resources/SSHButton/SSHButton.tsx index a1ac3c6819361..80ad1fa445600 100644 --- a/site/src/modules/resources/SSHButton/SSHButton.tsx +++ b/site/src/modules/resources/SSHButton/SSHButton.tsx @@ -2,17 +2,17 @@ import type { Interpolation, Theme } from "@emotion/react"; import { deploymentSSHConfig } from "api/queries/deployment"; import { Button } from "components/Button/Button"; import { CodeExample } from "components/CodeExample/CodeExample"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "components/deprecated/Popover/Popover"; import { HelpTooltipLink, HelpTooltipLinksGroup, HelpTooltipText, } from "components/HelpTooltip/HelpTooltip"; import { Stack } from "components/Stack/Stack"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "components/deprecated/Popover/Popover"; import { type ClassName, useClassName } from "hooks/useClassName"; import { ChevronDownIcon } from "lucide-react"; import type { FC } from "react"; diff --git a/site/src/modules/resources/SensitiveValue.tsx b/site/src/modules/resources/SensitiveValue.tsx index 626c7a8623291..b1ec1b4410e3e 100644 --- a/site/src/modules/resources/SensitiveValue.tsx +++ b/site/src/modules/resources/SensitiveValue.tsx @@ -1,4 +1,4 @@ -import { type Interpolation, type Theme, css } from "@emotion/react"; +import { css, type Interpolation, type Theme } from "@emotion/react"; import IconButton from "@mui/material/IconButton"; import Tooltip from "@mui/material/Tooltip"; import { CopyableValue } from "components/CopyableValue/CopyableValue"; diff --git a/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx b/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx index d5522e1daedaf..baef99efcb07e 100644 --- a/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx +++ b/site/src/modules/resources/TerminalLink/TerminalLink.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspace } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TerminalLink } from "./TerminalLink"; const meta: Meta = { diff --git a/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx b/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx index 3555ac0ce582b..477a40d106242 100644 --- a/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx +++ b/site/src/modules/resources/VSCodeDesktopButton/VSCodeDesktopButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { VSCodeDesktopButton } from "./VSCodeDesktopButton"; const meta: Meta = { diff --git a/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx b/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx index f8ae3a284e67a..f6cfd0850d7ed 100644 --- a/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx +++ b/site/src/modules/resources/VSCodeDevContainerButton/VSCodeDevContainerButton.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { VSCodeDevContainerButton } from "./VSCodeDevContainerButton"; const meta: Meta = { diff --git a/site/src/modules/resources/useAgentContainers.test.tsx b/site/src/modules/resources/useAgentContainers.test.tsx index 363f8d93223c8..f00f7b242b6e3 100644 --- a/site/src/modules/resources/useAgentContainers.test.tsx +++ b/site/src/modules/resources/useAgentContainers.test.tsx @@ -1,17 +1,17 @@ +import { + MockWorkspaceAgent, + MockWorkspaceAgentDevcontainer, +} from "testHelpers/entities"; +import { createTestQueryClient } from "testHelpers/renderHelpers"; +import { server } from "testHelpers/server"; import { renderHook, waitFor } from "@testing-library/react"; import * as API from "api/api"; import type { WorkspaceAgentListContainersResponse } from "api/typesGenerated"; import * as GlobalSnackbar from "components/GlobalSnackbar/utils"; -import { http, HttpResponse } from "msw"; +import { HttpResponse, http } from "msw"; import type { FC, PropsWithChildren } from "react"; import { act } from "react"; import { QueryClientProvider } from "react-query"; -import { - MockWorkspaceAgent, - MockWorkspaceAgentDevcontainer, -} from "testHelpers/entities"; -import { createTestQueryClient } from "testHelpers/renderHelpers"; -import { server } from "testHelpers/server"; import type { OneWayWebSocket } from "utils/OneWayWebSocket"; import { useAgentContainers } from "./useAgentContainers"; diff --git a/site/src/modules/resources/useAgentLogs.test.ts b/site/src/modules/resources/useAgentLogs.test.ts index 186087c871299..c4943c6f9d50f 100644 --- a/site/src/modules/resources/useAgentLogs.test.ts +++ b/site/src/modules/resources/useAgentLogs.test.ts @@ -1,7 +1,7 @@ +import { MockWorkspaceAgent } from "testHelpers/entities"; import { renderHook, waitFor } from "@testing-library/react"; import type { WorkspaceAgentLog } from "api/typesGenerated"; import WS from "jest-websocket-mock"; -import { MockWorkspaceAgent } from "testHelpers/entities"; import { useAgentLogs } from "./useAgentLogs"; /** diff --git a/site/src/modules/tableFiltering/options.tsx b/site/src/modules/tableFiltering/options.tsx index 9bc55744edb54..7b6964b5cd851 100644 --- a/site/src/modules/tableFiltering/options.tsx +++ b/site/src/modules/tableFiltering/options.tsx @@ -9,15 +9,15 @@ */ import { API } from "api/api"; import { Avatar } from "components/Avatar/Avatar"; +import { + type UseFilterMenuOptions, + useFilterMenu, +} from "components/Filter/menu"; import { SelectFilter, type SelectFilterOption, SelectFilterSearch, } from "components/Filter/SelectFilter"; -import { - type UseFilterMenuOptions, - useFilterMenu, -} from "components/Filter/menu"; import type { FC } from "react"; // Organization helpers //////////////////////////////////////////////////////// diff --git a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx index 8b235e2aa4641..775c82f806c37 100644 --- a/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx +++ b/site/src/modules/templates/TemplateExampleCard/TemplateExampleCard.stories.tsx @@ -1,9 +1,9 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateExample, MockTemplateExample2, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TemplateExampleCard } from "./TemplateExampleCard"; const meta: Meta = { diff --git a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx index bea0d1746b543..45191a2320a3f 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFileTree.stories.tsx @@ -1,6 +1,6 @@ +import { chromatic } from "testHelpers/chromatic"; import { useTheme } from "@emotion/react"; import type { Meta, StoryObj } from "@storybook/react-vite"; -import { chromatic } from "testHelpers/chromatic"; import type { FileTree } from "utils/filetree"; import { TemplateFileTree } from "./TemplateFileTree"; diff --git a/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx b/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx index e9fb48ca3fc1f..3a7adcfacf52c 100644 --- a/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx +++ b/site/src/modules/templates/TemplateFiles/TemplateFiles.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TemplateFiles } from "./TemplateFiles"; const exampleFiles = { diff --git a/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx b/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx index d2b74e4a3c733..9a0d1556e97ea 100644 --- a/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx +++ b/site/src/modules/templates/TemplateResourcesTable/TemplateResourcesTable.stories.tsx @@ -1,4 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceAgent, MockWorkspaceAgentConnecting, @@ -6,6 +5,7 @@ import { MockWorkspaceResource, MockWorkspaceVolumeResource, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { TemplateResourcesTable } from "./TemplateResourcesTable"; const meta: Meta = { diff --git a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx index e961d3bbc1803..ac627c6130565 100644 --- a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx +++ b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockPreviewParameter } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { DynamicParameter } from "./DynamicParameter"; const meta: Meta = { diff --git a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.test.tsx b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.test.tsx index e3bfd8dc80635..716fd26df4474 100644 --- a/site/src/modules/workspaces/DynamicParameter/DynamicParameter.test.tsx +++ b/site/src/modules/workspaces/DynamicParameter/DynamicParameter.test.tsx @@ -1,7 +1,7 @@ +import { render } from "testHelpers/renderHelpers"; import { act, fireEvent, screen, waitFor } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import type { PreviewParameter } from "api/typesGenerated"; -import { render } from "testHelpers/renderHelpers"; import { DynamicParameter } from "./DynamicParameter"; const createMockParameter = ( diff --git a/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx b/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx index c2f7da9aa21e5..3fbfc819b4f0a 100644 --- a/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceAppStatus/WorkspaceAppStatus.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceAppStatus } from "testHelpers/entities"; import { withProxyProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { WorkspaceAppStatus } from "./WorkspaceAppStatus"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx index 66a5a26f4066e..ec984417e9140 100644 --- a/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildData/WorkspaceBuildData.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockWorkspaceBuild } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { WorkspaceBuildData } from "./WorkspaceBuildData"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx index ed8f9bdd35fab..55ccc6ff6e6d7 100644 --- a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx @@ -1,6 +1,6 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockWorkspaceBuildLogs } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { WorkspaceBuildLogs } from "./WorkspaceBuildLogs"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx index 20c929406d32c..161efe260ed96 100644 --- a/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx +++ b/site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx @@ -54,7 +54,7 @@ export const WorkspaceBuildLogs: FC = ({ }) => { const theme = useTheme(); - const processedLogs = useMemo(() => { + const _processedLogs = useMemo(() => { const allLogs = logs || []; // Add synthetic overflow message if needed diff --git a/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx b/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx index 308b038f91d33..c7a159c0ce1f7 100644 --- a/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceDormantBadge/WorkspaceDormantBadge.stories.tsx @@ -1,6 +1,6 @@ +import { MockDormantWorkspace } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { userEvent, within } from "storybook/test"; -import { MockDormantWorkspace } from "testHelpers/entities"; import { WorkspaceDormantBadge } from "./WorkspaceDormantBadge"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx index 7f2df8cd9c072..7ff35868d0e75 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/ChangeWorkspaceVersionDialog.stories.tsx @@ -1,10 +1,10 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { templateVersionsQueryKey } from "api/queries/templates"; import { MockTemplateVersion, MockTemplateVersionWithMarkdownMessage, MockWorkspace, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { templateVersionsQueryKey } from "api/queries/templates"; import { ChangeWorkspaceVersionDialog } from "./ChangeWorkspaceVersionDialog"; const noMessage = { diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx index 9e27d1800d511..447a812399024 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/DownloadLogsDialog.stories.tsx @@ -1,8 +1,8 @@ +import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; +import { withDesktopViewport } from "testHelpers/storybook"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { agentLogsKey, buildLogsKey } from "api/queries/workspaces"; import { expect, fn, userEvent, waitFor, within } from "storybook/test"; -import { MockWorkspace, MockWorkspaceAgent } from "testHelpers/entities"; -import { withDesktopViewport } from "testHelpers/storybook"; import { DownloadLogsDialog } from "./DownloadLogsDialog"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx index dfee8134af496..b5fcd44b7c9c8 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceDeleteDialog.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockFailedWorkspace, MockWorkspace } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { daysAgo } from "utils/time"; import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx index 8e7b9e33b93d2..ca0e9803336e2 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/WorkspaceMoreActions.tsx @@ -1,6 +1,5 @@ import { MissingBuildParameters, ParameterValidationError } from "api/api"; -import { isApiError } from "api/errors"; -import { type ApiError, getErrorMessage } from "api/errors"; +import { type ApiError, getErrorMessage, isApiError } from "api/errors"; import { changeVersion, deleteWorkspace, @@ -32,8 +31,8 @@ import { ChangeWorkspaceVersionDialog } from "./ChangeWorkspaceVersionDialog"; import { DownloadLogsDialog } from "./DownloadLogsDialog"; import { UpdateBuildParametersDialog } from "./UpdateBuildParametersDialog"; import { UpdateBuildParametersDialogExperimental } from "./UpdateBuildParametersDialogExperimental"; -import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; import { useWorkspaceDuplication } from "./useWorkspaceDuplication"; +import { WorkspaceDeleteDialog } from "./WorkspaceDeleteDialog"; type WorkspaceMoreActionsProps = { workspace: Workspace; diff --git a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.test.tsx b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.test.tsx index 8e06e10136f92..d0e7af6d1aafd 100644 --- a/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.test.tsx +++ b/site/src/modules/workspaces/WorkspaceMoreActions/useWorkspaceDuplication.test.tsx @@ -1,10 +1,10 @@ -import { act, waitFor } from "@testing-library/react"; -import type { Workspace } from "api/typesGenerated"; import * as M from "testHelpers/entities"; import { type GetLocationSnapshot, renderHookWithAuth, } from "testHelpers/hooks"; +import { act, waitFor } from "@testing-library/react"; +import type { Workspace } from "api/typesGenerated"; import CreateWorkspacePage from "../../../pages/CreateWorkspacePage/CreateWorkspacePage"; import { useWorkspaceDuplication } from "./useWorkspaceDuplication"; diff --git a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx index 92d1a8e30c899..fc0a28815752b 100644 --- a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.stories.tsx @@ -1,11 +1,11 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { expect, userEvent, waitFor, within } from "storybook/test"; import { MockTemplate, MockTemplateVersion, MockWorkspace, } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, waitFor, within } from "storybook/test"; import { WorkspaceOutdatedTooltip } from "./WorkspaceOutdatedTooltip"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx index b79183acd7471..e1e83d502781a 100644 --- a/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx +++ b/site/src/modules/workspaces/WorkspaceOutdatedTooltip/WorkspaceOutdatedTooltip.tsx @@ -4,6 +4,7 @@ import Skeleton from "@mui/material/Skeleton"; import { getErrorDetail, getErrorMessage } from "api/errors"; import { templateVersion } from "api/queries/templates"; import type { Workspace } from "api/typesGenerated"; +import { usePopover } from "components/deprecated/Popover/Popover"; import { displayError } from "components/GlobalSnackbar/utils"; import { HelpTooltip, @@ -14,15 +15,13 @@ import { HelpTooltipTitle, HelpTooltipTrigger, } from "components/HelpTooltip/HelpTooltip"; -import { usePopover } from "components/deprecated/Popover/Popover"; -import { InfoIcon } from "lucide-react"; -import { RotateCcwIcon } from "lucide-react"; +import { InfoIcon, RotateCcwIcon } from "lucide-react"; import { linkToTemplate, useLinks } from "modules/navigation"; import type { FC } from "react"; import { useQuery } from "react-query"; import { - WorkspaceUpdateDialogs, useWorkspaceUpdate, + WorkspaceUpdateDialogs, } from "../WorkspaceUpdateDialogs"; interface TooltipProps { diff --git a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx index 0b4bf3d9d881e..61dd592886c9d 100644 --- a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.stories.tsx @@ -1,6 +1,6 @@ +import { MockWorkspace } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import type { Workspace, WorkspaceStatus } from "api/typesGenerated"; -import { MockWorkspace } from "testHelpers/entities"; import { WorkspaceStatusIndicator } from "./WorkspaceStatusIndicator"; const meta: Meta = { diff --git a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx index 972096314e1ee..c7e9e53ba8ff5 100644 --- a/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx +++ b/site/src/modules/workspaces/WorkspaceStatusIndicator/WorkspaceStatusIndicator.tsx @@ -10,8 +10,8 @@ import { TooltipProvider, TooltipTrigger, } from "components/Tooltip/Tooltip"; -import type { FC } from "react"; import type React from "react"; +import type { FC } from "react"; import { type DisplayWorkspaceStatusType, getDisplayWorkspaceStatus, diff --git a/site/src/modules/workspaces/WorkspaceTiming/Chart/Bar.tsx b/site/src/modules/workspaces/WorkspaceTiming/Chart/Bar.tsx index 2c3a1bf28b152..b76aa11a9883a 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/Chart/Bar.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/Chart/Bar.tsx @@ -1,5 +1,5 @@ import type { Interpolation, Theme } from "@emotion/react"; -import { type ButtonHTMLAttributes, type HTMLProps, forwardRef } from "react"; +import { type ButtonHTMLAttributes, forwardRef, type HTMLProps } from "react"; export type BarColors = { stroke: string; diff --git a/site/src/modules/workspaces/WorkspaceTiming/Chart/XAxis.tsx b/site/src/modules/workspaces/WorkspaceTiming/Chart/XAxis.tsx index 82c385e533802..c7409f5238522 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/Chart/XAxis.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/Chart/XAxis.tsx @@ -93,7 +93,7 @@ export const XAxisRow: FC = ({ yAxisLabelId, ...htmlProps }) => { }; return ( -
    { for (const s of scales) { diff --git a/site/src/modules/workspaces/WorkspaceTiming/ResourcesChart.tsx b/site/src/modules/workspaces/WorkspaceTiming/ResourcesChart.tsx index 8384d8c60857b..f2757ee48e5c0 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/ResourcesChart.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/ResourcesChart.tsx @@ -11,6 +11,14 @@ import { ChartToolbar, } from "./Chart/Chart"; import { Tooltip, TooltipLink, TooltipTitle } from "./Chart/Tooltip"; +import { + calcDuration, + calcOffset, + formatTime, + makeTicks, + mergeTimeRanges, + type TimeRange, +} from "./Chart/utils"; import { XAxis, XAxisRow, XAxisSection } from "./Chart/XAxis"; import { YAxis, @@ -19,14 +27,6 @@ import { YAxisLabels, YAxisSection, } from "./Chart/YAxis"; -import { - type TimeRange, - calcDuration, - calcOffset, - formatTime, - makeTicks, - mergeTimeRanges, -} from "./Chart/utils"; import type { Stage } from "./StagesChart"; type ResourceTiming = { diff --git a/site/src/modules/workspaces/WorkspaceTiming/ScriptsChart.tsx b/site/src/modules/workspaces/WorkspaceTiming/ScriptsChart.tsx index 3756589a8056a..d0f6ac6045383 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/ScriptsChart.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/ScriptsChart.tsx @@ -11,6 +11,14 @@ import { ChartToolbar, } from "./Chart/Chart"; import { Tooltip, TooltipTitle } from "./Chart/Tooltip"; +import { + calcDuration, + calcOffset, + formatTime, + makeTicks, + mergeTimeRanges, + type TimeRange, +} from "./Chart/utils"; import { XAxis, XAxisRow, XAxisSection } from "./Chart/XAxis"; import { YAxis, @@ -19,14 +27,6 @@ import { YAxisLabels, YAxisSection, } from "./Chart/YAxis"; -import { - type TimeRange, - calcDuration, - calcOffset, - formatTime, - makeTicks, - mergeTimeRanges, -} from "./Chart/utils"; import type { Stage } from "./StagesChart"; type ScriptTiming = { diff --git a/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx b/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx index c9e9f8d3a71b2..103d4717f20c6 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/StagesChart.tsx @@ -1,7 +1,6 @@ import type { Interpolation, Theme } from "@emotion/react"; import type { TimingStage } from "api/typesGenerated"; -import { CircleAlertIcon } from "lucide-react"; -import { InfoIcon } from "lucide-react"; +import { CircleAlertIcon, InfoIcon } from "lucide-react"; import type { FC } from "react"; import { Bar, ClickableBar } from "./Chart/Bar"; import { Blocks } from "./Chart/Blocks"; @@ -12,6 +11,14 @@ import { TooltipShortDescription, TooltipTitle, } from "./Chart/Tooltip"; +import { + calcDuration, + calcOffset, + formatTime, + makeTicks, + mergeTimeRanges, + type TimeRange, +} from "./Chart/utils"; import { XAxis, XAxisRow, XAxisSection } from "./Chart/XAxis"; import { YAxis, @@ -20,14 +27,6 @@ import { YAxisLabels, YAxisSection, } from "./Chart/YAxis"; -import { - type TimeRange, - calcDuration, - calcOffset, - formatTime, - makeTicks, - mergeTimeRanges, -} from "./Chart/utils"; export type Stage = { /** diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx index 6b7de2d76bbf3..9c8ce12168631 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.stories.tsx @@ -1,8 +1,8 @@ +import { chromatic } from "testHelpers/chromatic"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, userEvent, waitFor, within } from "storybook/test"; -import { chromatic } from "testHelpers/chromatic"; -import { WorkspaceTimings } from "./WorkspaceTimings"; import { WorkspaceTimingsResponse } from "./storybookData"; +import { WorkspaceTimings } from "./WorkspaceTimings"; const meta: Meta = { title: "modules/workspaces/WorkspaceTimings", diff --git a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx index 8b3f42c7b93e3..847b531949c00 100644 --- a/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx +++ b/site/src/modules/workspaces/WorkspaceTiming/WorkspaceTimings.tsx @@ -12,18 +12,18 @@ import uniqBy from "lodash/uniqBy"; import { ChevronDownIcon, ChevronUpIcon } from "lucide-react"; import { type FC, useState } from "react"; import { - type TimeRange, calcDuration, formatTime, mergeTimeRanges, + type TimeRange, } from "./Chart/utils"; -import { ResourcesChart, isCoderResource } from "./ResourcesChart"; +import { isCoderResource, ResourcesChart } from "./ResourcesChart"; import { ScriptsChart } from "./ScriptsChart"; import { - type Stage, - StagesChart, agentStages, provisioningStages, + type Stage, + StagesChart, } from "./StagesChart"; type TimingView = @@ -218,7 +218,7 @@ const toTimeRange = (timing: { }; }; -const humanizeDuration = (durationMs: number): string => { +const _humanizeDuration = (durationMs: number): string => { const seconds = Math.floor(durationMs / 1000); const minutes = Math.floor(seconds / 60); const hours = Math.floor(minutes / 60); diff --git a/site/src/modules/workspaces/generateWorkspaceName.ts b/site/src/modules/workspaces/generateWorkspaceName.ts index 00a6542180963..6f62bc3017fee 100644 --- a/site/src/modules/workspaces/generateWorkspaceName.ts +++ b/site/src/modules/workspaces/generateWorkspaceName.ts @@ -1,7 +1,7 @@ import { - NumberDictionary, animals, colors, + NumberDictionary, uniqueNamesGenerator, } from "unique-names-generator"; diff --git a/site/src/pages/AuditPage/AuditFilter.tsx b/site/src/pages/AuditPage/AuditFilter.tsx index c625a7d60797e..973d2d7a8e7ba 100644 --- a/site/src/pages/AuditPage/AuditFilter.tsx +++ b/site/src/pages/AuditPage/AuditFilter.tsx @@ -1,14 +1,14 @@ import { AuditActions, ResourceTypes } from "api/typesGenerated"; import { Filter, MenuSkeleton, type useFilter } from "components/Filter/Filter"; +import { + type UseFilterMenuOptions, + useFilterMenu, +} from "components/Filter/menu"; import { SelectFilter, type SelectFilterOption, } from "components/Filter/SelectFilter"; import { type UserFilterMenu, UserMenu } from "components/Filter/UserFilter"; -import { - type UseFilterMenuOptions, - useFilterMenu, -} from "components/Filter/menu"; import capitalize from "lodash/capitalize"; import { type OrganizationsFilterMenu, diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx index 8b5ecef7a09a1..8abf5442eb9cf 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogDescription/AuditLogDescription.stories.tsx @@ -1,4 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockAuditLog, MockAuditLogRequestPasswordReset, @@ -7,6 +6,7 @@ import { MockAuditLogWithWorkspaceBuild, MockWorkspaceCreateAuditLogForDifferentOwner, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AuditLogDescription } from "./AuditLogDescription"; const meta: Meta = { diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx index cb059c7a1cbaf..03ccfcf38dbae 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.stories.tsx @@ -1,10 +1,3 @@ -import Table from "@mui/material/Table"; -import TableBody from "@mui/material/TableBody"; -import TableCell from "@mui/material/TableCell"; -import TableContainer from "@mui/material/TableContainer"; -import TableHead from "@mui/material/TableHead"; -import TableRow from "@mui/material/TableRow"; -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockAuditLog, @@ -15,6 +8,13 @@ import { MockAuditLogWithWorkspaceBuild, MockUserOwner, } from "testHelpers/entities"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableContainer from "@mui/material/TableContainer"; +import TableHead from "@mui/material/TableHead"; +import TableRow from "@mui/material/TableRow"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { AuditLogRow } from "./AuditLogRow"; const meta: Meta = { diff --git a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx index b88ec000719c5..9661fbab59e75 100644 --- a/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx +++ b/site/src/pages/AuditPage/AuditLogRow/AuditLogRow.tsx @@ -9,8 +9,7 @@ import { DropdownArrow } from "components/DropdownArrow/DropdownArrow"; import { Stack } from "components/Stack/Stack"; import { StatusPill } from "components/StatusPill/StatusPill"; import { TimelineEntry } from "components/Timeline/TimelineEntry"; -import { InfoIcon } from "lucide-react"; -import { NetworkIcon } from "lucide-react"; +import { InfoIcon, NetworkIcon } from "lucide-react"; import { type FC, useState } from "react"; import { Link as RouterLink } from "react-router"; import userAgentParser from "ua-parser-js"; diff --git a/site/src/pages/AuditPage/AuditPage.test.tsx b/site/src/pages/AuditPage/AuditPage.test.tsx index 80f6e74ae1a26..ea7e5d9c44f06 100644 --- a/site/src/pages/AuditPage/AuditPage.test.tsx +++ b/site/src/pages/AuditPage/AuditPage.test.tsx @@ -1,9 +1,3 @@ -import { screen, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { API } from "api/api"; -import type { AuditLogsRequest } from "api/typesGenerated"; -import { DEFAULT_RECORDS_PER_PAGE } from "components/PaginationWidget/utils"; -import { http, HttpResponse } from "msw"; import { MockAuditLog, MockAuditLog2, @@ -14,6 +8,12 @@ import { waitForLoaderToBeRemoved, } from "testHelpers/renderHelpers"; import { server } from "testHelpers/server"; +import { screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { API } from "api/api"; +import type { AuditLogsRequest } from "api/typesGenerated"; +import { DEFAULT_RECORDS_PER_PAGE } from "components/PaginationWidget/utils"; +import { HttpResponse, http } from "msw"; import * as CreateDayString from "utils/createDayString"; import AuditPage from "./AuditPage"; diff --git a/site/src/pages/AuditPage/AuditPageView.stories.tsx b/site/src/pages/AuditPage/AuditPageView.stories.tsx index 96ab7f7456a3c..29715db05280b 100644 --- a/site/src/pages/AuditPage/AuditPageView.stories.tsx +++ b/site/src/pages/AuditPage/AuditPageView.stories.tsx @@ -1,7 +1,14 @@ +import { chromaticWithTablet } from "testHelpers/chromatic"; +import { + MockAuditLog, + MockAuditLog2, + MockAuditLog3, + MockUserOwner, +} from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { - MockMenu, getDefaultFilterProps, + MockMenu, } from "components/Filter/storyHelpers"; import { mockInitialRenderResult, @@ -9,13 +16,6 @@ import { } from "components/PaginationWidget/PaginationContainer.mocks"; import type { UsePaginatedQueryResult } from "hooks/usePaginatedQuery"; import type { ComponentProps } from "react"; -import { chromaticWithTablet } from "testHelpers/chromatic"; -import { - MockAuditLog, - MockAuditLog2, - MockAuditLog3, - MockUserOwner, -} from "testHelpers/entities"; import { AuditPageView } from "./AuditPageView"; type FilterProps = ComponentProps["filterProps"]; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx index 9d049c4e6865b..fcf1efeb7dda0 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogFilter.tsx @@ -1,14 +1,14 @@ import { ConnectionLogStatuses, ConnectionTypes } from "api/typesGenerated"; import { Filter, MenuSkeleton, type useFilter } from "components/Filter/Filter"; +import { + type UseFilterMenuOptions, + useFilterMenu, +} from "components/Filter/menu"; import { SelectFilter, type SelectFilterOption, } from "components/Filter/SelectFilter"; import { type UserFilterMenu, UserMenu } from "components/Filter/UserFilter"; -import { - type UseFilterMenuOptions, - useFilterMenu, -} from "components/Filter/menu"; import capitalize from "lodash/capitalize"; import { type OrganizationsFilterMenu, diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx index 7beea3f033e30..2ce25e5a33369 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx @@ -1,8 +1,3 @@ -import { screen, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { API } from "api/api"; -import { DEFAULT_RECORDS_PER_PAGE } from "components/PaginationWidget/utils"; -import { http, HttpResponse } from "msw"; import { MockConnectedSSHConnectionLog, MockDisconnectedSSHConnectionLog, @@ -13,6 +8,11 @@ import { waitForLoaderToBeRemoved, } from "testHelpers/renderHelpers"; import { server } from "testHelpers/server"; +import { screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { API } from "api/api"; +import { DEFAULT_RECORDS_PER_PAGE } from "components/PaginationWidget/utils"; +import { HttpResponse, http } from "msw"; import * as CreateDayString from "utils/createDayString"; import ConnectionLogPage from "./ConnectionLogPage"; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx index 444c38ab14287..7376a75daec4a 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPageView.stories.tsx @@ -1,7 +1,13 @@ +import { chromaticWithTablet } from "testHelpers/chromatic"; +import { + MockConnectedSSHConnectionLog, + MockDisconnectedSSHConnectionLog, + MockUserOwner, +} from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { - MockMenu, getDefaultFilterProps, + MockMenu, } from "components/Filter/storyHelpers"; import { mockInitialRenderResult, @@ -9,12 +15,6 @@ import { } from "components/PaginationWidget/PaginationContainer.mocks"; import type { UsePaginatedQueryResult } from "hooks/usePaginatedQuery"; import type { ComponentProps } from "react"; -import { chromaticWithTablet } from "testHelpers/chromatic"; -import { - MockConnectedSSHConnectionLog, - MockDisconnectedSSHConnectionLog, - MockUserOwner, -} from "testHelpers/entities"; import { ConnectionLogPageView } from "./ConnectionLogPageView"; type FilterProps = ComponentProps["filterProps"]; diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx index 004e466147c50..1354960c7894f 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogDescription/ConnectionLogDescription.stories.tsx @@ -1,8 +1,8 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockConnectedSSHConnectionLog, MockWebConnectionLog, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { ConnectionLogDescription } from "./ConnectionLogDescription"; const meta: Meta = { diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx index 73ed836f7d470..03833917e5bf4 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.stories.tsx @@ -1,11 +1,11 @@ -import TableContainer from "@mui/material/TableContainer"; -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { Table, TableBody } from "components/Table/Table"; import { MockConnectedSSHConnectionLog, MockDisconnectedSSHConnectionLog, MockWebConnectionLog, } from "testHelpers/entities"; +import TableContainer from "@mui/material/TableContainer"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { Table, TableBody } from "components/Table/Table"; import { ConnectionLogRow } from "./ConnectionLogRow"; const meta: Meta = { diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx index b3936a3a2850b..f66afde786e5f 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogRow/ConnectionLogRow.tsx @@ -7,8 +7,7 @@ import { Avatar } from "components/Avatar/Avatar"; import { Stack } from "components/Stack/Stack"; import { StatusPill } from "components/StatusPill/StatusPill"; import { TimelineEntry } from "components/Timeline/TimelineEntry"; -import { InfoIcon } from "lucide-react"; -import { NetworkIcon } from "lucide-react"; +import { InfoIcon, NetworkIcon } from "lucide-react"; import type { FC } from "react"; import { Link as RouterLink } from "react-router"; import userAgentParser from "ua-parser-js"; diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx index 0be2557856dbd..48f545ea1c3f2 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPage.test.tsx @@ -1,13 +1,13 @@ -import { render, screen } from "@testing-library/react"; import { AppProviders } from "App"; -import { RequireAuth } from "contexts/auth/RequireAuth"; -import { http, HttpResponse } from "msw"; -import { RouterProvider, createMemoryRouter } from "react-router"; import { MockTemplateExample, MockTemplateExample2, } from "testHelpers/entities"; import { server } from "testHelpers/server"; +import { render, screen } from "@testing-library/react"; +import { RequireAuth } from "contexts/auth/RequireAuth"; +import { HttpResponse, http } from "msw"; +import { createMemoryRouter, RouterProvider } from "react-router"; import CreateTemplateGalleryPage from "./CreateTemplateGalleryPage"; test("displays the scratch template", async () => { diff --git a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx index 2496f2a335465..b406daeb932d4 100644 --- a/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx +++ b/site/src/pages/CreateTemplateGalleryPage/CreateTemplateGalleryPageView.stories.tsx @@ -1,10 +1,10 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplateExample, MockTemplateExample2, mockApiError, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { getTemplatesByTag } from "utils/starterTemplates"; import { CreateTemplateGalleryPageView } from "./CreateTemplateGalleryPageView"; diff --git a/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx b/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx index 890bc4af96fb0..3febfa23d9314 100644 --- a/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx +++ b/site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx @@ -1,11 +1,11 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { JobError } from "api/queries/templates"; import { MockProvisionerJob, MockTemplateVersion, MockWorkspaceBuildLogs, } from "testHelpers/entities"; import { withWebSocket } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { JobError } from "api/queries/templates"; import { BuildLogsDrawer } from "./BuildLogsDrawer"; const meta: Meta = { diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx index a9dfd6de3b4c4..17167ef79fdb7 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.stories.tsx @@ -1,10 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { - getProvisionerDaemonsKey, - organizationsKey, -} from "api/queries/organizations"; -import { action } from "storybook/actions"; -import { screen, userEvent } from "storybook/test"; import { MockDefaultOrganization, MockOrganization2, @@ -16,6 +9,13 @@ import { MockTemplateVersionVariable4, MockTemplateVersionVariable5, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { + getProvisionerDaemonsKey, + organizationsKey, +} from "api/queries/organizations"; +import { action } from "storybook/actions"; +import { screen, userEvent } from "storybook/test"; import { CreateTemplateForm } from "./CreateTemplateForm"; const meta: Meta = { diff --git a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx index ba5a76f6b4e2f..ddd967554134b 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplateForm.tsx @@ -38,9 +38,9 @@ import { onChangeTrimmed, } from "utils/formUtils"; import { + sortedDays, type TemplateAutostartRequirementDaysValue, type TemplateAutostopRequirementDaysValue, - sortedDays, } from "utils/schedule"; import * as Yup from "yup"; import { TemplateUpload, type TemplateUploadProps } from "./TemplateUpload"; diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx index 2677f67d8df10..e403eab8bcb24 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.test.tsx @@ -1,6 +1,3 @@ -import { fireEvent, screen, waitFor, within } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { API } from "api/api"; import { MockTemplate, MockTemplateExample, @@ -11,6 +8,9 @@ import { mockApiError, } from "testHelpers/entities"; import { renderWithAuth } from "testHelpers/renderHelpers"; +import { fireEvent, screen, waitFor, within } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { API } from "api/api"; import CreateTemplatePage from "./CreateTemplatePage"; const renderPage = async (searchParams: URLSearchParams) => { diff --git a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx index f4b37209609fc..af71c1686e40d 100644 --- a/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx +++ b/site/src/pages/CreateTemplatePage/CreateTemplatePage.tsx @@ -10,8 +10,8 @@ import { pageTitle } from "utils/page"; import { BuildLogsDrawer } from "./BuildLogsDrawer"; import { DuplicateTemplateView } from "./DuplicateTemplateView"; import { ImportStarterTemplateView } from "./ImportStarterTemplateView"; -import { UploadTemplateView } from "./UploadTemplateView"; import type { CreateTemplatePageViewProps } from "./types"; +import { UploadTemplateView } from "./UploadTemplateView"; const CreateTemplatePage: FC = () => { const navigate = useNavigate(); diff --git a/site/src/pages/CreateTokenPage/CreateTokenForm.tsx b/site/src/pages/CreateTokenPage/CreateTokenForm.tsx index 117994ff8489a..be8fd4614f20f 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenForm.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenForm.tsx @@ -18,10 +18,10 @@ import { useNavigate } from "react-router"; import { getFormHelpers, onChangeTrimmed } from "utils/formUtils"; import { type CreateTokenData, - NANO_HOUR, customLifetimeDay, determineDefaultLtValue, filterByMaxTokenLifetime, + NANO_HOUR, } from "./utils"; dayjs.extend(utc); diff --git a/site/src/pages/CreateTokenPage/CreateTokenPage.test.tsx b/site/src/pages/CreateTokenPage/CreateTokenPage.test.tsx index 59bda3d458014..042b09bf24dff 100644 --- a/site/src/pages/CreateTokenPage/CreateTokenPage.test.tsx +++ b/site/src/pages/CreateTokenPage/CreateTokenPage.test.tsx @@ -1,10 +1,10 @@ -import { screen, within } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { API } from "api/api"; import { renderWithAuth, waitForLoaderToBeRemoved, } from "testHelpers/renderHelpers"; +import { screen, within } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { API } from "api/api"; import CreateTokenPage from "./CreateTokenPage"; describe("TokenPage", () => { diff --git a/site/src/pages/CreateTokenPage/utils.test.tsx b/site/src/pages/CreateTokenPage/utils.test.tsx index a8cfbbd855e96..b09e72a812f7d 100644 --- a/site/src/pages/CreateTokenPage/utils.test.tsx +++ b/site/src/pages/CreateTokenPage/utils.test.tsx @@ -1,9 +1,9 @@ import { - type LifetimeDay, - NANO_HOUR, determineDefaultLtValue, filterByMaxTokenLifetime, + type LifetimeDay, lifetimeDayPresets, + NANO_HOUR, } from "./utils"; describe("unit/CreateTokenForm", () => { diff --git a/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx b/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx index 2ceb599529a3e..d112fbae47966 100644 --- a/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx +++ b/site/src/pages/CreateUserPage/CreateUserForm.stories.tsx @@ -1,13 +1,13 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { organizationsKey } from "api/queries/organizations"; -import type { Organization } from "api/typesGenerated"; -import { action } from "storybook/actions"; -import { userEvent, within } from "storybook/test"; import { MockOrganization, MockOrganization2, mockApiError, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { organizationsKey } from "api/queries/organizations"; +import type { Organization } from "api/typesGenerated"; +import { action } from "storybook/actions"; +import { userEvent, within } from "storybook/test"; import { CreateUserForm } from "./CreateUserForm"; const meta: Meta = { diff --git a/site/src/pages/CreateUserPage/CreateUserPage.test.tsx b/site/src/pages/CreateUserPage/CreateUserPage.test.tsx index b1044630d798b..271376b3a28a8 100644 --- a/site/src/pages/CreateUserPage/CreateUserPage.test.tsx +++ b/site/src/pages/CreateUserPage/CreateUserPage.test.tsx @@ -1,9 +1,9 @@ -import { fireEvent, screen } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; import { renderWithAuth, waitForLoaderToBeRemoved, } from "testHelpers/renderHelpers"; +import { fireEvent, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; import CreateUserPage from "./CreateUserPage"; import { Language as FormLanguage } from "./Language"; diff --git a/site/src/pages/CreateUserPage/CreateUserPage.tsx b/site/src/pages/CreateUserPage/CreateUserPage.tsx index 6444b6d1213b6..9c47a7c1f0337 100644 --- a/site/src/pages/CreateUserPage/CreateUserPage.tsx +++ b/site/src/pages/CreateUserPage/CreateUserPage.tsx @@ -9,7 +9,7 @@ import { useNavigate } from "react-router"; import { pageTitle } from "utils/page"; import { CreateUserForm } from "./CreateUserForm"; -const Language = { +const _Language = { unknownError: "Oops, an unknown error occurred.", }; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx index 868aa85c751bd..5199854cface6 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePage.test.tsx @@ -1,6 +1,3 @@ -import { fireEvent, screen, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { API } from "api/api"; import { MockTemplate, MockTemplateVersionExternalAuthGithub, @@ -18,6 +15,9 @@ import { renderWithAuth, waitForLoaderToBeRemoved, } from "testHelpers/renderHelpers"; +import { fireEvent, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { API } from "api/api"; import CreateWorkspacePage from "./CreateWorkspacePage"; import { Language } from "./CreateWorkspacePageView"; diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.test.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.test.tsx index b20026472d701..b60c3ca3e7c7f 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.test.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageExperimental.test.tsx @@ -1,7 +1,3 @@ -import { screen, waitFor } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { API } from "api/api"; -import type { DynamicParametersResponse } from "api/typesGenerated"; import { MockDropdownParameter, MockDynamicParametersResponse, @@ -20,6 +16,10 @@ import { waitForLoaderToBeRemoved, } from "testHelpers/renderHelpers"; import { createMockWebSocket } from "testHelpers/websockets"; +import { screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { API } from "api/api"; +import type { DynamicParametersResponse } from "api/typesGenerated"; import CreateWorkspacePageExperimental from "./CreateWorkspacePageExperimental"; describe("CreateWorkspacePageExperimental", () => { diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx index 956ee72f2ee83..fca022c912982 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageView.stories.tsx @@ -1,8 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { within } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { action } from "storybook/actions"; -import { expect, screen, waitFor } from "storybook/test"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplate, @@ -13,6 +8,11 @@ import { mockApiError, } from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { within } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { action } from "storybook/actions"; +import { expect, screen, waitFor } from "storybook/test"; import { CreateWorkspacePageView } from "./CreateWorkspacePageView"; const meta: Meta = { @@ -205,11 +205,6 @@ export const PresetNoneSelected: Story = { args: { ...PresetsButNoneSelected.args, onSubmit: (request, owner) => { - // Assert that template_version_preset_id is not present in the request - console.assert( - !("template_version_preset_id" in request), - 'template_version_preset_id should not be present when "None" is selected', - ); action("onSubmit")(request, owner); }, }, diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx index 214ac58d80697..5faf991b876f1 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.stories.tsx @@ -1,7 +1,7 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { DetailedError } from "api/errors"; import { chromatic } from "testHelpers/chromatic"; import { MockTemplate, MockUserOwner } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { DetailedError } from "api/errors"; import { CreateWorkspacePageViewExperimental } from "./CreateWorkspacePageViewExperimental"; const meta: Meta = { diff --git a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx index 99876bfdb534d..cf1fd1746ce44 100644 --- a/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx +++ b/site/src/pages/CreateWorkspacePage/CreateWorkspacePageViewExperimental.tsx @@ -202,6 +202,36 @@ export const CreateWorkspacePageViewExperimental: FC< [], ); + // include any modified parameters and all touched parameters to the websocket request + const sendDynamicParamsRequest = useCallback( + ( + parameters: Array<{ parameter: PreviewParameter; value: string }>, + ownerId?: string, + ) => { + const formInputs: Record = {}; + const formParameters = form.values.rich_parameter_values ?? []; + + for (const { parameter, value } of parameters) { + formInputs[parameter.name] = value; + } + + for (const [fieldName, isTouched] of Object.entries(form.touched)) { + if ( + isTouched && + !parameters.some((p) => p.parameter.name === fieldName) + ) { + const param = formParameters.find((p) => p.name === fieldName); + if (param?.value) { + formInputs[fieldName] = param.value; + } + } + } + + sendMessage(formInputs, ownerId); + }, + [form.touched, form.values.rich_parameter_values, sendMessage], + ); + useEffect(() => { const selectedPresetOption = presetOptions[selectedPresetIndex]; let selectedPreset: TypesGen.Preset | undefined; @@ -274,35 +304,9 @@ export const CreateWorkspacePageViewExperimental: FC< form.setFieldTouched, parameters, form.values.rich_parameter_values, + sendDynamicParamsRequest, ]); - // include any modified parameters and all touched parameters to the websocket request - const sendDynamicParamsRequest = ( - parameters: Array<{ parameter: PreviewParameter; value: string }>, - ownerId?: string, - ) => { - const formInputs: Record = {}; - const formParameters = form.values.rich_parameter_values ?? []; - - for (const { parameter, value } of parameters) { - formInputs[parameter.name] = value; - } - - for (const [fieldName, isTouched] of Object.entries(form.touched)) { - if ( - isTouched && - !parameters.some((p) => p.parameter.name === fieldName) - ) { - const param = formParameters.find((p) => p.name === fieldName); - if (param?.value) { - formInputs[fieldName] = param.value; - } - } - } - - sendMessage(formInputs, ownerId); - }; - const handleOwnerChange = (user: TypesGen.User) => { setOwner(user); sendDynamicParamsRequest([], user.id); diff --git a/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx b/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx index 4e24d2d478c60..b4125ac999b2c 100644 --- a/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx +++ b/site/src/pages/CreateWorkspacePage/SelectedTemplate.stories.tsx @@ -1,5 +1,5 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; import { MockTemplate } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; import { SelectedTemplate } from "./SelectedTemplate"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx index 4988f95ea7cc2..010c7a999e98f 100644 --- a/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx +++ b/site/src/pages/DeploymentSettingsPage/AppearanceSettingsPage/AppearanceSettingsPageView.tsx @@ -7,17 +7,17 @@ import { PremiumBadge, } from "components/Badges/Badges"; import { Button } from "components/Button/Button"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "components/deprecated/Popover/Popover"; import { PopoverPaywall } from "components/Paywall/PopoverPaywall"; import { SettingsHeader, SettingsHeaderDescription, SettingsHeaderTitle, } from "components/SettingsHeader/SettingsHeader"; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from "components/deprecated/Popover/Popover"; import { useFormik } from "formik"; import type { FC } from "react"; import { getFormHelpers } from "utils/formUtils"; diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx index fea284ca4e666..8257e658ae8e8 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/ExportPolicyButton.stories.tsx @@ -1,6 +1,6 @@ +import { MockOrganizationSyncSettings } from "testHelpers/entities"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, fn, userEvent, waitFor, within } from "storybook/test"; -import { MockOrganizationSyncSettings } from "testHelpers/entities"; import { ExportPolicyButton } from "./ExportPolicyButton"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx index fcbbedc4f7265..38a76a5f3d43d 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPage.tsx @@ -5,8 +5,7 @@ import { patchOrganizationSyncSettings, } from "api/queries/idpsync"; import { ChooseOne, Cond } from "components/Conditionals/ChooseOne"; -import { displayError } from "components/GlobalSnackbar/utils"; -import { displaySuccess } from "components/GlobalSnackbar/utils"; +import { displayError, displaySuccess } from "components/GlobalSnackbar/utils"; import { Link } from "components/Link/Link"; import { Loader } from "components/Loader/Loader"; import { Paywall } from "components/Paywall/Paywall"; diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx index b28cd7ef3a3d4..148e061028284 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/IdpOrgSyncPageView.stories.tsx @@ -1,5 +1,3 @@ -import type { Meta, StoryObj } from "@storybook/react-vite"; -import { expect, userEvent, within } from "storybook/test"; import { MockOrganization, MockOrganization2, @@ -7,6 +5,8 @@ import { MockOrganizationSyncSettings2, MockOrganizationSyncSettingsEmpty, } from "testHelpers/entities"; +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { expect, userEvent, within } from "storybook/test"; import { IdpOrgSyncPageView } from "./IdpOrgSyncPageView"; const meta: Meta = { diff --git a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx index 9e26368e9c2cb..030e3889cac41 100644 --- a/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx +++ b/site/src/pages/DeploymentSettingsPage/IdpOrgSyncPage/OrganizationPills.tsx @@ -1,10 +1,10 @@ import { useTheme } from "@emotion/react"; -import { Pill } from "components/Pill/Pill"; import { Popover, PopoverContent, PopoverTrigger, } from "components/deprecated/Popover/Popover"; +import { Pill } from "components/Pill/Pill"; import type { FC } from "react"; import { cn } from "utils/cn"; import { isUUID } from "utils/uuid"; diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.test.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.test.tsx index 6a172b701e66d..59f1182ac7c00 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.test.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseCard.test.tsx @@ -1,6 +1,6 @@ -import { screen } from "@testing-library/react"; import { MockLicenseResponse } from "testHelpers/entities"; import { render } from "testHelpers/renderHelpers"; +import { screen } from "@testing-library/react"; import { LicenseCard } from "./LicenseCard"; describe("LicenseCard", () => { diff --git a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx index 5175aab8e38c2..3f91f58b8d678 100644 --- a/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx +++ b/site/src/pages/DeploymentSettingsPage/LicensesSettingsPage/LicenseSeatConsumptionChart.tsx @@ -81,17 +81,18 @@ export const LicenseSeatConsumptionChart: FC<

    +
    + + + ); +}; + +const TasksEmpty: FC = () => { + return ( + + +
    +
    +

    + No tasks found +

    + + Use the form above to run a task + +
    +
    +
    +
    + ); +}; + +type TasksProps = { tasks: Task[] }; + +const Tasks: FC = ({ tasks }) => { + return tasks.map(({ workspace, prompt }) => { + const templateDisplayName = + workspace.template_display_name ?? workspace.template_name; + + return ( + + + + + {prompt} + + + Access task + + + } + subtitle={templateDisplayName} + avatar={ + + } + /> + + + + + + + {relativeTime(new Date(workspace.created_at))} + + } + src={workspace.owner_avatar_url} + /> + + + ); + }); +}; + +const TasksSkeleton: FC = () => { + return ( + + + + + + + + + + + + + + ); +}; diff --git a/site/src/pages/TasksPage/UsersCombobox.tsx b/site/src/pages/TasksPage/UsersCombobox.tsx index 603085f28d678..e3e443754a17f 100644 --- a/site/src/pages/TasksPage/UsersCombobox.tsx +++ b/site/src/pages/TasksPage/UsersCombobox.tsx @@ -1,5 +1,6 @@ import Skeleton from "@mui/material/Skeleton"; import { users } from "api/queries/users"; +import type { User } from "api/typesGenerated"; import { Avatar } from "components/Avatar/Avatar"; import { Button } from "components/Button/Button"; import { @@ -15,44 +16,41 @@ import { PopoverContent, PopoverTrigger, } from "components/Popover/Popover"; +import { useAuthenticated } from "hooks"; import { useDebouncedValue } from "hooks/debounce"; import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; import { type FC, useState } from "react"; import { keepPreviousData, useQuery } from "react-query"; import { cn } from "utils/cn"; -export type UserOption = { +type UserOption = { label: string; - value: string; // Username + /** + * The username of the user. + */ + value: string; avatarUrl?: string; }; type UsersComboboxProps = { - selectedOption: UserOption | undefined; - onSelect: (option: UserOption | undefined) => void; + value: string; + onValueChange: (value: string) => void; }; export const UsersCombobox: FC = ({ - selectedOption, - onSelect, + value, + onValueChange, }) => { const [open, setOpen] = useState(false); const [search, setSearch] = useState(""); const debouncedSearch = useDebouncedValue(search, 250); - const usersQuery = useQuery({ + const { user } = useAuthenticated(); + const { data: options } = useQuery({ ...users({ q: debouncedSearch }), - select: (data) => - data.users.toSorted((a, _b) => { - return selectedOption && a.username === selectedOption.value ? -1 : 0; - }), + select: (res) => mapUsersToOptions(res.users, user, value), placeholderData: keepPreviousData, }); - - const options = usersQuery.data?.map((user) => ({ - label: user.name || user.username, - value: user.username, - avatarUrl: user.avatar_url, - })); + const selectedOption = options?.find((o) => o.value === value); return ( @@ -91,11 +89,7 @@ export const UsersCombobox: FC = ({ key={option.value} value={option.value} onSelect={() => { - onSelect( - option.value === selectedOption?.value - ? undefined - : option, - ); + onValueChange(option.value); setOpen(false); }} > @@ -131,3 +125,37 @@ const UserItem: FC = ({ option, className }) => {
    ); }; + +function mapUsersToOptions( + users: readonly User[], + /** + * Includes the authenticated user in the list if they are not already + * present. So the current user can always select themselves easily. + */ + authUser: User, + /** + * Username of the currently selected user. + */ + selectedValue: string, +): UserOption[] { + const includeAuthenticatedUser = (users: readonly User[]) => { + const hasAuthenticatedUser = users.some( + (u) => u.username === authUser.username, + ); + if (hasAuthenticatedUser) { + return users; + } + return [authUser, ...users]; + }; + + const sortSelectedFirst = (a: User) => + selectedValue && a.username === selectedValue ? -1 : 0; + + return includeAuthenticatedUser(users) + .toSorted(sortSelectedFirst) + .map((user) => ({ + label: user.name || user.username, + value: user.username, + avatarUrl: user.avatar_url, + })); +} diff --git a/site/src/pages/TasksPage/data.ts b/site/src/pages/TasksPage/data.ts new file mode 100644 index 0000000000000..0795dab2bb638 --- /dev/null +++ b/site/src/pages/TasksPage/data.ts @@ -0,0 +1,24 @@ +import { API } from "api/api"; +import type { Task } from "modules/tasks/tasks"; + +// TODO: This is a temporary solution while the BE does not return the Task in a +// right shape with a custom name. This should be removed once the BE is fixed. +export const data = { + async createTask( + prompt: string, + userId: string, + templateVersionId: string, + presetId: string | undefined, + ): Promise { + const workspace = await API.experimental.createTask(userId, { + template_version_id: templateVersionId, + template_version_preset_id: presetId, + prompt, + }); + + return { + workspace, + prompt, + }; + }, +}; From ad5e6785f4ed280c41350aff6775bea4f7fe5db9 Mon Sep 17 00:00:00 2001 From: Rafael Rodriguez Date: Thu, 21 Aug 2025 15:03:34 -0500 Subject: [PATCH 245/260] feat: add filtering options to provisioners list (#19378) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary In this pull request we're adding support for additional filtering options to the `provisioners list` CLI command and the `/provisionerdaemons` API endpoint. Resolves: https://github.com/coder/coder/issues/18783 ### Changes #### Added CLI Options - `--show-offline`: When this option is provided, all provisioner daemons will be returned. This means that when `--show-offline` is not provided only `idle` and `busy` provisioner daemons will be returned. - `--status=`: When this option is provided with a comma-separated list of valid statuses (`idle`, `busy`, or `offline`) only provisioner daemons that have these statuses will be returned. - `--max-age=`: When this option is provided with a valid duration value (e.g., `24h`, `30s`) only provisioner daemons with a `last_seen_at` timestamp within the provided max age will be returned. #### Query Params - `?offline=true`: Include offline provisioner daemons in the results. Offline provisioner daemons will be excluded if `?offline=false` or if offline is not provided. - `?status=`: Include provisioner daemons with the specified statuses. - `?max_age=`: Include provisioner daemons with a `last_seen_at` timestamp within the max age duration. #### Frontend - Since offline provisioners will not be returned by default anymore (`--show-offline` has to be provided to see them), a checkbox was added to the provisioners list page to allow for offline provisioners to be displayed - A revamp of the provisioners page will be done in: https://github.com/coder/coder/issues/17156, this checkbox change was just added to maintain currently functionality with the backend updates Current provisioners page (without checkbox) Screenshot 2025-08-20 at 10 51
00 AM Provisioners page with checkbox (unchecked) Screenshot 2025-08-20 at 10 48
40 AM Provisioner page with checkbox (checked) and URL updated with query parameters Screenshot 2025-08-20 at 10 50
14 AM ### Show Offline vs Offline Status To list offline provisioner daemons, users can either: 1. Include the `--show-offline` option OR 2. Include `offline` in the list of values provided to the `--status` option --- cli/provisioners.go | 33 ++- cli/provisioners_test.go | 68 ++++++ .../TestProvisioners_Golden/list.golden | 9 +- ...list_provisioner_daemons_by_max_age.golden | 4 + .../list_provisioner_daemons_by_status.golden | 5 + ...provisioner_daemons_without_offline.golden | 4 + ...st_with_offline_provisioner_daemons.golden | 5 + .../coder_provisioner_list_--help.golden | 9 + coderd/database/querier_test.go | 227 ++++++++++++++++++ coderd/database/queries.sql.go | 70 ++++-- .../database/queries/provisionerdaemons.sql | 46 +++- coderd/database/sdk2db/sdk2db.go | 16 ++ coderd/database/sdk2db/sdk2db_test.go | 36 +++ coderd/httpapi/queryparams.go | 23 ++ coderd/provisionerdaemons.go | 9 + coderd/provisionerdaemons_test.go | 13 +- codersdk/organizations.go | 18 +- codersdk/provisionerdaemons.go | 8 + docs/reference/cli/provisioner_list.md | 27 +++ .../coder_provisioner_list_--help.golden | 9 + site/src/api/api.ts | 2 + site/src/api/typesGenerated.ts | 3 + .../OrganizationProvisionersPage.tsx | 8 +- ...ganizationProvisionersPageView.stories.tsx | 16 ++ .../OrganizationProvisionersPageView.tsx | 133 +++++----- 25 files changed, 707 insertions(+), 94 deletions(-) create mode 100644 cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_max_age.golden create mode 100644 cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_status.golden create mode 100644 cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_without_offline.golden create mode 100644 cli/testdata/TestProvisioners_Golden/list_with_offline_provisioner_daemons.golden create mode 100644 coderd/database/sdk2db/sdk2db.go create mode 100644 coderd/database/sdk2db/sdk2db_test.go diff --git a/cli/provisioners.go b/cli/provisioners.go index 8f90a52589939..77f5e7705edd5 100644 --- a/cli/provisioners.go +++ b/cli/provisioners.go @@ -2,10 +2,12 @@ package cli import ( "fmt" + "time" "golang.org/x/xerrors" "github.com/coder/coder/v2/cli/cliui" + "github.com/coder/coder/v2/coderd/util/slice" "github.com/coder/coder/v2/codersdk" "github.com/coder/serpent" ) @@ -39,7 +41,10 @@ func (r *RootCmd) provisionerList() *serpent.Command { cliui.TableFormat([]provisionerDaemonRow{}, []string{"created at", "last seen at", "key name", "name", "version", "status", "tags"}), cliui.JSONFormat(), ) - limit int64 + limit int64 + offline bool + status []string + maxAge time.Duration ) cmd := &serpent.Command{ @@ -59,7 +64,10 @@ func (r *RootCmd) provisionerList() *serpent.Command { } daemons, err := client.OrganizationProvisionerDaemons(ctx, org.ID, &codersdk.OrganizationProvisionerDaemonsOptions{ - Limit: int(limit), + Limit: int(limit), + Offline: offline, + Status: slice.StringEnums[codersdk.ProvisionerDaemonStatus](status), + MaxAge: maxAge, }) if err != nil { return xerrors.Errorf("list provisioner daemons: %w", err) @@ -98,6 +106,27 @@ func (r *RootCmd) provisionerList() *serpent.Command { Default: "50", Value: serpent.Int64Of(&limit), }, + { + Flag: "show-offline", + FlagShorthand: "f", + Env: "CODER_PROVISIONER_SHOW_OFFLINE", + Description: "Show offline provisioners.", + Value: serpent.BoolOf(&offline), + }, + { + Flag: "status", + FlagShorthand: "s", + Env: "CODER_PROVISIONER_LIST_STATUS", + Description: "Filter by provisioner status.", + Value: serpent.EnumArrayOf(&status, slice.ToStrings(codersdk.ProvisionerDaemonStatusEnums())...), + }, + { + Flag: "max-age", + FlagShorthand: "m", + Env: "CODER_PROVISIONER_LIST_MAX_AGE", + Description: "Filter provisioners by maximum age.", + Value: serpent.DurationOf(&maxAge), + }, }...) orgContext.AttachOptions(cmd) diff --git a/cli/provisioners_test.go b/cli/provisioners_test.go index 0c3fe5ae2f6d1..f70029e7fa366 100644 --- a/cli/provisioners_test.go +++ b/cli/provisioners_test.go @@ -197,6 +197,74 @@ func TestProvisioners_Golden(t *testing.T) { clitest.TestGoldenFile(t, t.Name(), got.Bytes(), replace) }) + t.Run("list with offline provisioner daemons", func(t *testing.T) { + t.Parallel() + + var got bytes.Buffer + inv, root := clitest.New(t, + "provisioners", + "list", + "--show-offline", + ) + inv.Stdout = &got + clitest.SetupConfig(t, templateAdminClient, root) + err := inv.Run() + require.NoError(t, err) + + clitest.TestGoldenFile(t, t.Name(), got.Bytes(), replace) + }) + + t.Run("list provisioner daemons by status", func(t *testing.T) { + t.Parallel() + + var got bytes.Buffer + inv, root := clitest.New(t, + "provisioners", + "list", + "--status=idle,offline,busy", + ) + inv.Stdout = &got + clitest.SetupConfig(t, templateAdminClient, root) + err := inv.Run() + require.NoError(t, err) + + clitest.TestGoldenFile(t, t.Name(), got.Bytes(), replace) + }) + + t.Run("list provisioner daemons without offline", func(t *testing.T) { + t.Parallel() + + var got bytes.Buffer + inv, root := clitest.New(t, + "provisioners", + "list", + "--status=idle,busy", + ) + inv.Stdout = &got + clitest.SetupConfig(t, templateAdminClient, root) + err := inv.Run() + require.NoError(t, err) + + clitest.TestGoldenFile(t, t.Name(), got.Bytes(), replace) + }) + + t.Run("list provisioner daemons by max age", func(t *testing.T) { + t.Parallel() + + var got bytes.Buffer + inv, root := clitest.New(t, + "provisioners", + "list", + "--max-age=1h", + ) + inv.Stdout = &got + clitest.SetupConfig(t, templateAdminClient, root) + err := inv.Run() + require.NoError(t, err) + + clitest.TestGoldenFile(t, t.Name(), got.Bytes(), replace) + }) + // Test jobs list with template admin as members are currently // unable to access provisioner jobs. In the future (with RBAC // changes), we may allow them to view _their_ jobs. diff --git a/cli/testdata/TestProvisioners_Golden/list.golden b/cli/testdata/TestProvisioners_Golden/list.golden index 3f50f90746744..8f10eec458f7d 100644 --- a/cli/testdata/TestProvisioners_Golden/list.golden +++ b/cli/testdata/TestProvisioners_Golden/list.golden @@ -1,5 +1,4 @@ -ID CREATED AT LAST SEEN AT NAME VERSION TAGS KEY NAME STATUS CURRENT JOB ID CURRENT JOB STATUS PREVIOUS JOB ID PREVIOUS JOB STATUS ORGANIZATION -00000000-0000-0000-aaaa-000000000000 ====[timestamp]===== ====[timestamp]===== default-provisioner v0.0.0-devel map[owner: scope:organization] built-in idle 00000000-0000-0000-bbbb-000000000001 succeeded Coder -00000000-0000-0000-aaaa-000000000001 ====[timestamp]===== ====[timestamp]===== provisioner-1 v0.0.0 map[foo:bar owner: scope:organization] built-in busy 00000000-0000-0000-bbbb-000000000002 running Coder -00000000-0000-0000-aaaa-000000000002 ====[timestamp]===== ====[timestamp]===== provisioner-2 v0.0.0 map[owner: scope:organization] built-in offline 00000000-0000-0000-bbbb-000000000003 succeeded Coder -00000000-0000-0000-aaaa-000000000003 ====[timestamp]===== ====[timestamp]===== provisioner-3 v0.0.0 map[owner: scope:organization] built-in idle Coder +ID CREATED AT LAST SEEN AT NAME VERSION TAGS KEY NAME STATUS CURRENT JOB ID CURRENT JOB STATUS PREVIOUS JOB ID PREVIOUS JOB STATUS ORGANIZATION +00000000-0000-0000-aaaa-000000000000 ====[timestamp]===== ====[timestamp]===== default-provisioner v0.0.0-devel map[owner: scope:organization] built-in idle 00000000-0000-0000-bbbb-000000000001 succeeded Coder +00000000-0000-0000-aaaa-000000000001 ====[timestamp]===== ====[timestamp]===== provisioner-1 v0.0.0 map[foo:bar owner: scope:organization] built-in busy 00000000-0000-0000-bbbb-000000000002 running Coder +00000000-0000-0000-aaaa-000000000003 ====[timestamp]===== ====[timestamp]===== provisioner-3 v0.0.0 map[owner: scope:organization] built-in idle Coder diff --git a/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_max_age.golden b/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_max_age.golden new file mode 100644 index 0000000000000..bc383a839408d --- /dev/null +++ b/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_max_age.golden @@ -0,0 +1,4 @@ +CREATED AT LAST SEEN AT KEY NAME NAME VERSION STATUS TAGS +====[timestamp]===== ====[timestamp]===== built-in default-provisioner v0.0.0-devel idle map[owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-1 v0.0.0 busy map[foo:bar owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-3 v0.0.0 idle map[owner: scope:organization] diff --git a/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_status.golden b/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_status.golden new file mode 100644 index 0000000000000..fd7b966d8d982 --- /dev/null +++ b/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_by_status.golden @@ -0,0 +1,5 @@ +CREATED AT LAST SEEN AT KEY NAME NAME VERSION STATUS TAGS +====[timestamp]===== ====[timestamp]===== built-in default-provisioner v0.0.0-devel idle map[owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-1 v0.0.0 busy map[foo:bar owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-2 v0.0.0 offline map[owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-3 v0.0.0 idle map[owner: scope:organization] diff --git a/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_without_offline.golden b/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_without_offline.golden new file mode 100644 index 0000000000000..bc383a839408d --- /dev/null +++ b/cli/testdata/TestProvisioners_Golden/list_provisioner_daemons_without_offline.golden @@ -0,0 +1,4 @@ +CREATED AT LAST SEEN AT KEY NAME NAME VERSION STATUS TAGS +====[timestamp]===== ====[timestamp]===== built-in default-provisioner v0.0.0-devel idle map[owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-1 v0.0.0 busy map[foo:bar owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-3 v0.0.0 idle map[owner: scope:organization] diff --git a/cli/testdata/TestProvisioners_Golden/list_with_offline_provisioner_daemons.golden b/cli/testdata/TestProvisioners_Golden/list_with_offline_provisioner_daemons.golden new file mode 100644 index 0000000000000..fd7b966d8d982 --- /dev/null +++ b/cli/testdata/TestProvisioners_Golden/list_with_offline_provisioner_daemons.golden @@ -0,0 +1,5 @@ +CREATED AT LAST SEEN AT KEY NAME NAME VERSION STATUS TAGS +====[timestamp]===== ====[timestamp]===== built-in default-provisioner v0.0.0-devel idle map[owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-1 v0.0.0 busy map[foo:bar owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-2 v0.0.0 offline map[owner: scope:organization] +====[timestamp]===== ====[timestamp]===== built-in provisioner-3 v0.0.0 idle map[owner: scope:organization] diff --git a/cli/testdata/coder_provisioner_list_--help.golden b/cli/testdata/coder_provisioner_list_--help.golden index 7a1807bb012f5..ce6d0754073a4 100644 --- a/cli/testdata/coder_provisioner_list_--help.golden +++ b/cli/testdata/coder_provisioner_list_--help.golden @@ -17,8 +17,17 @@ OPTIONS: -l, --limit int, $CODER_PROVISIONER_LIST_LIMIT (default: 50) Limit the number of provisioners returned. + -m, --max-age duration, $CODER_PROVISIONER_LIST_MAX_AGE + Filter provisioners by maximum age. + -o, --output table|json (default: table) Output format. + -f, --show-offline bool, $CODER_PROVISIONER_SHOW_OFFLINE + Show offline provisioners. + + -s, --status [offline|idle|busy], $CODER_PROVISIONER_LIST_STATUS + Filter by provisioner status. + ——— Run `coder --help` for a list of global options. diff --git a/coderd/database/querier_test.go b/coderd/database/querier_test.go index 60e13ad5d907e..18c10d6388f37 100644 --- a/coderd/database/querier_test.go +++ b/coderd/database/querier_test.go @@ -397,6 +397,7 @@ func TestGetProvisionerDaemonsWithStatusByOrganization(t *testing.T) { daemons, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{ OrganizationID: org.ID, IDs: []uuid.UUID{matchingDaemon0.ID, matchingDaemon1.ID}, + Offline: sql.NullBool{Bool: true, Valid: true}, }) require.NoError(t, err) require.Len(t, daemons, 2) @@ -430,6 +431,7 @@ func TestGetProvisionerDaemonsWithStatusByOrganization(t *testing.T) { daemons, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{ OrganizationID: org.ID, Tags: database.StringMap{"foo": "bar"}, + Offline: sql.NullBool{Bool: true, Valid: true}, }) require.NoError(t, err) require.Len(t, daemons, 1) @@ -463,6 +465,7 @@ func TestGetProvisionerDaemonsWithStatusByOrganization(t *testing.T) { daemons, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{ OrganizationID: org.ID, StaleIntervalMS: 45 * time.Minute.Milliseconds(), + Offline: sql.NullBool{Bool: true, Valid: true}, }) require.NoError(t, err) require.Len(t, daemons, 2) @@ -475,6 +478,230 @@ func TestGetProvisionerDaemonsWithStatusByOrganization(t *testing.T) { require.Equal(t, database.ProvisionerDaemonStatusOffline, daemons[0].Status) require.Equal(t, database.ProvisionerDaemonStatusIdle, daemons[1].Status) }) + + t.Run("ExcludeOffline", func(t *testing.T) { + t.Parallel() + db, _ := dbtestutil.NewDB(t) + org := dbgen.Organization(t, db, database.Organization{}) + + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "offline-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-time.Hour), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-time.Hour), + }, + }) + fooDaemon := dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "foo-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-(30 * time.Minute)), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-(30 * time.Minute)), + }, + }) + + daemons, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{ + OrganizationID: org.ID, + StaleIntervalMS: 45 * time.Minute.Milliseconds(), + }) + require.NoError(t, err) + require.Len(t, daemons, 1) + + require.Equal(t, fooDaemon.ID, daemons[0].ProvisionerDaemon.ID) + require.Equal(t, database.ProvisionerDaemonStatusIdle, daemons[0].Status) + }) + + t.Run("IncludeOffline", func(t *testing.T) { + t.Parallel() + db, _ := dbtestutil.NewDB(t) + org := dbgen.Organization(t, db, database.Organization{}) + + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "offline-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-time.Hour), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-time.Hour), + }, + }) + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "foo-daemon", + OrganizationID: org.ID, + Tags: database.StringMap{ + "foo": "bar", + }, + }) + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "bar-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-(30 * time.Minute)), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-(30 * time.Minute)), + }, + }) + + daemons, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{ + OrganizationID: org.ID, + StaleIntervalMS: 45 * time.Minute.Milliseconds(), + Offline: sql.NullBool{Bool: true, Valid: true}, + }) + require.NoError(t, err) + require.Len(t, daemons, 3) + + statusCounts := make(map[database.ProvisionerDaemonStatus]int) + for _, daemon := range daemons { + statusCounts[daemon.Status]++ + } + + require.Equal(t, 2, statusCounts[database.ProvisionerDaemonStatusIdle]) + require.Equal(t, 1, statusCounts[database.ProvisionerDaemonStatusOffline]) + }) + + t.Run("MatchesStatuses", func(t *testing.T) { + t.Parallel() + db, _ := dbtestutil.NewDB(t) + org := dbgen.Organization(t, db, database.Organization{}) + + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "offline-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-time.Hour), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-time.Hour), + }, + }) + + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "foo-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-(30 * time.Minute)), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-(30 * time.Minute)), + }, + }) + + type testCase struct { + name string + statuses []database.ProvisionerDaemonStatus + expectedNum int + } + + tests := []testCase{ + { + name: "Get idle and offline", + statuses: []database.ProvisionerDaemonStatus{ + database.ProvisionerDaemonStatusOffline, + database.ProvisionerDaemonStatusIdle, + }, + expectedNum: 2, + }, + { + name: "Get offline", + statuses: []database.ProvisionerDaemonStatus{ + database.ProvisionerDaemonStatusOffline, + }, + expectedNum: 1, + }, + // Offline daemons should not be included without Offline param + { + name: "Get idle - empty statuses", + statuses: []database.ProvisionerDaemonStatus{}, + expectedNum: 1, + }, + { + name: "Get idle - nil statuses", + statuses: nil, + expectedNum: 1, + }, + } + + for _, tc := range tests { + //nolint:tparallel,paralleltest + t.Run(tc.name, func(t *testing.T) { + daemons, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{ + OrganizationID: org.ID, + StaleIntervalMS: 45 * time.Minute.Milliseconds(), + Statuses: tc.statuses, + }) + require.NoError(t, err) + require.Len(t, daemons, tc.expectedNum) + }) + } + }) + + t.Run("FilterByMaxAge", func(t *testing.T) { + t.Parallel() + db, _ := dbtestutil.NewDB(t) + org := dbgen.Organization(t, db, database.Organization{}) + + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "foo-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-(45 * time.Minute)), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-(45 * time.Minute)), + }, + }) + + dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{ + Name: "bar-daemon", + OrganizationID: org.ID, + CreatedAt: dbtime.Now().Add(-(25 * time.Minute)), + LastSeenAt: sql.NullTime{ + Valid: true, + Time: dbtime.Now().Add(-(25 * time.Minute)), + }, + }) + + type testCase struct { + name string + maxAge sql.NullInt64 + expectedNum int + } + + tests := []testCase{ + { + name: "Max age 1 hour", + maxAge: sql.NullInt64{Int64: time.Hour.Milliseconds(), Valid: true}, + expectedNum: 2, + }, + { + name: "Max age 30 minutes", + maxAge: sql.NullInt64{Int64: (30 * time.Minute).Milliseconds(), Valid: true}, + expectedNum: 1, + }, + { + name: "Max age 15 minutes", + maxAge: sql.NullInt64{Int64: (15 * time.Minute).Milliseconds(), Valid: true}, + expectedNum: 0, + }, + { + name: "No max age", + maxAge: sql.NullInt64{Valid: false}, + expectedNum: 2, + }, + } + for _, tc := range tests { + //nolint:tparallel,paralleltest + t.Run(tc.name, func(t *testing.T) { + daemons, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{ + OrganizationID: org.ID, + StaleIntervalMS: 60 * time.Minute.Milliseconds(), + MaxAgeMs: tc.maxAge, + }) + require.NoError(t, err) + require.Len(t, daemons, tc.expectedNum) + }) + } + }) } func TestGetWorkspaceAgentUsageStats(t *testing.T) { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 11d129b435e3e..3a41cf63c1630 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -8263,13 +8263,13 @@ const getProvisionerDaemonsWithStatusByOrganization = `-- name: GetProvisionerDa SELECT pd.id, pd.created_at, pd.name, pd.provisioners, pd.replica_id, pd.tags, pd.last_seen_at, pd.version, pd.api_version, pd.organization_id, pd.key_id, CASE - WHEN pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - ($1::bigint || ' ms')::interval) - THEN 'offline' - ELSE CASE - WHEN current_job.id IS NOT NULL THEN 'busy' - ELSE 'idle' - END - END::provisioner_daemon_status AS status, + WHEN current_job.id IS NOT NULL THEN 'busy'::provisioner_daemon_status + WHEN (COALESCE($1::bool, false) = true + OR 'offline'::provisioner_daemon_status = ANY($2::provisioner_daemon_status[])) + AND (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - ($3::bigint || ' ms')::interval)) + THEN 'offline'::provisioner_daemon_status + ELSE 'idle'::provisioner_daemon_status + END AS status, pk.name AS key_name, -- NOTE(mafredri): sqlc.embed doesn't support nullable tables nor renaming them. current_job.id AS current_job_id, @@ -8336,21 +8336,56 @@ LEFT JOIN AND previous_template.organization_id = pd.organization_id ) WHERE - pd.organization_id = $2::uuid - AND (COALESCE(array_length($3::uuid[], 1), 0) = 0 OR pd.id = ANY($3::uuid[])) - AND ($4::tagset = 'null'::tagset OR provisioner_tagset_contains(pd.tags::tagset, $4::tagset)) + pd.organization_id = $4::uuid + AND (COALESCE(array_length($5::uuid[], 1), 0) = 0 OR pd.id = ANY($5::uuid[])) + AND ($6::tagset = 'null'::tagset OR provisioner_tagset_contains(pd.tags::tagset, $6::tagset)) + -- Filter by max age if provided + AND ( + $7::bigint IS NULL + OR pd.last_seen_at IS NULL + OR pd.last_seen_at >= (NOW() - ($7::bigint || ' ms')::interval) + ) + AND ( + -- Always include online daemons + (pd.last_seen_at IS NOT NULL AND pd.last_seen_at >= (NOW() - ($3::bigint || ' ms')::interval)) + -- Include offline daemons if offline param is true or 'offline' status is requested + OR ( + (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - ($3::bigint || ' ms')::interval)) + AND ( + COALESCE($1::bool, false) = true + OR 'offline'::provisioner_daemon_status = ANY($2::provisioner_daemon_status[]) + ) + ) + ) + AND ( + -- Filter daemons by any statuses if provided + COALESCE(array_length($2::provisioner_daemon_status[], 1), 0) = 0 + OR (current_job.id IS NOT NULL AND 'busy'::provisioner_daemon_status = ANY($2::provisioner_daemon_status[])) + OR (current_job.id IS NULL AND 'idle'::provisioner_daemon_status = ANY($2::provisioner_daemon_status[])) + OR ( + 'offline'::provisioner_daemon_status = ANY($2::provisioner_daemon_status[]) + AND (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - ($3::bigint || ' ms')::interval)) + ) + OR ( + COALESCE($1::bool, false) = true + AND (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - ($3::bigint || ' ms')::interval)) + ) + ) ORDER BY pd.created_at DESC LIMIT - $5::int + $8::int ` type GetProvisionerDaemonsWithStatusByOrganizationParams struct { - StaleIntervalMS int64 `db:"stale_interval_ms" json:"stale_interval_ms"` - OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` - IDs []uuid.UUID `db:"ids" json:"ids"` - Tags StringMap `db:"tags" json:"tags"` - Limit sql.NullInt32 `db:"limit" json:"limit"` + Offline sql.NullBool `db:"offline" json:"offline"` + Statuses []ProvisionerDaemonStatus `db:"statuses" json:"statuses"` + StaleIntervalMS int64 `db:"stale_interval_ms" json:"stale_interval_ms"` + OrganizationID uuid.UUID `db:"organization_id" json:"organization_id"` + IDs []uuid.UUID `db:"ids" json:"ids"` + Tags StringMap `db:"tags" json:"tags"` + MaxAgeMs sql.NullInt64 `db:"max_age_ms" json:"max_age_ms"` + Limit sql.NullInt32 `db:"limit" json:"limit"` } type GetProvisionerDaemonsWithStatusByOrganizationRow struct { @@ -8373,10 +8408,13 @@ type GetProvisionerDaemonsWithStatusByOrganizationRow struct { // Previous job information. func (q *sqlQuerier) GetProvisionerDaemonsWithStatusByOrganization(ctx context.Context, arg GetProvisionerDaemonsWithStatusByOrganizationParams) ([]GetProvisionerDaemonsWithStatusByOrganizationRow, error) { rows, err := q.db.QueryContext(ctx, getProvisionerDaemonsWithStatusByOrganization, + arg.Offline, + pq.Array(arg.Statuses), arg.StaleIntervalMS, arg.OrganizationID, pq.Array(arg.IDs), arg.Tags, + arg.MaxAgeMs, arg.Limit, ) if err != nil { diff --git a/coderd/database/queries/provisionerdaemons.sql b/coderd/database/queries/provisionerdaemons.sql index 4f7c7a8b2200a..ad6c0948eb448 100644 --- a/coderd/database/queries/provisionerdaemons.sql +++ b/coderd/database/queries/provisionerdaemons.sql @@ -32,13 +32,13 @@ WHERE SELECT sqlc.embed(pd), CASE - WHEN pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - (@stale_interval_ms::bigint || ' ms')::interval) - THEN 'offline' - ELSE CASE - WHEN current_job.id IS NOT NULL THEN 'busy' - ELSE 'idle' - END - END::provisioner_daemon_status AS status, + WHEN current_job.id IS NOT NULL THEN 'busy'::provisioner_daemon_status + WHEN (COALESCE(sqlc.narg('offline')::bool, false) = true + OR 'offline'::provisioner_daemon_status = ANY(@statuses::provisioner_daemon_status[])) + AND (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - (@stale_interval_ms::bigint || ' ms')::interval)) + THEN 'offline'::provisioner_daemon_status + ELSE 'idle'::provisioner_daemon_status + END AS status, pk.name AS key_name, -- NOTE(mafredri): sqlc.embed doesn't support nullable tables nor renaming them. current_job.id AS current_job_id, @@ -110,6 +110,38 @@ WHERE pd.organization_id = @organization_id::uuid AND (COALESCE(array_length(@ids::uuid[], 1), 0) = 0 OR pd.id = ANY(@ids::uuid[])) AND (@tags::tagset = 'null'::tagset OR provisioner_tagset_contains(pd.tags::tagset, @tags::tagset)) + -- Filter by max age if provided + AND ( + sqlc.narg('max_age_ms')::bigint IS NULL + OR pd.last_seen_at IS NULL + OR pd.last_seen_at >= (NOW() - (sqlc.narg('max_age_ms')::bigint || ' ms')::interval) + ) + AND ( + -- Always include online daemons + (pd.last_seen_at IS NOT NULL AND pd.last_seen_at >= (NOW() - (@stale_interval_ms::bigint || ' ms')::interval)) + -- Include offline daemons if offline param is true or 'offline' status is requested + OR ( + (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - (@stale_interval_ms::bigint || ' ms')::interval)) + AND ( + COALESCE(sqlc.narg('offline')::bool, false) = true + OR 'offline'::provisioner_daemon_status = ANY(@statuses::provisioner_daemon_status[]) + ) + ) + ) + AND ( + -- Filter daemons by any statuses if provided + COALESCE(array_length(@statuses::provisioner_daemon_status[], 1), 0) = 0 + OR (current_job.id IS NOT NULL AND 'busy'::provisioner_daemon_status = ANY(@statuses::provisioner_daemon_status[])) + OR (current_job.id IS NULL AND 'idle'::provisioner_daemon_status = ANY(@statuses::provisioner_daemon_status[])) + OR ( + 'offline'::provisioner_daemon_status = ANY(@statuses::provisioner_daemon_status[]) + AND (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - (@stale_interval_ms::bigint || ' ms')::interval)) + ) + OR ( + COALESCE(sqlc.narg('offline')::bool, false) = true + AND (pd.last_seen_at IS NULL OR pd.last_seen_at < (NOW() - (@stale_interval_ms::bigint || ' ms')::interval)) + ) + ) ORDER BY pd.created_at DESC LIMIT diff --git a/coderd/database/sdk2db/sdk2db.go b/coderd/database/sdk2db/sdk2db.go new file mode 100644 index 0000000000000..02fe8578179c9 --- /dev/null +++ b/coderd/database/sdk2db/sdk2db.go @@ -0,0 +1,16 @@ +// Package sdk2db provides common conversion routines from codersdk types to database types +package sdk2db + +import ( + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/db2sdk" + "github.com/coder/coder/v2/codersdk" +) + +func ProvisionerDaemonStatus(status codersdk.ProvisionerDaemonStatus) database.ProvisionerDaemonStatus { + return database.ProvisionerDaemonStatus(status) +} + +func ProvisionerDaemonStatuses(params []codersdk.ProvisionerDaemonStatus) []database.ProvisionerDaemonStatus { + return db2sdk.List(params, ProvisionerDaemonStatus) +} diff --git a/coderd/database/sdk2db/sdk2db_test.go b/coderd/database/sdk2db/sdk2db_test.go new file mode 100644 index 0000000000000..ff51dc0ffaaf4 --- /dev/null +++ b/coderd/database/sdk2db/sdk2db_test.go @@ -0,0 +1,36 @@ +package sdk2db_test + +import ( + "testing" + + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/sdk2db" + "github.com/coder/coder/v2/codersdk" +) + +func TestProvisionerDaemonStatus(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + input codersdk.ProvisionerDaemonStatus + expect database.ProvisionerDaemonStatus + }{ + {"busy", codersdk.ProvisionerDaemonBusy, database.ProvisionerDaemonStatusBusy}, + {"offline", codersdk.ProvisionerDaemonOffline, database.ProvisionerDaemonStatusOffline}, + {"idle", codersdk.ProvisionerDaemonIdle, database.ProvisionerDaemonStatusIdle}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + got := sdk2db.ProvisionerDaemonStatus(tc.input) + if !got.Valid() { + t.Errorf("ProvisionerDaemonStatus(%v) returned invalid status", tc.input) + } + if got != tc.expect { + t.Errorf("ProvisionerDaemonStatus(%v) = %v; want %v", tc.input, got, tc.expect) + } + }) + } +} diff --git a/coderd/httpapi/queryparams.go b/coderd/httpapi/queryparams.go index 0e4a20920e526..e1bd983ea12a3 100644 --- a/coderd/httpapi/queryparams.go +++ b/coderd/httpapi/queryparams.go @@ -287,6 +287,29 @@ func (p *QueryParamParser) JSONStringMap(vals url.Values, def map[string]string, return v } +func (p *QueryParamParser) ProvisionerDaemonStatuses(vals url.Values, def []codersdk.ProvisionerDaemonStatus, queryParam string) []codersdk.ProvisionerDaemonStatus { + return ParseCustomList(p, vals, def, queryParam, func(v string) (codersdk.ProvisionerDaemonStatus, error) { + return codersdk.ProvisionerDaemonStatus(v), nil + }) +} + +func (p *QueryParamParser) Duration(vals url.Values, def time.Duration, queryParam string) time.Duration { + v, err := parseQueryParam(p, vals, func(v string) (time.Duration, error) { + d, err := time.ParseDuration(v) + if err != nil { + return 0, err + } + return d, nil + }, def, queryParam) + if err != nil { + p.Errors = append(p.Errors, codersdk.ValidationError{ + Field: queryParam, + Detail: fmt.Sprintf("Query param %q must be a valid duration (e.g., '24h', '30m', '1h30m'): %s", queryParam, err.Error()), + }) + } + return v +} + // ValidEnum represents an enum that can be parsed and validated. type ValidEnum interface { // Add more types as needed (avoid importing large dependency trees). diff --git a/coderd/provisionerdaemons.go b/coderd/provisionerdaemons.go index 332ae3b352e0a..67a40b88f69e9 100644 --- a/coderd/provisionerdaemons.go +++ b/coderd/provisionerdaemons.go @@ -6,6 +6,7 @@ import ( "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/db2sdk" + "github.com/coder/coder/v2/coderd/database/sdk2db" "github.com/coder/coder/v2/coderd/httpapi" "github.com/coder/coder/v2/coderd/httpmw" "github.com/coder/coder/v2/coderd/provisionerdserver" @@ -45,6 +46,9 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) { limit := p.PositiveInt32(qp, 50, "limit") ids := p.UUIDs(qp, nil, "ids") tags := p.JSONStringMap(qp, database.StringMap{}, "tags") + includeOffline := p.NullableBoolean(qp, sql.NullBool{}, "offline") + statuses := p.ProvisionerDaemonStatuses(qp, []codersdk.ProvisionerDaemonStatus{}, "status") + maxAge := p.Duration(qp, 0, "max_age") p.ErrorExcessParams(qp) if len(p.Errors) > 0 { httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ @@ -54,12 +58,17 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) { return } + dbStatuses := sdk2db.ProvisionerDaemonStatuses(statuses) + daemons, err := api.Database.GetProvisionerDaemonsWithStatusByOrganization( ctx, database.GetProvisionerDaemonsWithStatusByOrganizationParams{ OrganizationID: org.ID, StaleIntervalMS: provisionerdserver.StaleInterval.Milliseconds(), Limit: sql.NullInt32{Int32: limit, Valid: limit > 0}, + Offline: includeOffline, + Statuses: dbStatuses, + MaxAgeMs: sql.NullInt64{Int64: maxAge.Milliseconds(), Valid: maxAge > 0}, IDs: ids, Tags: tags, }, diff --git a/coderd/provisionerdaemons_test.go b/coderd/provisionerdaemons_test.go index 249da9d6bc922..8bbaca551a151 100644 --- a/coderd/provisionerdaemons_test.go +++ b/coderd/provisionerdaemons_test.go @@ -146,7 +146,9 @@ func TestProvisionerDaemons(t *testing.T) { t.Run("Default limit", func(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitMedium) - daemons, err := templateAdminClient.OrganizationProvisionerDaemons(ctx, owner.OrganizationID, nil) + daemons, err := templateAdminClient.OrganizationProvisionerDaemons(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerDaemonsOptions{ + Offline: true, + }) require.NoError(t, err) require.Len(t, daemons, 50) }) @@ -155,7 +157,8 @@ func TestProvisionerDaemons(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitMedium) daemons, err := templateAdminClient.OrganizationProvisionerDaemons(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerDaemonsOptions{ - IDs: []uuid.UUID{pd1.ID, pd2.ID}, + IDs: []uuid.UUID{pd1.ID, pd2.ID}, + Offline: true, }) require.NoError(t, err) require.Len(t, daemons, 2) @@ -167,7 +170,8 @@ func TestProvisionerDaemons(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitMedium) daemons, err := templateAdminClient.OrganizationProvisionerDaemons(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerDaemonsOptions{ - Tags: map[string]string{"count": "1"}, + Tags: map[string]string{"count": "1"}, + Offline: true, }) require.NoError(t, err) require.Len(t, daemons, 1) @@ -209,7 +213,8 @@ func TestProvisionerDaemons(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitMedium) daemons, err := templateAdminClient.OrganizationProvisionerDaemons(ctx, owner.OrganizationID, &codersdk.OrganizationProvisionerDaemonsOptions{ - IDs: []uuid.UUID{pd2.ID}, + IDs: []uuid.UUID{pd2.ID}, + Offline: true, }) require.NoError(t, err) require.Len(t, daemons, 1) diff --git a/codersdk/organizations.go b/codersdk/organizations.go index f87d0eae188ba..bca87c7bd4591 100644 --- a/codersdk/organizations.go +++ b/codersdk/organizations.go @@ -344,9 +344,12 @@ func (c *Client) ProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, e } type OrganizationProvisionerDaemonsOptions struct { - Limit int - IDs []uuid.UUID - Tags map[string]string + Limit int + Offline bool + Status []ProvisionerDaemonStatus + MaxAge time.Duration + IDs []uuid.UUID + Tags map[string]string } func (c *Client) OrganizationProvisionerDaemons(ctx context.Context, organizationID uuid.UUID, opts *OrganizationProvisionerDaemonsOptions) ([]ProvisionerDaemon, error) { @@ -355,6 +358,15 @@ func (c *Client) OrganizationProvisionerDaemons(ctx context.Context, organizatio if opts.Limit > 0 { qp.Add("limit", strconv.Itoa(opts.Limit)) } + if opts.Offline { + qp.Add("offline", "true") + } + if len(opts.Status) > 0 { + qp.Add("status", joinSlice(opts.Status)) + } + if opts.MaxAge > 0 { + qp.Add("max_age", opts.MaxAge.String()) + } if len(opts.IDs) > 0 { qp.Add("ids", joinSliceStringer(opts.IDs)) } diff --git a/codersdk/provisionerdaemons.go b/codersdk/provisionerdaemons.go index e36f995f1688e..4bff7d7827aa1 100644 --- a/codersdk/provisionerdaemons.go +++ b/codersdk/provisionerdaemons.go @@ -49,6 +49,14 @@ const ( ProvisionerDaemonBusy ProvisionerDaemonStatus = "busy" ) +func ProvisionerDaemonStatusEnums() []ProvisionerDaemonStatus { + return []ProvisionerDaemonStatus{ + ProvisionerDaemonOffline, + ProvisionerDaemonIdle, + ProvisionerDaemonBusy, + } +} + type ProvisionerDaemon struct { ID uuid.UUID `json:"id" format:"uuid" table:"id"` OrganizationID uuid.UUID `json:"organization_id" format:"uuid" table:"organization id"` diff --git a/docs/reference/cli/provisioner_list.md b/docs/reference/cli/provisioner_list.md index 128d76caf4c7e..aa67dcd815f67 100644 --- a/docs/reference/cli/provisioner_list.md +++ b/docs/reference/cli/provisioner_list.md @@ -25,6 +25,33 @@ coder provisioner list [flags] Limit the number of provisioners returned. +### -f, --show-offline + +| | | +|-------------|----------------------------------------------| +| Type | bool | +| Environment | $CODER_PROVISIONER_SHOW_OFFLINE | + +Show offline provisioners. + +### -s, --status + +| | | +|-------------|---------------------------------------------| +| Type | [offline\|idle\|busy] | +| Environment | $CODER_PROVISIONER_LIST_STATUS | + +Filter by provisioner status. + +### -m, --max-age + +| | | +|-------------|----------------------------------------------| +| Type | duration | +| Environment | $CODER_PROVISIONER_LIST_MAX_AGE | + +Filter provisioners by maximum age. + ### -O, --org | | | diff --git a/enterprise/cli/testdata/coder_provisioner_list_--help.golden b/enterprise/cli/testdata/coder_provisioner_list_--help.golden index 7a1807bb012f5..ce6d0754073a4 100644 --- a/enterprise/cli/testdata/coder_provisioner_list_--help.golden +++ b/enterprise/cli/testdata/coder_provisioner_list_--help.golden @@ -17,8 +17,17 @@ OPTIONS: -l, --limit int, $CODER_PROVISIONER_LIST_LIMIT (default: 50) Limit the number of provisioners returned. + -m, --max-age duration, $CODER_PROVISIONER_LIST_MAX_AGE + Filter provisioners by maximum age. + -o, --output table|json (default: table) Output format. + -f, --show-offline bool, $CODER_PROVISIONER_SHOW_OFFLINE + Show offline provisioners. + + -s, --status [offline|idle|busy], $CODER_PROVISIONER_LIST_STATUS + Filter by provisioner status. + ——— Run `coder --help` for a list of global options. diff --git a/site/src/api/api.ts b/site/src/api/api.ts index a6a6f4f383b56..d95d644ef7678 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -421,6 +421,8 @@ export type GetProvisionerDaemonsParams = { // Stringified JSON Object tags?: string; limit?: number; + // Include offline provisioner daemons? + offline?: boolean; }; export type TasksFilter = { diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index db840040687fc..a6610e3327cbe 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -1840,6 +1840,9 @@ export interface OrganizationMemberWithUserData extends OrganizationMember { // From codersdk/organizations.go export interface OrganizationProvisionerDaemonsOptions { readonly Limit: number; + readonly Offline: boolean; + readonly Status: readonly ProvisionerDaemonStatus[]; + readonly MaxAge: number; readonly IDs: readonly string[]; readonly Tags: Record; } diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx index 997621cdece10..95db66f2c41c4 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPage.tsx @@ -20,6 +20,7 @@ const OrganizationProvisionersPage: FC = () => { const queryParams = { ids: searchParams.get("ids") ?? "", tags: searchParams.get("tags") ?? "", + offline: searchParams.get("offline") === "true", }; const { organization, organizationPermissions } = useOrganizationSettings(); const { entitlements } = useDashboard(); @@ -66,7 +67,12 @@ const OrganizationProvisionersPage: FC = () => { buildVersion={buildInfoQuery.data?.version} onRetry={provisionersQuery.refetch} filter={queryParams} - onFilterChange={setSearchParams} + onFilterChange={({ ids, offline }) => { + setSearchParams({ + ids, + offline: offline.toString(), + }); + }} /> ); diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx index d1bcd7fbcb816..8dba15b4d8856 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.stories.tsx @@ -23,9 +23,14 @@ const meta: Meta = { ...MockProvisionerWithTags, version: "0.0.0", }, + { + ...MockUserProvisioner, + status: "offline", + }, ], filter: { ids: "", + offline: true, }, }, }; @@ -69,6 +74,17 @@ export const FilterByID: Story = { provisioners: [MockProvisioner], filter: { ids: MockProvisioner.id, + offline: true, + }, + }, +}; + +export const FilterByOffline: Story = { + args: { + provisioners: [MockProvisioner], + filter: { + ids: "", + offline: false, }, }, }; diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx index 387baf31519cb..ac6e45aed24cf 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationProvisionersPage/OrganizationProvisionersPageView.tsx @@ -1,6 +1,7 @@ import type { ProvisionerDaemon } from "api/typesGenerated"; import { Badge } from "components/Badge/Badge"; import { Button } from "components/Button/Button"; +import { Checkbox } from "components/Checkbox/Checkbox"; import { EmptyState } from "components/EmptyState/EmptyState"; import { Link } from "components/Link/Link"; import { Loader } from "components/Loader/Loader"; @@ -24,7 +25,7 @@ import { TooltipProvider, TooltipTrigger, } from "components/Tooltip/Tooltip"; -import { SquareArrowOutUpRightIcon, XIcon } from "lucide-react"; +import { XIcon } from "lucide-react"; import type { FC } from "react"; import { docs } from "utils/docs"; import { LastConnectionHead } from "./LastConnectionHead"; @@ -32,6 +33,7 @@ import { ProvisionerRow } from "./ProvisionerRow"; type ProvisionersFilter = { ids: string; + offline: boolean; }; interface OrganizationProvisionersPageViewProps { @@ -102,70 +104,89 @@ export const OrganizationProvisionersPageView: FC< documentationLink={docs("/")} /> ) : ( - - - - Name - Key - Version - Status - Tags - - - - - - - {provisioners ? ( - provisioners.length > 0 ? ( - provisioners.map((provisioner) => ( - - )) - ) : ( + <> +
    + { + onFilterChange({ + ...filter, + offline: checked === true, + }); + }} + /> + +
    +
    + + + Name + Key + Version + Status + Tags + + + + + + + {provisioners ? ( + provisioners.length > 0 ? ( + provisioners.map((provisioner) => ( + + )) + ) : ( + + + + + Create a provisioner + + + } + /> + + + ) + ) : error ? ( - - Create a provisioner - - + } /> - ) - ) : error ? ( - - - - Retry - - } - /> - - - ) : ( - - - - - - )} - -
    + ) : ( + + + + + + )} + + + )} ); From 9a872f903e7a1b1dde485b301b4ef4757f31eb7e Mon Sep 17 00:00:00 2001 From: Andrew Aquino Date: Thu, 21 Aug 2025 20:22:25 -0400 Subject: [PATCH 246/260] feat: show workspace health error alert above agents in WorkspacePage (#19400) closes #19338 image --- .../pages/WorkspacePage/Workspace.stories.tsx | 18 +++++++++ site/src/pages/WorkspacePage/Workspace.tsx | 39 +++++++++++++++++++ .../WorkspaceNotifications.stories.tsx | 2 +- .../WorkspaceNotifications.tsx | 2 +- site/src/testHelpers/entities.ts | 23 +++++++++++ 5 files changed, 82 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspacePage/Workspace.stories.tsx b/site/src/pages/WorkspacePage/Workspace.stories.tsx index df07c59c1c660..5a49e0fa57091 100644 --- a/site/src/pages/WorkspacePage/Workspace.stories.tsx +++ b/site/src/pages/WorkspacePage/Workspace.stories.tsx @@ -9,6 +9,7 @@ import type { ProvisionerJobLog } from "api/typesGenerated"; import { action } from "storybook/actions"; import type { WorkspacePermissions } from "../../modules/workspaces/permissions"; import { Workspace } from "./Workspace"; +import { defaultPermissions } from "./WorkspaceNotifications/WorkspaceNotifications.stories"; // Helper function to create timestamps easily - Copied from AppStatuses.stories.tsx const createTimestamp = ( @@ -349,6 +350,23 @@ export const Stopping: Story = { }, }; +export const Unhealthy: Story = { + args: { + ...Running.args, + workspace: Mocks.MockUnhealthyWorkspace, + }, +}; + +export const UnhealthyWithoutUpdatePermission: Story = { + args: { + ...Unhealthy.args, + permissions: { + ...defaultPermissions, + updateWorkspace: false, + }, + }, +}; + export const FailedWithLogs: Story = { args: { ...Running.args, diff --git a/site/src/pages/WorkspacePage/Workspace.tsx b/site/src/pages/WorkspacePage/Workspace.tsx index b81605dc239e9..b1eda1618038b 100644 --- a/site/src/pages/WorkspacePage/Workspace.tsx +++ b/site/src/pages/WorkspacePage/Workspace.tsx @@ -21,6 +21,8 @@ import { WorkspaceBuildProgress, } from "./WorkspaceBuildProgress"; import { WorkspaceDeletedBanner } from "./WorkspaceDeletedBanner"; +import { NotificationActionButton } from "./WorkspaceNotifications/Notifications"; +import { findTroubleshootingURL } from "./WorkspaceNotifications/WorkspaceNotifications"; import { WorkspaceTopbar } from "./WorkspaceTopbar"; interface WorkspaceProps { @@ -97,6 +99,8 @@ export const Workspace: FC = ({ (workspace.latest_build.matched_provisioners?.available ?? 1) > 0; const shouldShowProvisionerAlert = workspacePending && !haveBuildLogs && !provisionersHealthy && !isRestarting; + const troubleshootingURL = findTroubleshootingURL(workspace.latest_build); + const hasActions = permissions.updateWorkspace || troubleshootingURL; return (
    @@ -194,6 +198,41 @@ export const Workspace: FC = ({ )} + {!workspace.health.healthy && ( + + Workspace is unhealthy + +

    + Your workspace is running but{" "} + {workspace.health.failing_agents.length > 1 + ? `${workspace.health.failing_agents.length} agents are unhealthy` + : "1 agent is unhealthy"} + . +

    + {hasActions && ( +
    + {permissions.updateWorkspace && ( + handleRestart()} + > + Restart + + )} + {troubleshootingURL && ( + + window.open(troubleshootingURL, "_blank") + } + > + Troubleshooting + + )} +
    + )} +
    +
    + )} + {transitionStats !== undefined && ( >; -const findTroubleshootingURL = ( +export const findTroubleshootingURL = ( workspaceBuild: WorkspaceBuild, ): string | undefined => { for (const resource of workspaceBuild.resources) { diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index c130c952185fd..993b012bc09e2 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -994,6 +994,15 @@ export const MockWorkspaceSubAgent: TypesGen.WorkspaceAgent = { ], }; +const MockWorkspaceUnhealthyAgent: TypesGen.WorkspaceAgent = { + ...MockWorkspaceAgent, + id: "test-workspace-unhealthy-agent", + name: "a-workspace-unhealthy-agent", + status: "timeout", + lifecycle_state: "start_error", + health: { healthy: false }, +}; + export const MockWorkspaceAppStatus: TypesGen.WorkspaceAppStatus = { id: "test-app-status", created_at: "2022-05-17T17:39:01.382927298Z", @@ -1445,6 +1454,20 @@ export const MockStoppingWorkspace: TypesGen.Workspace = { status: "stopping", }, }; +export const MockUnhealthyWorkspace: TypesGen.Workspace = { + ...MockWorkspace, + id: "test-unhealthy-workspace", + health: { + healthy: false, + failing_agents: [MockWorkspaceUnhealthyAgent.id], + }, + latest_build: { + ...MockWorkspace.latest_build, + resources: [ + { ...MockWorkspaceResource, agents: [MockWorkspaceUnhealthyAgent] }, + ], + }, +}; export const MockStartingWorkspace: TypesGen.Workspace = { ...MockWorkspace, id: "test-starting-workspace", From a71e5cc8b0bf05f96c65b5320973fe848f48f294 Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Fri, 22 Aug 2025 12:20:03 +1000 Subject: [PATCH 247/260] test: add increasing integer to GetRandomNameHyphenated (#19481) Fixes flakes like the following: ``` workspaces_test.go:4938: Error Trace: /home/runner/work/coder/coder/coderd/coderdtest/coderdtest.go:1279 /home/runner/work/coder/coder/coderd/workspaces_test.go:4938 /home/runner/work/coder/coder/coderd/workspaces_test.go:5044 Error: Received unexpected error: POST http://127.0.0.1:42597/api/v2/users/me/workspaces: unexpected status code 409: Workspace "romantic-mcclintock" already exists. name: This value is already in use and should be unique. Test: TestWorkspaceCreateWithImplicitPreset/SinglePresetWithParameters ``` https://github.com/coder/coder/actions/runs/17142665868/job/48633017007?pr=19464 Which are caused by insufficient randomness when creating multiple workspaces with random names. Two words is not enough to avoid flakes. We have a `testutil.GetRandomName` function that appends a monotonically increasing integer, but this alternative function that uses hyphens doesn't add that integer. This PR fixes that by just `testutil.GetRandomName` --- testutil/names.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testutil/names.go b/testutil/names.go index e53e854fae239..bb804ba2cf400 100644 --- a/testutil/names.go +++ b/testutil/names.go @@ -30,7 +30,7 @@ func GetRandomName(t testing.TB) string { // an underscore. func GetRandomNameHyphenated(t testing.TB) string { t.Helper() - name := namesgenerator.GetRandomName(0) + name := GetRandomName(t) return strings.ReplaceAll(name, "_", "-") } From b90bc7c398d7d878d537011896f345afbc162faa Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Fri, 22 Aug 2025 07:41:49 +0200 Subject: [PATCH 248/260] feat: use cloud secret for DNS token in scaletest TF (#19466) Removes the requirement to obtain a Cloudflare DNS token from our scaletest/terraform/action builds. Instead, by default, we pull the token from Google Secrets Manager and use the `scaletest.dev` DNS domain. Removes cloudflare_email as this was unneeded. Removes the cloudflare_zone_id and instead pulls it from a data source via the Cloudflare API. closes https://github.com/coder/internal/issues/839 --- scaletest/terraform/action/cf_dns.tf | 6 +++++- scaletest/terraform/action/main.tf | 7 ++++++- scaletest/terraform/action/vars.tf | 14 +++++--------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/scaletest/terraform/action/cf_dns.tf b/scaletest/terraform/action/cf_dns.tf index eaaff28ce03a0..664b909ae90b2 100644 --- a/scaletest/terraform/action/cf_dns.tf +++ b/scaletest/terraform/action/cf_dns.tf @@ -1,6 +1,10 @@ +data "cloudflare_zone" "domain" { + name = var.cloudflare_domain +} + resource "cloudflare_record" "coder" { for_each = local.deployments - zone_id = var.cloudflare_zone_id + zone_id = data.cloudflare_zone.domain.zone_id name = each.value.subdomain content = google_compute_address.coder[each.key].address type = "A" diff --git a/scaletest/terraform/action/main.tf b/scaletest/terraform/action/main.tf index c5e22ff9f03ad..cd26c7ec1ccd2 100644 --- a/scaletest/terraform/action/main.tf +++ b/scaletest/terraform/action/main.tf @@ -46,8 +46,13 @@ terraform { provider "google" { } +data "google_secret_manager_secret_version_access" "cloudflare_api_token_dns" { + secret = "cloudflare-api-token-dns" + project = var.project_id +} + provider "cloudflare" { - api_token = var.cloudflare_api_token + api_token = coalesce(var.cloudflare_api_token, data.google_secret_manager_secret_version_access.cloudflare_api_token_dns.secret_data) } provider "kubernetes" { diff --git a/scaletest/terraform/action/vars.tf b/scaletest/terraform/action/vars.tf index 6788e843d8b6f..3952baab82b80 100644 --- a/scaletest/terraform/action/vars.tf +++ b/scaletest/terraform/action/vars.tf @@ -13,6 +13,7 @@ variable "scenario" { // GCP variable "project_id" { description = "The project in which to provision resources" + default = "coder-scaletest" } variable "k8s_version" { @@ -24,19 +25,14 @@ variable "k8s_version" { variable "cloudflare_api_token" { description = "Cloudflare API token." sensitive = true -} - -variable "cloudflare_email" { - description = "Cloudflare email address." - sensitive = true + # only override if you want to change the cloudflare_domain; pulls the token for scaletest.dev from Google Secrets + # Manager if null. + default = null } variable "cloudflare_domain" { description = "Cloudflare coder domain." -} - -variable "cloudflare_zone_id" { - description = "Cloudflare zone ID." + default = "scaletest.dev" } // Coder From 82f2e159747c818881ed94295bf42e832a566aaa Mon Sep 17 00:00:00 2001 From: Dean Sheather Date: Fri, 22 Aug 2025 16:32:35 +1000 Subject: [PATCH 249/260] chore: add unknown usage event type error (#19436) - Adds `usagetypes.UnknownEventTypeError` type, which is returned by `ParseEventWithType` - Changes `ParseEvent` to not be a generic function since it doesn't really need it - Adds `User-Agent` to tallyman requests --- coderd/usage/usagetypes/events.go | 49 +++++++++++++++++++------- coderd/usage/usagetypes/events_test.go | 27 ++++++++------ enterprise/coderd/usage/publisher.go | 2 ++ 3 files changed, 55 insertions(+), 23 deletions(-) diff --git a/coderd/usage/usagetypes/events.go b/coderd/usage/usagetypes/events.go index a8558fc49090e..ef5ac79d455fa 100644 --- a/coderd/usage/usagetypes/events.go +++ b/coderd/usage/usagetypes/events.go @@ -13,6 +13,7 @@ package usagetypes import ( "bytes" "encoding/json" + "fmt" "strings" "golang.org/x/xerrors" @@ -22,6 +23,10 @@ import ( // type `usage_event_type`. type UsageEventType string +// All event types. +// +// When adding a new event type, ensure you add it to the Valid method and the +// ParseEventWithType function. const ( UsageEventTypeDCManagedAgentsV1 UsageEventType = "dc_managed_agents_v1" ) @@ -43,38 +48,56 @@ func (e UsageEventType) IsHeartbeat() bool { return e.Valid() && strings.HasPrefix(string(e), "hb_") } -// ParseEvent parses the raw event data into the specified Go type. It fails if -// there is any unknown fields or extra data after the event. The returned event -// is validated. -func ParseEvent[T Event](data json.RawMessage) (T, error) { +// ParseEvent parses the raw event data into the provided event. It fails if +// there is any unknown fields or extra data at the end of the JSON. The +// returned event is validated. +func ParseEvent(data json.RawMessage, out Event) error { dec := json.NewDecoder(bytes.NewReader(data)) dec.DisallowUnknownFields() - var event T - err := dec.Decode(&event) + err := dec.Decode(out) if err != nil { - return event, xerrors.Errorf("unmarshal %T event: %w", event, err) + return xerrors.Errorf("unmarshal %T event: %w", out, err) } if dec.More() { - return event, xerrors.Errorf("extra data after %T event", event) + return xerrors.Errorf("extra data after %T event", out) } - err = event.Valid() + err = out.Valid() if err != nil { - return event, xerrors.Errorf("invalid %T event: %w", event, err) + return xerrors.Errorf("invalid %T event: %w", out, err) } - return event, nil + return nil +} + +// UnknownEventTypeError is returned by ParseEventWithType when an unknown event +// type is encountered. +type UnknownEventTypeError struct { + EventType string +} + +var _ error = UnknownEventTypeError{} + +// Error implements error. +func (e UnknownEventTypeError) Error() string { + return fmt.Sprintf("unknown usage event type: %q", e.EventType) } // ParseEventWithType parses the raw event data into the specified Go type. It // fails if there is any unknown fields or extra data after the event. The // returned event is validated. +// +// If the event type is unknown, UnknownEventTypeError is returned. func ParseEventWithType(eventType UsageEventType, data json.RawMessage) (Event, error) { switch eventType { case UsageEventTypeDCManagedAgentsV1: - return ParseEvent[DCManagedAgentsV1](data) + var event DCManagedAgentsV1 + if err := ParseEvent(data, &event); err != nil { + return nil, err + } + return event, nil default: - return nil, xerrors.Errorf("unknown event type: %s", eventType) + return nil, UnknownEventTypeError{EventType: string(eventType)} } } diff --git a/coderd/usage/usagetypes/events_test.go b/coderd/usage/usagetypes/events_test.go index 1e09aa07851c3..a04e5d4df025b 100644 --- a/coderd/usage/usagetypes/events_test.go +++ b/coderd/usage/usagetypes/events_test.go @@ -13,29 +13,34 @@ func TestParseEvent(t *testing.T) { t.Run("ExtraFields", func(t *testing.T) { t.Parallel() - _, err := usagetypes.ParseEvent[usagetypes.DCManagedAgentsV1]([]byte(`{"count": 1, "extra": "field"}`)) - require.ErrorContains(t, err, "unmarshal usagetypes.DCManagedAgentsV1 event") + var event usagetypes.DCManagedAgentsV1 + err := usagetypes.ParseEvent([]byte(`{"count": 1, "extra": "field"}`), &event) + require.ErrorContains(t, err, "unmarshal *usagetypes.DCManagedAgentsV1 event") }) t.Run("ExtraData", func(t *testing.T) { t.Parallel() - _, err := usagetypes.ParseEvent[usagetypes.DCManagedAgentsV1]([]byte(`{"count": 1}{"count": 2}`)) - require.ErrorContains(t, err, "extra data after usagetypes.DCManagedAgentsV1 event") + var event usagetypes.DCManagedAgentsV1 + err := usagetypes.ParseEvent([]byte(`{"count": 1}{"count": 2}`), &event) + require.ErrorContains(t, err, "extra data after *usagetypes.DCManagedAgentsV1 event") }) t.Run("DCManagedAgentsV1", func(t *testing.T) { t.Parallel() - event, err := usagetypes.ParseEvent[usagetypes.DCManagedAgentsV1]([]byte(`{"count": 1}`)) + var event usagetypes.DCManagedAgentsV1 + err := usagetypes.ParseEvent([]byte(`{"count": 1}`), &event) require.NoError(t, err) require.Equal(t, usagetypes.DCManagedAgentsV1{Count: 1}, event) require.Equal(t, map[string]any{"count": uint64(1)}, event.Fields()) - _, err = usagetypes.ParseEvent[usagetypes.DCManagedAgentsV1]([]byte(`{"count": "invalid"}`)) - require.ErrorContains(t, err, "unmarshal usagetypes.DCManagedAgentsV1 event") + event = usagetypes.DCManagedAgentsV1{} + err = usagetypes.ParseEvent([]byte(`{"count": "invalid"}`), &event) + require.ErrorContains(t, err, "unmarshal *usagetypes.DCManagedAgentsV1 event") - _, err = usagetypes.ParseEvent[usagetypes.DCManagedAgentsV1]([]byte(`{}`)) - require.ErrorContains(t, err, "invalid usagetypes.DCManagedAgentsV1 event: count must be greater than 0") + event = usagetypes.DCManagedAgentsV1{} + err = usagetypes.ParseEvent([]byte(`{}`), &event) + require.ErrorContains(t, err, "invalid *usagetypes.DCManagedAgentsV1 event: count must be greater than 0") }) } @@ -45,7 +50,9 @@ func TestParseEventWithType(t *testing.T) { t.Run("UnknownEvent", func(t *testing.T) { t.Parallel() _, err := usagetypes.ParseEventWithType(usagetypes.UsageEventType("fake"), []byte(`{}`)) - require.ErrorContains(t, err, "unknown event type: fake") + var unknownEventTypeError usagetypes.UnknownEventTypeError + require.ErrorAs(t, err, &unknownEventTypeError) + require.Equal(t, "fake", unknownEventTypeError.EventType) }) t.Run("DCManagedAgentsV1", func(t *testing.T) { diff --git a/enterprise/coderd/usage/publisher.go b/enterprise/coderd/usage/publisher.go index 16cc5564d0c08..ce38f9a24a925 100644 --- a/enterprise/coderd/usage/publisher.go +++ b/enterprise/coderd/usage/publisher.go @@ -14,6 +14,7 @@ import ( "golang.org/x/xerrors" "cdr.dev/slog" + "github.com/coder/coder/v2/buildinfo" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/dbauthz" "github.com/coder/coder/v2/coderd/database/dbtime" @@ -396,6 +397,7 @@ func (p *tallymanPublisher) sendPublishRequest(ctx context.Context, deploymentID if err != nil { return usagetypes.TallymanV1IngestResponse{}, err } + r.Header.Set("User-Agent", "coderd/"+buildinfo.Version()) r.Header.Set(usagetypes.TallymanCoderLicenseKeyHeader, licenseJwt) r.Header.Set(usagetypes.TallymanCoderDeploymentIDHeader, deploymentID.String()) From 213fffbfa688b9cccc1542c03a63b1f44b617d8e Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Fri, 22 Aug 2025 09:37:48 +0100 Subject: [PATCH 250/260] chore: add git-config module to dogfood template (#19489) As a developer, I want to be immediately able to run `git commit` in a fresh workspace. --- dogfood/coder/main.tf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index 0416317033234..2f3e870d7d49c 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -359,6 +359,13 @@ module "dotfiles" { agent_id = coder_agent.dev.id } +module "git-config" { + count = data.coder_workspace.me.start_count + source = "dev.registry.coder.com/coder/git-config/coder" + version = "1.0.31" + agent_id = coder_agent.dev.id +} + module "git-clone" { count = data.coder_workspace.me.start_count source = "dev.registry.coder.com/coder/git-clone/coder" From e549084b7f76cd03636eac000e3ba31efb6b5c94 Mon Sep 17 00:00:00 2001 From: Danny Kopping Date: Fri, 22 Aug 2025 12:07:01 +0200 Subject: [PATCH 251/260] chore: add pull request template for AI guidelines (#19487) --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000000..66deeefbc1d47 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1 @@ +If you have used AI to produce some or all of this PR, please ensure you have read our [AI Contribution guidelines](https://coder.com/docs/about/contributing/AI_CONTRIBUTING) before submitting. From 4970da433c2fb9c304a6fa3349bf6fcdcdab9fb6 Mon Sep 17 00:00:00 2001 From: Danny Kopping Date: Fri, 22 Aug 2025 13:28:40 +0200 Subject: [PATCH 252/260] chore: remove coderabbit (#19491) --- .coderabbit.yaml | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml deleted file mode 100644 index 03acfa4335995..0000000000000 --- a/.coderabbit.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json - -# CodeRabbit Configuration -# This configuration disables automatic reviews entirely - -language: "en-US" -early_access: false - -reviews: - # Disable automatic reviews for new PRs, but allow incremental reviews - auto_review: - enabled: false # Disable automatic review of new/updated PRs - drafts: false # Don't review draft PRs automatically - - # Other review settings (only apply if manually requested) - profile: "chill" - request_changes_workflow: false - high_level_summary: false - poem: false - review_status: false - collapse_walkthrough: true - high_level_summary_in_walkthrough: true - -chat: - auto_reply: true # Allow automatic chat replies - -# Note: With auto_review.enabled: false, CodeRabbit will only perform initial -# reviews when manually requested, but incremental reviews and chat replies remain enabled From 5e49d8c569825ad7edc0f5db7db01b008e366c88 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Fri, 22 Aug 2025 13:40:06 +0100 Subject: [PATCH 253/260] chore: reduce execution time of TestProvisionerJobs (#19475) Note: this commit was partially authored by AI. - Replaces coderdtest.CreateTemplate/TemplateVersion() with direct dbgen calls. We do not need a fully functional template for these tests. - Removes provisioner daemon creation/cleanup. We do not need a running provisioner daemon here; this functionality is tested elsewhere. - Simplifies provisioner job creation test helpers. This reduces the test runtime by over 50%: Old: ``` time go test -count=100 ./cli -test.run=TestProvisionerJobs ok github.com/coder/coder/v2/cli 50.149s ``` New: ``` time go test -count=100 ./cli -test.run=TestProvisionerJobs ok github.com/coder/coder/v2/cli 21.898 ``` --- cli/provisionerjobs_test.go | 111 +++++++++++++++++------------------- 1 file changed, 52 insertions(+), 59 deletions(-) diff --git a/cli/provisionerjobs_test.go b/cli/provisionerjobs_test.go index b33fd8b984dc7..4db42e8e3c9e7 100644 --- a/cli/provisionerjobs_test.go +++ b/cli/provisionerjobs_test.go @@ -8,7 +8,6 @@ import ( "testing" "time" - "github.com/aws/smithy-go/ptr" "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -20,6 +19,7 @@ import ( "github.com/coder/coder/v2/coderd/database/dbtestutil" "github.com/coder/coder/v2/coderd/rbac" "github.com/coder/coder/v2/codersdk" + "github.com/coder/coder/v2/provisionersdk" "github.com/coder/coder/v2/testutil" ) @@ -36,67 +36,43 @@ func TestProvisionerJobs(t *testing.T) { templateAdminClient, templateAdmin := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.ScopedRoleOrgTemplateAdmin(owner.OrganizationID)) memberClient, member := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) - // Create initial resources with a running provisioner. - firstProvisioner := coderdtest.NewTaggedProvisionerDaemon(t, coderdAPI, "default-provisioner", map[string]string{"owner": "", "scope": "organization"}) - t.Cleanup(func() { _ = firstProvisioner.Close() }) - version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, completeWithAgent()) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID, func(req *codersdk.CreateTemplateRequest) { - req.AllowUserCancelWorkspaceJobs = ptr.Bool(true) + // These CLI tests are related to provisioner job CRUD operations and as such + // do not require the overhead of starting a provisioner. Other provisioner job + // functionalities (acquisition etc.) are tested elsewhere. + template := dbgen.Template(t, db, database.Template{ + OrganizationID: owner.OrganizationID, + CreatedBy: owner.UserID, + AllowUserCancelWorkspaceJobs: true, + }) + version := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + OrganizationID: owner.OrganizationID, + CreatedBy: owner.UserID, + TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true}, }) - - // Stop the provisioner so it doesn't grab any more jobs. - firstProvisioner.Close() t.Run("Cancel", func(t *testing.T) { t.Parallel() - // Set up test helpers. - type jobInput struct { - WorkspaceBuildID string `json:"workspace_build_id,omitempty"` - TemplateVersionID string `json:"template_version_id,omitempty"` - DryRun bool `json:"dry_run,omitempty"` - } - prepareJob := func(t *testing.T, input jobInput) database.ProvisionerJob { + // Test helper to create a provisioner job of a given type with a given input. + prepareJob := func(t *testing.T, jobType database.ProvisionerJobType, input json.RawMessage) database.ProvisionerJob { t.Helper() - - inputBytes, err := json.Marshal(input) - require.NoError(t, err) - - var typ database.ProvisionerJobType - switch { - case input.WorkspaceBuildID != "": - typ = database.ProvisionerJobTypeWorkspaceBuild - case input.TemplateVersionID != "": - if input.DryRun { - typ = database.ProvisionerJobTypeTemplateVersionDryRun - } else { - typ = database.ProvisionerJobTypeTemplateVersionImport - } - default: - t.Fatal("invalid input") - } - - var ( - tags = database.StringMap{"owner": "", "scope": "organization", "foo": uuid.New().String()} - _ = dbgen.ProvisionerDaemon(t, db, database.ProvisionerDaemon{Tags: tags}) - job = dbgen.ProvisionerJob(t, db, coderdAPI.Pubsub, database.ProvisionerJob{ - InitiatorID: member.ID, - Input: json.RawMessage(inputBytes), - Type: typ, - Tags: tags, - StartedAt: sql.NullTime{Time: coderdAPI.Clock.Now().Add(-time.Minute), Valid: true}, - }) - ) - return job + return dbgen.ProvisionerJob(t, db, coderdAPI.Pubsub, database.ProvisionerJob{ + InitiatorID: member.ID, + Input: input, + Type: jobType, + StartedAt: sql.NullTime{Time: coderdAPI.Clock.Now().Add(-time.Minute), Valid: true}, + Tags: database.StringMap{provisionersdk.TagOwner: "", provisionersdk.TagScope: provisionersdk.ScopeOrganization, "foo": uuid.NewString()}, + }) } + // Test helper to create a workspace build job with a predefined input. prepareWorkspaceBuildJob := func(t *testing.T) database.ProvisionerJob { t.Helper() var ( - wbID = uuid.New() - job = prepareJob(t, jobInput{WorkspaceBuildID: wbID.String()}) - w = dbgen.Workspace(t, db, database.WorkspaceTable{ + wbID = uuid.New() + input, _ = json.Marshal(map[string]string{"workspace_build_id": wbID.String()}) + job = prepareJob(t, database.ProvisionerJobTypeWorkspaceBuild, input) + w = dbgen.Workspace(t, db, database.WorkspaceTable{ OrganizationID: owner.OrganizationID, OwnerID: member.ID, TemplateID: template.ID, @@ -112,12 +88,14 @@ func TestProvisionerJobs(t *testing.T) { return job } - prepareTemplateVersionImportJobBuilder := func(t *testing.T, dryRun bool) database.ProvisionerJob { + // Test helper to create a template version import job with a predefined input. + prepareTemplateVersionImportJob := func(t *testing.T) database.ProvisionerJob { t.Helper() var ( - tvID = uuid.New() - job = prepareJob(t, jobInput{TemplateVersionID: tvID.String(), DryRun: dryRun}) - _ = dbgen.TemplateVersion(t, db, database.TemplateVersion{ + tvID = uuid.New() + input, _ = json.Marshal(map[string]string{"template_version_id": tvID.String()}) + job = prepareJob(t, database.ProvisionerJobTypeTemplateVersionImport, input) + _ = dbgen.TemplateVersion(t, db, database.TemplateVersion{ OrganizationID: owner.OrganizationID, CreatedBy: templateAdmin.ID, ID: tvID, @@ -127,11 +105,26 @@ func TestProvisionerJobs(t *testing.T) { ) return job } - prepareTemplateVersionImportJob := func(t *testing.T) database.ProvisionerJob { - return prepareTemplateVersionImportJobBuilder(t, false) - } + + // Test helper to create a template version import dry run job with a predefined input. prepareTemplateVersionImportJobDryRun := func(t *testing.T) database.ProvisionerJob { - return prepareTemplateVersionImportJobBuilder(t, true) + t.Helper() + var ( + tvID = uuid.New() + input, _ = json.Marshal(map[string]interface{}{ + "template_version_id": tvID.String(), + "dry_run": true, + }) + job = prepareJob(t, database.ProvisionerJobTypeTemplateVersionDryRun, input) + _ = dbgen.TemplateVersion(t, db, database.TemplateVersion{ + OrganizationID: owner.OrganizationID, + CreatedBy: templateAdmin.ID, + ID: tvID, + TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true}, + JobID: job.ID, + }) + ) + return job } // Run the cancellation test suite. From 49f32d14eb6bfa8296534deb0251fadb1abc1947 Mon Sep 17 00:00:00 2001 From: Edward Angert Date: Fri, 22 Aug 2025 09:54:28 -0400 Subject: [PATCH 254/260] docs: add dev containers and scheduling to prebuilt workspaces known issues (#18816) closes #18806 - [x] scheduling limitation - [x] dev containers limitation - [x] edit intro [preview](https://coder.com/docs/@18806-prebuilds-known-limits/admin/templates/extending-templates/prebuilt-workspaces) ## Summary by CodeRabbit * **Documentation** * Clarified the introduction and administrator responsibilities for prebuilt workspaces. * Integrated compatibility information about DevContainers and workspace scheduling more contextually. * Added explicit notes on limitations with dev containers integration and workspace autostart/autostop features. * Improved configuration examples and clarified scheduling instructions. * Enhanced explanations of scheduling behavior and lifecycle steps for better understanding. --------- Co-authored-by: EdwardAngert <17991901+EdwardAngert@users.noreply.github.com> Co-authored-by: Sas Swart Co-authored-by: Susana Ferreira --- .../prebuilt-workspaces.md | 46 ++++++++----------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/docs/admin/templates/extending-templates/prebuilt-workspaces.md b/docs/admin/templates/extending-templates/prebuilt-workspaces.md index 70c2031d2a837..739e13d9130e5 100644 --- a/docs/admin/templates/extending-templates/prebuilt-workspaces.md +++ b/docs/admin/templates/extending-templates/prebuilt-workspaces.md @@ -1,18 +1,12 @@ # Prebuilt workspaces -> [!WARNING] -> Prebuilds Compatibility Limitations: -> Prebuilt workspaces currently do not work reliably with [DevContainers feature](../managing-templates/devcontainers/index.md). -> If your project relies on DevContainer configuration, we recommend disabling prebuilds or carefully testing behavior before enabling them. -> -> We’re actively working to improve compatibility, but for now, please avoid using prebuilds with this feature to ensure stability and expected behavior. +Prebuilt workspaces (prebuilds) reduce workspace creation time with an automatically-maintained pool of +ready-to-use workspaces for specific parameter presets. -Prebuilt workspaces allow template administrators to improve the developer experience by reducing workspace -creation time with an automatically maintained pool of ready-to-use workspaces for specific parameter presets. - -The template administrator configures a template to provision prebuilt workspaces in the background, and then when a developer creates -a new workspace that matches the preset, Coder assigns them an existing prebuilt instance. -Prebuilt workspaces significantly reduce wait times, especially for templates with complex provisioning or lengthy startup procedures. +The template administrator defines the prebuilt workspace's parameters and number of instances to keep provisioned. +The desired number of workspaces are then provisioned transparently. +When a developer creates a new workspace that matches the definition, Coder assigns them an existing prebuilt workspace. +This significantly reduces wait times, especially for templates with complex provisioning or lengthy startup procedures. Prebuilt workspaces are: @@ -21,6 +15,9 @@ Prebuilt workspaces are: - Monitored and replaced automatically to maintain your desired pool size. - Automatically scaled based on time-based schedules to optimize resource usage. +Prebuilt workspaces are a special type of workspace that don't follow the +[regular workspace scheduling features](../../../user-guides/workspace-scheduling.md) like autostart and autostop. Instead, they have their own reconciliation loop that handles prebuild-specific scheduling features such as TTL and prebuild scheduling. + ## Relationship to workspace presets Prebuilt workspaces are tightly integrated with [workspace presets](./parameters.md#workspace-presets): @@ -53,7 +50,7 @@ instances your Coder deployment should maintain, and optionally configure a `exp prebuilds { instances = 3 # Number of prebuilt workspaces to maintain expiration_policy { - ttl = 86400 # Time (in seconds) after which unclaimed prebuilds are expired (1 day) + ttl = 86400 # Time (in seconds) after which unclaimed prebuilds are expired (86400 = 1 day) } } } @@ -159,17 +156,17 @@ data "coder_workspace_preset" "goland" { **Scheduling configuration:** -- **`timezone`**: The timezone for all cron expressions (required). Only a single timezone is supported per scheduling configuration. -- **`schedule`**: One or more schedule blocks defining when to scale to specific instance counts. - - **`cron`**: Cron expression interpreted as continuous time ranges (required). - - **`instances`**: Number of prebuilt workspaces to maintain during this schedule (required). +- `timezone`: (Required) The timezone for all cron expressions. Only a single timezone is supported per scheduling configuration. +- `schedule`: One or more schedule blocks defining when to scale to specific instance counts. + - `cron`: (Required) Cron expression interpreted as continuous time ranges. + - `instances`: (Required) Number of prebuilt workspaces to maintain during this schedule. **How scheduling works:** 1. The reconciliation loop evaluates all active schedules every reconciliation interval (`CODER_WORKSPACE_PREBUILDS_RECONCILIATION_INTERVAL`). -2. The schedule that matches the current time becomes active. Overlapping schedules are disallowed by validation rules. -3. If no schedules match the current time, the base `instances` count is used. -4. The reconciliation loop automatically creates or destroys prebuilt workspaces to match the target count. +1. The schedule that matches the current time becomes active. Overlapping schedules are disallowed by validation rules. +1. If no schedules match the current time, the base `instances` count is used. +1. The reconciliation loop automatically creates or destroys prebuilt workspaces to match the target count. **Cron expression format:** @@ -227,7 +224,7 @@ When a template's active version is updated: 1. Prebuilt workspaces for old versions are automatically deleted. 1. New prebuilt workspaces are created for the active template version. 1. If dependencies change (e.g., an [AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) update) without a template version change: - - You may delete the existing prebuilt workspaces manually. + - You can delete the existing prebuilt workspaces manually. - Coder will automatically create new prebuilt workspaces with the updated dependencies. The system always maintains the desired number of prebuilt workspaces for the active template version. @@ -285,13 +282,6 @@ For example, the [`ami`](https://registry.terraform.io/providers/hashicorp/aws/l has [`ForceNew`](https://github.com/hashicorp/terraform-provider-aws/blob/main/internal/service/ec2/ec2_instance.go#L75-L81) set, since the AMI cannot be changed in-place._ -#### Updating claimed prebuilt workspace templates - -Once a prebuilt workspace has been claimed, and if its template uses `ignore_changes`, users may run into an issue where the agent -does not reconnect after a template update. This shortcoming is described in [this issue](https://github.com/coder/coder/issues/17840) -and will be addressed before the next release (v2.23). In the interim, a simple workaround is to restart the workspace -when it is in this problematic state. - ### Monitoring and observability #### Available metrics From fe36e9c1200826ec17e1d3cfa1e0d24cdf6d76c6 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Fri, 22 Aug 2025 15:08:42 +0100 Subject: [PATCH 255/260] fix(dogfood/coder): allow mutable ai_prompt parameter (#19493) --- dogfood/coder/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dogfood/coder/main.tf b/dogfood/coder/main.tf index 2f3e870d7d49c..a464972cb05b6 100644 --- a/dogfood/coder/main.tf +++ b/dogfood/coder/main.tf @@ -254,7 +254,7 @@ data "coder_parameter" "ai_prompt" { name = "AI Prompt" default = "" description = "Prompt for Claude Code" - mutable = false + mutable = true // Workaround for issue with claiming a prebuild from a preset that does not include this parameter. } provider "docker" { From 427b23f49af028969d4ab9ab047a1845b55f3e9a Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Fri, 22 Aug 2025 17:11:31 +0300 Subject: [PATCH 256/260] feat(coderd): add tasks list and get endpoints (#19468) Fixes coder/internal#899 Example API response: ```json { "tasks": [ { "id": "a7a27450-ca16-4553-a6c5-9d6f04808569", "organization_id": "241e869f-1a61-42c9-ae1e-9d46df874058", "owner_id": "9e9b9475-0fc0-47b2-9170-a5b7b9a075ee", "name": "task-hardcore-herschel-bd08", "template_id": "accab607-bbda-4794-89ac-da3926a8b71c", "workspace_id": "a7a27450-ca16-4553-a6c5-9d6f04808569", "initial_prompt": "What directory are you in?", "status": "running", "current_state": { "timestamp": "2025-08-22T10:03:27.837842Z", "state": "working", "message": "Listed root directory contents, working directory reset", "uri": "" }, "created_at": "2025-08-22T09:21:39.697094Z", "updated_at": "2025-08-22T09:21:39.697094Z" }, { "id": "50f92138-f463-4f2b-abad-1816264b065f", "organization_id": "241e869f-1a61-42c9-ae1e-9d46df874058", "owner_id": "9e9b9475-0fc0-47b2-9170-a5b7b9a075ee", "name": "task-musing-dewdney-f058", "template_id": "accab607-bbda-4794-89ac-da3926a8b71c", "workspace_id": "50f92138-f463-4f2b-abad-1816264b065f", "initial_prompt": "What is 1 + 1?", "status": "running", "current_state": { "timestamp": "2025-08-22T09:22:33.810707Z", "state": "idle", "message": "Completed arithmetic calculation", "uri": "" }, "created_at": "2025-08-22T09:18:28.027378Z", "updated_at": "2025-08-22T09:18:28.027378Z" } ], "count": 2 } ``` --- coderd/aitasks.go | 254 +++++++++++++++++++++++++++++++++ coderd/aitasks_test.go | 127 ++++++++++++++++- coderd/coderd.go | 2 + codersdk/aitasks.go | 103 +++++++++++++ site/src/api/typesGenerated.ts | 38 +++++ 5 files changed, 523 insertions(+), 1 deletion(-) diff --git a/coderd/aitasks.go b/coderd/aitasks.go index 9ba201f11c0d6..de607e7619f77 100644 --- a/coderd/aitasks.go +++ b/coderd/aitasks.go @@ -1,6 +1,7 @@ package coderd import ( + "context" "database/sql" "errors" "fmt" @@ -8,7 +9,9 @@ import ( "slices" "strings" + "github.com/go-chi/chi/v5" "github.com/google/uuid" + "golang.org/x/xerrors" "cdr.dev/slog" @@ -17,6 +20,8 @@ import ( "github.com/coder/coder/v2/coderd/httpapi" "github.com/coder/coder/v2/coderd/httpmw" "github.com/coder/coder/v2/coderd/rbac" + "github.com/coder/coder/v2/coderd/rbac/policy" + "github.com/coder/coder/v2/coderd/searchquery" "github.com/coder/coder/v2/coderd/taskname" "github.com/coder/coder/v2/codersdk" ) @@ -186,3 +191,252 @@ func (api *API) tasksCreate(rw http.ResponseWriter, r *http.Request) { defer commitAudit() createWorkspace(ctx, aReq, apiKey.UserID, api, owner, createReq, rw, r) } + +// tasksFromWorkspaces converts a slice of API workspaces into tasks, fetching +// prompts and mapping status/state. This method enforces that only AI task +// workspaces are given. +func (api *API) tasksFromWorkspaces(ctx context.Context, apiWorkspaces []codersdk.Workspace) ([]codersdk.Task, error) { + // Enforce that only AI task workspaces are given. + for _, ws := range apiWorkspaces { + if ws.LatestBuild.HasAITask == nil || !*ws.LatestBuild.HasAITask { + return nil, xerrors.Errorf("workspace %s is not an AI task workspace", ws.ID) + } + } + + // Fetch prompts for each workspace build and map by build ID. + buildIDs := make([]uuid.UUID, 0, len(apiWorkspaces)) + for _, ws := range apiWorkspaces { + buildIDs = append(buildIDs, ws.LatestBuild.ID) + } + parameters, err := api.Database.GetWorkspaceBuildParametersByBuildIDs(ctx, buildIDs) + if err != nil { + return nil, err + } + promptsByBuildID := make(map[uuid.UUID]string, len(parameters)) + for _, p := range parameters { + if p.Name == codersdk.AITaskPromptParameterName { + promptsByBuildID[p.WorkspaceBuildID] = p.Value + } + } + + tasks := make([]codersdk.Task, 0, len(apiWorkspaces)) + for _, ws := range apiWorkspaces { + var currentState *codersdk.TaskStateEntry + if ws.LatestAppStatus != nil { + currentState = &codersdk.TaskStateEntry{ + Timestamp: ws.LatestAppStatus.CreatedAt, + State: codersdk.TaskState(ws.LatestAppStatus.State), + Message: ws.LatestAppStatus.Message, + URI: ws.LatestAppStatus.URI, + } + } + tasks = append(tasks, codersdk.Task{ + ID: ws.ID, + OrganizationID: ws.OrganizationID, + OwnerID: ws.OwnerID, + Name: ws.Name, + TemplateID: ws.TemplateID, + WorkspaceID: uuid.NullUUID{Valid: true, UUID: ws.ID}, + CreatedAt: ws.CreatedAt, + UpdatedAt: ws.UpdatedAt, + InitialPrompt: promptsByBuildID[ws.LatestBuild.ID], + Status: ws.LatestBuild.Status, + CurrentState: currentState, + }) + } + + return tasks, nil +} + +// tasksListResponse wraps a list of experimental tasks. +// +// Experimental: Response shape is experimental and may change. +type tasksListResponse struct { + Tasks []codersdk.Task `json:"tasks"` + Count int `json:"count"` +} + +// tasksList is an experimental endpoint to list AI tasks by mapping +// workspaces to a task-shaped response. +func (api *API) tasksList(rw http.ResponseWriter, r *http.Request) { + ctx := r.Context() + apiKey := httpmw.APIKey(r) + + // Support standard pagination/filters for workspaces. + page, ok := ParsePagination(rw, r) + if !ok { + return + } + queryStr := r.URL.Query().Get("q") + filter, errs := searchquery.Workspaces(ctx, api.Database, queryStr, page, api.AgentInactiveDisconnectTimeout) + if len(errs) > 0 { + httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ + Message: "Invalid workspace search query.", + Validations: errs, + }) + return + } + + // Ensure that we only include AI task workspaces in the results. + filter.HasAITask = sql.NullBool{Valid: true, Bool: true} + + if filter.OwnerUsername == "me" || filter.OwnerUsername == "" { + filter.OwnerID = apiKey.UserID + filter.OwnerUsername = "" + } + + prepared, err := api.HTTPAuth.AuthorizeSQLFilter(r, policy.ActionRead, rbac.ResourceWorkspace.Type) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error preparing sql filter.", + Detail: err.Error(), + }) + return + } + + // Order with requester's favorites first, include summary row. + filter.RequesterID = apiKey.UserID + filter.WithSummary = true + + workspaceRows, err := api.Database.GetAuthorizedWorkspaces(ctx, filter, prepared) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching workspaces.", + Detail: err.Error(), + }) + return + } + if len(workspaceRows) == 0 { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching workspaces.", + Detail: "Workspace summary row is missing.", + }) + return + } + if len(workspaceRows) == 1 { + httpapi.Write(ctx, rw, http.StatusOK, tasksListResponse{ + Tasks: []codersdk.Task{}, + Count: 0, + }) + return + } + + // Skip summary row. + workspaceRows = workspaceRows[:len(workspaceRows)-1] + + workspaces := database.ConvertWorkspaceRows(workspaceRows) + + // Gather associated data and convert to API workspaces. + data, err := api.workspaceData(ctx, workspaces) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching workspace resources.", + Detail: err.Error(), + }) + return + } + apiWorkspaces, err := convertWorkspaces(apiKey.UserID, workspaces, data) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error converting workspaces.", + Detail: err.Error(), + }) + return + } + + tasks, err := api.tasksFromWorkspaces(ctx, apiWorkspaces) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching task prompts and states.", + Detail: err.Error(), + }) + return + } + + httpapi.Write(ctx, rw, http.StatusOK, tasksListResponse{ + Tasks: tasks, + Count: len(tasks), + }) +} + +// taskGet is an experimental endpoint to fetch a single AI task by ID +// (workspace ID). It returns a synthesized task response including +// prompt and status. +func (api *API) taskGet(rw http.ResponseWriter, r *http.Request) { + ctx := r.Context() + apiKey := httpmw.APIKey(r) + + idStr := chi.URLParam(r, "id") + taskID, err := uuid.Parse(idStr) + if err != nil { + httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ + Message: fmt.Sprintf("Invalid UUID %q for task ID.", idStr), + }) + return + } + + // For now, taskID = workspaceID, once we have a task data model in + // the DB, we can change this lookup. + workspaceID := taskID + workspace, err := api.Database.GetWorkspaceByID(ctx, workspaceID) + if httpapi.Is404Error(err) { + httpapi.ResourceNotFound(rw) + return + } + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching workspace.", + Detail: err.Error(), + }) + return + } + + data, err := api.workspaceData(ctx, []database.Workspace{workspace}) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching workspace resources.", + Detail: err.Error(), + }) + return + } + if len(data.builds) == 0 || len(data.templates) == 0 { + httpapi.ResourceNotFound(rw) + return + } + if data.builds[0].HasAITask == nil || !*data.builds[0].HasAITask { + httpapi.ResourceNotFound(rw) + return + } + + appStatus := codersdk.WorkspaceAppStatus{} + if len(data.appStatuses) > 0 { + appStatus = data.appStatuses[0] + } + + ws, err := convertWorkspace( + apiKey.UserID, + workspace, + data.builds[0], + data.templates[0], + api.Options.AllowWorkspaceRenames, + appStatus, + ) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error converting workspace.", + Detail: err.Error(), + }) + return + } + + tasks, err := api.tasksFromWorkspaces(ctx, []codersdk.Workspace{ws}) + if err != nil { + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ + Message: "Internal error fetching task prompt and state.", + Detail: err.Error(), + }) + return + } + + httpapi.Write(ctx, rw, http.StatusOK, tasks[0]) +} diff --git a/coderd/aitasks_test.go b/coderd/aitasks_test.go index d4fecd2145f6d..131238de8a5bd 100644 --- a/coderd/aitasks_test.go +++ b/coderd/aitasks_test.go @@ -10,6 +10,7 @@ import ( "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database/dbtestutil" + "github.com/coder/coder/v2/coderd/util/slice" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" @@ -142,7 +143,131 @@ func TestAITasksPrompts(t *testing.T) { }) } -func TestTaskCreate(t *testing.T) { +func TestTasks(t *testing.T) { + t.Parallel() + + createAITemplate := func(t *testing.T, client *codersdk.Client, user codersdk.CreateFirstUserResponse) codersdk.Template { + t.Helper() + + // Create a template version that supports AI tasks with the AI Prompt parameter. + taskAppID := uuid.New() + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ + Parse: echo.ParseComplete, + ProvisionPlan: []*proto.Response{ + { + Type: &proto.Response_Plan{ + Plan: &proto.PlanComplete{ + Parameters: []*proto.RichParameter{{Name: codersdk.AITaskPromptParameterName, Type: "string"}}, + HasAiTasks: true, + }, + }, + }, + }, + ProvisionApply: []*proto.Response{ + { + Type: &proto.Response_Apply{ + Apply: &proto.ApplyComplete{ + Resources: []*proto.Resource{ + { + Name: "example", + Type: "aws_instance", + Agents: []*proto.Agent{ + { + Id: uuid.NewString(), + Name: "example", + Apps: []*proto.App{ + { + Id: taskAppID.String(), + Slug: "task-sidebar", + DisplayName: "Task Sidebar", + }, + }, + }, + }, + }, + }, + AiTasks: []*proto.AITask{ + { + SidebarApp: &proto.AITaskSidebarApp{ + Id: taskAppID.String(), + }, + }, + }, + }, + }, + }, + }, + }) + coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + + return template + } + + t.Run("List", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + ctx := testutil.Context(t, testutil.WaitLong) + + template := createAITemplate(t, client, user) + + // Create a workspace (task) with a specific prompt. + wantPrompt := "build me a web app" + workspace := coderdtest.CreateWorkspace(t, client, template.ID, func(req *codersdk.CreateWorkspaceRequest) { + req.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: codersdk.AITaskPromptParameterName, Value: wantPrompt}, + } + }) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + + // List tasks via experimental API and verify the prompt and status mapping. + exp := codersdk.NewExperimentalClient(client) + tasks, err := exp.Tasks(ctx, &codersdk.TasksFilter{Owner: codersdk.Me}) + require.NoError(t, err) + + got, ok := slice.Find(tasks, func(task codersdk.Task) bool { return task.ID == workspace.ID }) + require.True(t, ok, "task should be found in the list") + assert.Equal(t, wantPrompt, got.InitialPrompt, "task prompt should match the AI Prompt parameter") + assert.Equal(t, workspace.Name, got.Name, "task name should map from workspace name") + assert.Equal(t, workspace.ID, got.WorkspaceID.UUID, "workspace id should match") + // Status should be populated via app status or workspace status mapping. + assert.NotEmpty(t, got.Status, "task status should not be empty") + }) + + t.Run("Get", func(t *testing.T) { + t.Parallel() + + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + ctx := testutil.Context(t, testutil.WaitLong) + + template := createAITemplate(t, client, user) + + // Create a workspace (task) with a specific prompt. + wantPrompt := "review my code" + workspace := coderdtest.CreateWorkspace(t, client, template.ID, func(req *codersdk.CreateWorkspaceRequest) { + req.RichParameterValues = []codersdk.WorkspaceBuildParameter{ + {Name: codersdk.AITaskPromptParameterName, Value: wantPrompt}, + } + }) + coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + + // Fetch the task by ID via experimental API and verify fields. + exp := codersdk.NewExperimentalClient(client) + task, err := exp.TaskByID(ctx, workspace.ID) + require.NoError(t, err) + + assert.Equal(t, workspace.ID, task.ID, "task ID should match workspace ID") + assert.Equal(t, workspace.Name, task.Name, "task name should map from workspace name") + assert.Equal(t, wantPrompt, task.InitialPrompt, "task prompt should match the AI Prompt parameter") + assert.Equal(t, workspace.ID, task.WorkspaceID.UUID, "workspace id should match") + assert.NotEmpty(t, task.Status, "task status should not be empty") + }) +} + +func TestTasksCreate(t *testing.T) { t.Parallel() t.Run("OK", func(t *testing.T) { diff --git a/coderd/coderd.go b/coderd/coderd.go index 5debc13d21431..bb6f7b4fef4e5 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -1011,6 +1011,8 @@ func New(options *Options) *API { r.Route("/{user}", func(r chi.Router) { r.Use(httpmw.ExtractOrganizationMembersParam(options.Database, api.HTTPAuth.Authorize)) + r.Get("/", api.tasksList) + r.Get("/{id}", api.taskGet) r.Post("/", api.tasksCreate) }) }) diff --git a/codersdk/aitasks.go b/codersdk/aitasks.go index 56b43d43a0d19..965b0fac1d493 100644 --- a/codersdk/aitasks.go +++ b/codersdk/aitasks.go @@ -6,6 +6,7 @@ import ( "fmt" "net/http" "strings" + "time" "github.com/google/uuid" @@ -70,3 +71,105 @@ func (c *ExperimentalClient) CreateTask(ctx context.Context, user string, reques return workspace, nil } + +// TaskState represents the high-level lifecycle of a task. +// +// Experimental: This type is experimental and may change in the future. +type TaskState string + +const ( + TaskStateWorking TaskState = "working" + TaskStateIdle TaskState = "idle" + TaskStateCompleted TaskState = "completed" + TaskStateFailed TaskState = "failed" +) + +// Task represents a task. +// +// Experimental: This type is experimental and may change in the future. +type Task struct { + ID uuid.UUID `json:"id" format:"uuid"` + OrganizationID uuid.UUID `json:"organization_id" format:"uuid"` + OwnerID uuid.UUID `json:"owner_id" format:"uuid"` + Name string `json:"name"` + TemplateID uuid.UUID `json:"template_id" format:"uuid"` + WorkspaceID uuid.NullUUID `json:"workspace_id" format:"uuid"` + InitialPrompt string `json:"initial_prompt"` + Status WorkspaceStatus `json:"status" enums:"pending,starting,running,stopping,stopped,failed,canceling,canceled,deleting,deleted"` + CurrentState *TaskStateEntry `json:"current_state"` + CreatedAt time.Time `json:"created_at" format:"date-time"` + UpdatedAt time.Time `json:"updated_at" format:"date-time"` +} + +// TaskStateEntry represents a single entry in the task's state history. +// +// Experimental: This type is experimental and may change in the future. +type TaskStateEntry struct { + Timestamp time.Time `json:"timestamp" format:"date-time"` + State TaskState `json:"state" enum:"working,idle,completed,failed"` + Message string `json:"message"` + URI string `json:"uri"` +} + +// TasksFilter filters the list of tasks. +// +// Experimental: This type is experimental and may change in the future. +type TasksFilter struct { + // Owner can be a username, UUID, or "me" + Owner string `json:"owner,omitempty"` +} + +// Tasks lists all tasks belonging to the user or specified owner. +// +// Experimental: This method is experimental and may change in the future. +func (c *ExperimentalClient) Tasks(ctx context.Context, filter *TasksFilter) ([]Task, error) { + if filter == nil { + filter = &TasksFilter{} + } + user := filter.Owner + if user == "" { + user = "me" + } + + res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/experimental/tasks/%s", user), nil) + if err != nil { + return nil, err + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return nil, ReadBodyAsError(res) + } + + // Experimental response shape for tasks list (server returns []Task). + type tasksListResponse struct { + Tasks []Task `json:"tasks"` + Count int `json:"count"` + } + var tres tasksListResponse + if err := json.NewDecoder(res.Body).Decode(&tres); err != nil { + return nil, err + } + + return tres.Tasks, nil +} + +// TaskByID fetches a single experimental task by its ID. +// +// Experimental: This method is experimental and may change in the future. +func (c *ExperimentalClient) TaskByID(ctx context.Context, id uuid.UUID) (Task, error) { + res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/experimental/tasks/%s/%s", "me", id.String()), nil) + if err != nil { + return Task{}, err + } + defer res.Body.Close() + if res.StatusCode != http.StatusOK { + return Task{}, ReadBodyAsError(res) + } + + var task Task + if err := json.NewDecoder(res.Body).Decode(&task); err != nil { + return Task{}, err + } + + return task, nil +} diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index a6610e3327cbe..58167d7d27df0 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -2807,6 +2807,44 @@ export interface TailDERPRegion { readonly Nodes: readonly TailDERPNode[]; } +// From codersdk/aitasks.go +export interface Task { + readonly id: string; + readonly organization_id: string; + readonly owner_id: string; + readonly name: string; + readonly template_id: string; + readonly workspace_id: string | null; + readonly initial_prompt: string; + readonly status: WorkspaceStatus; + readonly current_state: TaskStateEntry | null; + readonly created_at: string; + readonly updated_at: string; +} + +// From codersdk/aitasks.go +export type TaskState = "completed" | "failed" | "idle" | "working"; + +// From codersdk/aitasks.go +export interface TaskStateEntry { + readonly timestamp: string; + readonly state: TaskState; + readonly message: string; + readonly uri: string; +} + +export const TaskStates: TaskState[] = [ + "completed", + "failed", + "idle", + "working", +]; + +// From codersdk/aitasks.go +export interface TasksFilter { + readonly owner?: string; +} + // From codersdk/deployment.go export interface TelemetryConfig { readonly enable: boolean; From 7e23081c2fe32ff419b91c0312b87e75f85c5cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Fri, 22 Aug 2025 09:00:03 -0600 Subject: [PATCH 257/260] chore: fix vite types (#19477) --- .../DeploymentBanner/DeploymentBannerView.tsx | 108 ++++++++---------- site/tsconfig.json | 8 +- site/tsconfig.test.json | 5 - 3 files changed, 51 insertions(+), 70 deletions(-) delete mode 100644 site/tsconfig.test.json diff --git a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx index 2c0732053fa20..4f9838e0255da 100644 --- a/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx +++ b/site/src/modules/dashboard/DeploymentBanner/DeploymentBannerView.tsx @@ -1,4 +1,3 @@ -import type { CSSInterpolation } from "@emotion/css/dist/declarations/src/create-instance"; import { css, type Interpolation, type Theme, useTheme } from "@emotion/react"; import Button from "@mui/material/Button"; import Link from "@mui/material/Link"; @@ -15,7 +14,6 @@ import { TerminalIcon } from "components/Icons/TerminalIcon"; import { VSCodeIcon } from "components/Icons/VSCodeIcon"; import { Stack } from "components/Stack/Stack"; import dayjs from "dayjs"; -import { type ClassName, useClassName } from "hooks/useClassName"; import { AppWindowIcon, CircleAlertIcon, @@ -53,7 +51,6 @@ export const DeploymentBannerView: FC = ({ fetchStats, }) => { const theme = useTheme(); - const summaryTooltip = useClassName(classNames.summaryTooltip, []); const aggregatedMinutes = useMemo(() => { if (!stats) { @@ -128,7 +125,10 @@ export const DeploymentBannerView: FC = ({ }} > 0 ? ( <> @@ -236,10 +236,10 @@ export const DeploymentBannerView: FC = ({
    {typeof stats?.session_count.vscode === "undefined" ? "-" @@ -251,10 +251,10 @@ export const DeploymentBannerView: FC = ({
    {typeof stats?.session_count.jetbrains === "undefined" ? "-" @@ -303,20 +303,20 @@ export const DeploymentBannerView: FC = ({ css={[ styles.value, css` - margin: 0; - padding: 0 8px; - height: unset; - min-height: unset; - font-size: unset; - color: unset; - border: 0; - min-width: unset; - font-family: inherit; + margin: 0; + padding: 0 8px; + height: unset; + min-height: unset; + font-size: unset; + color: unset; + border: 0; + min-width: unset; + font-family: inherit; - & svg { - margin-right: 4px; - } - `, + & svg { + margin-right: 4px; + } + `, ]} onClick={() => { if (fetchStats) { @@ -410,41 +410,27 @@ const getHealthErrors = (health: HealthcheckReport) => { return warnings; }; -const classNames = { - summaryTooltip: (css, theme) => css` - ${theme.typography.body2 as CSSInterpolation} - - margin: 0 0 4px 12px; - width: 400px; - padding: 16px; - color: ${theme.palette.text.primary}; - background-color: ${theme.palette.background.paper}; - border: 1px solid ${theme.palette.divider}; - pointer-events: none; - `, -} satisfies Record; - const styles = { statusBadge: (theme) => css` - display: flex; - align-items: center; - justify-content: center; - padding: 0 12px; - height: 100%; - color: ${theme.experimental.l1.text}; + display: flex; + align-items: center; + justify-content: center; + padding: 0 12px; + height: 100%; + color: ${theme.experimental.l1.text}; - & svg { - width: 16px; - height: 16px; - } - `, + & svg { + width: 16px; + height: 16px; + } + `, unhealthy: { backgroundColor: colors.red[700], }, group: css` - display: flex; - align-items: center; - `, + display: flex; + align-items: center; + `, category: (theme) => ({ marginRight: 16, color: theme.palette.text.primary, @@ -455,15 +441,15 @@ const styles = { color: theme.palette.text.secondary, }), value: css` - display: flex; - align-items: center; - gap: 4px; + display: flex; + align-items: center; + gap: 4px; - & svg { - width: 12px; - height: 12px; - } - `, + & svg { + width: 12px; + height: 12px; + } + `, separator: (theme) => ({ color: theme.palette.text.disabled, }), diff --git a/site/tsconfig.json b/site/tsconfig.json index 7e969d18c42dd..79b406d0f5c13 100644 --- a/site/tsconfig.json +++ b/site/tsconfig.json @@ -7,8 +7,8 @@ "jsx": "react-jsx", "jsxImportSource": "@emotion/react", "lib": ["dom", "dom.iterable", "esnext"], - "module": "esnext", - "moduleResolution": "node", + "module": "preserve", + "moduleResolution": "bundler", "noEmit": true, "outDir": "build/", "preserveWatchOutput": true, @@ -16,9 +16,9 @@ "skipLibCheck": true, "strict": true, "target": "es2020", + "types": ["jest", "node", "react", "react-dom", "vite/client"], "baseUrl": "src/" }, "include": ["**/*.ts", "**/*.tsx"], - "exclude": ["node_modules/", "_jest"], - "types": ["@emotion/react", "@testing-library/jest-dom", "jest", "node"] + "exclude": ["node_modules/"] } diff --git a/site/tsconfig.test.json b/site/tsconfig.test.json deleted file mode 100644 index c6f5e679af857..0000000000000 --- a/site/tsconfig.test.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "./tsconfig.json", - "exclude": ["node_modules", "_jest"], - "include": ["**/*.stories.tsx", "**/*.test.tsx", "**/*.d.ts"] -} From 6fbe7773171ab71e06c495a9dfa52e6b57f90880 Mon Sep 17 00:00:00 2001 From: DevCats Date: Fri, 22 Aug 2025 12:53:33 -0500 Subject: [PATCH 258/260] chore: add auggie icon (#19500) add auggie icon --- site/src/theme/externalImages.ts | 1 + site/src/theme/icons.json | 1 + site/static/icon/auggie.svg | 8 ++++++++ 3 files changed, 10 insertions(+) create mode 100644 site/static/icon/auggie.svg diff --git a/site/src/theme/externalImages.ts b/site/src/theme/externalImages.ts index 15713559036d0..96515725bcfbc 100644 --- a/site/src/theme/externalImages.ts +++ b/site/src/theme/externalImages.ts @@ -142,6 +142,7 @@ export function getExternalImageStylesFromUrl( */ export const defaultParametersForBuiltinIcons = new Map([ ["/icon/apple-black.svg", "monochrome"], + ["/icon/auggie.svg", "monochrome"], ["/icon/aws.png", "whiteWithColor&brightness=1.5"], ["/icon/aws.svg", "blackWithColor&brightness=1.5"], ["/icon/aws-monochrome.svg", "monochrome"], diff --git a/site/src/theme/icons.json b/site/src/theme/icons.json index a9ed1ef361370..7c87468411e92 100644 --- a/site/src/theme/icons.json +++ b/site/src/theme/icons.json @@ -7,6 +7,7 @@ "apple-black.svg", "apple-grey.svg", "argo-workflows.svg", + "auggie.svg", "aws-dark.svg", "aws-light.svg", "aws-monochrome.svg", diff --git a/site/static/icon/auggie.svg b/site/static/icon/auggie.svg new file mode 100644 index 0000000000000..590bd5aa1e62a --- /dev/null +++ b/site/static/icon/auggie.svg @@ -0,0 +1,8 @@ + + + + + + + + From cde5b624f48ebb65fdb6be0d0cd23aa851b6b88c Mon Sep 17 00:00:00 2001 From: Bruno Quaresma Date: Fri, 22 Aug 2025 15:24:32 -0300 Subject: [PATCH 259/260] feat: display the number of idle tasks in the navbar (#19471) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Depends on: https://github.com/coder/coder/pull/19377 Closes https://github.com/coder/coder/issues/19323 **Screenshot:** Screenshot 2025-08-21 at 11 52 21 **Screen recording:** https://github.com/user-attachments/assets/f70b34fe-952b-427b-9bc9-71961ca23201 ## Summary by CodeRabbit - New Features - Added a Tasks navigation item showing a badge with the number of idle tasks and a tooltip: “You have X tasks waiting for input.” - Improvements - Fetches per-user tasks with periodic refresh for up-to-date counts. - Updated active styling for the Tasks link for clearer navigation state. - User menu now always appears on medium+ screens. - Tests - Expanded Storybook with preloaded, user-filtered task scenarios to showcase idle/task states. --- .../dashboard/Navbar/NavbarView.stories.tsx | 55 ++++++++- .../modules/dashboard/Navbar/NavbarView.tsx | 112 ++++++++++++++---- 2 files changed, 139 insertions(+), 28 deletions(-) diff --git a/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx b/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx index 786f595d32932..6b44ab0911024 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.stories.tsx @@ -1,13 +1,31 @@ import { chromaticWithTablet } from "testHelpers/chromatic"; -import { MockUserMember, MockUserOwner } from "testHelpers/entities"; +import { + MockUserMember, + MockUserOwner, + MockWorkspace, + MockWorkspaceAppStatus, +} from "testHelpers/entities"; import { withDashboardProvider } from "testHelpers/storybook"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { userEvent, within } from "storybook/test"; import { NavbarView } from "./NavbarView"; +const tasksFilter = { + username: MockUserOwner.username, +}; + const meta: Meta = { title: "modules/dashboard/NavbarView", - parameters: { chromatic: chromaticWithTablet, layout: "fullscreen" }, + parameters: { + chromatic: chromaticWithTablet, + layout: "fullscreen", + queries: [ + { + key: ["tasks", tasksFilter], + data: [], + }, + ], + }, component: NavbarView, args: { user: MockUserOwner, @@ -78,3 +96,36 @@ export const CustomLogo: Story = { logo_url: "/icon/github.svg", }, }; + +export const IdleTasks: Story = { + parameters: { + queries: [ + { + key: ["tasks", tasksFilter], + data: [ + { + prompt: "Task 1", + workspace: { + ...MockWorkspace, + latest_app_status: { + ...MockWorkspaceAppStatus, + state: "idle", + }, + }, + }, + { + prompt: "Task 2", + workspace: MockWorkspace, + }, + { + prompt: "Task 3", + workspace: { + ...MockWorkspace, + latest_app_status: MockWorkspaceAppStatus, + }, + }, + ], + }, + ], + }, +}; diff --git a/site/src/modules/dashboard/Navbar/NavbarView.tsx b/site/src/modules/dashboard/Navbar/NavbarView.tsx index 4a2b3027a47dd..0cafaa8fdd46f 100644 --- a/site/src/modules/dashboard/Navbar/NavbarView.tsx +++ b/site/src/modules/dashboard/Navbar/NavbarView.tsx @@ -1,13 +1,21 @@ import { API } from "api/api"; import type * as TypesGen from "api/typesGenerated"; +import { Badge } from "components/Badge/Badge"; import { Button } from "components/Button/Button"; import { ExternalImage } from "components/ExternalImage/ExternalImage"; import { CoderIcon } from "components/Icons/CoderIcon"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "components/Tooltip/Tooltip"; import type { ProxyContextValue } from "contexts/ProxyContext"; import { useWebpushNotifications } from "contexts/useWebpushNotifications"; import { useEmbeddedMetadata } from "hooks/useEmbeddedMetadata"; import { NotificationsInbox } from "modules/notifications/NotificationsInbox/NotificationsInbox"; import type { FC } from "react"; +import { useQuery } from "react-query"; import { NavLink, useLocation } from "react-router"; import { cn } from "utils/cn"; import { DeploymentDropdown } from "./DeploymentDropdown"; @@ -17,7 +25,7 @@ import { UserDropdown } from "./UserDropdown/UserDropdown"; interface NavbarViewProps { logo_url?: string; - user?: TypesGen.User; + user: TypesGen.User; buildInfo?: TypesGen.BuildInfoResponse; supportLinks?: readonly TypesGen.LinkConfig[]; onSignOut: () => void; @@ -60,7 +68,7 @@ export const NavbarView: FC = ({ )} - +
    {proxyContextValue && ( @@ -109,16 +117,14 @@ export const NavbarView: FC = ({ } /> - {user && ( -
    - -
    - )} +
    + +
    = ({ interface NavItemsProps { className?: string; + user: TypesGen.User; } -const NavItems: FC = ({ className }) => { +const NavItems: FC = ({ className, user }) => { const location = useLocation(); - const { metadata } = useEmbeddedMetadata(); return ( ); }; + +type TasksNavItemProps = { + user: TypesGen.User; +}; + +const TasksNavItem: FC = ({ user }) => { + const { metadata } = useEmbeddedMetadata(); + const canSeeTasks = Boolean( + metadata["tasks-tab-visible"].value || + process.env.NODE_ENV === "development" || + process.env.STORYBOOK, + ); + const filter = { + username: user.username, + }; + const { data: idleCount } = useQuery({ + queryKey: ["tasks", filter], + queryFn: () => API.experimental.getTasks(filter), + refetchInterval: 1_000 * 60, + enabled: canSeeTasks, + refetchOnWindowFocus: true, + initialData: [], + select: (data) => + data.filter((task) => task.workspace.latest_app_status?.state === "idle") + .length, + }); + + if (!canSeeTasks) { + return null; + } + + return ( + { + return cn(linkStyles.default, { [linkStyles.active]: isActive }); + }} + > + Tasks + {idleCount > 0 && ( + + + + + {idleCount} + + + {idleTasksLabel(idleCount)} + + + )} + + ); +}; + +function idleTasksLabel(count: number) { + return `You have ${count} ${count === 1 ? "task" : "tasks"} waiting for input`; +} From 3b6c85a3f907da92921627f07a0f586064b138e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=B1=E3=82=A4=E3=83=A9?= Date: Fri, 22 Aug 2025 13:40:24 -0600 Subject: [PATCH 260/260] chore: add @Parkreiner as site/ CODEOWNER (#19502) --- CODEOWNERS | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 451b34835eea0..fde24a9d874ed 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -18,7 +18,7 @@ coderd/rbac/ @Emyrk scripts/apitypings/ @Emyrk scripts/gensite/ @aslilac -site/ @aslilac +site/ @aslilac @Parkreiner site/src/hooks/ @Parkreiner # These rules intentionally do not specify any owners. More specific rules # override less specific rules, so these files are "ignored" by the site/ rule. @@ -27,6 +27,7 @@ site/e2e/provisionerGenerated.ts site/src/api/countriesGenerated.ts site/src/api/rbacresourcesGenerated.ts site/src/api/typesGenerated.ts +site/src/testHelpers/entities.ts site/CLAUDE.md # The blood and guts of the autostop algorithm, which is quite complex and pFad - Phonifier reborn

    Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

    Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


    Alternative Proxies:

    Alternative Proxy

    pFad Proxy

    pFad v3 Proxy

    pFad v4 Proxy