Newer
Older
MailChecker / config / schema.ts
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',
};