feat(coderd): add has_external_agent flag to template_versions and workspace_builds (#19285)

This pull request introduces support for external workspace management, allowing users to register and manage workspaces that are provisioned and managed outside of the Coder.

* Added has_external_agent field to workspace builds and template versions
This commit is contained in:
Kacper Sawicki
2025-08-19 10:29:51 +02:00
committed by GitHub
parent e67f0f6f52
commit 5e4aa79a9d
19 changed files with 522 additions and 267 deletions
+6
View File
@@ -72,6 +72,12 @@ WHERE
ELSE true
END
-- Filter by has_external_agent in latest version
AND CASE
WHEN sqlc.narg('has_external_agent') :: boolean IS NOT NULL THEN
tv.has_external_agent = sqlc.narg('has_external_agent') :: boolean
ELSE true
END
-- Authorize Filter clause will be injected below in GetAuthorizedTemplates
-- @authorize_filter
ORDER BY (t.name, t.id) ASC
+10 -9
View File
@@ -122,15 +122,6 @@ SET
WHERE
job_id = $1;
-- name: UpdateTemplateVersionAITaskByJobID :exec
UPDATE
template_versions
SET
has_ai_task = $2,
updated_at = $3
WHERE
job_id = $1;
-- name: GetPreviousTemplateVersion :one
SELECT
*
@@ -241,3 +232,13 @@ SELECT EXISTS (
FROM template_versions
WHERE id = $1 AND has_ai_task = TRUE
);
-- name: UpdateTemplateVersionFlagsByJobID :exec
UPDATE
template_versions
SET
has_ai_task = $2,
has_external_agent = $3,
updated_at = $4
WHERE
job_id = $1;
+10 -9
View File
@@ -145,15 +145,6 @@ SET
updated_at = @updated_at::timestamptz
WHERE id = @id::uuid;
-- name: UpdateWorkspaceBuildAITaskByID :exec
UPDATE
workspace_builds
SET
has_ai_task = @has_ai_task,
ai_task_sidebar_app_id = @sidebar_app_id,
updated_at = @updated_at::timestamptz
WHERE id = @id::uuid;
-- name: GetActiveWorkspaceBuildsByTemplateID :many
SELECT wb.*
FROM (
@@ -247,3 +238,13 @@ WHERE
AND pj.job_status = 'failed'
ORDER BY
tv.name ASC, wb.build_number DESC;
-- name: UpdateWorkspaceBuildFlagsByID :exec
UPDATE
workspace_builds
SET
has_ai_task = @has_ai_task,
ai_task_sidebar_app_id = @sidebar_app_id,
has_external_agent = @has_external_agent,
updated_at = @updated_at::timestamptz
WHERE id = @id::uuid;
+11 -2
View File
@@ -117,7 +117,8 @@ SELECT
latest_build.error as latest_build_error,
latest_build.transition as latest_build_transition,
latest_build.job_status as latest_build_status,
latest_build.has_ai_task as latest_build_has_ai_task
latest_build.has_ai_task as latest_build_has_ai_task,
latest_build.has_external_agent as latest_build_has_external_agent
FROM
workspaces_expanded as workspaces
JOIN
@@ -130,6 +131,7 @@ LEFT JOIN LATERAL (
workspace_builds.transition,
workspace_builds.template_version_id,
workspace_builds.has_ai_task,
workspace_builds.has_external_agent,
template_versions.name AS template_version_name,
provisioner_jobs.id AS provisioner_job_id,
provisioner_jobs.started_at,
@@ -370,6 +372,12 @@ WHERE
)) = (sqlc.narg('has_ai_task') :: boolean)
ELSE true
END
-- Filter by has_external_agent in latest build
AND CASE
WHEN sqlc.narg('has_external_agent') :: boolean IS NOT NULL THEN
latest_build.has_external_agent = sqlc.narg('has_external_agent') :: boolean
ELSE true
END
-- Authorize Filter clause will be injected below in GetAuthorizedWorkspaces
-- @authorize_filter
), filtered_workspaces_order AS (
@@ -439,7 +447,8 @@ WHERE
'', -- latest_build_error
'start'::workspace_transition, -- latest_build_transition
'unknown'::provisioner_job_status, -- latest_build_status
false -- latest_build_has_ai_task
false, -- latest_build_has_ai_task
false -- latest_build_has_external_agent
WHERE
@with_summary :: boolean = true
), total_count AS (