import type { AuthManagedUsageResult, AuthManagedUserInfoResult, BearerTokenProvider, KimiOAuthLoginOptions, KimiOAuthLoginResult, KimiOAuthLogoutResult, KimiOAuthTokenRef, KimiRegion, } from '@moonshot-ai/kimi-code-oauth'; import { createDecorator, type ServiceIdentifier } from '#/_base/di/instantiation'; import { Error2 } from '#/_base/errors/errors'; import type { OAuthRef } from '#/llm-adapter/provider/provider'; import { AuthErrors } from './errors'; import type { OAuthFlowSnapshot, OAuthFlowStart, OAuthLoginCancelResponse, OAuthLogoutResponse, RefreshOAuthProviderModelsResponse, } from './oauthProtocol'; export interface AuthStatus { readonly loggedIn: boolean; readonly provider?: string; } export interface OAuthLoginOptions { readonly region?: KimiRegion; } export interface IOAuthService { readonly _serviceBrand: undefined; startLogin(provider?: string, options?: OAuthLoginOptions): Promise; getFlow(provider?: string): OAuthFlowSnapshot | undefined; cancelLogin(provider?: string): Promise; logout(provider?: string): Promise; status(provider?: string): Promise; refreshOAuthProviderModels(): Promise; getManagedUsage(provider?: string): Promise; getManagedUserInfo(provider?: string): Promise; resolveTokenProvider(provider: string, oauthRef?: OAuthRef): BearerTokenProvider | undefined; getCachedAccessToken(provider: string, oauthRef?: OAuthRef): Promise; getRegion(): KimiRegion; } export const IOAuthService: ServiceIdentifier = createDecorator('oauthService'); export interface IOAuthToolkit { readonly _serviceBrand: undefined; login(providerName?: string, options?: KimiOAuthLoginOptions): Promise; logout(providerName?: string, oauthRef?: KimiOAuthTokenRef): Promise; getCachedAccessToken( providerName?: string, oauthRef?: KimiOAuthTokenRef, ): Promise; tokenProvider(providerName?: string, oauthRef?: KimiOAuthTokenRef): BearerTokenProvider; getManagedUsage( providerName?: string, options?: { readonly oauthRef?: KimiOAuthTokenRef; readonly baseUrl?: string }, ): Promise; getManagedUserInfo( providerName?: string, options?: { readonly oauthRef?: KimiOAuthTokenRef; readonly baseUrl?: string }, ): Promise; } export const IOAuthToolkit: ServiceIdentifier = createDecorator('oauthToolkit'); export interface IAuthSummaryService { readonly _serviceBrand: undefined; summarize(): Promise; ensureReady(modelOverride?: string): Promise; } export const IAuthSummaryService: ServiceIdentifier = createDecorator('authSummaryService'); export class AuthProvisioningRequiredError extends Error2 { constructor() { super( AuthErrors.codes.AUTH_PROVISIONING_REQUIRED, 'no provider configured; complete onboarding via /login or the providers endpoint', { name: 'AuthProvisioningRequiredError' }, ); } } export class AuthTokenMissingError extends Error2 { readonly providerId: string; constructor(providerId: string) { super( AuthErrors.codes.AUTH_TOKEN_MISSING, `provider ${providerId} has no credential configured`, { details: { provider_id: providerId }, name: 'AuthTokenMissingError' }, ); this.providerId = providerId; } } export class AuthModelNotResolvedError extends Error2 { readonly modelId: string | undefined; readonly providerId: string | undefined; constructor(modelId: string | undefined, providerId?: string) { const details: Record = {}; if (modelId !== undefined) details['model_id'] = modelId; if (providerId !== undefined) details['provider_id'] = providerId; super( AuthErrors.codes.AUTH_MODEL_NOT_RESOLVED, modelId === undefined ? 'no default model configured' : `model ${modelId} does not resolve to a configured provider`, { details: Object.keys(details).length === 0 ? undefined : details, name: 'AuthModelNotResolvedError', }, ); this.modelId = modelId; this.providerId = providerId; } }