53 lines
3.3 KiB
TypeScript
53 lines
3.3 KiB
TypeScript
import { defaultCodexTempUnschedulablePolicy, renderSub2ApiTempUnschedulableCredentials } from "./src/platform-infra-sub2api-codex";
|
|
|
|
function assertCondition(condition: unknown, message: string, detail: unknown = {}): void {
|
|
if (!condition) throw new Error(`${message}: ${JSON.stringify(detail)}`);
|
|
}
|
|
|
|
const policy = defaultCodexTempUnschedulablePolicy();
|
|
const credentials = renderSub2ApiTempUnschedulableCredentials(policy) as {
|
|
temp_unschedulable_enabled?: boolean;
|
|
temp_unschedulable_rules?: Array<{
|
|
error_code?: number;
|
|
keywords?: string[];
|
|
duration_minutes?: number;
|
|
description?: string;
|
|
}>;
|
|
pool_mode?: unknown;
|
|
};
|
|
|
|
const rules = credentials.temp_unschedulable_rules ?? [];
|
|
const overload429 = rules.find((rule) => rule.error_code === 429);
|
|
const overloaded529 = rules.find((rule) => rule.error_code === 529);
|
|
|
|
assertCondition(credentials.temp_unschedulable_enabled === true, "default policy must enable Sub2API temporary unschedulable mode", credentials);
|
|
assertCondition(Array.isArray(credentials.temp_unschedulable_rules), "Sub2API rules must be rendered as an array", credentials);
|
|
assertCondition(rules.length === policy.rules.length, "rendered rule count must match the UniDesk policy", { policy, credentials });
|
|
assertCondition(overload429 !== undefined, "rendered policy must include 429 handling", rules);
|
|
assertCondition(overload429?.keywords?.includes("capacity"), "429 handling must catch capacity text", overload429);
|
|
assertCondition(overload429?.keywords?.includes("too many requests"), "429 handling must catch rate-limit text", overload429);
|
|
assertCondition(overload429?.duration_minutes === 10, "429 cooldown must match the default policy", overload429);
|
|
assertCondition(overloaded529 !== undefined, "rendered policy must include provider overloaded status 529", rules);
|
|
assertCondition(rules.every((rule) => typeof rule.error_code === "number"), "rules must use Sub2API error_code field names", rules);
|
|
assertCondition(rules.every((rule) => typeof rule.duration_minutes === "number"), "rules must use Sub2API duration_minutes field names", rules);
|
|
assertCondition(rules.every((rule) => Array.isArray(rule.keywords) && rule.keywords.length > 0), "rules must include non-empty keyword lists", rules);
|
|
assertCondition(!("pool_mode" in credentials), "pool_mode must not be enabled because it retries the same account instead of cooling it down", credentials);
|
|
assertCondition(!("api_key" in credentials) && !("base_url" in credentials), "temporary-unschedulable rendering must not include secrets or endpoints", credentials);
|
|
|
|
const disabled = renderSub2ApiTempUnschedulableCredentials({ enabled: false, rules: policy.rules }) as {
|
|
temp_unschedulable_enabled?: boolean;
|
|
temp_unschedulable_rules?: unknown[];
|
|
};
|
|
|
|
assertCondition(disabled.temp_unschedulable_enabled === false, "disabled policy must explicitly disable Sub2API temporary unschedulable mode", disabled);
|
|
assertCondition(Array.isArray(disabled.temp_unschedulable_rules) && disabled.temp_unschedulable_rules.length === 0, "disabled policy must not leave stale rules active", disabled);
|
|
|
|
console.log(JSON.stringify({
|
|
ok: true,
|
|
checks: [
|
|
"temporary unschedulable policy renders to Sub2API credential field names",
|
|
"capacity/rate-limit errors cool down an account without enabling pool_mode",
|
|
"disabled policies clear runtime rules",
|
|
],
|
|
}));
|