From 2b18ca38dc09633b1ab216ac87aac429e9a5eb08 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Thu, 4 Jun 2026 21:17:20 +0000 Subject: [PATCH 1/2] fix(canvas): platform-managed provider must not require/show/send credential (#2245) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CreateWorkspaceDialog treated all providers with envVars as BYOK, blocking submission, showing a credential input, and sending an empty secrets payload for platform-managed providers whose token is injected by the control-plane provisioner. Changes: - Add isPlatformManagedProvider() discriminator to ProviderModelSelector. - Skip validation when provider is platform-managed. - Hide credential input and show "Platform-managed — no key required". - Omit secrets from POST body for platform-managed providers. - Add vitest regression tests for all three behaviors + BYOK regression. Closes #2245 Co-Authored-By: Claude Opus 4.7 --- .../src/components/CreateWorkspaceDialog.tsx | 11 ++- .../src/components/ProviderModelSelector.tsx | 4 + .../__tests__/CreateWorkspaceDialog.test.tsx | 91 +++++++++++++++++++ 3 files changed, 103 insertions(+), 3 deletions(-) diff --git a/canvas/src/components/CreateWorkspaceDialog.tsx b/canvas/src/components/CreateWorkspaceDialog.tsx index f03e61924..47f47f6ad 100644 --- a/canvas/src/components/CreateWorkspaceDialog.tsx +++ b/canvas/src/components/CreateWorkspaceDialog.tsx @@ -10,6 +10,7 @@ import { buildProviderCatalog, buildProviderCatalogFromRegistry, findProviderForModel, + isPlatformManagedProvider, type SelectorModel, type SelectorValue, type RegistryProvider, @@ -290,7 +291,7 @@ export function CreateWorkspaceButton() { setError("Model is required"); return; } - if (!isExternal && selectedLLMProvider?.envVars.length && !llmSecret.trim()) { + if (!isExternal && !isPlatformManagedProvider(selectedLLMProvider) && selectedLLMProvider?.envVars.length && !llmSecret.trim()) { setError("Provider credential is required"); return; } @@ -325,7 +326,7 @@ export function CreateWorkspaceButton() { ? { model: llmSelection.model.trim(), llm_provider: nativeProvider.vendor, - ...(nativeProvider.envVars.length > 0 + ...(!isPlatformManagedProvider(nativeProvider) && nativeProvider.envVars.length > 0 ? { secrets: { [nativeProvider.envVars[0]]: llmSecret.trim() } } : {}), } @@ -521,7 +522,11 @@ export function CreateWorkspaceButton() { idPrefix="create-workspace-llm" variant="stack" /> - {selectedLLMProvider.envVars.length > 0 && ( + {isPlatformManagedProvider(selectedLLMProvider) ? ( +

+ Platform-managed — no key required +

+ ) : selectedLLMProvider.envVars.length > 0 && (