From 2f5536fd48b01dd2da8165526736c139bd8c3db0 Mon Sep 17 00:00:00 2001 From: core-be Date: Sat, 6 Jun 2026 05:59:43 +0000 Subject: [PATCH] feat(workspace): forward per-workspace compute provider to CP (multi-provider RFC) WorkspaceCompute.Provider -> WorkspaceConfig.Provider -> cpProvisionRequest.provider -> CP /cp/workspaces/provision (routes to its WorkspaceProvisioner, controlplane PR #566). Cloud/compute provider, distinct from the LLM/model provider. Empty/aws = default EC2 (unchanged). Pairs with cp#573; Hetzner workspace boot live-proven (A2A card 200 on :8000). --- workspace-server/internal/handlers/workspace_provision.go | 1 + workspace-server/internal/models/workspace.go | 5 +++++ workspace-server/internal/provisioner/cp_provisioner.go | 4 ++++ workspace-server/internal/provisioner/provisioner.go | 1 + 4 files changed, 11 insertions(+) diff --git a/workspace-server/internal/handlers/workspace_provision.go b/workspace-server/internal/handlers/workspace_provision.go index faaa800dc..8dc4f921e 100644 --- a/workspace-server/internal/handlers/workspace_provision.go +++ b/workspace-server/internal/handlers/workspace_provision.go @@ -332,6 +332,7 @@ func (h *WorkspaceHandler) buildProvisionerConfig( InstanceType: payload.Compute.InstanceType, DiskGB: int32(payload.Compute.Volume.RootGB), DataPersistence: payload.Compute.DataPersistence, + Provider: payload.Compute.Provider, Display: provisioner.WorkspaceDisplayConfig{ Mode: payload.Compute.Display.Mode, Width: payload.Compute.Display.Width, diff --git a/workspace-server/internal/models/workspace.go b/workspace-server/internal/models/workspace.go index a43a162bb..220c57494 100644 --- a/workspace-server/internal/models/workspace.go +++ b/workspace-server/internal/models/workspace.go @@ -174,6 +174,11 @@ type WorkspaceCompute struct { // disk (wiped each recreate — privacy); "" = auto (desktop-control persists, // others follow the org flag). Forwarded verbatim to CP's data_persistence. DataPersistence string `json:"data_persistence,omitempty"` + // Provider is the CLOUD/compute backend for this workspace box (multi-provider + // RFC, per-workspace): ""/"aws" = default EC2; "hetzner"/"gcp" route to the + // CP WorkspaceProvisioner. Distinct from the LLM/model provider. Forwarded to + // CP /cp/workspaces/provision `provider`. + Provider string `json:"provider,omitempty"` } type CreateWorkspacePayload struct { diff --git a/workspace-server/internal/provisioner/cp_provisioner.go b/workspace-server/internal/provisioner/cp_provisioner.go index ff113d554..ac3d862a8 100644 --- a/workspace-server/internal/provisioner/cp_provisioner.go +++ b/workspace-server/internal/provisioner/cp_provisioner.go @@ -161,6 +161,9 @@ type cpProvisionRequest struct { Tier int `json:"tier"` InstanceType string `json:"instance_type,omitempty"` DiskGB int32 `json:"disk_gb,omitempty"` + // Provider routes the CP to the compute backend for this workspace box + // (multi-provider RFC, per-workspace). Distinct from the LLM/model provider. + Provider string `json:"provider,omitempty"` // DataPersistence is the per-workspace durable-data choice (internal#734); // CP validates the enum at its provision edge and resolves the data volume // from it. Empty = auto (omitted on the wire). @@ -257,6 +260,7 @@ func (p *CPProvisioner) Start(ctx context.Context, cfg WorkspaceConfig) (string, InstanceType: cfg.InstanceType, DiskGB: cfg.DiskGB, DataPersistence: cfg.DataPersistence, + Provider: cfg.Provider, Display: cfg.Display, PlatformURL: cfg.PlatformURL, Env: env, diff --git a/workspace-server/internal/provisioner/provisioner.go b/workspace-server/internal/provisioner/provisioner.go index ea86d33c6..028fd430f 100644 --- a/workspace-server/internal/provisioner/provisioner.go +++ b/workspace-server/internal/provisioner/provisioner.go @@ -100,6 +100,7 @@ type WorkspaceConfig struct { InstanceType string // Optional CP EC2 instance type override (SaaS only) DiskGB int32 // Optional CP root volume size override in GiB (SaaS only) DataPersistence string // internal#734: "persist"|"ephemeral"|"" — durable-data choice forwarded to CP (SaaS only) + Provider string // multi-provider RFC: ""/"aws"|"hetzner"|"gcp" compute backend for the workspace box (per-workspace; distinct from LLM/model provider). Forwarded to CP. Display WorkspaceDisplayConfig EnvVars map[string]string // Additional env vars (API keys, etc.) PlatformURL string -- 2.52.0