@gnidreve/classic-imap-smtp-mcp 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bin/main.ts","../src/config/loader.ts","../src/lib/errors.ts","../src/config/providers.ts","../src/config/schema.ts","../src/config/xdg.ts","../src/connections/imap-pool.ts","../src/connections/smtp-pool.ts","../src/server/logging.ts","../src/server/options.ts","../src/server/registry.ts","../src/server/server.ts","../src/tools/imap-read/check-capabilities.ts","../src/tools/_types.ts","../src/tools/imap-read/download-attachment.ts","../src/tools/imap-read/get-message-headers.ts","../src/tools/imap-read/get-message-raw.ts","../src/tools/imap-read/get-message.ts","../src/lib/mime.ts","../src/tools/imap-read/get-messages-bulk.ts","../src/tools/imap-read/get-quota.ts","../src/tools/imap-read/get-thread.ts","../src/lib/threading.ts","../src/tools/imap-read/list-mailboxes.ts","../src/tools/imap-read/list-messages.ts","../src/tools/imap-read/search.ts","../src/lib/search-builder.ts","../src/tools/imap-read/status-mailbox.ts","../src/tools/imap-write/append-message.ts","../src/tools/imap-write/bulk-mark.ts","../src/tools/imap-write/bulk-move.ts","../src/tools/imap-write/copy-message.ts","../src/tools/imap-write/delete-message.ts","../src/tools/imap-write/expunge.ts","../src/tools/imap-write/mark-message.ts","../src/tools/imap-write/move-message.ts","../src/tools/imap-mailbox/create-mailbox.ts","../src/tools/imap-mailbox/delete-mailbox.ts","../src/tools/imap-mailbox/rename-mailbox.ts","../src/tools/imap-mailbox/subscribe-mailbox.ts","../src/tools/imap-mailbox/unsubscribe-mailbox.ts","../src/tools/smtp/forward.ts","../src/lib/sent-folder.ts","../src/tools/smtp/reply.ts","../src/tools/smtp/send-raw.ts","../src/tools/smtp/send.ts","../src/tools/smtp/verify-connection.ts","../src/tools/account/add.ts","../src/tools/account/delete.ts","../src/tools/account/list.ts","../src/tools/account/update.ts","../src/tools/meta/health.ts","../src/tools/meta/server-info.ts","../src/tools/index.ts"],"sourcesContent":["// CLI-Entry (Command: classic-imap-smtp-mcp): parst Args, baut Context, startet stdio-Server. Fail-fast bei --no-imap+--no-smtp.\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { loadConfig } from \"../config/loader.js\";\nimport { defaultConfigPath } from \"../config/xdg.js\";\nimport { ImapPool } from \"../connections/imap-pool.js\";\nimport { SmtpPool } from \"../connections/smtp-pool.js\";\nimport { AccountNotFoundError, McpMailError } from \"../lib/errors.js\";\nimport { createLogger } from \"../server/logging.js\";\nimport { parseArgs } from \"../server/options.js\";\nimport { resolveActiveTools } from \"../server/registry.js\";\nimport { SERVER_VERSION, buildServer, runStdio } from \"../server/server.js\";\nimport type { ToolContext } from \"../tools/_types.js\";\nimport { ALL_TOOLS } from \"../tools/index.js\";\n\nconst HELP = `classic-imap-smtp-mcp — classic IMAP/SMTP MCP server (stdio)\n\nUsage: classic-imap-smtp-mcp [options]\n\nOptions:\n --safe Disable delete tools (delete/expunge/delete-mailbox)\n --readonly Read-only: no writes, no SMTP send\n --no-imap Disable all IMAP tools\n --no-smtp Disable all SMTP tools\n --allow-tools=<csv> Explicitly enable tools (overrides feature flags, prefix wildcards)\n --deny-tools=<csv> Explicitly remove tools (wins over everything, prefix wildcards)\n --account=<name> Default account override\n --config=<path> Alternative config path\n --log-level=<level> trace|debug|info|warn|error (default: info)\n --log-format=<fmt> json|pretty (default: json)\n -h, --help Show help\n -V, --version Show version\n\nSubcommands:\n init Write a template config to the XDG path\n test [account] Test IMAP+SMTP connection\n list-tools Dry-run: which tools would register with the current flags\n`;\n\nconst TEMPLATE_CONFIG = `# classic-imap-smtp-mcp — Multi-Account Config\n# Generated by \\`classic-imap-smtp-mcp init\\`\n# Pfad: see defaultConfigPath()\n# Datei sollte Permission 0600 haben — der Server warnt sonst.\n\ndefault_account = \"personal\"\n\n# Optional: globale Rate-Limits\n[limits]\nsmtp_per_minute = 10\nimap_ops_per_second = 100\n\n# --- Füge hier deine Accounts ein ---\n# Beispiel mit Provider-Auto-Detect (nur user/pass nötig):\n[[accounts]]\nname = \"personal\"\nuser = \"you@gmail.com\"\npass = \"your-app-password\"\nfrom_name = \"Your Name\"\n\n# Beispiel mit explizitem Host/Port:\n# [[accounts]]\n# name = \"work\"\n# user = \"you@company.com\"\n# pass = \"another-app-password\"\n# imap_host = \"imap.company.com\"\n# imap_port = 993\n# imap_tls = \"implicit\"\n# smtp_host = \"smtp.company.com\"\n# smtp_port = 587\n# smtp_tls = \"starttls\"\n# from_name = \"You at Work\"\n`;\n\nasync function main(): Promise<void> {\n const parsed = parseArgs(process.argv.slice(2));\n\n if (parsed.help) {\n process.stdout.write(HELP);\n return;\n }\n if (parsed.version) {\n process.stdout.write(`${SERVER_VERSION}\\n`);\n return;\n }\n\n const logger = createLogger({ level: parsed.options.logLevel, format: parsed.options.logFormat });\n\n // Fail-fast: leerer Server ist fast sicher ein Konfig-Versehen.\n if (parsed.options.noImap && parsed.options.noSmtp) {\n logger.error(\"Both --no-imap and --no-smtp set: server would expose no mail tools. Aborting.\");\n process.exit(1);\n }\n\n // Subcommands\n if (parsed.subcommand === \"init\") {\n await handleInit(logger);\n return;\n }\n if (parsed.subcommand === \"list-tools\") {\n await handleListTools(parsed.options, logger);\n return;\n }\n if (parsed.subcommand === \"test\") {\n await handleTest(parsed.options, parsed.subcommandArg, logger);\n return;\n }\n\n // Normal server mode\n const config = loadConfig(parsed.options.configPath);\n const imap = new ImapPool(config, logger);\n const smtp = new SmtpPool(config, logger);\n\n const activeTools = resolveActiveTools(ALL_TOOLS, parsed.options).map((t) => t.name);\n\n const ctx: ToolContext = {\n config,\n imap,\n smtp,\n logger,\n activeTools,\n flags: parsed.options,\n resolveAccount(name?: string): string {\n const target = name ?? parsed.options.account ?? config.defaultAccount;\n if (!config.accounts.has(target)) throw new AccountNotFoundError(target);\n return target;\n },\n };\n\n const server = buildServer(parsed.options, ctx, logger);\n\n const shutdown = async () => {\n await Promise.allSettled([imap.closeAll(), smtp.closeAll()]);\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await runStdio(server);\n logger.info(\"classic-imap-smtp-mcp running on stdio\");\n}\n\nasync function handleInit(logger: ReturnType<typeof createLogger>): Promise<void> {\n const configPath = defaultConfigPath();\n const dir = dirname(configPath);\n\n if (!existsSync(configPath)) {\n mkdirSync(dir, { recursive: true });\n writeFileSync(configPath, TEMPLATE_CONFIG, \"utf8\");\n try {\n // Set 0600 permissions on Unix\n if (process.platform !== \"win32\") {\n const { chmodSync } = await import(\"node:fs\");\n chmodSync(configPath, 0o600);\n }\n } catch {\n /* ignore */\n }\n process.stdout.write(`Template config written to: ${configPath}\\n`);\n process.stdout.write(\"Edit the file with your account details, then run the server.\\n\");\n } else {\n process.stdout.write(`Config file already exists: ${configPath}\\n`);\n }\n}\n\nasync function handleListTools(\n options: Parameters<typeof resolveActiveTools>[1],\n logger: ReturnType<typeof createLogger>,\n): Promise<void> {\n const active = resolveActiveTools(ALL_TOOLS, options);\n const lines: string[] = [];\n lines.push(`Active tools: ${active.length}/${ALL_TOOLS.length}`);\n for (const t of active) {\n lines.push(` ${t.name.padEnd(32)} ${t.category}`);\n }\n const denied = ALL_TOOLS.length - active.length;\n if (denied > 0) {\n lines.push(`\\nBlocked by flags: ${denied} tool(s)`);\n const blocked = ALL_TOOLS.filter((t) => !active.find((a) => a.name === t.name));\n for (const t of blocked) {\n lines.push(` ${t.name.padEnd(32)} ${t.category}`);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nasync function handleTest(\n options: Parameters<typeof resolveActiveTools>[1],\n accountArg: string | undefined,\n logger: ReturnType<typeof createLogger>,\n): Promise<void> {\n const config = loadConfig(options.configPath);\n const imap = new ImapPool(config, logger);\n const smtp = new SmtpPool(config, logger);\n\n const accountName = accountArg ?? config.defaultAccount;\n if (!config.accounts.has(accountName)) {\n process.stderr.write(`Account not found: ${accountName}\\n`);\n process.exit(1);\n }\n\n process.stdout.write(`Testing account: ${accountName}\\n`);\n\n // IMAP\n process.stdout.write(\" IMAP... \");\n try {\n const start = Date.now();\n const client = await imap.acquire(accountName);\n const caps = [...client.capabilities.keys()];\n const latency = Date.now() - start;\n process.stdout.write(`OK (${latency}ms, ${caps.length} capabilities)\\n`);\n } catch (err) {\n process.stdout.write(`FAIL: ${err}\\n`);\n }\n\n // SMTP\n process.stdout.write(\" SMTP... \");\n try {\n const start = Date.now();\n const transport = await smtp.acquire(accountName);\n await transport.verify();\n const latency = Date.now() - start;\n process.stdout.write(`OK (${latency}ms)\\n`);\n } catch (err) {\n process.stdout.write(`FAIL: ${err}\\n`);\n }\n\n await imap.closeAll();\n await smtp.closeAll();\n}\n\nmain().catch((err) => {\n const msg = err instanceof McpMailError ? `${err.code}: ${err.message}` : String(err);\n process.stderr.write(`Fatal: ${msg}\\n`);\n process.exit(1);\n});\n","// Config-Loader: liest entweder Env-Vars (Single-Account) oder TOML (Multi-Account), ergänzt Provider-Presets, validiert, prüft 0600.\nimport { readFileSync, statSync } from \"node:fs\";\nimport { parse as parseToml } from \"smol-toml\";\nimport { ConfigError, PermissionError } from \"../lib/errors.js\";\nimport { detectProvider } from \"./providers.js\";\nimport { type AccountConfig, type FileConfig, accountSchema, fileConfigSchema } from \"./schema.js\";\nimport { defaultConfigPath } from \"./xdg.js\";\n\nexport interface ConfigStore {\n mode: \"env\" | \"config-file\";\n defaultAccount: string;\n accounts: Map<string, AccountConfig>;\n configPath?: string;\n}\n\nconst ENV = \"CLASSIC_IMAP_SMTP_\";\n\n// Liest die Single-Account-Konfiguration aus Env-Vars (Präfix CLASSIC_IMAP_SMTP_).\nfunction loadFromEnv(): ConfigStore | null {\n const user = process.env[`${ENV}USER`];\n const pass = process.env[`${ENV}PASS`];\n if (!user || !pass) return null;\n\n const preset = detectProvider(user);\n const raw = {\n name: \"default\",\n user,\n pass,\n from_name: process.env[`${ENV}FROM_NAME`],\n imap_host: process.env[`${ENV}IMAP_HOST`] ?? preset?.imap_host,\n imap_port: numEnv(`${ENV}IMAP_PORT`) ?? preset?.imap_port ?? 993,\n imap_tls: process.env[`${ENV}IMAP_TLS`] ?? preset?.imap_tls ?? \"implicit\",\n smtp_host: process.env[`${ENV}SMTP_HOST`] ?? preset?.smtp_host,\n smtp_port: numEnv(`${ENV}SMTP_PORT`) ?? preset?.smtp_port ?? 465,\n smtp_tls: process.env[`${ENV}SMTP_TLS`] ?? preset?.smtp_tls ?? \"implicit\",\n verify_tls: process.env[`${ENV}VERIFY_TLS`] !== \"false\",\n };\n const account = accountSchema.parse(normalizeTls(raw));\n return { mode: \"env\", defaultAccount: \"default\", accounts: new Map([[\"default\", account]]) };\n}\n\n// Lädt und validiert die TOML-Config-Datei, prüft Datei-Permissions (0600 empfohlen).\nfunction loadFromFile(path: string): ConfigStore {\n let text: string;\n try {\n checkPermissions(path);\n text = readFileSync(path, \"utf8\");\n } catch (err) {\n if (err instanceof PermissionError) throw err;\n throw new ConfigError(`Cannot read config file: ${path}`, { cause: String(err) });\n }\n let parsed: FileConfig;\n try {\n parsed = fileConfigSchema.parse(parseToml(text));\n } catch (err) {\n throw new ConfigError(\"Invalid config file\", { cause: String(err) });\n }\n\n const accounts = new Map<string, AccountConfig>();\n for (const acc of parsed.accounts) {\n const preset = detectProvider(acc.user);\n accounts.set(acc.name, {\n ...acc,\n imap_host: acc.imap_host ?? preset?.imap_host,\n smtp_host: acc.smtp_host ?? preset?.smtp_host,\n });\n }\n // biome-ignore lint/style/noNonNullAssertion: zod validates accounts min(1)\n const defaultAccount = parsed.default_account ?? parsed.accounts[0]!.name;\n return { mode: \"config-file\", defaultAccount, accounts, configPath: path };\n}\n\n// Haupteinstieg: Env hat Vorrang, sonst Config-File. Wirft, wenn keins vorhanden.\nexport function loadConfig(explicitPath?: string): ConfigStore {\n const fromEnv = loadFromEnv();\n if (fromEnv) return fromEnv;\n\n const path = explicitPath ?? defaultConfigPath();\n return loadFromFile(path);\n}\n\nfunction checkPermissions(path: string): void {\n if (process.platform === \"win32\") return; // POSIX-Permissions nicht anwendbar\n const mode = statSync(path).mode & 0o777;\n if (mode & 0o077) {\n throw new PermissionError(\n `Config file ${path} is too permissive (mode ${mode.toString(8)}); expected 0600`,\n { path, mode: mode.toString(8) },\n );\n }\n}\n\nfunction numEnv(key: string): number | undefined {\n const v = process.env[key];\n return v ? Number.parseInt(v, 10) : undefined;\n}\n\n// \"true\" -> implicit, \"starttls\" -> starttls, \"false\" -> none (Env akzeptiert true/false/starttls).\nfunction normalizeTls(raw: Record<string, unknown>): Record<string, unknown> {\n const map = (v: unknown) =>\n v === \"true\" || v === true ? \"implicit\" : v === \"false\" || v === false ? \"none\" : v;\n return { ...raw, imap_tls: map(raw.imap_tls), smtp_tls: map(raw.smtp_tls) };\n}\n","// Strukturierte Error-Klassen mit festen code-Strings (Client-sichtbar). Mapping 1:1 wie in AGENTS.md dokumentiert.\nexport type ErrorCode =\n | \"AUTH_FAILED\"\n | \"MAILBOX_NOT_FOUND\"\n | \"UID_NOT_FOUND\"\n | \"ATTACHMENT_NOT_FOUND\"\n | \"ACCOUNT_NOT_FOUND\"\n | \"RATE_LIMITED\"\n | \"TLS_ERROR\"\n | \"CONFIG_ERROR\"\n | \"PERMISSION_DENIED\"\n | \"IMAP_PROTOCOL_ERROR\"\n | \"SMTP_RELAY_ERROR\";\n\nexport class McpMailError extends Error {\n constructor(\n public readonly code: ErrorCode,\n message: string,\n public readonly details?: Record<string, unknown>,\n public readonly imapResponse?: string,\n ) {\n super(message);\n this.name = new.target.name;\n }\n\n toResult() {\n return {\n code: this.code,\n message: this.message,\n ...(this.details ? { details: this.details } : {}),\n ...(this.imapResponse ? { imap_response: this.imapResponse } : {}),\n };\n }\n}\n\nexport class AuthError extends McpMailError {\n constructor(message = \"Authentication failed\", details?: Record<string, unknown>) {\n super(\"AUTH_FAILED\", message, details);\n }\n}\nexport class MailboxNotFoundError extends McpMailError {\n constructor(mailbox: string) {\n super(\"MAILBOX_NOT_FOUND\", `Mailbox not found: ${mailbox}`, { mailbox });\n }\n}\nexport class UidNotFoundError extends McpMailError {\n constructor(uid: number, mailbox: string) {\n super(\"UID_NOT_FOUND\", `UID ${uid} not found in ${mailbox}`, { uid, mailbox });\n }\n}\nexport class AttachmentNotFoundError extends McpMailError {\n constructor(ref: string) {\n super(\"ATTACHMENT_NOT_FOUND\", `Attachment not found: ${ref}`, { ref });\n }\n}\nexport class AccountNotFoundError extends McpMailError {\n constructor(account: string) {\n super(\"ACCOUNT_NOT_FOUND\", `Account not configured: ${account}`, { account });\n }\n}\nexport class RateLimitError extends McpMailError {\n constructor(message = \"Rate limit exceeded\") {\n super(\"RATE_LIMITED\", message);\n }\n}\nexport class TlsError extends McpMailError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(\"TLS_ERROR\", message, details);\n }\n}\nexport class ConfigError extends McpMailError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(\"CONFIG_ERROR\", message, details);\n }\n}\nexport class PermissionError extends McpMailError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(\"PERMISSION_DENIED\", message, details);\n }\n}\nexport class ImapProtocolError extends McpMailError {\n constructor(message: string, imapResponse?: string) {\n super(\"IMAP_PROTOCOL_ERROR\", message, undefined, imapResponse);\n }\n}\nexport class SmtpRelayError extends McpMailError {\n constructor(message: string, details?: Record<string, unknown>) {\n super(\"SMTP_RELAY_ERROR\", message, details);\n }\n}\n","// Provider-Auto-Detection: Mapping bekannter Mail-Domains auf IMAP/SMTP-Host/Port/TLS. Ergaenzt fehlende Felder beim Laden.\nimport type { TlsMode } from \"./schema.js\";\n\nexport interface ProviderPreset {\n imap_host: string;\n imap_port: number;\n imap_tls: TlsMode;\n smtp_host: string;\n smtp_port: number;\n smtp_tls: TlsMode;\n}\n\n// Domain (lowercase) -> Preset. Mehrere Domains koennen auf dasselbe Preset zeigen.\nexport const PROVIDERS: Record<string, ProviderPreset> = {\n \"gmail.com\": {\n imap_host: \"imap.gmail.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.gmail.com\",\n smtp_port: 465,\n smtp_tls: \"implicit\",\n },\n \"outlook.com\": {\n imap_host: \"outlook.office365.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.office365.com\",\n smtp_port: 587,\n smtp_tls: \"starttls\",\n },\n \"hotmail.com\": {\n imap_host: \"outlook.office365.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.office365.com\",\n smtp_port: 587,\n smtp_tls: \"starttls\",\n },\n \"live.com\": {\n imap_host: \"outlook.office365.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.office365.com\",\n smtp_port: 587,\n smtp_tls: \"starttls\",\n },\n \"icloud.com\": {\n imap_host: \"imap.mail.me.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.mail.me.com\",\n smtp_port: 587,\n smtp_tls: \"starttls\",\n },\n \"me.com\": {\n imap_host: \"imap.mail.me.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.mail.me.com\",\n smtp_port: 587,\n smtp_tls: \"starttls\",\n },\n \"yahoo.com\": {\n imap_host: \"imap.mail.yahoo.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.mail.yahoo.com\",\n smtp_port: 465,\n smtp_tls: \"implicit\",\n },\n \"fastmail.com\": {\n imap_host: \"imap.fastmail.com\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.fastmail.com\",\n smtp_port: 465,\n smtp_tls: \"implicit\",\n },\n \"posteo.de\": {\n imap_host: \"posteo.de\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"posteo.de\",\n smtp_port: 465,\n smtp_tls: \"implicit\",\n },\n \"mailbox.org\": {\n imap_host: \"imap.mailbox.org\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.mailbox.org\",\n smtp_port: 465,\n smtp_tls: \"implicit\",\n },\n \"gmx.net\": {\n imap_host: \"imap.gmx.net\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"mail.gmx.net\",\n smtp_port: 465,\n smtp_tls: \"implicit\",\n },\n \"gmx.de\": {\n imap_host: \"imap.gmx.net\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"mail.gmx.net\",\n smtp_port: 465,\n smtp_tls: \"implicit\",\n },\n \"web.de\": {\n imap_host: \"imap.web.de\",\n imap_port: 993,\n imap_tls: \"implicit\",\n smtp_host: \"smtp.web.de\",\n smtp_port: 587,\n smtp_tls: \"starttls\",\n },\n \"proton.me\": {\n imap_host: \"127.0.0.1\",\n imap_port: 1143,\n imap_tls: \"starttls\",\n smtp_host: \"127.0.0.1\",\n smtp_port: 1025,\n smtp_tls: \"starttls\",\n },\n};\n\nexport function detectProvider(email: string): ProviderPreset | undefined {\n const domain = email.split(\"@\")[1]?.toLowerCase();\n return domain ? PROVIDERS[domain] : undefined;\n}\n","// Zod-Schemas für Account, Config-File und Env-Vars (Präfix CLASSIC_IMAP_SMTP_). Validiert beim Laden.\nimport { z } from \"zod\";\n\nexport const tlsModeSchema = z.union([\n z.literal(\"implicit\"),\n z.literal(\"starttls\"),\n z.literal(\"none\"),\n]);\nexport type TlsMode = z.infer<typeof tlsModeSchema>;\n\nexport const accountSchema = z.object({\n name: z.string().min(1),\n user: z.string().min(1),\n pass: z.string().min(1),\n from_name: z.string().optional(),\n imap_host: z.string().optional(), // optional bei Auto-Detect-Providern\n imap_port: z.number().int().positive().default(993),\n imap_tls: tlsModeSchema.default(\"implicit\"),\n smtp_host: z.string().optional(),\n smtp_port: z.number().int().positive().default(465),\n smtp_tls: tlsModeSchema.default(\"implicit\"),\n verify_tls: z.boolean().default(true),\n});\nexport type AccountConfig = z.infer<typeof accountSchema>;\n\nexport const limitsSchema = z.object({\n smtp_per_minute: z.number().int().positive().default(10),\n imap_ops_per_second: z.number().int().positive().default(100),\n});\n\nexport const fileConfigSchema = z.object({\n default_account: z.string().optional(),\n limits: limitsSchema.default({ smtp_per_minute: 10, imap_ops_per_second: 100 }),\n accounts: z.array(accountSchema).min(1),\n});\nexport type FileConfig = z.infer<typeof fileConfigSchema>;\n","// Plattformübergreifende XDG-Pfad-Auflösung für die Config-Datei (Linux/macOS ~/.config, Windows %APPDATA%).\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst APP = \"classic-imap-smtp-mcp\";\n\nexport function defaultConfigPath(): string {\n if (platform() === \"win32\") {\n const appData = process.env.APPDATA ?? join(homedir(), \"AppData\", \"Roaming\");\n return join(appData, APP, \"config.toml\");\n }\n const xdg = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n return join(xdg, APP, \"config.toml\");\n}\n","// IMAP-Connection-Pool: persistente imapflow-Connection pro Account, Reconnect mit Exp-Backoff\n// (1s → 2s → 4s → 8s → 16s → 60s, max 5 Retries), 5min Idle-Timeout.\nimport { ImapFlow } from \"imapflow\";\nimport type { ImapFlowOptions } from \"imapflow\";\nimport type { ConfigStore } from \"../config/loader.js\";\nimport type { AccountConfig } from \"../config/schema.js\";\nimport { AuthError, ImapProtocolError, TlsError } from \"../lib/errors.js\";\nimport type { Logger } from \"../server/logging.js\";\n\nconst MAX_RETRIES = 5;\nconst BASE_DELAY_MS = 1000;\nconst MAX_DELAY_MS = 60000;\nconst IDLE_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport class ImapPool {\n private connections = new Map<string, { client: ImapFlow; lastUsed: number }>();\n\n constructor(\n private readonly config: ConfigStore,\n private readonly logger: Logger,\n ) {}\n\n async acquire(account: string): Promise<ImapFlow> {\n const existing = this.connections.get(account);\n if (existing?.client.usable) {\n existing.lastUsed = Date.now();\n return existing.client;\n }\n\n if (existing) {\n try {\n await existing.client.logout();\n } catch {\n /* ignore */\n }\n this.connections.delete(account);\n }\n\n const accConfig = this.config.accounts.get(account);\n if (!accConfig) {\n throw new ImapProtocolError(`Account ${account} not configured`);\n }\n\n const client = await this.connectWithRetry(accConfig);\n this.connections.set(account, { client, lastUsed: Date.now() });\n return client;\n }\n\n private async connectWithRetry(acc: AccountConfig, attempt = 0): Promise<ImapFlow> {\n try {\n const opts: ImapFlowOptions = {\n // biome-ignore lint/style/noNonNullAssertion: config validated at load\n host: acc.imap_host!,\n port: acc.imap_port,\n auth: {\n user: acc.user,\n pass: acc.pass,\n },\n logger: false,\n secure: acc.imap_tls !== \"starttls\" && acc.imap_tls !== \"none\",\n };\n\n if (acc.imap_tls === \"none\") {\n (opts as unknown as Record<string, unknown>).disableAutoIdle = true;\n }\n\n if (!acc.verify_tls) {\n (opts as unknown as Record<string, unknown>).tls = { rejectUnauthorized: false };\n }\n\n const client = new ImapFlow(opts);\n await client.connect();\n this.logger.info({ account: acc.name }, \"IMAP connected\");\n return client;\n } catch (err) {\n const error = err as Error;\n if (error.message?.includes(\"TLS\") || error.message?.includes(\"certificate\")) {\n throw new TlsError(`IMAP TLS error: ${error.message}`);\n }\n if (\n error.message?.includes(\"authentication\") ||\n error.message?.includes(\"login\") ||\n error.message?.includes(\"Auth\")\n ) {\n throw new AuthError(`IMAP authentication failed: ${error.message}`);\n }\n\n if (attempt < MAX_RETRIES) {\n const delay = Math.min(BASE_DELAY_MS * 2 ** attempt, MAX_DELAY_MS);\n this.logger.warn({ account: acc.name, attempt: attempt + 1, delay }, \"IMAP reconnect\");\n await sleep(delay);\n return this.connectWithRetry(acc, attempt + 1);\n }\n\n throw new ImapProtocolError(`Failed to connect to IMAP: ${error.message}`);\n }\n }\n\n async pruneIdle(): Promise<void> {\n const now = Date.now();\n for (const [account, entry] of this.connections) {\n if (now - entry.lastUsed > IDLE_TIMEOUT_MS) {\n this.logger.info({ account }, \"Closing idle IMAP connection\");\n try {\n await entry.client.logout();\n } catch {\n /* ignore */\n }\n this.connections.delete(account);\n }\n }\n }\n\n async closeAll(): Promise<void> {\n for (const [account, entry] of this.connections) {\n try {\n if (entry.client.usable) await entry.client.logout();\n } catch (err) {\n this.logger.warn({ account, err }, \"Error closing IMAP connection\");\n }\n }\n this.connections.clear();\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// SMTP-Transport-Pool: nodemailer-Transport pro Account, gepoolt (max 1 Connection, 100 Msg/Connection).\n// Rate-Limiting: 10 Messages/Minute (Token-Bucket).\nimport nodemailer, { type Transporter } from \"nodemailer\";\nimport type { ConfigStore } from \"../config/loader.js\";\nimport type { AccountConfig } from \"../config/schema.js\";\nimport { AuthError, RateLimitError, SmtpRelayError } from \"../lib/errors.js\";\nimport type { Logger } from \"../server/logging.js\";\n\nconst RATE_LIMIT_WINDOW_MS = 60_000; // 1 Minute\nconst DEFAULT_RATE_LIMIT = 10; // Max Messages pro Minute\n\ninterface RateLimitBucket {\n tokens: number;\n lastRefill: number;\n}\n\nexport class SmtpPool {\n private transports = new Map<string, Transporter>();\n private rateBuckets = new Map<string, RateLimitBucket>();\n\n constructor(\n private readonly config: ConfigStore,\n private readonly logger: Logger,\n ) {}\n\n // Liefert einen nodemailer-Transporter für den Account.\n async acquire(account: string): Promise<Transporter> {\n // Rate-Limit prüfen\n this.checkRateLimit(account);\n\n const existing = this.transports.get(account);\n if (existing) return existing;\n\n const accConfig = this.config.accounts.get(account);\n if (!accConfig) {\n throw new SmtpRelayError(`Account ${account} not configured`);\n }\n\n const transport = await this.createTransport(accConfig);\n this.transports.set(account, transport);\n return transport;\n }\n\n private checkRateLimit(account: string): void {\n const limit = DEFAULT_RATE_LIMIT;\n const bucket = this.rateBuckets.get(account) ?? { tokens: limit, lastRefill: Date.now() };\n\n // Refill tokens\n const now = Date.now();\n const elapsed = now - bucket.lastRefill;\n if (elapsed >= RATE_LIMIT_WINDOW_MS) {\n bucket.tokens = limit;\n bucket.lastRefill = now;\n }\n\n if (bucket.tokens <= 0) {\n throw new RateLimitError(`SMTP rate limit (${limit}/minute) reached for account ${account}`);\n }\n\n bucket.tokens--;\n this.rateBuckets.set(account, bucket);\n }\n\n private async createTransport(acc: AccountConfig): Promise<Transporter> {\n try {\n const tlsOpts: Record<string, unknown> = {};\n if (!acc.verify_tls) {\n tlsOpts.rejectUnauthorized = false;\n }\n\n const transporter = nodemailer.createTransport({\n // biome-ignore lint/style/noNonNullAssertion: config validated at load\n host: acc.smtp_host!,\n port: acc.smtp_port,\n secure: acc.smtp_tls === \"implicit\",\n auth: {\n user: acc.user,\n pass: acc.pass,\n },\n tls: tlsOpts,\n // STARTTLS: wird von nodemailer automatisch bei secure=false und Port 587/25 verwendet\n pool: true,\n maxConnections: 1,\n maxMessages: 100,\n logger: false,\n });\n\n this.logger.info({ account: acc.name }, \"SMTP transport created\");\n return transporter;\n } catch (err) {\n const error = err as Error;\n if (error.message?.includes(\"auth\") || error.message?.includes(\"login\")) {\n throw new AuthError(`SMTP authentication failed: ${error.message}`);\n }\n throw new SmtpRelayError(`Failed to create SMTP transport: ${error.message}`);\n }\n }\n\n async closeAll(): Promise<void> {\n for (const [account, transport] of this.transports) {\n try {\n transport.close();\n } catch (err) {\n this.logger.warn({ account, err }, \"Error closing SMTP transport\");\n }\n }\n this.transports.clear();\n this.rateBuckets.clear();\n }\n}\n","// Logger via pino, schreibt AUSSCHLIESSLICH auf stderr (stdout = MCP-Protokoll). Sanitizer maskiert Credentials immer.\nimport { pino } from \"pino\";\n\nexport type Logger = ReturnType<typeof pino>;\n\nconst REDACT_KEYS = [\"pass\", \"password\", \"token\", \"secret\", \"apikey\", \"apiKey\"];\n\nexport interface LoggerOptions {\n level?: string;\n format?: \"json\" | \"pretty\";\n}\n\nexport function createLogger(opts: LoggerOptions = {}): Logger {\n const level = opts.level ?? \"info\";\n const format = opts.format ?? \"json\";\n\n if (format === \"pretty\") {\n return pino({\n level,\n redact: { paths: REDACT_KEYS.flatMap((k) => [k, `*.${k}`, `*.*.${k}`]), censor: \"***\" },\n transport: { target: \"pino-pretty\", options: { destination: 2 } },\n });\n }\n\n return pino({\n level,\n redact: { paths: REDACT_KEYS.flatMap((k) => [k, `*.${k}`, `*.*.${k}`]), censor: \"***\" },\n });\n}\n","// CLI-Argument-Parser: liest die vier Feature-Flags (--safe/--readonly/--no-imap/--no-smtp) + --allow-tools/--deny-tools + Betriebs-Args.\nexport interface ResolvedOptions {\n safe: boolean;\n readonly: boolean;\n noImap: boolean;\n noSmtp: boolean;\n allowTools?: string[];\n denyTools?: string[];\n account?: string;\n configPath?: string;\n logLevel: string;\n logFormat: \"json\" | \"pretty\";\n}\n\nexport interface ParsedArgs {\n subcommand: \"init\" | \"test\" | \"list-tools\" | undefined;\n subcommandArg: string | undefined;\n options: ResolvedOptions;\n help: boolean;\n version: boolean;\n}\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const opts: ResolvedOptions = {\n safe: false,\n readonly: false,\n noImap: false,\n noSmtp: false,\n logLevel: \"info\",\n logFormat: \"json\",\n };\n let subcommand: ParsedArgs[\"subcommand\"];\n let subcommandArg: string | undefined;\n let help = false;\n let version = false;\n\n for (let i = 0; i < argv.length; i++) {\n // biome-ignore lint/style/noNonNullAssertion: loop bound ensures i < argv.length\n const arg = argv[i]!;\n if (arg === \"init\" || arg === \"test\" || arg === \"list-tools\") {\n subcommand = arg;\n if (arg === \"test\" && argv[i + 1] && !argv[i + 1]?.startsWith(\"-\")) {\n subcommandArg = argv[++i];\n }\n } else if (arg === \"--safe\") opts.safe = true;\n else if (arg === \"--readonly\") opts.readonly = true;\n else if (arg === \"--no-imap\") opts.noImap = true;\n else if (arg === \"--no-smtp\") opts.noSmtp = true;\n else if (arg === \"-h\" || arg === \"--help\") help = true;\n else if (arg === \"-V\" || arg === \"--version\") version = true;\n else if (arg.startsWith(\"--allow-tools=\")) opts.allowTools = csv(arg);\n else if (arg.startsWith(\"--deny-tools=\")) opts.denyTools = csv(arg);\n else if (arg.startsWith(\"--account=\")) opts.account = val(arg);\n else if (arg.startsWith(\"--config=\")) opts.configPath = val(arg);\n else if (arg.startsWith(\"--log-level=\")) opts.logLevel = val(arg);\n else if (arg.startsWith(\"--log-format=\"))\n opts.logFormat = val(arg) === \"pretty\" ? \"pretty\" : \"json\";\n }\n\n return { subcommand, subcommandArg, options: opts, help, version };\n}\n\nconst val = (arg: string) => arg.slice(arg.indexOf(\"=\") + 1);\nconst csv = (arg: string) =>\n val(arg)\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n","// Registry: 3-Stufen-Kaskade (Feature-Flags -> Allow -> Deny, fein gewinnt). Entscheidet, welche Tools beim Start registriert werden.\nimport type { ToolDefinition } from \"../tools/_types.js\";\nimport type { ResolvedOptions } from \"./options.js\";\n\n// Tools, die im --readonly-Modus erlaubt bleiben (lesend + introspektiv).\nconst READONLY_TOOLS = new Set<string>([\n \"imap_list_mailboxes\",\n \"imap_status_mailbox\",\n \"imap_list_messages\",\n \"imap_get_message\",\n \"imap_get_message_headers\",\n \"imap_get_message_raw\",\n \"imap_get_messages_bulk\",\n \"imap_search\",\n \"imap_download_attachment\",\n \"imap_get_thread\",\n \"imap_get_quota\",\n \"imap_check_capabilities\",\n \"smtp_verify_connection\",\n \"account_list\",\n \"meta_health\",\n \"meta_server_info\",\n]);\n\n// Tools, die --safe entfernt (Loeschen).\nconst DELETE_TOOLS = new Set<string>([\n \"imap_delete_message\",\n \"imap_expunge\",\n \"imap_delete_mailbox\",\n]);\n\n// Praefix-Wildcard-Match: \"imap_*\" matcht \"imap_search\"; exakte Namen matchen exakt.\nfunction matchesAny(name: string, patterns: string[]): boolean {\n return patterns.some((p) => (p.endsWith(\"*\") ? name.startsWith(p.slice(0, -1)) : name === p));\n}\n\n// Stufe 1: grobe Basis-Menge aus den vier Feature-Flags.\nfunction passesFeatureFlags(t: ToolDefinition, o: ResolvedOptions): boolean {\n if (o.noImap && t.category.startsWith(\"imap\")) return false;\n if (o.noSmtp && t.category === \"smtp\") return false;\n if (o.readonly && !READONLY_TOOLS.has(t.name)) return false;\n if (o.safe && DELETE_TOOLS.has(t.name)) return false;\n return true;\n}\n\n// Wendet die volle Kaskade an und liefert die zu registrierenden Tools.\nexport function resolveActiveTools(all: ToolDefinition[], o: ResolvedOptions): ToolDefinition[] {\n const active = new Set<string>();\n\n // Stufe 1: Feature-Flags\n for (const t of all) if (passesFeatureFlags(t, o)) active.add(t.name);\n\n // Stufe 2: Allow ueberschreibt Feature-Flags (b-Logik: kann Tools zurueckholen)\n if (o.allowTools?.length) {\n for (const t of all) if (matchesAny(t.name, o.allowTools)) active.add(t.name);\n }\n\n // Stufe 3: Deny gewinnt ueber alles\n if (o.denyTools?.length) {\n for (const name of [...active]) if (matchesAny(name, o.denyTools)) active.delete(name);\n }\n\n return all.filter((t) => active.has(t.name));\n}\n","// MCP-Server-Aufbau (SDK v1.x): erzeugt McpServer, registriert die aktiven Tools, mappt Handler-Ergebnisse + Errors auf MCP-Content.\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { McpMailError } from \"../lib/errors.js\";\nimport type { ToolContext } from \"../tools/_types.js\";\nimport { ALL_TOOLS } from \"../tools/index.js\";\nimport type { Logger } from \"./logging.js\";\nimport type { ResolvedOptions } from \"./options.js\";\nimport { resolveActiveTools } from \"./registry.js\";\n\nexport const SERVER_NAME = \"classic-imap-smtp-mcp\";\nexport const SERVER_VERSION = \"0.3.0\";\n\nexport function buildServer(opts: ResolvedOptions, ctx: ToolContext, logger: Logger): McpServer {\n const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });\n const active = resolveActiveTools(ALL_TOOLS, opts);\n\n logger.info({ count: active.length, tools: active.map((t) => t.name) }, \"Registering tools\");\n\n for (const tool of active) {\n server.registerTool(\n tool.name,\n { description: tool.description, inputSchema: tool.inputSchema },\n async (input: unknown) => {\n try {\n const result = await tool.handler(input, ctx);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(result, null, 2) }] };\n } catch (err) {\n const payload =\n err instanceof McpMailError\n ? err.toResult()\n : { code: \"INTERNAL_ERROR\", message: String(err) };\n logger.error({ tool: tool.name, err: payload }, \"Tool call failed\");\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: JSON.stringify(payload, null, 2) }],\n };\n }\n },\n );\n }\n\n return server;\n}\n\nexport async function runStdio(server: McpServer): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","// Server CAPABILITY-Liste\nimport { z } from \"zod\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_check_capabilities\",\n description: \"Server CAPABILITY-Liste\",\n category: \"imap-read\",\n inputSchema: z.object({\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const caps = [...client.capabilities.keys()];\n\n return { capabilities: caps };\n },\n});\n","// Zentrale Typen: ToolDefinition-Interface (eine Datei = ein Tool exportiert das) + ToolContext (DI-Container) + Kategorien.\nimport type { ZodTypeAny, z } from \"zod\";\nimport type { ConfigStore } from \"../config/loader.js\";\nimport type { ImapPool } from \"../connections/imap-pool.js\";\nimport type { SmtpPool } from \"../connections/smtp-pool.js\";\nimport type { Logger } from \"../server/logging.js\";\n\nexport type ToolCategory =\n | \"imap-read\"\n | \"imap-write\"\n | \"imap-mailbox\"\n | \"smtp\"\n | \"account\"\n | \"meta\";\n\nexport interface ServerFlags {\n safe: boolean;\n readonly: boolean;\n noImap: boolean;\n noSmtp: boolean;\n allowTools?: string[];\n denyTools?: string[];\n}\n\n// Wird per Dependency Injection an jeden Handler gegeben — niemals Globals verwenden.\nexport interface ToolContext {\n config: ConfigStore;\n imap: ImapPool;\n smtp: SmtpPool;\n logger: Logger;\n flags: ServerFlags;\n activeTools: string[];\n resolveAccount(name?: string): string; // Account-Name oder Default; wirft AccountNotFoundError\n}\n\n// Infer the input type from a Zod schema\ntype InferInput<T extends ZodTypeAny> = z.input<T>;\ntype InferOutput<T extends ZodTypeAny> = z.output<T>;\n\nexport interface ToolDefinition<TInputSchema extends ZodTypeAny = ZodTypeAny, TOutput = unknown> {\n name: string;\n description: string;\n category: ToolCategory;\n inputSchema: TInputSchema;\n handler: (input: InferInput<TInputSchema>, ctx: ToolContext) => Promise<TOutput>;\n}\n\n// Hilfsfunktion, um ein Tool typsicher zu definieren.\nexport function defineTool<TSchema extends ZodTypeAny, TOutput>(\n def: ToolDefinition<TSchema, TOutput>,\n): ToolDefinition<TSchema, TOutput> {\n return def;\n}\n\n// Convenience type aliases for handler patterns\nexport type HandlerFn<TInput, TOutput> = (input: TInput, ctx: ToolContext) => Promise<TOutput>;\n","import { writeFileSync } from \"node:fs\";\n// Gezielt eine MIME-Part extrahieren (Pfad oder Base64)\nimport { z } from \"zod\";\nimport {\n AttachmentNotFoundError,\n MailboxNotFoundError,\n UidNotFoundError,\n} from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_download_attachment\",\n description: \"Gezielt eine MIME-Part extrahieren (Pfad oder Base64)\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n partId: z.string().min(1).describe(\"MIME part ID (e.g. '1', '2.1')\"),\n savePath: z.string().optional().describe(\"Local path to save the attachment\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n // FETCH specific body part + bodyStructure for metadata\n const msg = await client.fetchOne(input.uid, {\n uid: true,\n bodyParts: [input.partId],\n bodyStructure: true,\n });\n\n if (!msg) throw new UidNotFoundError(input.uid, input.mailbox);\n\n const part = msg.bodyParts?.get(input.partId);\n if (!part) throw new AttachmentNotFoundError(`Part ${input.partId}`);\n\n // Resolve content-type and filename from bodyStructure\n let contentType = \"application/octet-stream\";\n let filename = `attachment-${input.partId}`;\n if (msg.bodyStructure) {\n contentType = msg.bodyStructure.type || contentType;\n filename =\n msg.bodyStructure.parameters?.name || msg.bodyStructure.parameters?.filename || filename;\n }\n\n const buffer = Buffer.from(part);\n const size = buffer.length;\n const base64 = buffer.toString(\"base64\");\n\n if (input.savePath) {\n writeFileSync(input.savePath, buffer);\n }\n\n return {\n partId: input.partId,\n ...(filename ? { filename } : {}),\n contentType,\n size,\n ...(input.savePath ? { savedPath: input.savePath } : { base64 }),\n };\n },\n});\n","// Nur Header einer Mail\nimport { z } from \"zod\";\nimport { MailboxNotFoundError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_get_message_headers\",\n description: \"Nur Header einer Mail\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mailbox = await client.mailboxOpen(input.mailbox);\n if (!mailbox) throw new MailboxNotFoundError(input.mailbox);\n\n const msg = await client.fetchOne(input.uid, {\n uid: true,\n headers: true,\n });\n\n if (!msg) throw new UidNotFoundError(input.uid, input.mailbox);\n\n // Parse headers from the headers Buffer\n const rawHeaders = msg.headers?.toString() ?? \"\";\n const headers: Record<string, string | string[]> = {};\n\n const lines = rawHeaders.split(\"\\r\\n\");\n let currentKey: string | null = null;\n let currentValue: string | null = null;\n\n for (const line of lines) {\n // Continuation line (folded header)\n if ((line.startsWith(\" \") || line.startsWith(\"\\t\")) && currentKey) {\n if (currentValue) {\n currentValue += ` ${line.trim()}`;\n }\n continue;\n }\n\n // Save previous header\n if (currentKey && currentValue) {\n const existing = headers[currentKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(currentValue);\n } else {\n headers[currentKey] = [existing, currentValue];\n }\n } else {\n headers[currentKey] = currentValue;\n }\n }\n\n const colonIdx = line.indexOf(\":\");\n if (colonIdx > 0) {\n currentKey = line.slice(0, colonIdx).trim();\n currentValue = line.slice(colonIdx + 1).trim();\n } else {\n currentKey = null;\n currentValue = null;\n }\n }\n\n // Don't forget the last header\n if (currentKey && currentValue) {\n const existing = headers[currentKey];\n if (existing) {\n if (Array.isArray(existing)) {\n existing.push(currentValue);\n } else {\n headers[currentKey] = [existing, currentValue];\n }\n } else {\n headers[currentKey] = currentValue;\n }\n }\n\n return {\n uid: msg.uid,\n headers,\n };\n },\n});\n","// RFC-822 raw source einer Mail\nimport { z } from \"zod\";\nimport { MailboxNotFoundError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_get_message_raw\",\n description: \"RFC-822 raw source einer Mail\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mailbox = await client.mailboxOpen(input.mailbox);\n if (!mailbox) throw new MailboxNotFoundError(input.mailbox);\n\n const msg = await client.fetchOne(input.uid, {\n uid: true,\n source: true,\n });\n\n if (!msg) throw new UidNotFoundError(input.uid, input.mailbox);\n\n return {\n uid: msg.uid,\n rfc822: msg.source?.toString() ?? \"\",\n };\n },\n});\n","// Vollständige Mail inkl. geparstem Body + Attachment-Metadaten\nimport { z } from \"zod\";\nimport { MailboxNotFoundError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { parseMime } from \"../../lib/mime.js\";\nimport { defineTool } from \"../_types.js\";\n\nfunction addressArray(addr: unknown): Array<{ name?: string; address: string }> {\n if (!addr) return [];\n const list = Array.isArray(addr) ? addr : [addr];\n const result: Array<{ name?: string; address: string }> = [];\n for (const entry of list) {\n if (entry && typeof entry === \"object\") {\n const e = entry as { name?: string; address?: string };\n const addrStr = e.address ?? \"\";\n if (addrStr) {\n result.push({ ...(e.name ? { name: e.name } : {}), address: addrStr });\n }\n }\n }\n return result;\n}\n\nexport default defineTool({\n name: \"imap_get_message\",\n description: \"Vollständige Mail inkl. geparstem Body + Attachment-Metadaten\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mailbox = await client.mailboxOpen(input.mailbox);\n if (!mailbox) throw new MailboxNotFoundError(input.mailbox);\n\n const msg = await client.fetchOne(input.uid, {\n uid: true,\n envelope: true,\n flags: true,\n size: true,\n source: true,\n });\n\n if (!msg) throw new UidNotFoundError(input.uid, input.mailbox);\n\n const raw = msg.source?.toString() ?? \"\";\n let parsed: import(\"../../lib/mime.js\").ParsedMessage;\n try {\n parsed = await parseMime(raw);\n } catch {\n parsed = { body: {}, attachments: [] };\n }\n\n const enc = msg.envelope;\n return {\n envelope: {\n uid: msg.uid,\n subject: enc?.subject ?? \"\",\n from: addressArray(enc?.from),\n to: addressArray(enc?.to),\n ...(enc?.cc?.length ? { cc: addressArray(enc.cc) } : {}),\n ...(enc?.bcc?.length ? { bcc: addressArray(enc.bcc) } : {}),\n ...(enc?.replyTo?.length ? { replyTo: addressArray(enc.replyTo) } : {}),\n date: (enc?.date ?? new Date()).toISOString(),\n ...(enc?.messageId ? { messageId: enc.messageId } : {}),\n ...(enc?.inReplyTo ? { inReplyTo: enc.inReplyTo } : {}),\n flags: [...(msg.flags ?? [])],\n size: msg.size ?? 0,\n hasAttachments: parsed.attachments.length > 0,\n },\n ...(parsed.body.text ? { text: parsed.body.text } : {}),\n ...(parsed.body.html ? { html: parsed.body.html } : {}),\n attachments: parsed.attachments,\n };\n },\n});\n","// MIME-Verarbeitung via mailparser: parst rohe RFC-822-Mails, extrahiert text/html/Attachments,\n// dekodiert Encodings + Filenames (RFC 2231), liefert strukturierte Metadaten.\nimport { type ParsedMail, simpleParser } from \"mailparser\";\nimport type { Attachment } from \"mailparser\";\n\nexport interface ParsedBody {\n text?: string;\n html?: string;\n}\n\nexport interface AttachmentMeta {\n partId: string;\n filename?: string;\n contentType: string;\n size: number;\n contentId?: string;\n disposition?: \"inline\" | \"attachment\";\n}\n\nexport interface ParsedMessage {\n body: ParsedBody;\n attachments: AttachmentMeta[];\n}\n\n// Parst einen rohen RFC-822-String und extrahiert Text-/HTML-Body + Attachment-Metadaten.\nexport async function parseMime(raw: string): Promise<ParsedMessage> {\n const parsed: ParsedMail = await simpleParser(raw);\n\n const body: ParsedBody = {};\n if (parsed.text) body.text = parsed.text;\n if (parsed.html) body.html = parsed.html;\n\n const attachments: AttachmentMeta[] = (parsed.attachments || []).map(\n (a: Attachment, idx: number): AttachmentMeta => {\n const fn = a.filename || extractFilenameFromHeaders(a.headers);\n return {\n partId: a.related ? `related.${idx + 1}` : String(idx + 1),\n filename: fn ?? `attachment_${idx + 1}`,\n contentType: a.contentType || \"application/octet-stream\",\n size: a.size || a.content.length || 0,\n ...(a.contentId ? { contentId: a.contentId } : {}),\n ...(a.contentDisposition === \"inline\"\n ? { disposition: \"inline\" as const }\n : a.contentDisposition === \"attachment\"\n ? { disposition: \"attachment\" as const }\n : {}),\n };\n },\n );\n\n return { body, attachments };\n}\n\n// Extrahiert Filename aus Mail-Headers (Content-Disposition oder Content-Type).\nfunction extractFilenameFromHeaders(headers: Map<string, unknown> | undefined): string | undefined {\n if (!headers) return undefined;\n // Prüfe Content-Disposition header auf filename/filename*\n const cd = headers.get(\"content-disposition\");\n if (typeof cd === \"string\") {\n const m = cd.match(/filename\\*?=(?:[^']*'[^']*')?([^;\\s]+)/i);\n if (m) {\n try {\n const captured = m[1];\n return captured ? decodeURIComponent(captured) : undefined;\n } catch {\n return m[1];\n }\n }\n const m2 = cd.match(/filename=\"?([^\";]*)\"?/i);\n if (m2) return m2[1];\n }\n return undefined;\n}\n","// Bis N UIDs in einem Call holen\nimport { z } from \"zod\";\nimport { MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { type ParsedMessage, parseMime } from \"../../lib/mime.js\";\nimport { defineTool } from \"../_types.js\";\n\nfunction addressArray(addr: unknown): Array<{ name?: string; address: string }> {\n if (!addr) return [];\n const list = Array.isArray(addr) ? addr : [addr];\n const result: Array<{ name?: string; address: string }> = [];\n for (const entry of list) {\n if (entry && typeof entry === \"object\") {\n const e = entry as { name?: string; address?: string };\n const addrStr = e.address ?? \"\";\n if (addrStr) {\n result.push({ ...(e.name ? { name: e.name } : {}), address: addrStr });\n }\n }\n }\n return result;\n}\n\nexport default defineTool({\n name: \"imap_get_messages_bulk\",\n description: \"Bis N UIDs in einem Call holen\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uids: z.array(z.number().int().positive()).min(1).max(500).describe(\"Message UIDs\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n const messages: Array<Record<string, unknown>> = [];\n const notFound: number[] = [];\n const uidSet = new Set(input.uids);\n\n for await (const msg of client.fetch(input.uids, {\n uid: true,\n envelope: true,\n flags: true,\n size: true,\n source: true,\n })) {\n uidSet.delete(msg.uid);\n const raw = msg.source?.toString() ?? \"\";\n let parsed: ParsedMessage;\n try {\n parsed = await parseMime(raw);\n } catch {\n parsed = { body: {}, attachments: [] };\n }\n\n const enc = msg.envelope;\n messages.push({\n envelope: {\n uid: msg.uid,\n subject: enc?.subject ?? \"\",\n from: addressArray(enc?.from),\n to: addressArray(enc?.to),\n ...(enc?.cc?.length ? { cc: addressArray(enc.cc) } : {}),\n ...(enc?.bcc?.length ? { bcc: addressArray(enc.bcc) } : {}),\n ...(enc?.replyTo?.length ? { replyTo: addressArray(enc.replyTo) } : {}),\n date: (enc?.date ?? new Date()).toISOString(),\n ...(enc?.messageId ? { messageId: enc.messageId } : {}),\n ...(enc?.inReplyTo ? { inReplyTo: enc.inReplyTo } : {}),\n flags: [...(msg.flags ?? [])],\n size: msg.size ?? 0,\n hasAttachments: parsed.attachments.length > 0,\n },\n ...(parsed.body.text ? { text: parsed.body.text } : {}),\n ...(parsed.body.html ? { html: parsed.body.html } : {}),\n attachments: parsed.attachments,\n });\n }\n\n for (const uid of uidSet) notFound.push(uid);\n\n return {\n mailbox: input.mailbox,\n messages,\n notFound,\n };\n },\n});\n","// Quota-Info abfragen (RFC 2087)\nimport { z } from \"zod\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_get_quota\",\n description: \"Quota-Info abfragen (RFC 2087)\",\n category: \"imap-read\",\n inputSchema: z.object({\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n // Check if server supports QUOTA via capabilities\n const caps = [...client.capabilities.keys()];\n if (!caps.some((c) => c.toUpperCase() === \"QUOTA\")) {\n return { root: \"INBOX\", usage: 0, limit: -1 };\n }\n\n try {\n const result = await client.getQuota();\n if (!result) {\n return { root: \"INBOX\", usage: 0, limit: -1 };\n }\n\n const usage = result.storage?.used ?? result.messages?.used ?? 0;\n const limit = result.storage?.limit ?? result.messages?.limit ?? -1;\n const resources: Array<{ name: string; usage: number; limit: number }> = [];\n if (result.storage) {\n resources.push({\n name: \"STORAGE\",\n usage: result.storage.used,\n limit: result.storage.limit,\n });\n }\n if (result.messages) {\n resources.push({\n name: \"MESSAGES\",\n usage: result.messages.used,\n limit: result.messages.limit,\n });\n }\n\n return {\n root: result.path,\n usage,\n limit,\n ...(resources.length > 1 ? { resources } : {}),\n };\n } catch {\n // Server doesn't support QUOTA or no quota\n return { root: \"INBOX\", usage: 0, limit: -1 };\n }\n },\n});\n","// Konversation via In-Reply-To/References rekonstruieren\nimport { z } from \"zod\";\nimport { MailboxNotFoundError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { type ThreadableMessage, reconstructThread } from \"../../lib/threading.js\";\nimport { defineTool } from \"../_types.js\";\n\nfunction addressArray(addr: unknown): Array<{ name?: string; address: string }> {\n if (!addr) return [];\n const list = Array.isArray(addr) ? addr : [addr];\n const result: Array<{ name?: string; address: string }> = [];\n for (const entry of list) {\n if (entry && typeof entry === \"object\") {\n const e = entry as { name?: string; address?: string };\n const addrStr = e.address ?? \"\";\n if (addrStr) {\n result.push({ ...(e.name ? { name: e.name } : {}), address: addrStr });\n }\n }\n }\n return result;\n}\n\nexport default defineTool({\n name: \"imap_get_thread\",\n description: \"Konversation via In-Reply-To/References rekonstruieren\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uid: z.number().int().positive().describe(\"Root message UID\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n const allMessages: ThreadableMessage[] = [];\n const extras = new Map<number, Record<string, unknown>>();\n\n for await (const msg of client.fetch(\"1:*\", {\n uid: true,\n envelope: true,\n flags: true,\n size: true,\n headers: [\"message-id\", \"in-reply-to\", \"references\"],\n })) {\n const enc = msg.envelope;\n if (!enc) continue;\n\n // Extract references from raw headers (not on MessageEnvelopeObject)\n const rawHeaders = msg.headers?.toString() ?? \"\";\n const refMatch = rawHeaders.match(/^references:\\s*(.*)$/im);\n const refs = refMatch ? refMatch[1]?.trim().split(/\\s+/).filter(Boolean) : undefined;\n\n allMessages.push({\n uid: msg.uid,\n messageId: enc.messageId ?? undefined,\n inReplyTo: enc.inReplyTo ?? undefined,\n references: refs,\n date: enc.date ?? new Date(),\n });\n\n extras.set(msg.uid, {\n subject: enc.subject ?? \"\",\n from: addressArray(enc.from),\n to: addressArray(enc.to),\n ...(enc.cc?.length ? { cc: addressArray(enc.cc) } : {}),\n ...(enc.bcc?.length ? { bcc: addressArray(enc.bcc) } : {}),\n ...(enc.replyTo?.length ? { replyTo: addressArray(enc.replyTo) } : {}),\n date: (enc.date ?? new Date()).toISOString(),\n ...(enc.messageId ? { messageId: enc.messageId } : {}),\n ...(enc.inReplyTo ? { inReplyTo: enc.inReplyTo } : {}),\n flags: [...(msg.flags ?? [])],\n size: msg.size ?? 0,\n hasAttachments: false,\n });\n }\n\n const thread = reconstructThread(allMessages, input.uid);\n const root = allMessages.find((m) => m.uid === input.uid);\n if (!root) throw new UidNotFoundError(input.uid, input.mailbox);\n\n const messages = thread.map((m) => ({\n ...(extras.get(m.uid) ?? {}),\n }));\n\n return {\n rootUid: input.uid,\n mailbox: input.mailbox,\n messages,\n };\n },\n});\n","// Thread-Rekonstruktion: folgt In-Reply-To/References-Kette (RFC 5322 §3.6.4),\n// um eine Konversation chronologisch zusammenzubauen.\n\nexport interface ThreadableMessage {\n uid: number;\n messageId: string | undefined;\n inReplyTo: string | undefined;\n references: string[] | undefined;\n date: Date;\n [key: string]: unknown;\n}\n\nexport function reconstructThread(\n messages: ThreadableMessage[],\n rootUid: number,\n): ThreadableMessage[] {\n if (messages.length === 0) return [];\n\n const byUid = new Map<number, ThreadableMessage>();\n const byMessageId = new Map<string, ThreadableMessage>();\n\n for (const msg of messages) {\n byUid.set(msg.uid, msg);\n if (msg.messageId) {\n byMessageId.set(msg.messageId, msg);\n }\n }\n\n const root = byUid.get(rootUid);\n if (!root) return [];\n\n const allMessageIds = new Set<string>();\n for (const msg of messages) {\n if (msg.messageId) allMessageIds.add(msg.messageId);\n if (msg.references) for (const ref of msg.references) allMessageIds.add(ref);\n if (msg.inReplyTo) allMessageIds.add(msg.inReplyTo);\n }\n\n const threadSet = new Set<number>();\n threadSet.add(rootUid);\n\n const seen = new Set<number>();\n const queue = [rootUid];\n\n while (queue.length > 0) {\n // biome-ignore lint/style/noNonNullAssertion: queue.length > 0 checked in while\n const currentUid = queue.pop()!;\n if (seen.has(currentUid)) continue;\n seen.add(currentUid);\n\n const current = byUid.get(currentUid);\n if (!current) continue;\n\n const relevantIds = new Set<string>();\n if (current.messageId) relevantIds.add(current.messageId);\n if (current.inReplyTo) relevantIds.add(current.inReplyTo);\n if (current.references) for (const ref of current.references) relevantIds.add(ref);\n\n for (const other of messages) {\n if (threadSet.has(other.uid)) continue;\n if (!other.inReplyTo && !other.references) continue;\n\n if (other.inReplyTo && relevantIds.has(other.inReplyTo)) {\n threadSet.add(other.uid);\n queue.push(other.uid);\n continue;\n }\n if (other.references) {\n for (const ref of other.references) {\n if (relevantIds.has(ref)) {\n threadSet.add(other.uid);\n queue.push(other.uid);\n break;\n }\n }\n }\n\n if (current.messageId && other.references?.includes(current.messageId)) {\n threadSet.add(other.uid);\n queue.push(other.uid);\n }\n }\n\n if (current.inReplyTo) {\n const parent = byMessageId.get(current.inReplyTo);\n if (parent) {\n threadSet.add(parent.uid);\n queue.push(parent.uid);\n }\n }\n if (current.references) {\n for (const ref of current.references) {\n const refMsg = byMessageId.get(ref);\n if (refMsg) {\n threadSet.add(refMsg.uid);\n queue.push(refMsg.uid);\n }\n }\n }\n }\n\n const result = messages.filter((m) => threadSet.has(m.uid));\n result.sort((a, b) => a.date.getTime() - b.date.getTime());\n return result;\n}\n","// Folder enumerieren mit Special-Use-Flags (RFC 6154)\nimport { z } from \"zod\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_list_mailboxes\",\n description: \"Folder enumerieren mit Special-Use-Flags (RFC 6154)\",\n category: \"imap-read\",\n inputSchema: z.object({\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mailboxes = await client.list();\n const result = mailboxes.map((mb) => {\n const flags = [...(mb.flags || [])];\n const specialUse = flags.find((f) =>\n [\n \"\\\\Inbox\",\n \"\\\\Sent\",\n \"\\\\Drafts\",\n \"\\\\Trash\",\n \"\\\\Junk\",\n \"\\\\Archive\",\n \"\\\\All\",\n \"\\\\Flagged\",\n ].includes(f),\n );\n\n return {\n path: mb.path,\n delimiter: mb.delimiter,\n flags,\n ...(specialUse ? { specialUse } : {}),\n subscribed: mb.subscribed,\n };\n });\n\n return { mailboxes: result };\n },\n});\n","// Paginierte Envelope-Liste in einem Folder\nimport { z } from \"zod\";\nimport { MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nfunction addressArray(addr: unknown): Array<{ name?: string; address: string }> {\n if (!addr) return [];\n const list = Array.isArray(addr) ? addr : [addr];\n const result: Array<{ name?: string; address: string }> = [];\n for (const entry of list) {\n if (entry && typeof entry === \"object\") {\n const e = entry as { name?: string; address?: string };\n const addrStr = e.address ?? \"\";\n if (addrStr) {\n result.push({ ...(e.name ? { name: e.name } : {}), address: addrStr });\n }\n }\n }\n return result;\n}\n\nexport default defineTool({\n name: \"imap_list_messages\",\n description: \"Paginierte Envelope-Liste in einem Folder\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n page: z.number().int().positive().default(1).describe(\"Page number (default: 1)\"),\n pageSize: z\n .number()\n .int()\n .positive()\n .max(500)\n .default(50)\n .describe(\"Messages per page (default: 50, max: 500)\"),\n sort: z.enum([\"date\", \"subject\", \"from\", \"size\"]).optional().describe(\"Sort field\"),\n sortOrder: z.enum([\"asc\", \"desc\"]).default(\"desc\").describe(\"Sort order (default: desc)\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mailbox = await client.mailboxOpen(input.mailbox);\n if (!mailbox) {\n throw new MailboxNotFoundError(input.mailbox);\n }\n\n const total = mailbox.exists;\n const currentPage = input.page ?? 1;\n const pageSize = input.pageSize ?? 50;\n\n const startNum = (currentPage - 1) * pageSize + 1;\n const endNum = Math.min(startNum + pageSize - 1, total);\n\n if (startNum > total) {\n return {\n mailbox: input.mailbox,\n page: currentPage,\n pageSize,\n total,\n messages: [],\n };\n }\n\n // FETCH envelope\n const messages: Array<Record<string, unknown>> = [];\n for await (const msg of client.fetch(`${startNum}:${endNum}`, {\n uid: true,\n envelope: true,\n flags: true,\n size: true,\n })) {\n const enc = msg.envelope;\n if (!enc) continue;\n\n // Check if body structure indicates attachments\n let hasAttachments = false;\n if (msg.bodyStructure?.type?.toLowerCase() === \"multipart\") {\n hasAttachments = true;\n }\n\n messages.push({\n uid: msg.uid,\n seq: msg.seq,\n subject: enc.subject ?? \"\",\n from: addressArray(enc.from),\n to: addressArray(enc.to),\n ...(enc.cc?.length ? { cc: addressArray(enc.cc) } : {}),\n ...(enc.bcc?.length ? { bcc: addressArray(enc.bcc) } : {}),\n ...(enc.replyTo?.length ? { replyTo: addressArray(enc.replyTo) } : {}),\n date: (enc.date ?? new Date()).toISOString(),\n ...(enc.messageId ? { messageId: enc.messageId } : {}),\n ...(enc.inReplyTo ? { inReplyTo: enc.inReplyTo } : {}),\n flags: [...(msg.flags ?? [])],\n size: msg.size ?? 0,\n hasAttachments,\n });\n }\n\n return {\n mailbox: input.mailbox,\n page: currentPage,\n pageSize,\n total,\n messages,\n };\n },\n});\n","// Vollständiger RFC-3501-SEARCH-Builder\nimport { z } from \"zod\";\nimport { MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { buildSearchQuery } from \"../../lib/search-builder.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_search\",\n description: \"Vollständiger RFC-3501-SEARCH-Builder\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n from: z.string().optional().describe(\"Sender address\"),\n to: z.string().optional().describe(\"Recipient address\"),\n cc: z.string().optional().describe(\"CC recipient address\"),\n bcc: z.string().optional().describe(\"BCC recipient address\"),\n subject: z.string().optional().describe(\"Subject line\"),\n body: z.string().optional().describe(\"Body text\"),\n text: z.string().optional().describe(\"Full text (headers + body)\"),\n since: z\n .string()\n .optional()\n .describe(\"Messages on or after this date (DD-Mon-YYYY or YYYY-MM-DD)\"),\n before: z.string().optional().describe(\"Messages before this date\"),\n on: z.string().optional().describe(\"Messages on this exact date\"),\n sentSince: z.string().optional().describe(\"Sent on or after this date\"),\n sentBefore: z.string().optional().describe(\"Sent before this date\"),\n sentOn: z.string().optional().describe(\"Sent on this exact date\"),\n larger: z.number().int().positive().optional().describe(\"Larger than N bytes\"),\n smaller: z.number().int().positive().optional().describe(\"Smaller than N bytes\"),\n unseen: z.boolean().optional().describe(\"Not read\"),\n seen: z.boolean().optional().describe(\"Read\"),\n flagged: z.boolean().optional().describe(\"Flagged\"),\n unflagged: z.boolean().optional().describe(\"Not flagged\"),\n answered: z.boolean().optional().describe(\"Answered\"),\n unanswered: z.boolean().optional().describe(\"Not answered\"),\n deleted: z.boolean().optional().describe(\"Deleted\"),\n undeleted: z.boolean().optional().describe(\"Not deleted\"),\n keyword: z.string().optional().describe(\"Has this keyword\"),\n unkeyword: z.string().optional().describe(\"Does not have this keyword\"),\n new: z.boolean().optional().describe(\"New (unseen + recent)\"),\n old: z.boolean().optional().describe(\"Old (not recent)\"),\n recent: z.boolean().optional().describe(\"Recent\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n const { mailbox: _mb, account: _acct, ...searchCriteria } = input;\n const query = buildSearchQuery(\n searchCriteria as import(\"../../lib/search-builder.js\").SearchCriteria,\n );\n const result = await client.search(query);\n const uids: number[] = result ? [...result] : [];\n\n return {\n mailbox: input.mailbox,\n uids,\n count: uids.length,\n };\n },\n});\n","// IMAP-SEARCH-Builder: übersetzt strukturierte Suchkriterien (alle RFC-3501-Felder) in imapflow-Query-Objekte.\n// imapflow akzeptiert ein SearchQuery-Objekt mit Eigenschaften wie from, to, subject, body, text,\n// since, before, on, sentSince, sentBefore, sentOn, larger, smaller, unseen, seen, flagged,\n// unflagged, answered, unanswered, deleted, undeleted, keyword, unkeyword, new, old, recent, etc.\n\nexport interface SearchCriteria {\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n subject?: string;\n body?: string;\n text?: string;\n since?: string; // DD-Mon-YYYY\n before?: string;\n on?: string;\n sentSince?: string;\n sentBefore?: string;\n sentOn?: string;\n larger?: number;\n smaller?: number;\n unseen?: boolean;\n seen?: boolean;\n flagged?: boolean;\n unflagged?: boolean;\n answered?: boolean;\n unanswered?: boolean;\n deleted?: boolean;\n undeleted?: boolean;\n keyword?: string;\n unkeyword?: string;\n new?: boolean;\n old?: boolean;\n recent?: boolean;\n}\n\n// Normalisiert ein Datum von DD-Mon-YYYY oder ISO in ein imapflow-kompatibles Date-Objekt.\nfunction parseSearchDate(value: string): Date {\n // ISO 8601: \"2026-05-21\" or \"2026-05-21T14:30:00Z\"\n const isoMatch = value.match(/^\\d{4}-\\d{2}-\\d{2}/);\n if (isoMatch) return new Date(isoMatch[0]);\n\n // RFC 3501: \"21-May-2026\"\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) return parsed;\n\n // Fallback mit Monats-Mapping\n const months: Record<string, string> = {\n jan: \"01\",\n feb: \"02\",\n mar: \"03\",\n apr: \"04\",\n may: \"05\",\n jun: \"06\",\n jul: \"07\",\n aug: \"08\",\n sep: \"09\",\n oct: \"10\",\n nov: \"11\",\n dec: \"12\",\n };\n const parts = value.split(\"-\");\n if (parts.length === 3) {\n // biome-ignore lint/style/noNonNullAssertion: parts.length === 3 verified above\n const day = parts[0]!.padStart(2, \"0\");\n const monKey = parts[1]?.toLowerCase().slice(0, 3);\n const mon = monKey ? months[monKey] : undefined;\n // biome-ignore lint/style/noNonNullAssertion: parts.length === 3 verified above\n const yearRaw = parts[2]!;\n const year = yearRaw.length === 2 ? `20${yearRaw}` : yearRaw;\n if (mon && day) return new Date(`${year}-${mon}-${day}`);\n }\n\n throw new Error(\n `Cannot parse date: ${value}. Use DD-Mon-YYYY (e.g., 21-May-2026) or YYYY-MM-DD.`,\n );\n}\n\n// Übersetzt strukturierte Suchkriterien in ein imapflow-SearchQuery-Objekt.\nexport function buildSearchQuery(criteria: SearchCriteria): Record<string, unknown> {\n const query: Record<string, unknown> = {};\n\n if (criteria.from !== undefined) query.from = criteria.from;\n if (criteria.to !== undefined) query.to = criteria.to;\n if (criteria.cc !== undefined) query.cc = criteria.cc;\n if (criteria.bcc !== undefined) query.bcc = criteria.bcc;\n if (criteria.subject !== undefined) query.subject = criteria.subject;\n if (criteria.body !== undefined) query.body = criteria.body;\n if (criteria.text !== undefined) query.text = criteria.text;\n\n if (criteria.since !== undefined) query.since = parseSearchDate(criteria.since);\n if (criteria.before !== undefined) query.before = parseSearchDate(criteria.before);\n if (criteria.on !== undefined) query.on = parseSearchDate(criteria.on);\n if (criteria.sentSince !== undefined) query.sentSince = parseSearchDate(criteria.sentSince);\n if (criteria.sentBefore !== undefined) query.sentBefore = parseSearchDate(criteria.sentBefore);\n if (criteria.sentOn !== undefined) query.sentOn = parseSearchDate(criteria.sentOn);\n\n if (criteria.larger !== undefined) query.larger = criteria.larger;\n if (criteria.smaller !== undefined) query.smaller = criteria.smaller;\n\n if (criteria.unseen !== undefined) query.unseen = criteria.unseen;\n if (criteria.seen !== undefined) query.seen = criteria.seen;\n if (criteria.flagged !== undefined) query.flagged = criteria.flagged;\n if (criteria.unflagged !== undefined) query.unflagged = criteria.unflagged;\n if (criteria.answered !== undefined) query.answered = criteria.answered;\n if (criteria.unanswered !== undefined) query.unanswered = criteria.unanswered;\n if (criteria.deleted !== undefined) query.deleted = criteria.deleted;\n if (criteria.undeleted !== undefined) query.undeleted = criteria.undeleted;\n if (criteria.new !== undefined) query.new = criteria.new;\n if (criteria.old !== undefined) query.old = criteria.old;\n if (criteria.recent !== undefined) query.recent = criteria.recent;\n\n if (criteria.keyword !== undefined) query.keyword = criteria.keyword;\n if (criteria.unkeyword !== undefined) query.unkeyword = criteria.unkeyword;\n\n return query;\n}\n","// Counts (unread/total/recent) ohne SELECT (STATUS)\nimport { z } from \"zod\";\nimport { MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_status_mailbox\",\n description: \"Counts (unread/total/recent) ohne SELECT (STATUS)\",\n category: \"imap-read\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path (e.g. INBOX)\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n try {\n const status = await client.status(input.mailbox, {\n messages: true,\n unseen: true,\n recent: true,\n uidNext: true,\n uidValidity: true,\n });\n\n return {\n path: input.mailbox,\n messages: status.messages ?? 0,\n unseen: status.unseen ?? 0,\n recent: status.recent ?? 0,\n ...(status.uidNext !== undefined ? { uidNext: status.uidNext } : {}),\n ...(status.uidValidity !== undefined ? { uidValidity: status.uidValidity } : {}),\n };\n } catch (err) {\n throw new MailboxNotFoundError(input.mailbox);\n }\n },\n});\n","// Mail in Folder schreiben (APPEND, Drafts/Import)\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_append_message\",\n description: \"Mail in Folder schreiben (APPEND, Drafts/Import)\",\n category: \"imap-write\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Target mailbox path\"),\n raw: z.string().min(1).describe(\"RFC-822 raw message content\"),\n flags: z\n .array(z.string())\n .optional()\n .describe(\"Optional flags to set (e.g. ['\\\\Seen', '\\\\Drafts'])\"),\n date: z.string().optional().describe(\"Optional internal date (ISO 8601 or imap date-time)\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const normalizedFlags = input.flags?.map((f) => (f.startsWith(\"\\\\\") ? f : `\\\\${f}`));\n const internalDate = input.date ? new Date(input.date) : undefined;\n\n try {\n const result = await client.append(input.mailbox, input.raw, normalizedFlags, internalDate);\n\n const uid = result && result.uid !== undefined ? Number(result.uid) : undefined;\n return {\n mailbox: input.mailbox,\n ...(uid !== undefined ? { uid } : {}),\n };\n } catch (err) {\n throw new ImapProtocolError(`Failed to append message: ${err}`);\n }\n },\n});\n","// Bulk-STORE über mehrere UIDs\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_bulk_mark\",\n description: \"Bulk-STORE über mehrere UIDs\",\n category: \"imap-write\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uids: z.array(z.number().int().positive()).min(1).max(500).describe(\"Message UIDs\"),\n flags: z.array(z.string()).min(1).describe(\"Flags to set/add/remove\"),\n mode: z.enum([\"set\", \"add\", \"remove\"]).default(\"set\").describe(\"STORE mode\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n const normalizedFlags = input.flags.map((f) =>\n f.startsWith(\"\\\\\") ? (f as `\\\\${string}`) : (`\\\\${f}` as const),\n );\n const notFound: number[] = [];\n let modified = 0;\n\n for (const uid of input.uids) {\n try {\n switch (input.mode) {\n case \"set\":\n await client.messageFlagsSet(uid, normalizedFlags);\n break;\n case \"add\":\n await client.messageFlagsAdd(uid, normalizedFlags);\n break;\n case \"remove\":\n await client.messageFlagsRemove(uid, normalizedFlags);\n break;\n }\n modified++;\n } catch {\n notFound.push(uid);\n }\n }\n\n return {\n modified,\n uids: input.uids.filter((u) => !notFound.includes(u)),\n notFound,\n };\n },\n});\n","// Bulk-MOVE über mehrere UIDs\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_bulk_move\",\n description: \"Bulk-MOVE über mehrere UIDs\",\n category: \"imap-write\",\n inputSchema: z.object({\n fromMailbox: z.string().min(1).describe(\"Source mailbox path\"),\n toMailbox: z.string().min(1).describe(\"Target mailbox path\"),\n uids: z.array(z.number().int().positive()).min(1).max(500).describe(\"Message UIDs to move\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.fromMailbox);\n if (!mb) throw new MailboxNotFoundError(input.fromMailbox);\n\n const moved: number[] = [];\n const notFound: number[] = [];\n\n // Use MOVE command for batch if available\n try {\n // Try a single MOVE command for all UIDs\n await client.messageMove(input.uids, input.toMailbox);\n moved.push(...input.uids);\n } catch {\n // Fallback: try each individually\n for (const uid of input.uids) {\n try {\n await client.messageMove(uid, input.toMailbox);\n moved.push(uid);\n } catch {\n // Fallback: COPY + DELETE (no direct expunge)\n try {\n await client.messageCopy(uid, input.toMailbox);\n await client.messageDelete(uid);\n moved.push(uid);\n } catch {\n notFound.push(uid);\n }\n }\n }\n }\n\n return {\n fromMailbox: input.fromMailbox,\n toMailbox: input.toMailbox,\n moved: moved.length,\n uids: moved,\n notFound,\n };\n },\n});\n","// Mail kopieren (COPY)\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_copy_message\",\n description: \"Mail kopieren (COPY)\",\n category: \"imap-write\",\n inputSchema: z.object({\n fromMailbox: z.string().min(1).describe(\"Source mailbox path\"),\n toMailbox: z.string().min(1).describe(\"Target mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.fromMailbox);\n if (!mb) throw new MailboxNotFoundError(input.fromMailbox);\n\n let targetUid: number | undefined;\n\n try {\n const result = await client.messageCopy(input.uid, input.toMailbox);\n // biome-ignore lint/complexity/useOptionalChain: false|CopyResponseObject union breaks ?.\n if (result && result.uidMap) {\n targetUid = result.uidMap.get(input.uid);\n }\n } catch (err) {\n throw new ImapProtocolError(`Failed to copy message: ${err}`);\n }\n\n return {\n fromMailbox: input.fromMailbox,\n toMailbox: input.toMailbox,\n sourceUid: input.uid,\n ...(targetUid !== undefined ? { targetUid } : {}),\n };\n },\n});\n","// STORE \\\\Deleted + optional EXPUNGE\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_delete_message\",\n description: \"STORE \\\\Deleted + optional EXPUNGE\",\n category: \"imap-write\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n expunge: z.boolean().default(false).describe(\"Also EXPUNGE after marking (default: false)\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n try {\n await client.messageDelete(input.uid);\n } catch (err) {\n throw new UidNotFoundError(input.uid, input.mailbox);\n }\n\n let expunged = false;\n\n if (input.expunge) {\n try {\n await client.mailboxClose();\n expunged = true;\n } catch (err) {\n throw new ImapProtocolError(`Failed to expunge after delete: ${err}`);\n }\n }\n\n return {\n uid: input.uid,\n mailbox: input.mailbox,\n expunged,\n };\n },\n});\n","// EXPUNGE eines Folders\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_expunge\",\n description: \"EXPUNGE eines Folders\",\n category: \"imap-write\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path to expunge\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n const beforeCount = mb.exists;\n\n try {\n // ImapFlow doesn't support direct EXPUNGE; use mailboxClose() to purge \\Deleted messages\n await client.mailboxClose();\n // Reopen to get fresh counts\n const after = await client.mailboxOpen(input.mailbox);\n const afterCount = after?.exists ?? beforeCount;\n return {\n mailbox: input.mailbox,\n expunged: Math.max(0, beforeCount - afterCount),\n };\n } catch (err) {\n throw new ImapProtocolError(`Failed to expunge mailbox: ${err}`);\n }\n },\n});\n","// Flags setzen/entfernen (STORE)\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_mark_message\",\n description: \"Flags setzen/entfernen (STORE)\",\n category: \"imap-write\",\n inputSchema: z.object({\n mailbox: z.string().min(1).describe(\"Mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n flags: z\n .array(z.string())\n .min(1)\n .describe(\"Flags to set/add/remove (e.g. ['\\\\Seen', '\\\\Flagged'])\"),\n mode: z\n .enum([\"set\", \"add\", \"remove\"])\n .default(\"set\")\n .describe(\"STORE mode: set (replace), add (+FLAGS), remove (-FLAGS)\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.mailbox);\n if (!mb) throw new MailboxNotFoundError(input.mailbox);\n\n const normalizedFlags = input.flags.map((f) =>\n f.startsWith(\"\\\\\") ? (f as `\\\\${string}`) : (`\\\\${f}` as const),\n );\n\n try {\n switch (input.mode) {\n case \"set\":\n await client.messageFlagsSet(input.uid, normalizedFlags);\n break;\n case \"add\":\n await client.messageFlagsAdd(input.uid, normalizedFlags);\n break;\n case \"remove\":\n await client.messageFlagsRemove(input.uid, normalizedFlags);\n break;\n }\n } catch (err) {\n throw new ImapProtocolError(`Failed to set flags: ${err}`);\n }\n\n return {\n uid: input.uid,\n flags: input.flags,\n };\n },\n});\n","// Mail verschieben (MOVE, Fallback COPY+EXPUNGE)\nimport { z } from \"zod\";\nimport { ImapProtocolError, MailboxNotFoundError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_move_message\",\n description: \"Mail verschieben (MOVE, Fallback COPY+EXPUNGE)\",\n category: \"imap-write\",\n inputSchema: z.object({\n fromMailbox: z.string().min(1).describe(\"Source mailbox path\"),\n toMailbox: z.string().min(1).describe(\"Target mailbox path\"),\n uid: z.number().int().positive().describe(\"Message UID\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n const mb = await client.mailboxOpen(input.fromMailbox);\n if (!mb) throw new MailboxNotFoundError(input.fromMailbox);\n\n // Try MOVE first (RFC 6851)\n let targetUid: number | undefined;\n\n try {\n const result = await client.messageMove(input.uid, input.toMailbox);\n // biome-ignore lint/complexity/useOptionalChain: false|CopyResponseObject union\n if (result && result.uidMap) {\n targetUid = result.uidMap.get(input.uid);\n }\n } catch (err) {\n // Fallback: COPY + EXPUNGE via mailboxClose\n try {\n const copyResult = await client.messageCopy(input.uid, input.toMailbox);\n // biome-ignore lint/complexity/useOptionalChain: false|CopyResponseObject union\n if (copyResult && copyResult.uidMap) {\n targetUid = copyResult.uidMap.get(input.uid);\n }\n await client.messageDelete(input.uid);\n } catch (fallbackErr) {\n throw new ImapProtocolError(`Failed to move message: ${fallbackErr}`);\n }\n }\n\n return {\n fromMailbox: input.fromMailbox,\n toMailbox: input.toMailbox,\n sourceUid: input.uid,\n ...(targetUid !== undefined ? { targetUid } : {}),\n };\n },\n});\n","// Neuen Folder anlegen (CREATE)\nimport { z } from \"zod\";\nimport { ImapProtocolError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_create_mailbox\",\n description: \"Neuen Folder anlegen (CREATE)\",\n category: \"imap-mailbox\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Mailbox path to create\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n try {\n await client.mailboxCreate(input.path);\n } catch (err) {\n throw new ImapProtocolError(`Failed to create mailbox: ${err}`);\n }\n\n return { path: input.path, created: true };\n },\n});\n","// Folder löschen (DELETE)\nimport { z } from \"zod\";\nimport { ImapProtocolError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_delete_mailbox\",\n description: \"Folder löschen (DELETE)\",\n category: \"imap-mailbox\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Mailbox path to delete\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n try {\n await client.mailboxDelete(input.path);\n } catch (err) {\n throw new ImapProtocolError(`Failed to delete mailbox: ${err}`);\n }\n\n return { path: input.path, deleted: true };\n },\n});\n","// Folder umbenennen (RENAME)\nimport { z } from \"zod\";\nimport { ImapProtocolError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_rename_mailbox\",\n description: \"Folder umbenennen (RENAME)\",\n category: \"imap-mailbox\",\n inputSchema: z.object({\n from: z.string().min(1).describe(\"Current mailbox path\"),\n to: z.string().min(1).describe(\"New mailbox path\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n try {\n await client.mailboxRename(input.from, input.to);\n } catch (err) {\n throw new ImapProtocolError(`Failed to rename mailbox: ${err}`);\n }\n\n return { from: input.from, to: input.to, renamed: true };\n },\n});\n","// Folder abonnieren (SUBSCRIBE)\nimport { z } from \"zod\";\nimport { ImapProtocolError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_subscribe_mailbox\",\n description: \"Folder abonnieren (SUBSCRIBE)\",\n category: \"imap-mailbox\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Mailbox path to subscribe\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n try {\n await client.mailboxSubscribe(input.path);\n } catch (err) {\n throw new ImapProtocolError(`Failed to subscribe to mailbox: ${err}`);\n }\n\n return { path: input.path, subscribed: true };\n },\n});\n","// Folder-Abo entfernen (UNSUBSCRIBE)\nimport { z } from \"zod\";\nimport { ImapProtocolError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"imap_unsubscribe_mailbox\",\n description: \"Folder-Abo entfernen (UNSUBSCRIBE)\",\n category: \"imap-mailbox\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Mailbox path to unsubscribe\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const client = await ctx.imap.acquire(accountName);\n\n try {\n await client.mailboxUnsubscribe(input.path);\n } catch (err) {\n throw new ImapProtocolError(`Failed to unsubscribe from mailbox: ${err}`);\n }\n\n return { path: input.path, subscribed: false };\n },\n});\n","import type nodemailer from \"nodemailer\";\nimport type Mail from \"nodemailer/lib/mailer/index.js\";\n// Weiterleiten (Original quoted oder als Attachment) + Sent-Ablage\nimport { z } from \"zod\";\nimport { MailboxNotFoundError, SmtpRelayError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { resolveSentFolder } from \"../../lib/sent-folder.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"smtp_forward\",\n description: \"Weiterleiten (Original quoted oder als Attachment) + Sent-Ablage\",\n category: \"smtp\",\n inputSchema: z.object({\n to: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .describe(\"Forward recipient(s)\"),\n cc: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .optional()\n .describe(\"CC recipient(s)\"),\n bcc: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .optional()\n .describe(\"BCC recipient(s)\"),\n subject: z.string().optional().describe(\"Forward subject (default: Fwd: <original subject>)\"),\n text: z.string().optional().describe(\"Additional plain text body\"),\n html: z.string().optional().describe(\"Additional HTML body\"),\n originalMailbox: z.string().min(1).describe(\"Mailbox containing the original message\"),\n originalUid: z.number().int().positive().describe(\"UID of the original message\"),\n forwardAsAttachment: z\n .boolean()\n .default(false)\n .describe(\"Forward as attachment (RFC-822) (default: false)\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n saveToSent: z.boolean().default(true).describe(\"Save copy to Sent folder (default: true)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const transport = await ctx.smtp.acquire(accountName);\n // biome-ignore lint/style/noNonNullAssertion: resolveAccount guarantees existence\n const accConfig = ctx.config.accounts.get(accountName)!;\n\n // Fetch original message\n const imapClient = await ctx.imap.acquire(accountName);\n const mb = await imapClient.mailboxOpen(input.originalMailbox);\n if (!mb) throw new MailboxNotFoundError(input.originalMailbox);\n\n const original = await imapClient.fetchOne(input.originalUid, {\n uid: true,\n envelope: true,\n source: true,\n });\n if (!original) throw new UidNotFoundError(input.originalUid, input.originalMailbox);\n\n const enc = original.envelope;\n if (!enc) throw new Error(\"Original message has no envelope\");\n const subject =\n input.subject ??\n (enc.subject?.startsWith(\"Fwd:\") ? enc.subject : `Fwd: ${enc.subject ?? \"\"}`);\n\n const mailOptions: nodemailer.SendMailOptions = {\n from: accConfig.from_name ? `\"${accConfig.from_name}\" <${accConfig.user}>` : accConfig.user,\n to:\n typeof input.to === \"string\"\n ? input.to\n : input.to.map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address)).join(\", \"),\n cc: input.cc\n ? typeof input.cc === \"string\"\n ? input.cc\n : input.cc.map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address)).join(\", \")\n : undefined,\n bcc: input.bcc\n ? typeof input.bcc === \"string\"\n ? input.bcc\n : input.bcc.map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address)).join(\", \")\n : undefined,\n subject,\n };\n\n if (input.forwardAsAttachment) {\n // Forward original as RFC-822 attachment\n const rawSource = original.source?.toString() ?? \"\";\n (mailOptions as Record<string, unknown>).attachments = [\n {\n filename: `forwarded-${input.originalUid}.eml`,\n content: rawSource,\n contentType: \"message/rfc822\",\n },\n ];\n mailOptions.text = input.text ?? \"\";\n mailOptions.html = input.html ?? \"\";\n } else {\n // Inline: quote original\n const fromStr = enc.from\n ? Array.isArray(enc.from)\n ? enc.from.map((f: { address?: string }) => f.address ?? \"\").join(\", \")\n : \"\"\n : \"\";\n const toStr = enc.to\n ? Array.isArray(enc.to)\n ? enc.to.map((t: { address?: string }) => t.address ?? \"\").join(\", \")\n : \"\"\n : \"\";\n const dateStr = enc.date ? enc.date.toISOString() : new Date().toISOString();\n const quotedBody = original.source?.toString() ?? \"\";\n const quotedText = input.text\n ? `${input.text}\\n\\n-------- Forwarded Message --------\\nSubject: ${enc.subject ?? \"\"}\\nDate: ${dateStr}\\nFrom: ${fromStr}\\nTo: ${toStr}\\n\\n${quotedBody}`\n : `-------- Forwarded Message --------\\nSubject: ${enc.subject ?? \"\"}\\nDate: ${dateStr}\\nFrom: ${fromStr}\\nTo: ${toStr}\\n\\n${quotedBody}`;\n mailOptions.text = quotedText;\n }\n\n let info: nodemailer.SentMessageInfo;\n try {\n info = await transport.sendMail(mailOptions);\n } catch (err) {\n throw new SmtpRelayError(`Failed to forward email: ${err}`);\n }\n\n // Save to Sent\n let savedToSent = false;\n let sentMailbox: string | undefined;\n let sentSaveError: string | undefined;\n\n if (input.saveToSent) {\n try {\n const sentFolder = await resolveSentFolder(imapClient);\n if (sentFolder) {\n sentMailbox = sentFolder;\n const rawLines: string[] = [];\n rawLines.push(`From: ${mailOptions.from}`);\n rawLines.push(`To: ${mailOptions.to}`);\n if (mailOptions.cc) rawLines.push(`Cc: ${mailOptions.cc}`);\n rawLines.push(`Subject: ${subject}`);\n rawLines.push(`Date: ${new Date().toUTCString()}`);\n rawLines.push(\"MIME-Version: 1.0\");\n rawLines.push(\"Content-Type: text/plain; charset=UTF-8\");\n rawLines.push(\"\");\n rawLines.push(mailOptions.text ?? \"\");\n await imapClient.append(sentFolder, rawLines.join(\"\\r\\n\"));\n savedToSent = true;\n } else {\n sentSaveError = \"No Sent folder found\";\n }\n } catch (err) {\n sentSaveError = `Failed to save to Sent: ${err}`;\n }\n }\n\n return {\n messageId: info.messageId ?? \"\",\n accepted: info.accepted ?? [],\n rejected: info.rejected ?? [],\n response: info.response ?? \"\",\n savedToSent,\n ...(sentMailbox ? { sentMailbox } : {}),\n ...(sentSaveError ? { sentSaveError } : {}),\n };\n },\n});\n","// Sent-Folder-Auflösung für save_to_sent: primär über \\Sent Special-Use,\n// Fallback auf gängige Namen.\nimport type { ImapFlow } from \"imapflow\";\n\nconst SENT_FALLBACKS = [\n \"Sent\",\n \"Sent Items\",\n \"[Gmail]/Sent Mail\",\n \"[Gmail]/Gesendet\",\n \"INBOX.Sent\",\n \"Gesendet\",\n \"Gesendete Elemente\",\n];\n\nexport async function resolveSentFolder(client: ImapFlow): Promise<string | undefined> {\n // Schritt 1: Special-Use-Flag \\Sent suchen\n const mailboxes = await client.list();\n for (const mb of mailboxes) {\n if (mb.specialUse === \"\\\\Sent\" || mb.specialUse === \"Sent\") {\n return mb.path;\n }\n if (mb.flags.has(\"\\\\Sent\")) {\n return mb.path;\n }\n }\n\n // Schritt 2: Fallback-Namen prüfen\n for (const name of SENT_FALLBACKS) {\n try {\n const status = await client.status(name, { messages: true });\n if (status) return name;\n } catch {\n // Mailbox existiert nicht\n }\n }\n\n return undefined;\n}\n","import type nodemailer from \"nodemailer\";\n// Antwort mit korrekter In-Reply-To/References-Kette + Sent-Ablage\nimport { z } from \"zod\";\nimport { MailboxNotFoundError, SmtpRelayError, UidNotFoundError } from \"../../lib/errors.js\";\nimport { resolveSentFolder } from \"../../lib/sent-folder.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"smtp_reply\",\n description: \"Antwort mit korrekter In-Reply-To/References-Kette + Sent-Ablage\",\n category: \"smtp\",\n inputSchema: z.object({\n to: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .optional()\n .describe(\"Reply recipient(s) (default: from of original)\"),\n cc: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .optional()\n .describe(\"CC recipient(s)\"),\n subject: z.string().optional().describe(\"Reply subject (default: Re: <original subject>)\"),\n text: z.string().optional().describe(\"Plain text body\"),\n html: z.string().optional().describe(\"HTML body\"),\n originalMailbox: z.string().min(1).describe(\"Mailbox containing the original message\"),\n originalUid: z.number().int().positive().describe(\"UID of the original message\"),\n replyAll: z.boolean().default(false).describe(\"Reply to all recipients (default: false)\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n saveToSent: z.boolean().default(true).describe(\"Save copy to Sent folder (default: true)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const transport = await ctx.smtp.acquire(accountName);\n // biome-ignore lint/style/noNonNullAssertion: resolveAccount guarantees existence\n const accConfig = ctx.config.accounts.get(accountName)!;\n\n // Fetch original message\n const imapClient = await ctx.imap.acquire(accountName);\n const mb = await imapClient.mailboxOpen(input.originalMailbox);\n if (!mb) throw new MailboxNotFoundError(input.originalMailbox);\n\n const original = await imapClient.fetchOne(input.originalUid, {\n uid: true,\n envelope: true,\n headers: true,\n });\n if (!original) throw new UidNotFoundError(input.originalUid, input.originalMailbox);\n\n const enc = original.envelope;\n if (!enc) throw new Error(\"Original message has no envelope\");\n const messageId = enc.messageId ?? \"\";\n\n // Extract references from raw headers (not on MessageEnvelopeObject)\n const rawHeaders = original.headers?.toString() ?? \"\";\n const refMatch = rawHeaders.match(/^references:\\s*(.*)$/im);\n const existingRefs = refMatch ? (refMatch[1]?.trim().split(/\\s+/) ?? []) : [];\n const references = [...existingRefs, messageId].filter(Boolean);\n const inReplyTo = messageId;\n\n // Build to/cc from original envelope\n let to = input.to;\n const cc = input.cc;\n\n if (!to) {\n // Default: reply to from address\n const fromAddr = enc.from?.[0];\n to = fromAddr?.address ?? \"\";\n }\n\n if (input.replyAll && enc.to) {\n // Reply-all: original to + cc, excluding ourselves\n // (simplified: just use what the client provides)\n }\n\n const subject =\n input.subject ?? (enc.subject?.startsWith(\"Re:\") ? enc.subject : `Re: ${enc.subject ?? \"\"}`);\n\n const mailOptions: nodemailer.SendMailOptions = {\n from: accConfig.from_name ? `\"${accConfig.from_name}\" <${accConfig.user}>` : accConfig.user,\n to:\n typeof to === \"string\"\n ? to\n : Array.isArray(to)\n ? to.map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address)).join(\", \")\n : undefined,\n cc:\n typeof cc === \"string\"\n ? cc\n : Array.isArray(cc)\n ? cc.map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address)).join(\", \")\n : undefined,\n subject,\n text: input.text,\n html: input.html,\n inReplyTo,\n references: references.join(\" \"),\n };\n\n let info: nodemailer.SentMessageInfo;\n try {\n info = await transport.sendMail(mailOptions);\n } catch (err) {\n throw new SmtpRelayError(`Failed to send reply: ${err}`);\n }\n\n // Save to Sent\n let savedToSent = false;\n let sentMailbox: string | undefined;\n let sentSaveError: string | undefined;\n\n if (input.saveToSent) {\n try {\n const sentFolder = await resolveSentFolder(imapClient);\n if (sentFolder) {\n sentMailbox = sentFolder;\n const rawLines: string[] = [];\n rawLines.push(`From: ${mailOptions.from}`);\n rawLines.push(`To: ${mailOptions.to}`);\n if (mailOptions.cc) rawLines.push(`Cc: ${mailOptions.cc}`);\n rawLines.push(`Subject: ${subject}`);\n rawLines.push(`In-Reply-To: ${inReplyTo}`);\n rawLines.push(`References: ${references.join(\" \")}`);\n rawLines.push(`Date: ${new Date().toUTCString()}`);\n rawLines.push(\"MIME-Version: 1.0\");\n rawLines.push(\"Content-Type: text/plain; charset=UTF-8\");\n rawLines.push(\"\");\n rawLines.push(input.text ?? input.html ?? \"\");\n await imapClient.append(sentFolder, rawLines.join(\"\\r\\n\"));\n savedToSent = true;\n } else {\n sentSaveError = \"No Sent folder found\";\n }\n } catch (err) {\n sentSaveError = `Failed to save to Sent: ${err}`;\n }\n }\n\n return {\n messageId: info.messageId ?? \"\",\n inReplyTo,\n accepted: info.accepted ?? [],\n rejected: info.rejected ?? [],\n response: info.response ?? \"\",\n savedToSent,\n ...(sentMailbox ? { sentMailbox } : {}),\n ...(sentSaveError ? { sentSaveError } : {}),\n };\n },\n});\n","import type nodemailer from \"nodemailer\";\n// Vor-formatierte RFC-822 senden (Power-User) + Sent-Ablage\nimport { z } from \"zod\";\nimport { SmtpRelayError } from \"../../lib/errors.js\";\nimport { resolveSentFolder } from \"../../lib/sent-folder.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"smtp_send_raw\",\n description: \"Vor-formatierte RFC-822 senden (Power-User) + Sent-Ablage\",\n category: \"smtp\",\n inputSchema: z.object({\n raw: z.string().min(1).describe(\"Raw RFC-822 message content to send\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n saveToSent: z.boolean().default(true).describe(\"Save copy to Sent folder (default: true)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const transport = await ctx.smtp.acquire(accountName);\n\n const mailOptions: nodemailer.SendMailOptions = {\n raw: input.raw,\n };\n\n let info: nodemailer.SentMessageInfo;\n try {\n info = await transport.sendMail(mailOptions);\n } catch (err) {\n throw new SmtpRelayError(`Failed to send raw email: ${err}`);\n }\n\n let savedToSent = false;\n let sentMailbox: string | undefined;\n let sentSaveError: string | undefined;\n\n if (input.saveToSent) {\n try {\n const imapClient = await ctx.imap.acquire(accountName);\n const sentFolder = await resolveSentFolder(imapClient);\n if (sentFolder) {\n sentMailbox = sentFolder;\n await imapClient.append(sentFolder, input.raw);\n savedToSent = true;\n } else {\n sentSaveError = \"No Sent folder found\";\n }\n } catch (err) {\n sentSaveError = `Failed to save to Sent: ${err}`;\n }\n }\n\n return {\n messageId: info.messageId ?? \"\",\n accepted: info.accepted ?? [],\n rejected: info.rejected ?? [],\n response: info.response ?? \"\",\n savedToSent,\n ...(sentMailbox ? { sentMailbox } : {}),\n ...(sentSaveError ? { sentSaveError } : {}),\n };\n },\n});\n","import type nodemailer from \"nodemailer\";\nimport type Mail from \"nodemailer/lib/mailer/index.js\";\n// Mail senden + optionale Sent-Ablage\nimport { z } from \"zod\";\nimport { SmtpRelayError } from \"../../lib/errors.js\";\nimport { resolveSentFolder } from \"../../lib/sent-folder.js\";\nimport { defineTool } from \"../_types.js\";\n\nfunction buildAddresses(\n list: Array<{ address: string; name?: string }> | string | undefined | null,\n): string | string[] | undefined {\n if (!list) return undefined;\n if (typeof list === \"string\") return list;\n return list.map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address));\n}\n\nexport default defineTool({\n name: \"smtp_send\",\n description: \"Mail senden + optionale Sent-Ablage\",\n category: \"smtp\",\n inputSchema: z.object({\n to: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .describe(\"Recipient(s)\"),\n cc: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .optional()\n .describe(\"CC recipient(s)\"),\n bcc: z\n .union([z.string(), z.array(z.object({ address: z.string(), name: z.string().optional() }))])\n .optional()\n .describe(\"BCC recipient(s)\"),\n subject: z.string().min(1).describe(\"Email subject\"),\n text: z.string().optional().describe(\"Plain text body\"),\n html: z.string().optional().describe(\"HTML body\"),\n attachments: z\n .array(\n z.object({\n filename: z.string().optional(),\n content: z.string().optional(),\n path: z.string().optional(),\n contentType: z.string().optional(),\n cid: z.string().optional(),\n }),\n )\n .optional()\n .describe(\"Attachments\"),\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n saveToSent: z.boolean().default(true).describe(\"Save copy to Sent folder (default: true)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const transport = await ctx.smtp.acquire(accountName);\n\n // biome-ignore lint/style/noNonNullAssertion: resolveAccount guarantees existence\n const accConfig = ctx.config.accounts.get(accountName)!;\n\n const mailOptions: nodemailer.SendMailOptions = {\n from: accConfig.from_name ? `\"${accConfig.from_name}\" <${accConfig.user}>` : accConfig.user,\n to: buildAddresses(input.to as string | Array<{ address: string; name?: string }>),\n cc: buildAddresses(\n input.cc as string | Array<{ address: string; name?: string }> | undefined,\n ),\n bcc: buildAddresses(\n input.bcc as string | Array<{ address: string; name?: string }> | undefined,\n ),\n subject: input.subject,\n text: input.text,\n html: input.html,\n attachments: input.attachments as unknown as Mail.Attachment[] | undefined,\n };\n\n let info: nodemailer.SentMessageInfo;\n try {\n info = await transport.sendMail(mailOptions);\n } catch (err) {\n throw new SmtpRelayError(`Failed to send email: ${err}`);\n }\n\n let savedToSent = false;\n let sentMailbox: string | undefined;\n let sentSaveError: string | undefined;\n\n if (input.saveToSent) {\n try {\n const imapClient = await ctx.imap.acquire(accountName);\n const sentFolder = await resolveSentFolder(imapClient);\n if (sentFolder) {\n sentMailbox = sentFolder;\n const raw = await buildRfc822(\n {\n user: accConfig.user,\n ...(accConfig.from_name ? { from_name: accConfig.from_name } : {}),\n },\n mailOptions,\n );\n await imapClient.append(sentFolder, raw);\n savedToSent = true;\n } else {\n sentSaveError = \"No Sent folder found\";\n }\n } catch (err) {\n sentSaveError = `Failed to save to Sent: ${err}`;\n }\n }\n\n return {\n messageId: info.messageId ?? \"\",\n accepted: info.accepted ?? [],\n rejected: info.rejected ?? [],\n response: info.response ?? \"\",\n savedToSent,\n ...(sentMailbox ? { sentMailbox } : {}),\n ...(sentSaveError ? { sentSaveError } : {}),\n };\n },\n});\n\nasync function buildRfc822(\n acc: { user: string; from_name?: string },\n opts: nodemailer.SendMailOptions,\n): Promise<string> {\n // Build a minimal RFC-822 message for the sent copy\n const lines: string[] = [];\n const from =\n typeof opts.from === \"string\"\n ? opts.from\n : acc.from_name\n ? `\"${acc.from_name}\" <${acc.user}>`\n : acc.user;\n const to =\n typeof opts.to === \"string\" ? opts.to : Array.isArray(opts.to) ? opts.to.join(\", \") : \"\";\n const date = new Date().toUTCString();\n\n lines.push(`From: ${from}`);\n lines.push(`To: ${to}`);\n if (opts.cc) {\n const ccStr =\n typeof opts.cc === \"string\"\n ? opts.cc\n : (opts.cc as Array<{ name?: string; address: string }>).map((a) => a.address).join(\", \");\n lines.push(`Cc: ${ccStr}`);\n }\n lines.push(`Subject: ${opts.subject ?? \"\"}`);\n lines.push(`Date: ${date}`);\n lines.push(\"MIME-Version: 1.0\");\n lines.push(\"Content-Type: text/plain; charset=UTF-8\");\n lines.push(\"Content-Transfer-Encoding: 7bit\");\n lines.push(\"\");\n lines.push(opts.text ? (opts.text as string) : opts.html ? (opts.html as string) : \"\");\n\n return lines.join(\"\\r\\n\");\n}\n","// SMTP-Connection-Health-Check (EHLO, AUTH)\nimport { z } from \"zod\";\nimport { AuthError, SmtpRelayError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"smtp_verify_connection\",\n description: \"SMTP-Connection-Health-Check (EHLO, AUTH)\",\n category: \"smtp\",\n inputSchema: z.object({\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n const transport = await ctx.smtp.acquire(accountName);\n // biome-ignore lint/style/noNonNullAssertion: resolveAccount guarantees existence\n const accConfig = ctx.config.accounts.get(accountName)!;\n\n const start = Date.now();\n\n try {\n const ok = await transport.verify();\n const latencyMs = Date.now() - start;\n\n return {\n ok,\n host: accConfig.smtp_host ?? \"unknown\",\n port: accConfig.smtp_port,\n tls:\n accConfig.smtp_tls === \"implicit\"\n ? (\"implicit\" as const)\n : accConfig.smtp_tls === \"starttls\"\n ? (\"starttls\" as const)\n : (\"none\" as const),\n latencyMs,\n };\n } catch (err) {\n const error = err as Error;\n if (error.message?.includes(\"auth\") || error.message?.includes(\"login\")) {\n throw new AuthError(`SMTP authentication failed: ${error.message}`);\n }\n throw new SmtpRelayError(`SMTP connection failed: ${error.message}`);\n }\n },\n});\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\n// Neuen Account zur Config hinzufügen\nimport { z } from \"zod\";\nimport { ConfigError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"account_add\",\n description: \"Neuen Account zur Config hinzufügen\",\n category: \"account\",\n inputSchema: z.object({\n name: z.string().min(1).describe(\"Account name\"),\n user: z.string().min(1).describe(\"Email address / IMAP login\"),\n pass: z.string().min(1).describe(\"Password or app password\"),\n imap_host: z.string().optional().describe(\"IMAP host (auto-detect if omitted)\"),\n imap_port: z.number().int().positive().optional().describe(\"IMAP port (default: 993)\"),\n imap_tls: z.enum([\"implicit\", \"starttls\", \"none\"]).optional().describe(\"IMAP TLS mode\"),\n smtp_host: z.string().optional().describe(\"SMTP host (auto-detect if omitted)\"),\n smtp_port: z.number().int().positive().optional().describe(\"SMTP port (default: 465)\"),\n smtp_tls: z.enum([\"implicit\", \"starttls\", \"none\"]).optional().describe(\"SMTP TLS mode\"),\n from_name: z.string().optional().describe(\"Display name for sent emails\"),\n verify_tls: z.boolean().optional().describe(\"Verify TLS certificate (default: true)\"),\n }),\n handler: async (input, ctx) => {\n if (ctx.config.mode !== \"config-file\" || !ctx.config.configPath) {\n throw new ConfigError(\n \"Account mutations require a config file (multi-account mode). Use --config=<path> or set up a config file.\",\n );\n }\n\n const configPath = ctx.config.configPath;\n\n // Read current config\n let raw: string;\n try {\n raw = readFileSync(configPath, \"utf8\");\n } catch {\n throw new ConfigError(`Cannot read config file: ${configPath}`);\n }\n\n const parsed = parseToml(raw) as Record<string, unknown>;\n const accounts = (parsed.accounts as Array<Record<string, unknown>>) ?? [];\n\n // Check for duplicate\n if (accounts.some((a) => a.name === input.name)) {\n throw new ConfigError(`Account \"${input.name}\" already exists`);\n }\n\n // Build new account entry\n const newAccount: Record<string, unknown> = {\n name: input.name,\n user: input.user,\n pass: input.pass,\n };\n if (input.imap_host) newAccount.imap_host = input.imap_host;\n if (input.imap_port) newAccount.imap_port = input.imap_port;\n if (input.imap_tls) newAccount.imap_tls = input.imap_tls;\n if (input.smtp_host) newAccount.smtp_host = input.smtp_host;\n if (input.smtp_port) newAccount.smtp_port = input.smtp_port;\n if (input.smtp_tls) newAccount.smtp_tls = input.smtp_tls;\n if (input.from_name) newAccount.from_name = input.from_name;\n if (input.verify_tls !== undefined) newAccount.verify_tls = input.verify_tls;\n\n accounts.push(newAccount);\n parsed.accounts = accounts;\n\n // Write back\n const tomlStr = stringifyToml(parsed as Record<string, unknown>);\n writeFileSync(configPath, tomlStr, \"utf8\");\n\n // Update in-memory config\n // (In a production system we'd re-parse the config, but for simplicity\n // we just note that the user should restart to pick up the new account.)\n ctx.logger.info({ account: input.name }, \"Account added to config file\");\n\n return { name: input.name, created: true, configPath };\n },\n});\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\n// Account aus Config entfernen\nimport { z } from \"zod\";\nimport { AccountNotFoundError, ConfigError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"account_delete\",\n description: \"Account aus Config entfernen\",\n category: \"account\",\n inputSchema: z.object({\n name: z.string().min(1).describe(\"Account name to delete\"),\n }),\n handler: async (input, ctx) => {\n if (ctx.config.mode !== \"config-file\" || !ctx.config.configPath) {\n throw new ConfigError(\"Account mutations require a config file (multi-account mode).\");\n }\n\n const configPath = ctx.config.configPath;\n\n let raw: string;\n try {\n raw = readFileSync(configPath, \"utf8\");\n } catch {\n throw new ConfigError(`Cannot read config file: ${configPath}`);\n }\n\n const parsed = parseToml(raw) as Record<string, unknown>;\n const accounts = (parsed.accounts as Array<Record<string, unknown>>) ?? [];\n const idx = accounts.findIndex((a) => a.name === input.name);\n\n if (idx === -1) {\n throw new AccountNotFoundError(input.name);\n }\n\n accounts.splice(idx, 1);\n parsed.accounts = accounts;\n\n // If this was the default account, reset default\n if (parsed.default_account === input.name) {\n if (accounts.length > 0) {\n parsed.default_account = accounts[0]?.name;\n } else {\n parsed.default_account = undefined;\n }\n }\n\n const tomlStr = stringifyToml(parsed as Record<string, unknown>);\n writeFileSync(configPath, tomlStr, \"utf8\");\n\n ctx.logger.info({ account: input.name }, \"Account deleted\");\n\n return { name: input.name, deleted: true };\n },\n});\n","// Konfigurierte Accounts auflisten (Credentials masked)\nimport { z } from \"zod\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"account_list\",\n description: \"Konfigurierte Accounts auflisten (Credentials masked)\",\n category: \"account\",\n inputSchema: z.object({}),\n handler: async (_input, ctx) => {\n const accounts = [...ctx.config.accounts.entries()].map(([name, acc]) => ({\n name,\n user: acc.user,\n imapHost: acc.imap_host ?? \"auto-detect\",\n smtpHost: acc.smtp_host ?? \"auto-detect\",\n }));\n\n return {\n defaultAccount: ctx.config.defaultAccount,\n accounts,\n mode: ctx.config.mode,\n };\n },\n});\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\n// Bestehenden Account modifizieren\nimport { z } from \"zod\";\nimport { AccountNotFoundError, ConfigError } from \"../../lib/errors.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"account_update\",\n description: \"Bestehenden Account modifizieren\",\n category: \"account\",\n inputSchema: z.object({\n name: z.string().min(1).describe(\"Account name to modify\"),\n user: z.string().optional().describe(\"New email address / IMAP login\"),\n pass: z.string().optional().describe(\"New password or app password\"),\n imap_host: z.string().optional().describe(\"New IMAP host\"),\n imap_port: z.number().int().positive().optional().describe(\"New IMAP port\"),\n imap_tls: z.enum([\"implicit\", \"starttls\", \"none\"]).optional().describe(\"New IMAP TLS mode\"),\n smtp_host: z.string().optional().describe(\"New SMTP host\"),\n smtp_port: z.number().int().positive().optional().describe(\"New SMTP port\"),\n smtp_tls: z.enum([\"implicit\", \"starttls\", \"none\"]).optional().describe(\"New SMTP TLS mode\"),\n from_name: z.string().optional().describe(\"New display name\"),\n verify_tls: z.boolean().optional().describe(\"New TLS verification setting\"),\n }),\n handler: async (input, ctx) => {\n if (ctx.config.mode !== \"config-file\" || !ctx.config.configPath) {\n throw new ConfigError(\"Account mutations require a config file (multi-account mode).\");\n }\n\n const configPath = ctx.config.configPath;\n\n let raw: string;\n try {\n raw = readFileSync(configPath, \"utf8\");\n } catch {\n throw new ConfigError(`Cannot read config file: ${configPath}`);\n }\n\n const parsed = parseToml(raw) as Record<string, unknown>;\n const accounts = (parsed.accounts as Array<Record<string, unknown>>) ?? [];\n\n const account = accounts.find((a) => a.name === input.name);\n if (!account) {\n throw new AccountNotFoundError(input.name);\n }\n\n const changedFields: string[] = [];\n\n const updatable: Array<[string, unknown]> = [\n [\"user\", input.user],\n [\"pass\", input.pass],\n [\"imap_host\", input.imap_host],\n [\"imap_port\", input.imap_port],\n [\"imap_tls\", input.imap_tls],\n [\"smtp_host\", input.smtp_host],\n [\"smtp_port\", input.smtp_port],\n [\"smtp_tls\", input.smtp_tls],\n [\"from_name\", input.from_name],\n ];\n\n for (const [key, value] of updatable) {\n if (value !== undefined) {\n account[key] = value;\n changedFields.push(key);\n }\n }\n\n if (input.verify_tls !== undefined) {\n account.verify_tls = input.verify_tls;\n changedFields.push(\"verify_tls\");\n }\n\n if (changedFields.length === 0) {\n throw new ConfigError(\"No fields to update\");\n }\n\n parsed.accounts = accounts;\n const tomlStr = stringifyToml(parsed as Record<string, unknown>);\n writeFileSync(configPath, tomlStr, \"utf8\");\n\n ctx.logger.info({ account: input.name, changedFields }, \"Account updated\");\n\n return { name: input.name, updated: true, changedFields };\n },\n});\n","// IMAP + SMTP Erreichbarkeit, Latenz, Capabilities\nimport { z } from \"zod\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"meta_health\",\n description: \"IMAP + SMTP Erreichbarkeit, Latenz, Capabilities\",\n category: \"meta\",\n inputSchema: z.object({\n account: z.string().optional().describe(\"Account name (default: default_account)\"),\n }),\n handler: async (input, ctx) => {\n const accountName = ctx.resolveAccount(input.account);\n\n const accConfig = ctx.config.accounts.get(accountName);\n\n // IMAP health\n let imapOk = false;\n let imapLatencyMs: number | undefined;\n let imapCaps: string[] | undefined;\n let imapError: string | undefined;\n\n try {\n const imapStart = Date.now();\n const client = await ctx.imap.acquire(accountName);\n const caps = [...client.capabilities.keys()];\n imapLatencyMs = Date.now() - imapStart;\n imapOk = true;\n imapCaps = caps;\n } catch (err) {\n imapError = String(err);\n }\n\n // SMTP health\n let smtpOk = false;\n let smtpLatencyMs: number | undefined;\n let smtpError: string | undefined;\n\n try {\n const smtpStart = Date.now();\n const transport = await ctx.smtp.acquire(accountName);\n const verify = await transport.verify();\n smtpLatencyMs = Date.now() - smtpStart;\n smtpOk = verify;\n } catch (err) {\n smtpError = String(err);\n }\n\n return {\n account: accountName,\n imap: {\n ok: imapOk,\n ...(imapLatencyMs !== undefined ? { latencyMs: imapLatencyMs } : {}),\n ...(imapCaps ? { capabilities: imapCaps } : {}),\n ...(imapError ? { error: imapError } : {}),\n },\n smtp: {\n ok: smtpOk,\n ...(smtpLatencyMs !== undefined ? { latencyMs: smtpLatencyMs } : {}),\n ...(smtpError ? { error: smtpError } : {}),\n },\n };\n },\n});\n","// Aktive Tools, aktiver Modus, Version\nimport { z } from \"zod\";\nimport { SERVER_NAME, SERVER_VERSION } from \"../../server/server.js\";\nimport { defineTool } from \"../_types.js\";\n\nexport default defineTool({\n name: \"meta_server_info\",\n description: \"Aktive Tools, aktiver Modus, Version\",\n category: \"meta\",\n inputSchema: z.object({}),\n handler: async (_input, ctx) => {\n const flags: Record<string, unknown> = {\n safe: ctx.flags.safe,\n readonly: ctx.flags.readonly,\n noImap: ctx.flags.noImap,\n noSmtp: ctx.flags.noSmtp,\n };\n if (ctx.flags.allowTools?.length) flags.allowTools = ctx.flags.allowTools;\n if (ctx.flags.denyTools?.length) flags.denyTools = ctx.flags.denyTools;\n\n return {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n activeTools: ctx.activeTools,\n flags,\n };\n },\n});\n","// Zentraler Tool-Index: importiert alle 36 Tool-Definitionen und exportiert sie als flaches Array. Einzige Stelle, die jedes Tool kennt.\nimport type { ToolDefinition } from \"./_types.js\";\n\nimport checkCapabilities from \"./imap-read/check-capabilities.js\";\nimport downloadAttachment from \"./imap-read/download-attachment.js\";\nimport getMessageHeaders from \"./imap-read/get-message-headers.js\";\nimport getMessageRaw from \"./imap-read/get-message-raw.js\";\nimport getMessage from \"./imap-read/get-message.js\";\nimport getMessagesBulk from \"./imap-read/get-messages-bulk.js\";\nimport getQuota from \"./imap-read/get-quota.js\";\nimport getThread from \"./imap-read/get-thread.js\";\n// IMAP-Read\nimport listMailboxes from \"./imap-read/list-mailboxes.js\";\nimport listMessages from \"./imap-read/list-messages.js\";\nimport search from \"./imap-read/search.js\";\nimport statusMailbox from \"./imap-read/status-mailbox.js\";\n\nimport appendMessage from \"./imap-write/append-message.js\";\nimport bulkMark from \"./imap-write/bulk-mark.js\";\nimport bulkMove from \"./imap-write/bulk-move.js\";\nimport copyMessage from \"./imap-write/copy-message.js\";\nimport deleteMessage from \"./imap-write/delete-message.js\";\nimport expunge from \"./imap-write/expunge.js\";\n// IMAP-Write\nimport markMessage from \"./imap-write/mark-message.js\";\nimport moveMessage from \"./imap-write/move-message.js\";\n\n// IMAP-Folder-CRUD\nimport createMailbox from \"./imap-mailbox/create-mailbox.js\";\nimport deleteMailbox from \"./imap-mailbox/delete-mailbox.js\";\nimport renameMailbox from \"./imap-mailbox/rename-mailbox.js\";\nimport subscribeMailbox from \"./imap-mailbox/subscribe-mailbox.js\";\nimport unsubscribeMailbox from \"./imap-mailbox/unsubscribe-mailbox.js\";\n\nimport smtpForward from \"./smtp/forward.js\";\nimport smtpReply from \"./smtp/reply.js\";\nimport smtpSendRaw from \"./smtp/send-raw.js\";\n// SMTP\nimport smtpSend from \"./smtp/send.js\";\nimport smtpVerifyConnection from \"./smtp/verify-connection.js\";\n\nimport accountAdd from \"./account/add.js\";\nimport accountDelete from \"./account/delete.js\";\n// Account\nimport accountList from \"./account/list.js\";\nimport accountUpdate from \"./account/update.js\";\n\n// Meta\nimport metaHealth from \"./meta/health.js\";\nimport metaServerInfo from \"./meta/server-info.js\";\n\n// biome-ignore lint/suspicious/noExplicitAny: covariant type erasure for mixed-tool array\nexport const ALL_TOOLS: ToolDefinition<any, any>[] = [\n listMailboxes,\n statusMailbox,\n listMessages,\n getMessage,\n getMessageHeaders,\n getMessageRaw,\n getMessagesBulk,\n search,\n downloadAttachment,\n getThread,\n getQuota,\n checkCapabilities,\n markMessage,\n bulkMark,\n moveMessage,\n copyMessage,\n bulkMove,\n appendMessage,\n expunge,\n deleteMessage,\n createMailbox,\n deleteMailbox,\n renameMailbox,\n subscribeMailbox,\n unsubscribeMailbox,\n smtpSend,\n smtpReply,\n smtpForward,\n smtpVerifyConnection,\n smtpSendRaw,\n accountList,\n accountAdd,\n accountUpdate,\n accountDelete,\n metaHealth,\n metaServerInfo,\n];\n"],"mappings":"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","names":["writeFileSync","resolve","z","z","z","z","z","z","z","z","z","z","z","addressArray","z","z","z","z","addressArray","z","z","z","z","addressArray","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","readFileSync","writeFileSync","parseToml","z","z","readFileSync","parseToml","writeFileSync","readFileSync","writeFileSync","parseToml","stringifyToml","z","z","readFileSync","parseToml","stringifyToml","writeFileSync","z","z","readFileSync","writeFileSync","parseToml","stringifyToml","z","z","readFileSync","parseToml","stringifyToml","writeFileSync","z","z","z","z","writeFileSync"]}