fix: 支持动态 provider profile slug

This commit is contained in:
Codex
2026-06-08 04:19:58 +08:00
parent bda8e3bb1e
commit 509c2aa6fd
6 changed files with 181 additions and 47 deletions
+34 -6
View File
@@ -1,5 +1,7 @@
import type { BackendProfile, JsonRecord } from "./types.js";
export const backendProfileIdPattern = /^[a-z0-9][a-z0-9-]{0,63}$/u;
export interface BackendProfileSpec {
profile: BackendProfile;
backendKind: "codex-app-server-stdio";
@@ -13,7 +15,7 @@ export interface BackendProfileSpec {
description: string;
}
export const backendProfileSpecs: readonly BackendProfileSpec[] = [
const builtinBackendProfileSpecs: readonly BackendProfileSpec[] = [
{
profile: "codex",
backendKind: "codex-app-server-stdio",
@@ -64,14 +66,40 @@ export const backendProfileSpecs: readonly BackendProfileSpec[] = [
},
];
export const backendProfiles = backendProfileSpecs.map((item) => item.profile) as readonly BackendProfile[];
export const backendProfileSpecs = builtinBackendProfileSpecs;
export const backendProfiles = builtinBackendProfileSpecs.map((item) => item.profile) as readonly BackendProfile[];
export function defaultSecretNameForProfile(profile: string): string {
return `agentrun-v01-provider-${profile}`;
}
function dynamicBackendProfileSpec(profile: string): BackendProfileSpec {
return {
profile,
backendKind: "codex-app-server-stdio",
protocol: "codex-app-server-jsonrpc-stdio",
transport: "stdio",
command: "codex app-server --listen stdio://",
status: "registered",
requiredSecretKeys: ["auth.json", "config.toml"],
defaultSecretName: defaultSecretNameForProfile(profile),
profileIsolation: "profile-scoped-codex-home",
description: `Dynamic Codex-compatible profile ${profile}`,
};
}
export function backendProfileSpec(profile: string): BackendProfileSpec | null {
return backendProfileSpecs.find((item) => item.profile === profile) ?? null;
if (!isBackendProfileSlug(profile)) return null;
return builtinBackendProfileSpecs.find((item) => item.profile === profile) ?? dynamicBackendProfileSpec(profile);
}
export function isBackendProfileSlug(value: string): boolean {
return backendProfileIdPattern.test(value);
}
export function isBackendProfile(value: string): value is BackendProfile {
return backendProfileSpec(value) !== null;
return isBackendProfileSlug(value);
}
export function backendCapability(spec: BackendProfileSpec): JsonRecord {
@@ -111,7 +139,7 @@ export function mergeBackendCapability(profile: string, storedCapabilities: Json
}
export function backendCapabilities(): JsonRecord[] {
return backendProfileSpecs.map(backendCapability);
return builtinBackendProfileSpecs.map(backendCapability);
}
export function backendCapabilitiesSqlValues(profiles?: readonly BackendProfile[]): string {
@@ -121,7 +149,7 @@ export function backendCapabilitiesSqlValues(profiles?: readonly BackendProfile[
if (!spec) throw new Error(`unknown backend profile for SQL seed: ${profile}`);
return spec;
})
: backendProfileSpecs;
: builtinBackendProfileSpecs;
return specs.map((spec) => {
const capabilities = JSON.stringify({
backendKind: spec.backendKind,