import type { YinianAuthSession, YinianConfigSnapshot, YinianImageCaptcha, YinianLoginWithPasswordInput, YinianLoginWithSmsInput, YinianLocalSkill, YinianServerStatus, YinianSessionState, YinianSkillRegistry, YinianSkillSyncResult, } from '../../shared/yinian'; import { HttpYinianControlPlane } from './http-control-plane'; import { MockYinianControlPlane } from './mock-control-plane'; import { getYinianStorage } from './storage'; import { UnconfiguredYinianControlPlane } from './unconfigured-control-plane'; const DEFAULT_YINIAN_API_BASE_URL = 'https://onefeel.brother7.cn/ingress'; export interface YinianControlPlane { getServerStatus(): Promise; createImageCaptcha(randomStr?: string): Promise; restoreSession(): Promise; getSessionState(): Promise; loginWithSms(input: YinianLoginWithSmsInput): Promise; loginWithPassword(input: YinianLoginWithPasswordInput): Promise; logout(): Promise; switchHotel(hotelId: string): Promise; getConfigSnapshot(): Promise; syncSkills(): Promise; listLocalSkills(): Promise; getSkillRegistry(hotelId?: string): Promise | undefined>; } let controlPlane: YinianControlPlane | null = null; export function getYinianControlPlane(): YinianControlPlane { if (controlPlane) return controlPlane; const apiBaseUrl = process.env.YINIAN_API_BASE_URL?.trim() || DEFAULT_YINIAN_API_BASE_URL; const explicitMode = process.env.YINIAN_CONTROL_PLANE_MODE?.trim(); const shouldUseMock = explicitMode === 'mock' || process.env.CLAWX_E2E === '1'; controlPlane = shouldUseMock ? new MockYinianControlPlane({ storage: getYinianStorage() }) : apiBaseUrl ? new HttpYinianControlPlane({ apiBaseUrl, storage: getYinianStorage() }) : new UnconfiguredYinianControlPlane(); return controlPlane; } export function resetYinianControlPlaneForTests(next?: YinianControlPlane): void { controlPlane = next ?? null; }