feat(quota): Moonshot Open Platform balance and TPD lock for custom nodes (#12590)

Validado em lote numa worktree combinada com os 9 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check:provider-consistency` OK (273 entradas REGISTRY, **356** providers canônicos), `check-docs-counts-sync` exit 0 e **300/300** nos testes que a leva toca.

O crescimento de arquivo que os PRs empilham uns sobre os outros foi rebaselinado num único registro datado (`_rebaseline_2026_09_03_houminxi_batch`), com a decomposição por arquivo: `providers/page.tsx` +18 (import CSV do #12504 + busca do #12495 no mesmo painel), `accountFallback.ts` +6 (o #12566 sobre o rebaseline que o #12590 já registrou — os dois tocam `checkFallbackError`) e `chatCore.ts` +3 (invalidez de cache de quota no 429 do #12325). As violações restantes (`codex.ts`, `stream.ts`) foram medidas também no tip puro e são drift da base, não desta leva.
This commit is contained in:
Bob.Hou
2026-09-03 11:47:50 -04:00
committed by GitHub
parent a47d2e521e
commit 831ea040c3
121 changed files with 1626 additions and 247 deletions

View File

@@ -22,16 +22,36 @@ import {
isReservedProviderPrefix,
reservedProviderPrefixMessage,
} from "@/shared/constants/reservedProviderPrefixes";
import {
isValidIanaTimeZone,
isValidResetHour,
} from "@omniroute/open-sse/services/dailyQuotaReset.ts";
import {
upstreamHeadersRecordSchema,
modelCompatPerProtocolSchema,
customHeadersSchema,
} from "./misc.ts";
import { isValidProviderIconUrl } from "@/shared/validation/iconUrl";
export { validateProviderSpecificData };
import { isValidProviderIconUrl } from "@/shared/validation/iconUrl";
const dailyQuotaResetTimezoneSchema = z
.string()
.trim()
.optional()
.or(z.literal(""))
.refine((value) => !value || isValidIanaTimeZone(value), {
message: "Unknown IANA timezone",
});
const dailyQuotaResetHourSchema = z
.number()
.int()
.optional()
.nullable()
.refine((value) => value == null || isValidResetHour(value), {
message: "Hour must be 0-23",
});
// ──── Provider Schemas ────
@@ -337,6 +357,8 @@ export const createProviderNodeSchema = z
// isValidProviderIconUrl (2000 chars for http(s), 256 KiB for data:image).
iconUrl: providerNodeIconUrlSchema,
customHeaders: customHeadersSchema,
dailyQuotaResetTimezone: dailyQuotaResetTimezoneSchema,
dailyQuotaResetHour: dailyQuotaResetHourSchema,
})
.superRefine((value, ctx) => {
const nodeType = value.type || "openai-compatible";
@@ -419,6 +441,8 @@ export const updateProviderNodeSchema = z
// clears a previously stored custom icon.
iconUrl: providerNodeIconUrlSchema,
customHeaders: customHeadersSchema,
dailyQuotaResetTimezone: dailyQuotaResetTimezoneSchema,
dailyQuotaResetHour: dailyQuotaResetHourSchema,
})
.superRefine((value, ctx) => {
// Reserved-prefix guard (tokenrouter bug) — same rationale as the guard in