60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
export interface GeminiActivationEvidence {
|
|
enabled?: boolean | null
|
|
authentication_verified?: boolean | null
|
|
cost_guard_ready?: boolean | null
|
|
proof_source?: string | null
|
|
receipt_id?: string | null
|
|
receipt_status?: string | null
|
|
run_id?: string | null
|
|
work_item_id?: string | null
|
|
}
|
|
|
|
interface AiRouteActivationStatus {
|
|
selected_provider?: string | null
|
|
active_lane?: { provider_name?: string | null } | null
|
|
gemini_activation_evidence?: GeminiActivationEvidence | null
|
|
}
|
|
|
|
const GEMINI_ACTIVE_RECEIPT_STATUSES = new Set([
|
|
'reserved',
|
|
'succeeded',
|
|
'succeeded_usage_estimated',
|
|
])
|
|
|
|
export function hasDurableGeminiActivationProof(
|
|
evidence?: GeminiActivationEvidence | null,
|
|
): boolean {
|
|
const receiptId = evidence?.receipt_id?.trim() ?? ''
|
|
const receiptStatus = evidence?.receipt_status?.trim() ?? ''
|
|
const runId = evidence?.run_id?.trim() ?? ''
|
|
const workItemId = evidence?.work_item_id?.trim() ?? ''
|
|
|
|
return Boolean(
|
|
evidence?.enabled === true
|
|
&& evidence.authentication_verified === true
|
|
&& evidence.cost_guard_ready === true
|
|
&& evidence.proof_source === 'durable_generation_receipt'
|
|
&& receiptId
|
|
&& runId
|
|
&& workItemId
|
|
&& GEMINI_ACTIVE_RECEIPT_STATUSES.has(receiptStatus),
|
|
)
|
|
}
|
|
|
|
export function resolveAiRouteActiveProvider(
|
|
status?: AiRouteActivationStatus | null,
|
|
): string | null {
|
|
const selectedProvider = status?.selected_provider ?? null
|
|
const reportedActive = status?.active_lane?.provider_name ?? null
|
|
|
|
if (!reportedActive) return null
|
|
if (reportedActive !== 'gemini') return reportedActive
|
|
if (hasDurableGeminiActivationProof(status?.gemini_activation_evidence)) {
|
|
return 'gemini'
|
|
}
|
|
|
|
return selectedProvider && selectedProvider !== 'gemini'
|
|
? selectedProvider
|
|
: null
|
|
}
|