import { ipcMain } from 'electron'; import { getYinianControlPlane } from '../../yinian/control-plane'; import { getYinianStorage } from '../../yinian/storage'; import type { YinianLoginWithPasswordInput, YinianLoginWithSmsInput, YinianSavedCredentials } from '../../../shared/yinian'; export function registerYinianHandlers(): void { ipcMain.handle('yinian:server:status', async () => getYinianControlPlane().getServerStatus()); ipcMain.handle('yinian:auth:createImageCaptcha', async (_, randomStr?: string) => { return getYinianControlPlane().createImageCaptcha(randomStr); }); ipcMain.handle('yinian:auth:restoreSession', async () => getYinianControlPlane().restoreSession()); ipcMain.handle('yinian:auth:getSessionState', async () => getYinianControlPlane().getSessionState()); ipcMain.handle('yinian:auth:loginWithSms', async (_, input: YinianLoginWithSmsInput) => { return getYinianControlPlane().loginWithSms(input); }); ipcMain.handle('yinian:auth:loginWithPassword', async (_, input: YinianLoginWithPasswordInput) => { return getYinianControlPlane().loginWithPassword(input); }); ipcMain.handle('yinian:auth:logout', async () => getYinianControlPlane().logout()); ipcMain.handle('yinian:auth:getSavedCredentials', async () => { return getYinianStorage().getSavedCredentials(); }); ipcMain.handle('yinian:auth:saveCredentials', async (_, input: Pick) => { const account = typeof input.account === 'string' ? input.account.trim() : ''; if (!account) { await getYinianStorage().clearSavedCredentials(); return undefined; } const credentials: YinianSavedCredentials = { account, password: input.rememberPassword ? input.password ?? '' : undefined, rememberPassword: Boolean(input.rememberPassword), updatedAt: Date.now(), }; await getYinianStorage().setSavedCredentials(credentials); return credentials; }); ipcMain.handle('yinian:auth:clearSavedCredentials', async () => { await getYinianStorage().clearSavedCredentials(); }); ipcMain.handle('yinian:config:get', async () => getYinianControlPlane().getConfigSnapshot()); ipcMain.handle('yinian:hotel:switch', async (_, hotelId: string) => getYinianControlPlane().switchHotel(hotelId)); ipcMain.handle('yinian:skills:sync', async () => getYinianControlPlane().syncSkills()); ipcMain.handle('yinian:skills:listLocal', async () => getYinianControlPlane().listLocalSkills()); ipcMain.handle('yinian:skills:getRegistry', async (_, hotelId?: string) => getYinianControlPlane().getSkillRegistry(hotelId)); }