import { z } from 'zod';
// IMAPアカウント設定スキーマ
export const ImapAccountSchema = z.object({
name: z.string().min(1, 'アカウント名は必須です'),
host: z.string().min(1, 'ホスト名は必須です'),
port: z.number().int().min(1).max(65535).default(993),
secure: z.boolean().default(true),
auth: z.object({
user: z.string().email('有効なメールアドレスを入力してください'),
password: z.string().min(1, 'パスワードは必須です'),
}),
tls: z.object({
rejectUnauthorized: z.boolean().default(true),
minVersion: z.enum(['TLSv1.2', 'TLSv1.3']).default('TLSv1.2'),
}).optional().default({
rejectUnauthorized: true,
minVersion: 'TLSv1.2',
}),
// オプション設定
mailbox: z.string().default('INBOX'),
maxEmailsPerCheck: z.number().min(1).max(100).default(20),
checkInterval: z.number().min(30000).default(300000), // 5分
});
// ベイズフィルタ設定スキーマ
export const BayesianFilterSchema = z.object({
enabled: z.boolean().default(true),
categories: z.array(z.enum(['important', 'normal', 'spam', 'newsletter'])).default(['important', 'normal', 'spam']),
trainingDataPath: z.string().default('./data/training'),
modelPath: z.string().default('./data/models/bayesian.model'),
minConfidence: z.number().min(0).max(1).default(0.7),
});
// 通知設定スキーマ
export const NotificationSchema = z.object({
enabled: z.boolean().default(true),
methods: z.array(z.enum(['openclaw', 'log', 'file'])).default(['openclaw']),
importantOnly: z.boolean().default(true),
summaryFormat: z.enum(['brief', 'detailed']).default('brief'),
});
// メイン設定スキーマ
export const ConfigSchema = z.object({
version: z.string().default('1.0.0'),
accounts: z.array(ImapAccountSchema).min(1, '少なくとも1つのアカウントが必要です'),
bayesianFilter: BayesianFilterSchema.default({}),
notification: NotificationSchema.default({}),
logLevel: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
dataDirectory: z.string().default('./data'),
});
// 型エクスポート
export type ImapAccount = z.infer<typeof ImapAccountSchema>;
export type BayesianFilterConfig = z.infer<typeof BayesianFilterSchema>;
export type NotificationConfig = z.infer<typeof NotificationSchema>;
export type Config = z.infer<typeof ConfigSchema>;
// デフォルト設定
export const defaultConfig: Config = {
version: '1.0.0',
accounts: [],
bayesianFilter: {
enabled: true,
categories: ['important', 'normal', 'spam'],
trainingDataPath: './data/training',
modelPath: './data/models/bayesian.model',
minConfidence: 0.7,
},
notification: {
enabled: true,
methods: ['openclaw'],
importantOnly: true,
summaryFormat: 'brief',
},
logLevel: 'info',
dataDirectory: './data',
};