File size: 2,420 Bytes
68d7816
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { KIMI_CODE_PROVIDER_NAME } from '@moonshot-ai/kimi-code-oauth';
import type { AuthSummary } from './authLegacy';
import { LifecycleScope } from '#/app/scopes';
import { ScopeActivation, registerScopedService } from '#/_base/di/scope';
import { IOAuthService } from '#/app/auth/auth';
import { IConfigService } from '#/app/config/config';
import {
  DEFAULT_MODEL_SECTION,
  DEFAULT_PROVIDER_SECTION,
  MODELS_SECTION,
  PROVIDERS_SECTION,
} from '#/app/kosongConfig/configSection';
import { resolveModelForReady } from '#/llm-adapter/model/model-auth';
import type { ModelRecord } from '#/llm-adapter/model/model';
import type { ProviderConfig } from '#/llm-adapter/provider/provider';

import { IAuthLegacyService } from './authLegacy';

const MANAGED_PROVIDER_NAME = KIMI_CODE_PROVIDER_NAME;

export class AuthLegacyService implements IAuthLegacyService {
  declare readonly _serviceBrand: undefined;

  constructor(
    @IConfigService private readonly config: IConfigService,
    @IOAuthService private readonly oauth: IOAuthService,
  ) {}

  async get(): Promise<AuthSummary> {
    await this.config.ready;

    const snapshot = this.config.getAll();
    const providers = (snapshot[PROVIDERS_SECTION] ?? {}) as Readonly<
      Record<string, ProviderConfig>
    >;
    const models = (snapshot[MODELS_SECTION] ?? {}) as Readonly<Record<string, ModelRecord>>;
    const defaultModel = snapshot[DEFAULT_MODEL_SECTION] as string | undefined;
    const defaultProvider = snapshot[DEFAULT_PROVIDER_SECTION] as string | undefined;
    const providers_count = Object.keys(providers).length;
    const models_ready = resolveModelForReady(defaultModel, models, providers, defaultProvider).resolved;

    let managed_provider: AuthSummary['managed_provider'] = null;
    if (providers[MANAGED_PROVIDER_NAME] !== undefined) {
      const loggedIn = await this.managedLoggedIn();
      managed_provider = {
        name: MANAGED_PROVIDER_NAME,
        status: loggedIn ? 'authenticated' : 'unauthenticated',
      };
    }

    return { models_ready, providers_count, managed_provider };
  }

  private async managedLoggedIn(): Promise<boolean> {
    try {
      return (await this.oauth.status(MANAGED_PROVIDER_NAME)).loggedIn;
    } catch {
      return false;
    }
  }
}

registerScopedService(
  LifecycleScope.App,
  IAuthLegacyService,
  AuthLegacyService,
  ScopeActivation.OnScopeCreated,
  'authLegacy',
);