Skip to content

Commit 22eb5c9

Browse files
Merge branch 'main' into dm-pr-feedback-oops
2 parents a6d5bce + 8f6a5af commit 22eb5c9

36 files changed

+576
-51
lines changed

cli/testdata/coder_server_--help.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ Clients include the Coder CLI, Coder Desktop, IDE extensions, and the web UI.
8585
is detected. By default it instructs users to update using 'curl -L
8686
https://coder.com/install.sh | sh'.
8787

88+
--hide-ai-tasks bool, $CODER_HIDE_AI_TASKS (default: false)
89+
Hide AI tasks from the dashboard.
90+
8891
--ssh-config-options string-array, $CODER_SSH_CONFIG_OPTIONS
8992
These SSH config options will override the default SSH config options.
9093
Provide options in "key=value" or "key value" format separated by

cli/testdata/server-config.yaml.golden

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,9 @@ client:
520520
# 'webgl', or 'dom'.
521521
# (default: canvas, type: string)
522522
webTerminalRenderer: canvas
523+
# Hide AI tasks from the dashboard.
524+
# (default: false, type: bool)
525+
hideAITasks: false
523526
# Support links to display in the top right drop down menu.
524527
# (default: <unset>, type: struct[[]codersdk.LinkConfig])
525528
supportLinks: []

coderd/apidoc/docs.go

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,7 @@ func New(options *Options) *API {
628628
Entitlements: options.Entitlements,
629629
Telemetry: options.Telemetry,
630630
Logger: options.Logger.Named("site"),
631+
HideAITasks: options.DeploymentValues.HideAITasks.Value(),
631632
})
632633
api.SiteHandler.Experiments.Store(&experiments)
633634

coderd/database/dbauthz/dbauthz.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3451,6 +3451,11 @@ func (q *querier) GetWorkspacesEligibleForTransition(ctx context.Context, now ti
34513451
return q.db.GetWorkspacesEligibleForTransition(ctx, now)
34523452
}
34533453

