blob: 33394aa0f9ec25248aa03f519bec81101c494ac4 [file]
import type { BotProvider } from './bot-chat-settings.js';
export const BOT_ONBOARDING_PROVIDERS = [
'dingtalk',
'feishu',
'wecom',
'wechat',
'qq',
] as const satisfies ReadonlyArray<BotProvider>;
export type BotOnboardingProvider = (typeof BOT_ONBOARDING_PROVIDERS)[number];
export type BotOnboardingBrand = 'feishu' | 'lark';
export const BOT_ONBOARDING_STATES = [
'waiting',
'scanned',
'connecting',
'connected',
'expired',
'denied',
'cancelled',
'error',
] as const;
export type BotOnboardingState = (typeof BOT_ONBOARDING_STATES)[number];
export interface BotOnboardingStartInput {
provider: BotOnboardingProvider;
/** Feishu and Lark share one Maka channel but use different account domains. */
brand?: BotOnboardingBrand;
}
/**
* Renderer-safe projection of a main-process-owned onboarding session.
* Provider device codes and final credentials never cross the preload boundary.
*/
export interface BotOnboardingSnapshot {
sessionId: string;
provider: BotOnboardingProvider;
brand?: BotOnboardingBrand;
state: BotOnboardingState;
qrCodeDataUrl?: string;
expiresAt?: number;
nextPollAfterMs: number;
canOpenInBrowser: boolean;
identity?: {
id?: string;
displayName?: string;
};
error?: string;
/**
* Set on a `connected` snapshot when the channel was saved successfully but
* the live bridge did not reach a running/healthy state within the commit
* window. The saved channel is valid and persisted; this is an honest,
* redacted notice (never carries provider credentials) that the connection
* still needs to be (re)established — never a hard failure of onboarding.
*/
warning?: string;
}
export function isBotOnboardingProvider(value: unknown): value is BotOnboardingProvider {
return (
typeof value === 'string' && (BOT_ONBOARDING_PROVIDERS as readonly string[]).includes(value)
);
}
export function isBotOnboardingBrand(value: unknown): value is BotOnboardingBrand {
return value === 'feishu' || value === 'lark';
}