Merge commit 'b450cc8d' into v0.3
Pipelines as Code CI / hwlab-nc01-v03-ci-poll- Success

This commit is contained in:
root
2026-07-09 09:51:09 +02:00
5 changed files with 24 additions and 15 deletions
@@ -12,7 +12,7 @@ const AGENTRUN_RUNNER_KIND = "agentrun-v01-shared-runner";
const AGENTRUN_SESSION_MODE = "agentrun-v01-durable-session"; const AGENTRUN_SESSION_MODE = "agentrun-v01-durable-session";
const AGENTRUN_IMPLEMENTATION_TYPE = "agentrun-v01-shared-execution-infra"; const AGENTRUN_IMPLEMENTATION_TYPE = "agentrun-v01-shared-execution-infra";
const AGENTRUN_PROVIDER_TRACE_PROTOCOL = "agentrun-v01-jsonrpc"; const AGENTRUN_PROVIDER_TRACE_PROTOCOL = "agentrun-v01-jsonrpc";
const AGENTRUN_BACKEND_ALIASES = Object.freeze({ "codex-api": "codex", codex: "codex" }); const AGENTRUN_BACKEND_ALIASES = Object.freeze({ "codex-api": "codex", codex: "codex", "gpt.pika": "gpt-pika" });
const AGENTRUN_BACKEND_PROFILE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/u; const AGENTRUN_BACKEND_PROFILE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/u;
export function resolveAgentRunBackendProfile(env = process.env, params = {}) { export function resolveAgentRunBackendProfile(env = process.env, params = {}) {
@@ -108,6 +108,7 @@ export function modelForBackendProfile(profile, env = process.env) {
export function providerForBackendProfile(profile) { export function providerForBackendProfile(profile) {
const resolved = resolveAgentRunBackendProfile({}, { providerProfile: profile }); const resolved = resolveAgentRunBackendProfile({}, { providerProfile: profile });
if (resolved === "codex") return "codex-api"; if (resolved === "codex") return "codex-api";
if (resolved === "gpt-pika") return "gpt.pika";
return resolved; return resolved;
} }
+14 -8
View File
@@ -8,7 +8,10 @@ const AGENTRUN_MANAGER_HOST_PATTERN = /^agentrun-mgr\.[a-z0-9]([-a-z0-9]*[a-z0-9
const DEFAULT_TIMEOUT_MS = 30000; const DEFAULT_TIMEOUT_MS = 30000;
const PROVIDER_PROFILE_ALIASES = Object.freeze({ codex: "codex-api" }); const PROVIDER_PROFILE_ALIASES = Object.freeze({ codex: "codex-api" });
const PROVIDER_PROFILE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/u; const PROVIDER_PROFILE_BACKEND_ALIASES = Object.freeze({ "codex-api": "codex", "gpt.pika": "gpt-pika" });
const PROVIDER_PROFILE_DISPLAY_ALIASES = Object.freeze({ codex: "codex-api", "gpt-pika": "gpt.pika" });
const PROVIDER_PROFILE_ID_PATTERN = /^[a-z0-9][a-z0-9.-]{0,63}$/u;
const AGENTRUN_PROVIDER_PROFILE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/u;
const RESERVED_PROVIDER_PROFILES = new Set(["runtime-default"]); const RESERVED_PROVIDER_PROFILES = new Set(["runtime-default"]);
export async function handleProviderProfileCatalogHttp(request, response, options = {}) { export async function handleProviderProfileCatalogHttp(request, response, options = {}) {
@@ -174,14 +177,15 @@ function parseProviderProfileRoute(pathname, method) {
function normalizeProfile(value) { function normalizeProfile(value) {
const input = text(value).toLowerCase(); const input = text(value).toLowerCase();
const publicProfile = PROVIDER_PROFILE_ALIASES[input] ?? input; const publicProfile = PROVIDER_PROFILE_ALIASES[input] ?? input;
if (!publicProfile || RESERVED_PROVIDER_PROFILES.has(publicProfile) || !PROVIDER_PROFILE_ID_PATTERN.test(publicProfile)) { const agentRunProfile = PROVIDER_PROFILE_BACKEND_ALIASES[publicProfile] ?? publicProfile;
throw routeError(400, "invalid_provider_profile", "Provider profile must be a lowercase slug such as deepseek, minimax-m3, dsflash-go, or codex-api", { if (!publicProfile || RESERVED_PROVIDER_PROFILES.has(publicProfile) || !PROVIDER_PROFILE_ID_PATTERN.test(publicProfile) || !AGENTRUN_PROVIDER_PROFILE_ID_PATTERN.test(agentRunProfile)) {
throw routeError(400, "invalid_provider_profile", "Provider profile must be a lowercase id such as deepseek, minimax-m3, dsflash-go, codex-api, or gpt.pika", {
profile: input, profile: input,
alias: "codex -> codex-api", alias: "codex -> codex-api, gpt.pika -> gpt-pika",
pattern: String(PROVIDER_PROFILE_ID_PATTERN) pattern: String(PROVIDER_PROFILE_ID_PATTERN)
}); });
} }
return { publicProfile, agentRunProfile: publicProfile === "codex-api" ? "codex" : publicProfile }; return { publicProfile, agentRunProfile };
} }
async function agentRunJson(fetchImpl, managerUrl, path, { method = "GET", body, requestId, timeoutMs, apiKey }) { async function agentRunJson(fetchImpl, managerUrl, path, { method = "GET", body, requestId, timeoutMs, apiKey }) {
@@ -270,9 +274,11 @@ function normalizeCatalogData(data) {
function normalizeProfileData(item) { function normalizeProfileData(item) {
if (!item || typeof item !== "object") return item; if (!item || typeof item !== "object") return item;
const copy = redactObject(item); const copy = redactObject(item);
if (copy.profile === "codex") { const backendProfile = text(copy.backendProfile ?? copy.profile);
copy.backendProfile = "codex"; const displayProfile = PROVIDER_PROFILE_DISPLAY_ALIASES[backendProfile] ?? copy.profile;
copy.profile = "codex-api"; if (displayProfile && displayProfile !== copy.profile) {
copy.backendProfile = backendProfile;
copy.profile = displayProfile;
} }
if (copy.profile === "deepseek") copy.bridge = deepseekBridgeSummary(); if (copy.profile === "deepseek") copy.bridge = deepseekBridgeSummary();
if (text(copy.configSummary?.model ?? copy.model) === "deepseek-v4-flash") copy.bridge = opencodeZenGoBridgeSummary(); if (text(copy.configSummary?.model ?? copy.model) === "deepseek-v4-flash") copy.bridge = opencodeZenGoBridgeSummary();
+5 -4
View File
@@ -580,11 +580,12 @@ async function providerProfileAuthJsonFromStdin(context: any) {
function normalizeProviderProfile(value: unknown) { function normalizeProviderProfile(value: unknown) {
const profile = text(value).toLowerCase(); const profile = text(value).toLowerCase();
const normalized = profile === "codex" ? "codex-api" : profile; const normalized = profile === "codex" ? "codex-api" : profile;
if (/^[a-z0-9][a-z0-9-]{0,63}$/u.test(normalized) && normalized !== "runtime-default") return normalized; const backendProfile = normalized === "gpt.pika" ? "gpt-pika" : normalized;
throw cliError("invalid_provider_profile", "provider profile must be a lowercase slug such as deepseek, minimax-m3, dsflash-go, or codex-api", { if (/^[a-z0-9][a-z0-9.-]{0,63}$/u.test(normalized) && /^[a-z0-9][a-z0-9-]{0,63}$/u.test(backendProfile) && normalized !== "runtime-default") return normalized;
throw cliError("invalid_provider_profile", "provider profile must be a lowercase id such as deepseek, minimax-m3, dsflash-go, codex-api, or gpt.pika", {
profile, profile,
alias: "codex -> codex-api", alias: "codex -> codex-api, gpt.pika -> gpt-pika",
pattern: "^[a-z0-9][a-z0-9-]{0,63}$" pattern: "public=^[a-z0-9][a-z0-9.-]{0,63}$ backend=^[a-z0-9][a-z0-9-]{0,63}$"
}); });
} }
@@ -92,7 +92,7 @@ export function mergeProviderRow(rows: ProviderProfileRow[], updated: ProviderPr
} }
export function orderProviderProfiles(rows: ProviderProfileRow[]): ProviderProfileRow[] { export function orderProviderProfiles(rows: ProviderProfileRow[]): ProviderProfileRow[] {
const preferred = ["deepseek", "dsflash-go", "codex-api", "minimax-m3"]; const preferred = ["deepseek", "dsflash-go", "gpt.pika", "codex-api", "minimax-m3"];
return [...rows].sort((a, b) => { return [...rows].sort((a, b) => {
const ai = preferred.indexOf(a.profile); const ai = preferred.indexOf(a.profile);
const bi = preferred.indexOf(b.profile); const bi = preferred.indexOf(b.profile);
@@ -66,10 +66,11 @@ export const RECENT_DRAFTS_LIMIT = 8;
const OBJECT_OBJECT_TEXT = "[object Object]"; const OBJECT_OBJECT_TEXT = "[object Object]";
const GENERIC_USER_TITLE_TEXT = "用户"; const GENERIC_USER_TITLE_TEXT = "用户";
const BUILTIN_PROVIDER_PROFILE_ORDER = Object.freeze(["deepseek", "dsflash-go", "codex-api", "minimax-m3"]); const BUILTIN_PROVIDER_PROFILE_ORDER = Object.freeze(["deepseek", "dsflash-go", "gpt.pika", "codex-api", "minimax-m3"]);
const BUILTIN_PROVIDER_PROFILE_LABELS: Readonly<Record<string, string>> = Object.freeze({ const BUILTIN_PROVIDER_PROFILE_LABELS: Readonly<Record<string, string>> = Object.freeze({
deepseek: "DeepSeek", deepseek: "DeepSeek",
"dsflash-go": "DeepSeek V4 Flash", "dsflash-go": "DeepSeek V4 Flash",
"gpt.pika": "gpt.pika",
"codex-api": "Codex API", "codex-api": "Codex API",
"minimax-m3": "MiniMax-M3" "minimax-m3": "MiniMax-M3"
}); });