3454+
func (q *querier) HasTemplateVersionsWithAITask(ctx context.Context) (bool, error) {
3455+
// Anyone can call HasTemplateVersionsWithAITask.
3456+
return q.db.HasTemplateVersionsWithAITask(ctx)
3457+
}
3458+
34543459
func (q *querier) InsertAPIKey(ctx context.Context, arg database.InsertAPIKeyParams) (database.APIKey, error) {
34553460
return insert(q.log, q.auth,
34563461
rbac.ResourceApiKey.WithOwner(arg.UserID.String()),

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4566,6 +4566,9 @@ func (s *MethodTestSuite) TestSystemFunctions() {
45664566
s.Run("GetProvisionerJobByIDForUpdate", s.Subtest(func(db database.Store, check *expects) {
45674567
check.Args(uuid.New()).Asserts(rbac.ResourceProvisionerJobs, policy.ActionRead).Errors(sql.ErrNoRows)
45684568
}))
4569+
s.Run("HasTemplateVersionsWithAITask", s.Subtest(func(db database.Store, check *expects) {
4570+
check.Args().Asserts()
4571+
}))
45694572
}
45704573

45714574
func (s *MethodTestSuite) TestNotifications() {

coderd/database/dbmem/dbmem.go

Lines changed: 74 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,17 @@ func isDeprecated(template database.Template) bool {
13891389
return template.Deprecated != ""
13901390
}
13911391

1392+
func (q *FakeQuerier) getWorkspaceBuildParametersNoLock(workspaceBuildID uuid.UUID) ([]database.WorkspaceBuildParameter, error) {
1393+
params := make([]database.WorkspaceBuildParameter, 0)
1394+
for _, param := range q.workspaceBuildParameters {
1395+
if param.WorkspaceBuildID != workspaceBuildID {
1396+
continue
1397+
}
1398+
params = append(params, param)
1399+
}
1400+
return params, nil
1401+
}
1402+
13921403
func (*FakeQuerier) AcquireLock(_ context.Context, _ int64) error {
13931404
return xerrors.New("AcquireLock must only be called within a transaction")
13941405
}
@@ -7898,14 +7909,7 @@ func (q *FakeQuerier) GetWorkspaceBuildParameters(_ context.Context, workspaceBu
78987909
q.mutex.RLock()
78997910
defer q.mutex.RUnlock()
79007911

7901-
params := make([]database.WorkspaceBuildParameter, 0)
7902-
for _, param := range q.workspaceBuildParameters {
7903-
if param.WorkspaceBuildID != workspaceBuildID {
7904-
continue
7905-
}
7906-
params = append(params, param)
7907-
}
7908-
return params, nil
7912+
return q.getWorkspaceBuildParametersNoLock(workspaceBuildID)
79097913
}
79107914

79117915
func (q *FakeQuerier) GetWorkspaceBuildStatsByTemplates(ctx context.Context, since time.Time) ([]database.GetWorkspaceBuildStatsByTemplatesRow, error) {
@@ -8491,6 +8495,19 @@ func (q *FakeQuerier) GetWorkspacesEligibleForTransition(ctx context.Context, no
84918495
return workspaces, nil
84928496
}
84938497

8498+
func (q *FakeQuerier) HasTemplateVersionsWithAITask(_ context.Context) (bool, error) {
8499+
q.mutex.RLock()
8500+
defer q.mutex.RUnlock()
8501+
8502+
for _, templateVersion := range q.templateVersions {
8503+
if templateVersion.HasAITask {
8504+
return true, nil
8505+
}
8506+
}
8507+
8508+
return false, nil
8509+
}
8510+
84948511
func (q *FakeQuerier) InsertAPIKey(_ context.Context, arg database.InsertAPIKeyParams) (database.APIKey, error) {
84958512
if err := validateDatabaseType(arg); err != nil {
84968513
return database.APIKey{}, err
@@ -13233,6 +13250,18 @@ func (q *FakeQuerier) GetAuthorizedTemplates(ctx context.Context, arg database.G
1323313250
continue
1323413251
}
1323513252
}
13253+
13254+
if arg.HasAITask.Valid {
13255+
tv, err := q.getTemplateVersionByIDNoLock(ctx, template.ActiveVersionID)
13256+
if err != nil {
13257+
return nil, xerrors.Errorf("get template version: %w", err)
13258+
}
13259+
tvHasAITask := tv.HasAITask.Valid && tv.HasAITask.Bool
13260+
if tvHasAITask != arg.HasAITask.Bool {
13261+
continue
13262+
}
13263+
}
13264+
1323613265
templates = append(templates, template)
1323713266
}
1323813267
if len(templates) > 0 {
@@ -13562,6 +13591,43 @@ func (q *FakeQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg database.
1356213591
}
1356313592
}
1356413593

13594+
if arg.HasAITask.Valid {
13595+
hasAITask, err := func() (bool, error) {
13596+
build, err := q.getLatestWorkspaceBuildByWorkspaceIDNoLock(ctx, workspace.ID)
13597+
if err != nil {
13598+
return false, xerrors.Errorf("get latest build: %w", err)
13599+
}
13600+
if build.HasAITask.Valid {
13601+
return build.HasAITask.Bool, nil
13602+
}
13603+
// If the build has a nil AI task, check if the job is in progress
13604+
// and if it has a non-empty AI Prompt parameter
13605+
job, err := q.getProvisionerJobByIDNoLock(ctx, build.JobID)
13606+
if err != nil {
13607+
return false, xerrors.Errorf("get provisioner job: %w", err)
13608+
}
13609+
if job.CompletedAt.Valid {
13610+
return false, nil
13611+
}
13612+
parameters, err := q.getWorkspaceBuildParametersNoLock(build.ID)
13613+
if err != nil {
13614+
return false, xerrors.Errorf("get workspace build parameters: %w", err)
13615+
}
13616+
for _, param := range parameters {
13617+
if param.Name == "AI Prompt" && param.Value != "" {
13618+
return true, nil
13619+
}
13620+
}
13621+
return false, nil
13622+
}()
13623+
if err != nil {
13624+
return nil, xerrors.Errorf("get hasAITask: %w", err)
13625+
}
13626+
if hasAITask != arg.HasAITask.Bool {
13627+
continue
13628+
}
13629+
}
13630+
1356513631
// If the filter exists, ensure the object is authorized.
1356613632
if prepared != nil && prepared.Authorize(ctx, workspace.RBACObject()) != nil {
1356713633
continue

coderd/database/dbmetrics/querymetrics.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/modelqueries.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ func (q *sqlQuerier) GetAuthorizedTemplates(ctx context.Context, arg GetTemplate
8080
arg.FuzzyName,
8181
pq.Array(arg.IDs),
8282
arg.Deprecated,
83+
arg.HasAITask,
8384
)
8485
if err != nil {
8586
return nil, err
@@ -264,6 +265,7 @@ func (q *sqlQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspa
264265
arg.LastUsedBefore,
265266
arg.LastUsedAfter,
266267
arg.UsingActive,
268+
arg.HasAITask,
267269
arg.RequesterID,
268270
arg.Offset,
269271
arg.Limit,
@@ -311,6 +313,7 @@ func (q *sqlQuerier) GetAuthorizedWorkspaces(ctx context.Context, arg GetWorkspa
311313
&i.LatestBuildError,
312314
&i.LatestBuildTransition,
313315
&i.LatestBuildStatus,
316+
&i.LatestBuildHasAITask,
314317
&i.Count,
315318
); err != nil {
316319
return nil, err

coderd/database/querier.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)