From 8d2e0cb2c68b843d15c88ae7618b46ea0b4fbd2f Mon Sep 17 00:00:00 2001 From: ChickenPige0n <2336983354@qq.com> Date: Mon, 13 Jul 2026 23:46:15 +0800 Subject: [PATCH] fix(admin-web): align provider surface with backend and ADR-0024 The org-admin provider page was a stale prototype wired to a removed singular /provider-connection endpoint. It contradicted the pinned invariants in several ways: - It documented a process-env fallback for platform-managed credentials, but ADR-0024 / Spec.System.Organization pins the resolver fail-closed with no process-global key fallback. - It exposed a BYOK<->PLATFORM_MANAGED mode toggle to org admins, but ADR-0021 makes platform-managed connections platform-admin owned; the org-side API (requireByokActor) rejects mutating them. - It modeled one connection per org, while OrganizationProviderConnection is keyed by (org, providerId) and the backend exposes a list plus a per-providerId BYOK rotation. - Its HTTP contract (/provider-connection, {baseUrl, hasAuthToken}) did not match the real backend (/provider-connections + /:providerId, {status, activeVersion, keyId}). - It dangled a pointer to role/model pages that do not exist in the SPA; roles/skills are managed via the CLI. Rewrite the page to list connections, show status/version/keyId, and rotate BYOK credentials per providerId with baseUrl + authToken (+ optional anthropicApiKey) as the backend requires. Platform-managed rows render read-only. Drop the fallback copy and the dangling pointer. Replace the singular ProviderConnection API client with providerConnections / rotateProviderConnection and remove the now-unused PROVIDER_MODES constant. --- hub/admin-web/src/lib/api.ts | 23 +- hub/admin-web/src/lib/constants.ts | 5 - .../admin/org/[slug]/provider/+page.svelte | 204 ++++++++++-------- 3 files changed, 132 insertions(+), 100 deletions(-) diff --git a/hub/admin-web/src/lib/api.ts b/hub/admin-web/src/lib/api.ts index 4c63ff4..c70e863 100644 --- a/hub/admin-web/src/lib/api.ts +++ b/hub/admin-web/src/lib/api.ts @@ -145,12 +145,13 @@ export interface SessionSummary { updatedAt: string; } -export interface ProviderConnection { - organizationId: string; +export interface ProviderConnectionRow { + id: string; providerId: string; mode: 'BYOK' | 'PLATFORM_MANAGED'; - baseUrl: string | null; - hasAuthToken: boolean; + status: 'DRAFT' | 'ACTIVE' | 'DISABLED'; + activeVersion: number | null; + keyId: string | null; createdAt: string; updatedAt: string; } @@ -248,7 +249,15 @@ export const api = { return get(`${orgBase(slug)}/usage${qs ? `?${qs}` : ''}`) as Promise; }, - provider: (slug: string) => get(`${orgBase(slug)}/provider-connection`) as Promise, - setProvider: (slug: string, body: { mode: string; providerId?: string; baseUrl?: string | null; authToken?: string | null }) => - put(`${orgBase(slug)}/provider-connection`, body) as Promise + providerConnections: (slug: string) => + get(`${orgBase(slug)}/provider-connections`) as Promise<{ connections: ProviderConnectionRow[] }>, + rotateProviderConnection: ( + slug: string, + providerId: string, + body: { baseUrl: string; authToken: string; anthropicApiKey?: string }, + ) => + put( + `${orgBase(slug)}/provider-connections/${encodeURIComponent(providerId)}`, + body, + ) as Promise }; diff --git a/hub/admin-web/src/lib/constants.ts b/hub/admin-web/src/lib/constants.ts index 8eda0a3..8440255 100644 --- a/hub/admin-web/src/lib/constants.ts +++ b/hub/admin-web/src/lib/constants.ts @@ -37,8 +37,3 @@ export const PERMISSION_ROLE_LABELS: Record = { EDIT: '编辑', MANAGE: '管理' }; - -export const PROVIDER_MODES = [ - { value: 'PLATFORM_MANAGED', label: '平台托管' }, - { value: 'BYOK', label: '自带密钥' } -] as const; diff --git a/hub/admin-web/src/routes/admin/org/[slug]/provider/+page.svelte b/hub/admin-web/src/routes/admin/org/[slug]/provider/+page.svelte index 6d97242..0c5fe74 100644 --- a/hub/admin-web/src/routes/admin/org/[slug]/provider/+page.svelte +++ b/hub/admin-web/src/routes/admin/org/[slug]/provider/+page.svelte @@ -1,36 +1,31 @@