import type { WebhookEvent, TextMessage, ImageMessage, VideoMessage, AudioMessage, StickerMessage, LocationMessage, } from "@line/bot-sdk"; export type LineTokenSource = "config" | "env" | "file" | "none"; export interface LineConfig { enabled?: boolean; channelAccessToken?: string; channelSecret?: string; tokenFile?: string; secretFile?: string; name?: string; allowFrom?: Array; groupAllowFrom?: Array; dmPolicy?: "open" | "allowlist" | "pairing" | "disabled"; groupPolicy?: "open" | "allowlist" | "disabled"; mediaMaxMb?: number; webhookPath?: string; accounts?: Record; groups?: Record; } export interface LineAccountConfig { enabled?: boolean; channelAccessToken?: string; channelSecret?: string; tokenFile?: string; secretFile?: string; name?: string; allowFrom?: Array; groupAllowFrom?: Array; dmPolicy?: "open" | "allowlist" | "pairing" | "disabled"; groupPolicy?: "open" | "allowlist" | "disabled"; mediaMaxMb?: number; webhookPath?: string; groups?: Record; } export interface LineGroupConfig { enabled?: boolean; allowFrom?: Array; requireMention?: boolean; systemPrompt?: string; skills?: string[]; } export interface ResolvedLineAccount { accountId: string; name?: string; enabled: boolean; channelAccessToken: string; channelSecret: string; tokenSource: LineTokenSource; config: LineConfig & LineAccountConfig; } export type LineMessageType = | TextMessage | ImageMessage | VideoMessage | AudioMessage | StickerMessage | LocationMessage; export interface LineWebhookContext { event: WebhookEvent; replyToken?: string; userId?: string; groupId?: string; roomId?: string; } export interface LineSendResult { messageId: string; chatId: string; } export interface LineProbeResult { ok: boolean; bot?: { displayName?: string; userId?: string; basicId?: string; pictureUrl?: string; }; error?: string; } export type LineFlexMessagePayload = { altText: string; contents: unknown; }; export type LineTemplateMessagePayload = | { type: "confirm"; text: string; confirmLabel: string; confirmData: string; cancelLabel: string; cancelData: string; altText?: string; } | { type: "buttons"; title: string; text: string; actions: Array<{ type: "message" | "uri" | "postback"; label: string; data?: string; uri?: string; }>; thumbnailImageUrl?: string; altText?: string; } | { type: "carousel"; columns: Array<{ title?: string; text: string; thumbnailImageUrl?: string; actions: Array<{ type: "message" | "uri" | "postback"; label: string; data?: string; uri?: string; }>; }>; altText?: string; }; export type LineChannelData = { quickReplies?: string[]; location?: { title: string; address: string; latitude: number; longitude: number; }; flexMessage?: LineFlexMessagePayload; templateMessage?: LineTemplateMessagePayload; };