hypermail-mcp 0.7.5 → 0.7.6
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.
- package/README.md +14 -9
- package/dist/cli.js +14130 -285
- package/dist/cli.js.map +1 -1
- package/package.json +3 -2
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/store/account-store.ts","../src/store/crypto.ts","../src/providers/outlook/index.ts","../src/providers/outlook/client.ts","../src/providers/outlook/auth.ts","../src/providers/shared/inline-images.ts","../src/providers/outlook/helpers.ts","../src/providers/outlook/write-ops.ts","../src/providers/outlook/read-ops.ts","../src/providers/outlook/folders.ts","../src/providers/imap/client.ts","../src/providers/imap/read-ops.ts","../src/providers/imap/helpers.ts","../src/providers/imap/account-ops.ts","../src/providers/imap/write-ops.ts","../src/providers/imap/mime-utils.ts","../src/providers/imap/folders.ts","../src/providers/imap/index.ts","../src/providers/gmail/index.ts","../src/providers/gmail/auth.ts","../src/providers/gmail/client.ts","../src/providers/gmail/read-ops.ts","../src/providers/gmail/helpers.ts","../src/providers/gmail/write-ops.ts","../src/providers/registry.ts","../src/tools/shared.ts","../src/markdown-to-html.ts","../src/tools/accounts.ts","../src/tools/browse.ts","../src/html-to-markdown.ts","../src/tools/folders.ts","../src/tools/organize.ts","../src/tools/compose.ts","../src/tools/index.ts","../package.json","../src/version.ts","../src/watcher/webhook.ts","../src/watcher/script.ts","../src/watcher/manager.ts","../src/config.ts","../src/config/load.ts"],"sourcesContent":["import { randomBytes } from \"node:crypto\";\n\nimport { startServer } from \"./server.js\";\nimport { loadConfig } from \"./config.js\";\n\ntype ParsedArgs = {\n http: boolean;\n port: number;\n host: string;\n dataDir?: string;\n config?: string;\n help: boolean;\n};\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = {\n http: false,\n port: 3000,\n host: \"127.0.0.1\",\n help: false,\n };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n switch (a) {\n case \"--http\":\n out.http = true;\n break;\n case \"--port\":\n out.port = Number(argv[++i] ?? \"3000\");\n break;\n case \"--host\":\n out.host = String(argv[++i] ?? \"127.0.0.1\");\n break;\n case \"--data-dir\":\n out.dataDir = String(argv[++i] ?? \"\");\n break;\n case \"--config\":\n out.config = String(argv[++i] ?? \"\");\n break;\n case \"-h\":\n case \"--help\":\n out.help = true;\n break;\n default:\n if (a && a.startsWith(\"--\")) {\n // ignore unknown flags rather than crashing — keeps the CLI forgiving\n // when embedded in MCP host configs.\n }\n }\n }\n return out;\n}\n\nfunction printHelp(): void {\n const msg = `hypermail-mcp — unified email MCP server\n\nUsage:\n hypermail-mcp [options]\n\nOptions:\n --http Run as Streamable HTTP server (default: stdio)\n --port <n> HTTP port (default: 3000)\n --host <addr> HTTP bind address (default: 127.0.0.1)\n --data-dir <path> Where to store the encrypted accounts file\n (default: $HYPERMAIL_MCP_DATA_DIR or ~/.hypermail-mcp)\n --config <path> Path to hypermail-config.json\n -h, --help Show this help\n\nConfiguration:\n All settings can be provided via environment variables — no config file\n required. Use hypermail-config.json for advanced scenarios.\n\n Environment variables:\n\n HYPERMAIL_MCP_DATA_DIR Data directory (string)\n HYPERMAIL_HTTP_ENABLED Enable HTTP mode (bool: true/false/1/0)\n HYPERMAIL_HTTP_PORT HTTP port (number)\n HYPERMAIL_HTTP_HOST HTTP bind address (string)\n HYPERMAIL_TOOLS_DISABLED Comma-separated tool names to disable\n HYPERMAIL_TOOLS_ENABLED Comma-separated tool names to enable\n HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID Outlook OAuth client ID (string)\n HYPERMAIL_PROVIDERS_OUTLOOK_TENANT_ID Outlook tenant ID (string)\n HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID Gmail OAuth client ID (string)\n HYPERMAIL_PROVIDERS_GMAIL_CLIENT_SECRET Gmail OAuth client secret (string)\n HYPERMAIL_WATCH_ENABLED Enable inbox polling (bool)\n HYPERMAIL_WATCH_POLL_INTERVAL Poll interval in seconds (number)\n HYPERMAIL_WATCH_WEBHOOK_URL Webhook URL for new-email events (string)\n HYPERMAIL_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS Retry max attempts (number)\n HYPERMAIL_WATCH_WEBHOOK_RETRY_BASE_DELAY_MS Retry base delay ms (number)\n HYPERMAIL_MCP_KEY Encryption master key (hex or base64)\n\n Legacy env vars (still supported):\n MS_CLIENT_ID, MS_TENANT_ID, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET\n\n Priority: CLI flags > config file > env vars > defaults.\n\n Example (env-only, no config file):\n HYPERMAIL_HTTP_ENABLED=true \\\\\n HYPERMAIL_HTTP_PORT=8080 \\\\\n HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID=abc123 \\\\\n HYPERMAIL_PROVIDERS_OUTLOOK_TENANT_ID=common \\\\\n HYPERMAIL_MCP_DATA_DIR=/data/hypermail \\\\\n hypermail-mcp --http\n\n Example hypermail-config.json:\n {\n \"dataDir\": \"/path/to/data\",\n \"http\": { \"enabled\": false },\n \"tools\": { \"disabled\": [\"send_email\"] },\n \"providers\": {\n \"outlook\": { \"clientId\": \"\\${MS_CLIENT_ID}\", \"tenantId\": \"\\${MS_TENANT_ID}\" },\n \"gmail\": { \"clientId\": \"\\${GOOGLE_CLIENT_ID}\", \"clientSecret\": \"\\${GOOGLE_CLIENT_SECRET}\" }\n }\n }\n`;\n process.stdout.write(msg);\n}\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n\n // Subcommand: generate-key\n if (rawArgs[0] === \"generate-key\") {\n const key = `hm_sk_${randomBytes(32).toString(\"hex\")}`;\n process.stdout.write(key + \"\\n\");\n return;\n }\n\n const opts = parseArgs(rawArgs);\n if (opts.help) {\n printHelp();\n return;\n }\n\n const config = loadConfig(opts.config, {\n http: opts.http,\n port: opts.port,\n host: opts.host,\n dataDir: opts.dataDir,\n });\n\n await startServer({ config });\n}\n\nmain().catch((err) => {\n // eslint-disable-next-line no-console\n console.error(\"[hypermail-mcp] fatal:\", err);\n process.exit(1);\n});\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\n\nimport { AccountStore } from \"./store/account-store.js\";\nimport { buildRegistry } from \"./providers/registry.js\";\nimport { registerTools } from \"./tools/index.js\";\nimport { VERSION } from \"./version.js\";\nimport { WatcherManager } from \"./watcher/index.js\";\nimport type { AppConfig, ResolvedTools } from \"./config.js\";\nimport { resolveTools } from \"./config.js\";\n\nexport interface ServerOptions {\n /** Fully resolved application config from hypermail-config.json. */\n config: AppConfig;\n}\n\nexport async function startServer(opts: ServerOptions): Promise<void> {\n const { config } = opts;\n const store = await AccountStore.open({ dataDir: config.dataDir });\n const registry = buildRegistry({ store, providers: config.providers });\n const tools: ResolvedTools = resolveTools(config);\n\n // Start email watch loop if explicitly enabled (opt-in).\n // Works in both stdio and HTTP modes — setInterval fires normally\n // alongside the stdio transport's stdin listener.\n let watcher: WatcherManager | undefined;\n if (config.watch?.enabled) {\n watcher = new WatcherManager(store, registry, config.watch);\n watcher.start();\n const stop = () => watcher?.stop();\n process.on(\"SIGTERM\", stop);\n process.on(\"SIGINT\", stop);\n }\n\n // Factory: creates a fresh McpServer with all tools registered.\n // HTTP mode creates one per session; stdio mode uses a single instance.\n const createServer = (): McpServer => {\n const s = new McpServer(\n { name: \"hypermail-mcp\", version: VERSION },\n { capabilities: { tools: {}, logging: {} } },\n );\n registerTools(s, { store, registry, tools });\n return s;\n };\n\n if (config.http.enabled) {\n await startHttp(createServer, config.http.host, config.http.port);\n } else {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n }\n}\n\ninterface HttpSession {\n transport: StreamableHTTPServerTransport;\n server: McpServer;\n}\n\nasync function startHttp(\n createServer: () => McpServer,\n host: string,\n port: number,\n): Promise<void> {\n // One McpServer + transport per session, keyed by Mcp-Session-Id header.\n const sessions = new Map<string, HttpSession>();\n\n const http = createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {\n try {\n if (!req.url || !req.url.startsWith(\"/mcp\")) {\n res.statusCode = 404;\n res.end(\"not found\");\n return;\n }\n const sessionId = (req.headers[\"mcp-session-id\"] as string | undefined) ?? undefined;\n let session = sessionId ? sessions.get(sessionId) : undefined;\n\n if (!session) {\n const server = createServer();\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sid: string) => {\n sessions.set(sid, { transport, server });\n transport.onclose = () => {\n if (transport.sessionId) sessions.delete(transport.sessionId);\n };\n },\n });\n await server.connect(transport);\n session = { transport, server };\n }\n\n // Buffer body for POST / DELETE\n let body: unknown = undefined;\n if (req.method === \"POST\" || req.method === \"DELETE\") {\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n body = raw ? JSON.parse(raw) : undefined;\n }\n await session.transport.handleRequest(req, res, body);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[hypermail-mcp] http error:\", err);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.end(\"internal error\");\n }\n }\n });\n\n await new Promise<void>((resolve) => http.listen(port, host, resolve));\n // eslint-disable-next-line no-console\n console.error(`[hypermail-mcp] listening on http://${host}:${port}/mcp`);\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n encrypt,\n decrypt,\n resolveDataDir,\n resolveKey,\n writeAtomic,\n} from \"./crypto.js\";\n\n/**\n * One stored account. `tokens` is provider-specific (e.g. serialized MSAL cache\n * for Outlook, host/port/password blob for IMAP) — the store is opaque to it.\n */\nexport interface AccountRecord {\n email: string;\n provider: \"outlook\" | \"imap\" | \"gmail\";\n displayName?: string;\n tokens: Record<string, unknown>;\n addedAt: string;\n /** HTML snippet — may contain formatting, images, links. Injected at end of outgoing emails. */\n signature?: string;\n /** Font/style preferences applied to outgoing HTML emails. */\n style?: { fontFamily?: string; fontSize?: string; fontColor?: string };\n /** ISO timestamp of the newest email the watcher has already seen.\n * Used by the email-watcher to detect new mail since last poll. */\n lastSeenAt?: string;\n /** Email IDs the watcher has already seen (most recent first, capped at 200).\n * Used for ID-based dedup — emails whose ID is in this list are skipped\n * during polling, preventing duplicate/lost notifications from timestamp\n * collisions. */\n lastSeenIds?: string[];\n}\n\ninterface StoreFile {\n version: 1;\n accounts: AccountRecord[];\n}\n\nexport interface OpenOptions {\n dataDir?: string;\n /** Inject the encryption key directly (mostly for tests). Otherwise resolved\n * from `HYPERMAIL_MCP_KEY` env, then OS keychain, then auto-generated. */\n key?: Buffer;\n}\n\nconst FILE_NAME = \"accounts.json.enc\";\n\nexport class AccountStore {\n private constructor(\n private readonly filePath: string,\n private readonly key: Buffer,\n private data: StoreFile,\n ) {}\n\n static async open(opts: OpenOptions = {}): Promise<AccountStore> {\n const dataDir = resolveDataDir(opts.dataDir);\n await fs.mkdir(dataDir, { recursive: true, mode: 0o700 });\n const filePath = path.join(dataDir, FILE_NAME);\n const key = opts.key ?? (await resolveKey(dataDir));\n\n let data: StoreFile;\n try {\n const buf = await fs.readFile(filePath);\n data = decrypt(buf, key);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n data = { version: 1, accounts: [] };\n } else {\n throw err;\n }\n }\n return new AccountStore(filePath, key, data);\n }\n\n listAccounts(): AccountRecord[] {\n // Return shallow clones without tokens leaking out unintentionally is the\n // caller's job; here we expose the full record for provider use.\n return this.data.accounts.map((a) => ({ ...a }));\n }\n\n getAccount(email: string): AccountRecord | undefined {\n const norm = email.trim().toLowerCase();\n const rec = this.data.accounts.find((a) => a.email.toLowerCase() === norm);\n return rec ? { ...rec } : undefined;\n }\n\n async upsertAccount(rec: AccountRecord): Promise<AccountRecord> {\n const norm = rec.email.trim().toLowerCase();\n const next: AccountRecord = { ...rec, email: norm };\n const idx = this.data.accounts.findIndex((a) => a.email.toLowerCase() === norm);\n if (idx >= 0) this.data.accounts[idx] = next;\n else this.data.accounts.push(next);\n await this.flush();\n return { ...next };\n }\n\n async removeAccount(email: string): Promise<boolean> {\n const norm = email.trim().toLowerCase();\n const before = this.data.accounts.length;\n this.data.accounts = this.data.accounts.filter((a) => a.email.toLowerCase() !== norm);\n if (this.data.accounts.length === before) return false;\n await this.flush();\n return true;\n }\n\n private async flush(): Promise<void> {\n const buf = encrypt(this.data, this.key);\n await writeAtomic(this.filePath, buf);\n }\n}\n","import {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n createHash,\n scryptSync,\n timingSafeEqual,\n} from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport const ALGO = \"aes-256-gcm\";\nexport const KEY_LEN = 32;\n\n// ── AES-256-GCM encrypt / decrypt ──\n\n/** Encrypt JSON-serializable data with AES-256-GCM. Returns [1-byte version=1][12 iv][16 tag][ct...]. */\nexport function encrypt(data: unknown, key: Buffer): Buffer {\n if (key.length !== KEY_LEN) throw new Error(`key must be ${KEY_LEN} bytes`);\n const iv = randomBytes(12);\n const cipher = createCipheriv(ALGO, key, iv);\n const plaintext = Buffer.from(JSON.stringify(data), \"utf8\");\n const ct = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([Buffer.from([1]), iv, tag, ct]);\n}\n\n/** Decrypt a buffer produced by {@link encrypt}. Returns the parsed JSON value. */\nexport function decrypt<T = unknown>(buf: Buffer, key: Buffer): T {\n if (key.length !== KEY_LEN) throw new Error(`key must be ${KEY_LEN} bytes`);\n if (buf.length < 1 + 12 + 16 + 1) throw new Error(\"encrypted data truncated\");\n const v = buf[0];\n if (v !== 1) throw new Error(`unsupported data version: ${v}`);\n const iv = buf.subarray(1, 13);\n const tag = buf.subarray(13, 29);\n const ct = buf.subarray(29);\n const decipher = createDecipheriv(ALGO, key, iv);\n decipher.setAuthTag(tag);\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\n return JSON.parse(pt.toString(\"utf8\")) as T;\n}\n\n// ── key + path resolution ──\n\nexport function resolveDataDir(explicit?: string): string {\n if (explicit && explicit.length > 0) return path.resolve(explicit);\n return path.join(homedir(), \".hypermail-mcp\");\n}\n\nexport function parseEnvKey(raw: string): Buffer | undefined {\n const s = raw.trim();\n // hex (64 chars)\n if (/^[0-9a-fA-F]{64}$/.test(s)) return Buffer.from(s, \"hex\");\n // base64 — accept any length, then check\n try {\n const buf = Buffer.from(s, \"base64\");\n if (buf.length === KEY_LEN) return buf;\n } catch {\n /* ignore */\n }\n // last-resort: derive 32 bytes via SHA-256 over the raw string\n return createHash(\"sha256\").update(s, \"utf8\").digest();\n}\n\nexport async function resolveKey(dataDir: string): Promise<Buffer> {\n const env = process.env.HYPERMAIL_MCP_KEY;\n if (env && env.length > 0) {\n const k = parseEnvKey(env);\n if (k) return k;\n }\n\n // Try OS keychain via keytar (optional dep).\n const fromKeytar = await tryKeytarGet();\n if (fromKeytar) return fromKeytar;\n\n // Local-dev fallback: persist a generated key to a 0600 file.\n const keyFile = path.join(dataDir, \"master.key\");\n try {\n const existing = await fs.readFile(keyFile);\n if (existing.length === KEY_LEN) return existing;\n } catch {\n /* fall through to generate */\n }\n const gen = randomBytes(KEY_LEN);\n await fs.writeFile(keyFile, gen, { mode: 0o600 });\n await tryKeytarSet(gen);\n return gen;\n}\n\n// ── API key hashing (scrypt — built into Node, no native deps) ──\n\n/**\n * Hash an API key with scrypt. Returns \"salt:hash\" (both hex-encoded) for\n * storage. Suitable for <10 agents — scrypt is purpose-built for password\n * hashing and runs in-process with no native compilation.\n */\nexport function hashApiKey(apiKey: string): string {\n const salt = randomBytes(16).toString(\"hex\");\n const hash = scryptSync(apiKey, salt, 32).toString(\"hex\");\n return `${salt}:${hash}`;\n}\n\n/**\n * Verify a plaintext API key against a stored \"salt:hash\" string produced by\n * {@link hashApiKey}. Uses constant-time comparison.\n */\nexport function verifyApiKey(apiKey: string, stored: string): boolean {\n const [salt, hash] = stored.split(\":\");\n if (!salt || !hash) return false;\n try {\n const computed = scryptSync(apiKey, salt, 32);\n const expected = Buffer.from(hash, \"hex\");\n if (computed.length !== expected.length) return false;\n return timingSafeEqual(computed, expected);\n } catch {\n return false;\n }\n}\n\n// ── atomic file write ──\n\n/** Write `data` to `filePath` atomically (tmp + rename). */\nexport async function writeAtomic(filePath: string, data: Buffer): Promise<void> {\n const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n await fs.writeFile(tmp, data, { mode: 0o600 });\n await fs.rename(tmp, filePath);\n}\n\n// ── keytar helpers (private) ──\n\nasync function tryKeytarGet(): Promise<Buffer | undefined> {\n try {\n const mod = (await import(\"keytar\")) as typeof import(\"keytar\");\n const val = await mod.getPassword(\"hypermail-mcp\", \"master\");\n if (val) {\n const buf = Buffer.from(val, \"base64\");\n if (buf.length === KEY_LEN) return buf;\n }\n } catch {\n /* keytar not installed or unsupported platform */\n }\n return undefined;\n}\n\nasync function tryKeytarSet(key: Buffer): Promise<void> {\n try {\n const mod = (await import(\"keytar\")) as typeof import(\"keytar\");\n await mod.setPassword(\"hypermail-mcp\", \"master\", key.toString(\"base64\"));\n } catch {\n /* ignore */\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AccountRecord, AccountStore } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n AttachmentContent,\n CompleteAddAccountResult,\n CreateFolderInput,\n DraftUpdateInput,\n EmailFull,\n EmailProvider,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n SendInput,\n} from \"../types.js\";\nimport { OutlookClientFactory } from \"./client.js\";\nimport {\n awaitDeviceCodeReady,\n beginDeviceCode,\n type DeviceCodeBegin,\n} from \"./auth.js\";\nimport { convertInlineImages } from \"./helpers.js\";\nimport {\n addAttachmentToDraft,\n markRead,\n moveEmail,\n removeAttachmentFromDraft,\n sendDraft,\n sendOrSave,\n updateDraft,\n} from \"./write-ops.js\";\nimport {\n listEmails,\n readAttachment,\n readEmail,\n searchEmails,\n} from \"./read-ops.js\";\nimport {\n createFolder,\n deleteFolder,\n listFolders,\n renameFolder,\n} from \"./folders.js\";\n\nexport { convertInlineImages };\n\ninterface PendingFlow {\n begin: DeviceCodeBegin;\n emailHint?: string;\n startedAt: number;\n settled: \"pending\" | \"ready\" | \"error\" | \"expired\";\n account?: AccountRecord;\n error?: string;\n}\n\nexport interface OutlookProviderOptions {\n store: AccountStore;\n clientId?: string;\n tenantId?: string;\n}\n\nexport class OutlookProvider implements EmailProvider {\n readonly id = \"outlook\" as const;\n private readonly clients: OutlookClientFactory;\n private readonly pending = new Map<string, PendingFlow>();\n private readonly clientId?: string;\n private readonly tenantId?: string;\n\n constructor(private readonly opts: OutlookProviderOptions) {\n this.clientId = opts.clientId;\n this.tenantId = opts.tenantId;\n this.clients = new OutlookClientFactory(opts.store, opts.clientId, opts.tenantId);\n }\n\n // ---------- account lifecycle ----------\n\n async addAccount(input: AddAccountInput): Promise<AddAccountResult> {\n const begin = beginDeviceCode(undefined, this.clientId, this.tenantId);\n await awaitDeviceCodeReady(begin);\n\n const handle = randomUUID();\n const flow: PendingFlow = {\n begin,\n emailHint: input.email,\n startedAt: Date.now(),\n settled: \"pending\",\n };\n this.pending.set(handle, flow);\n\n // Fire-and-forget: when the user finishes, persist and update flow.\n begin.result\n .then(async ({ tokens, account }) => {\n const email = (account.username || input.email || \"\").toLowerCase();\n if (!email) {\n flow.settled = \"error\";\n flow.error = \"no email returned from Microsoft account\";\n return;\n }\n const rec: AccountRecord = {\n email,\n provider: \"outlook\",\n displayName: account.name ?? undefined,\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n };\n const saved = await this.opts.store.upsertAccount(rec);\n flow.account = saved;\n flow.settled = \"ready\";\n })\n .catch((err: unknown) => {\n flow.settled = \"error\";\n flow.error = err instanceof Error ? err.message : String(err);\n });\n\n return {\n status: \"pending\",\n handle,\n verification: {\n userCode: begin.userCode,\n verificationUri: begin.verificationUri,\n expiresAt: begin.expiresAt,\n message: begin.message,\n },\n };\n }\n\n async completeAddAccount(handle: string): Promise<CompleteAddAccountResult> {\n const flow = this.pending.get(handle);\n if (!flow) return { status: \"error\", error: \"unknown handle\" };\n // expire after 20 minutes regardless\n if (Date.now() - flow.startedAt > 20 * 60_000 && flow.settled === \"pending\") {\n flow.settled = \"expired\";\n flow.begin.cancel();\n }\n if (flow.settled === \"ready\" && flow.account) {\n this.pending.delete(handle);\n return { status: \"ready\", account: flow.account };\n }\n if (flow.settled === \"error\") {\n this.pending.delete(handle);\n return { status: \"error\", error: flow.error ?? \"unknown error\" };\n }\n if (flow.settled === \"expired\") {\n this.pending.delete(handle);\n return { status: \"expired\" };\n }\n return { status: \"pending\" };\n }\n\n // ---------- email ops (delegated) ----------\n\n async listEmails(account: AccountRecord, opts: ListEmailsOptions): Promise<ListEmailsResult> {\n return listEmails(this.clients.get(account), account, opts);\n }\n\n async searchEmails(\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n ): Promise<EmailSummary[]> {\n return searchEmails(this.clients.get(account), account, query, opts);\n }\n\n async readEmail(account: AccountRecord, id: string): Promise<EmailFull> {\n return readEmail(this.clients.get(account), account, id);\n }\n\n async readAttachment(\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n ): Promise<AttachmentContent> {\n return readAttachment(this.clients.get(account), account, messageId, attachmentId);\n }\n\n async sendEmail(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return sendOrSave(this.clients.get(account), account, msg, \"send\");\n }\n\n async saveDraft(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return sendOrSave(this.clients.get(account), account, msg, \"draft\");\n }\n\n async updateDraft(\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n ): Promise<{ id: string }> {\n return updateDraft(this.clients.get(account), account, id, update);\n }\n\n async moveEmail(account: AccountRecord, id: string, destinationId: string): Promise<void> {\n return moveEmail(this.clients.get(account), account, id, destinationId);\n }\n\n async sendDraft(account: AccountRecord, id: string): Promise<{ id: string }> {\n return sendDraft(this.clients.get(account), account, id);\n }\n\n async addAttachmentToDraft(\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n ): Promise<{ id: string; attachment: { id: string; name: string; contentType?: string } }> {\n return addAttachmentToDraft(\n this.clients.get(account),\n account,\n draftId,\n name,\n contentBytes,\n contentType,\n );\n }\n\n async removeAttachmentFromDraft(\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n ): Promise<void> {\n return removeAttachmentFromDraft(this.clients.get(account), account, draftId, attachmentId);\n }\n\n async markRead(account: AccountRecord, id: string, isRead: boolean): Promise<void> {\n return markRead(this.clients.get(account), account, id, isRead);\n }\n\n // ---------- folder ops (delegated) ----------\n\n async listFolders(account: AccountRecord, opts: ListFoldersOptions): Promise<FolderInfo[]> {\n return listFolders(this.clients.get(account), account, opts);\n }\n\n async createFolder(account: AccountRecord, input: CreateFolderInput): Promise<FolderInfo> {\n return createFolder(this.clients.get(account), account, input);\n }\n\n async renameFolder(\n account: AccountRecord,\n folderId: string,\n newName: string,\n ): Promise<FolderInfo> {\n return renameFolder(this.clients.get(account), account, folderId, newName);\n }\n\n async deleteFolder(account: AccountRecord, folderId: string): Promise<void> {\n return deleteFolder(this.clients.get(account), account, folderId);\n }\n}\n","import \"isomorphic-fetch\";\nimport {\n Client,\n type AuthenticationProvider,\n} from \"@microsoft/microsoft-graph-client\";\n\nimport type { AccountStore, AccountRecord } from \"../../store/account-store.js\";\nimport { acquireAccessToken, isSerializedTokens, type SerializedTokens } from \"./auth.js\";\n\n/**\n * Builds a Graph `Client` bound to a stored account. The client uses an\n * `AuthenticationProvider` that calls msal silently on every request, and\n * writes the (possibly-refreshed) cache back into the AccountStore.\n *\n * Clients are cached per email since the underlying SDK reuses connections.\n */\nexport class OutlookClientFactory {\n private readonly cache = new Map<string, Client>();\n /** Serialize token refreshes per email to prevent concurrent-refresh races. */\n private readonly refreshLocks = new Map<string, Promise<string>>();\n\n constructor(\n private readonly store: AccountStore,\n private readonly clientId?: string,\n private readonly tenantId?: string,\n ) {}\n\n get(account: AccountRecord): Client {\n const key = account.email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) return existing;\n\n const store = this.store;\n const refreshLocks = this.refreshLocks;\n const provider: AuthenticationProvider = {\n getAccessToken: async () => {\n const existing = refreshLocks.get(key);\n if (existing) {\n try {\n return await existing;\n } catch {\n // previous refresh failed — fall through to retry\n }\n }\n const promise = (async (): Promise<string> => {\n const fresh = store.getAccount(account.email) ?? account;\n if (!isSerializedTokens(fresh.tokens)) {\n throw new Error(\n \"Outlook account tokens are missing or corrupted — re-run add_account\",\n );\n }\n const tokens: SerializedTokens = fresh.tokens;\n const { accessToken, tokens: nextTokens } = await acquireAccessToken(\n tokens,\n undefined,\n this.clientId,\n this.tenantId,\n );\n if (nextTokens.msalCache !== tokens.msalCache) {\n store\n .upsertAccount({\n ...fresh,\n tokens: nextTokens as unknown as Record<string, unknown>,\n })\n .catch(() => {\n /* swallow — next call will refresh again */\n });\n }\n return accessToken;\n })();\n refreshLocks.set(key, promise);\n try {\n return await promise;\n } finally {\n refreshLocks.delete(key);\n }\n },\n };\n\n const client = Client.initWithMiddleware({ authProvider: provider });\n this.cache.set(key, client);\n return client;\n }\n\n /** Drop a cached client (e.g. after removeAccount). */\n invalidate(email: string): void {\n this.cache.delete(email.toLowerCase());\n }\n}\n","import {\n PublicClientApplication,\n type Configuration,\n type AuthenticationResult,\n type AccountInfo,\n} from \"@azure/msal-node\";\n\n/**\n * Public client app id. Default is the well-known `ms-365` client id used by\n * the softeria/ms-365-mcp-server project — it's a public client registered\n * for personal MSA + multi-tenant work/school. Users can override via\n * MS_CLIENT_ID for their own Entra app registrations.\n */\nconst DEFAULT_CLIENT_ID = \"084a3e9f-a9f4-43f7-89f9-d229cf97853e\";\n// ^ Pre-registered public client app (same one used by softeria/ms-365-mcp-server).\n// Supports personal MSA + multi-tenant work/school via device-code flow.\n// Operators should set MS_CLIENT_ID to a client they control for production.\n\nconst DEFAULT_SCOPES = [\n \"offline_access\",\n \"User.Read\",\n \"Mail.ReadWrite\",\n \"Mail.Send\",\n];\n\nexport interface DeviceCodeBegin {\n userCode: string;\n verificationUri: string;\n message: string;\n expiresAt: string; // ISO\n /** Resolves with the auth result once the user completes the flow. */\n result: Promise<{ tokens: SerializedTokens; account: AccountInfo }>;\n /** Aborts the in-flight polling promise. */\n cancel(): void;\n}\n\nexport interface SerializedTokens {\n /** MSAL cache JSON, encrypted at rest by the account store. */\n msalCache: string;\n /** Home account id used to look up the account in the rehydrated cache. */\n homeAccountId: string;\n /** Tenant id captured at sign-in. */\n tenantId: string;\n /** Username captured at sign-in (typically the primary email). */\n username: string;\n scopes: string[];\n}\n\n/** Type guard — validates that an unknown value has the shape of SerializedTokens. */\nexport function isSerializedTokens(obj: unknown): obj is SerializedTokens {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return (\n typeof o.msalCache === \"string\" &&\n typeof o.homeAccountId === \"string\" &&\n typeof o.tenantId === \"string\" &&\n typeof o.username === \"string\" &&\n Array.isArray(o.scopes)\n );\n}\n\nfunction makeConfig(prevCacheJson?: string, clientIdOverride?: string, tenantOverride?: string): Configuration {\n const clientId = clientIdOverride || DEFAULT_CLIENT_ID;\n const tenant = tenantOverride || \"common\";\n return {\n auth: {\n clientId,\n authority: `https://login.microsoftonline.com/${tenant}`,\n },\n cache: prevCacheJson\n ? {\n // msal-node supports an in-memory cache plugin; we hydrate manually\n // below via deserialize after construction.\n }\n : undefined,\n };\n}\n\nexport function buildPca(prevCacheJson?: string, clientIdOverride?: string, tenantOverride?: string): PublicClientApplication {\n const pca = new PublicClientApplication(makeConfig(prevCacheJson, clientIdOverride, tenantOverride));\n if (prevCacheJson) {\n pca.getTokenCache().deserialize(prevCacheJson);\n }\n return pca;\n}\n\n/**\n * Start a device-code flow. The returned `result` promise resolves once the\n * user has entered the code and consented; callers should poll it (or await it)\n * via `complete_add_account`.\n */\nexport function beginDeviceCode(\n scopes: string[] = DEFAULT_SCOPES,\n clientIdOverride?: string,\n tenantOverride?: string,\n): DeviceCodeBegin {\n const pca = buildPca(undefined, clientIdOverride, tenantOverride);\n let resolve!: (v: { tokens: SerializedTokens; account: AccountInfo }) => void;\n let reject!: (err: unknown) => void;\n const result = new Promise<{ tokens: SerializedTokens; account: AccountInfo }>(\n (res, rej) => {\n resolve = res;\n reject = rej;\n },\n );\n\n // We capture the deviceCodeCallback synchronously to surface the user-facing\n // info back out via this object before awaiting the long-running poll.\n let userCode = \"\";\n let verificationUri = \"\";\n let message = \"\";\n let expiresAt = new Date(Date.now() + 15 * 60_000).toISOString();\n let aborted = false;\n\n const ready = new Promise<void>((r) => {\n pca\n .acquireTokenByDeviceCode({\n scopes,\n deviceCodeCallback: (info) => {\n if (!info.userCode || !info.verificationUri) {\n // MSAL may fire the callback with an empty object if the\n // downstream HTTP request fails — reject so the caller\n // gets a clear error instead of silent empty strings.\n reject(\n new Error(\n \"Microsoft device-code endpoint returned no code. \" +\n \"Check MS_CLIENT_ID is a valid Azure Entra public-client application.\",\n ),\n );\n return;\n }\n userCode = info.userCode;\n verificationUri = info.verificationUri;\n message = info.message;\n if (info.expiresIn) {\n expiresAt = new Date(Date.now() + info.expiresIn * 1000).toISOString();\n }\n r();\n },\n })\n .then((authResult: AuthenticationResult | null) => {\n if (aborted) return;\n if (!authResult || !authResult.account) {\n reject(new Error(\"device-code flow returned no account\"));\n return;\n }\n const cache = pca.getTokenCache().serialize();\n const tokens: SerializedTokens = {\n msalCache: cache,\n homeAccountId: authResult.account.homeAccountId,\n tenantId: authResult.account.tenantId,\n username: authResult.account.username,\n scopes,\n };\n resolve({ tokens, account: authResult.account });\n })\n .catch((err) => {\n if (!aborted) reject(err);\n });\n });\n\n // Surface device-code info synchronously via a wrapper Promise:\n // we return the object but its strings are populated once `ready` settles.\n // To keep the API simple, we attach a getter that callers must `await` on.\n // Instead of getters, we wait for `ready` inside the begin helper:\n return {\n // these are placeholders until ready resolves\n get userCode() {\n return userCode;\n },\n get verificationUri() {\n return verificationUri;\n },\n get message() {\n return message;\n },\n get expiresAt() {\n return expiresAt;\n },\n result,\n cancel() {\n aborted = true;\n },\n // hidden helper for the caller to await initial code\n // (typed via a cast below where used)\n ...({ _ready: ready } as Record<string, unknown>),\n } as DeviceCodeBegin;\n}\n\n/** Await `_ready` so the user-code fields are populated. */\nexport async function awaitDeviceCodeReady(b: DeviceCodeBegin): Promise<void> {\n const r = (b as unknown as { _ready: Promise<void> })._ready;\n await r;\n}\n\n/**\n * Acquire a fresh access token for a stored account, refreshing silently from\n * the persisted MSAL cache. Returns the (possibly-updated) cache so the caller\n * can write it back to the store.\n */\nexport async function acquireAccessToken(\n tokens: SerializedTokens,\n scopes: string[] = DEFAULT_SCOPES,\n clientIdOverride?: string,\n tenantOverride?: string,\n): Promise<{ accessToken: string; tokens: SerializedTokens }> {\n const pca = buildPca(tokens.msalCache, clientIdOverride, tenantOverride);\n const cache = pca.getTokenCache();\n const account =\n (await cache.getAccountByHomeId(tokens.homeAccountId)) ??\n (await cache.getAllAccounts()).find((a) => a.username === tokens.username);\n if (!account) {\n throw new Error(\"no MSAL account in cache — re-run add_account\");\n }\n const res = await pca.acquireTokenSilent({ account, scopes });\n if (!res?.accessToken) {\n throw new Error(\"acquireTokenSilent returned no access token\");\n }\n const next: SerializedTokens = {\n ...tokens,\n msalCache: cache.serialize(),\n scopes,\n };\n return { accessToken: res.accessToken, tokens: next };\n}\n","import { randomUUID } from \"node:crypto\";\n\n/** A generic inline image extracted from an HTML body. */\nexport interface InlineImage {\n /** The generated Content-ID (without \"cid:\" prefix). */\n cid: string;\n /** Raw base64 content bytes (without the data:image/...;base64, prefix). */\n contentBytes: string;\n /** Full MIME type, e.g. \"image/png\". */\n contentType: string;\n /** Suggested filename, e.g. \"signature-image.png\". */\n filename: string;\n}\n\n/**\n * Parse an HTML body for `data:image/<subtype>;base64,<payload>` URIs inside\n * `src=\"...\"` attributes. Each match is replaced with a `cid:<uuid>` reference,\n * and the extracted base64 data is collected into a flat image array.\n *\n * This is provider-agnostic — each provider wraps the result into its own\n * attachment format (e.g. Outlook `@odata.type` objects or nodemailer\n * `cid` attachments).\n */\nexport function parseInlineImages(html: string): {\n body: string;\n images: InlineImage[];\n} {\n const images: InlineImage[] = [];\n // Match src=\"data:image/<subtype>;base64,<payload>\"\n // Supports png, jpg, jpeg, gif, svg+xml, webp, bmp, etc.\n const re = /src=\"data:image\\/([\\w+]+);base64,([^\"]+)\"/gi;\n\n const transformed = html.replace(re, (_fullMatch, mimeSubtype, b64) => {\n const contentId = `sig-img-${randomUUID()}`;\n const ext =\n mimeSubtype.toLowerCase().replace(/\\+/g, \"-\") === \"svg-xml\"\n ? \"svg\"\n : mimeSubtype.toLowerCase().replace(/\\+/g, \"-\");\n images.push({\n cid: contentId,\n contentBytes: b64,\n contentType: `image/${mimeSubtype}`,\n filename: `signature-image.${ext}`,\n });\n return `src=\"cid:${contentId}\"`;\n });\n\n return { body: transformed, images };\n}\n","import { parseInlineImages } from \"../shared/inline-images.js\";\nimport type { EmailAddress, EmailSummary, FolderInfo } from \"../types.js\";\n\nexport interface InlineAttachment {\n \"@odata.type\": string;\n name: string;\n contentType: string;\n contentId: string;\n contentBytes: string;\n isInline: boolean;\n}\n\n/**\n * Scans HTML for data:image/...;base64,... URIs, extracts the raw base64\n * data, assigns unique contentIds, and returns the transformed body\n * (with src=\"cid:...\" references) plus an array of inline fileAttachment\n * objects ready for the Graph API.\n *\n * Delegates the HTML parsing to the shared {@link parseInlineImages} and\n * then wraps each image in an Outlook-specific `@odata.type` attachment.\n *\n * Pass-through when there are no matches — returns the original body with\n * an empty attachments array.\n */\nexport function convertInlineImages(body: string): {\n body: string;\n attachments: InlineAttachment[];\n} {\n const { body: transformed, images } = parseInlineImages(body);\n const attachments: InlineAttachment[] = images.map((img) => ({\n \"@odata.type\": \"#microsoft.graph.fileAttachment\",\n name: img.filename,\n contentType: img.contentType,\n contentId: img.cid,\n contentBytes: img.contentBytes,\n isInline: true,\n }));\n return { body: transformed, attachments };\n}\n\nexport interface GraphRecipient {\n emailAddress?: { name?: string; address?: string };\n}\n\nexport interface GraphMessage {\n id: string;\n subject?: string;\n from?: GraphRecipient;\n toRecipients?: GraphRecipient[];\n ccRecipients?: GraphRecipient[];\n bccRecipients?: GraphRecipient[];\n receivedDateTime?: string;\n bodyPreview?: string;\n isRead?: boolean;\n hasAttachments?: boolean;\n body?: { contentType?: \"text\" | \"html\"; content?: string };\n}\n\nexport interface GraphAttachment {\n id: string;\n name: string;\n contentType?: string;\n size?: number;\n}\n\nexport interface GraphFolder {\n id: string;\n displayName: string;\n parentFolderId?: string;\n childFolderCount: number;\n totalItemCount: number;\n unreadItemCount: number;\n}\n\nexport function mapFolder(f: GraphFolder): FolderInfo {\n return {\n id: f.id,\n displayName: f.displayName,\n parentFolderId: f.parentFolderId,\n childFolderCount: f.childFolderCount,\n totalItemCount: f.totalItemCount,\n unreadItemCount: f.unreadItemCount,\n };\n}\n\nexport function mapRecipient(r: GraphRecipient): EmailAddress {\n return {\n name: r.emailAddress?.name,\n address: r.emailAddress?.address ?? \"\",\n };\n}\n\nexport function mapSummary(m: GraphMessage, folder?: string): EmailSummary {\n return {\n id: m.id,\n subject: m.subject ?? \"\",\n from: m.from ? mapRecipient(m.from) : undefined,\n to: (m.toRecipients ?? []).map(mapRecipient),\n receivedAt: m.receivedDateTime,\n preview: m.bodyPreview,\n isRead: m.isRead,\n hasAttachments: m.hasAttachments,\n folder,\n };\n}\n\nexport function toRecipient(a: EmailAddress): GraphRecipient {\n return { emailAddress: { name: a.name, address: a.address } };\n}\n\nexport function clampLimit(v: number | undefined, dflt: number, max: number): number {\n if (!v || v <= 0) return dflt;\n return Math.min(v, max);\n}\n","import type { Client } from \"@microsoft/microsoft-graph-client\";\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type { DraftUpdateInput, SendInput } from \"../types.js\";\nimport { convertInlineImages, type InlineAttachment, toRecipient } from \"./helpers.js\";\n\n/** Hidden HTML comment placed at the thread boundary to survive Graph HTML normalization. */\nexport const THREAD_MARKER = \"<!-- hypermail-thread-boundary -->\";\n\n/**\n * Creates a draft from a reference message (forward or reply), prepends our\n * composed body before the existing content, and attaches inline images.\n * Returns the draft message ID.\n */\nexport async function buildDraftFromReference(\n client: Client,\n createEndpoint: string,\n createPayload: Record<string, unknown>,\n converted: { body: string; attachments: InlineAttachment[] },\n): Promise<string> {\n const draft: { id: string } = await client\n .api(createEndpoint)\n .post(createPayload);\n\n const draftMsg: { body?: { content?: string; contentType?: string } } =\n await client.api(`/me/messages/${draft.id}`).select(\"body\").get();\n\n const draftBody = draftMsg.body?.content ?? \"\";\n const draftContentType = draftMsg.body?.contentType ?? \"HTML\";\n const spacer = '<div style=\"line-height:12px\"><br></div>';\n const prepend = converted.body + spacer + THREAD_MARKER;\n const finalBody = draftBody.includes(\"<body\")\n ? draftBody.replace(/(<body[^>]*>)/i, `$1${prepend}`)\n : prepend + draftBody;\n\n await client.api(`/me/messages/${draft.id}`).patch({\n body: { contentType: draftContentType, content: finalBody },\n });\n\n for (const att of converted.attachments) {\n await client.api(`/me/messages/${draft.id}/attachments`).post(att);\n }\n\n return draft.id;\n}\n\n/**\n * Shared backend for sendEmail and saveDraft — handles forward, reply, and\n * new-message paths. The `mode` controls whether the message is sent\n * immediately or saved as a draft.\n */\nexport async function sendOrSave(\n client: Client,\n account: AccountRecord,\n msg: SendInput,\n mode: \"send\" | \"draft\",\n): Promise<{ id: string }> {\n const converted = convertInlineImages(msg.body);\n\n const toRecipients = msg.to.map(toRecipient);\n const ccRecipients = (msg.cc ?? []).map(toRecipient);\n const bccRecipients = (msg.bcc ?? []).map(toRecipient);\n\n // Forward — build a forward draft, then send if mode is \"send\".\n if (msg.forwardMessageId) {\n const draftId = await buildDraftFromReference(\n client,\n `/me/messages/${encodeURIComponent(msg.forwardMessageId)}/createForward`,\n { message: { toRecipients, ccRecipients, bccRecipients }, comment: \"\" },\n converted,\n );\n if (mode === \"send\") {\n await client.api(`/me/messages/${draftId}/send`).post({});\n }\n return { id: draftId };\n }\n\n // Reply — build a reply draft, then send if mode is \"send\".\n if (msg.inReplyTo) {\n const createEndpoint = msg.replyAll\n ? `/me/messages/${encodeURIComponent(msg.inReplyTo)}/createReplyAll`\n : `/me/messages/${encodeURIComponent(msg.inReplyTo)}/createReply`;\n const draftId = await buildDraftFromReference(\n client, createEndpoint, {}, converted,\n );\n if (mode === \"send\") {\n await client.api(`/me/messages/${draftId}/send`).post({});\n }\n return { id: draftId };\n }\n\n // New email — sendMail (mode=send) or POST /me/messages (mode=draft).\n const messagePayload: Record<string, unknown> = {\n subject: msg.subject,\n body: {\n contentType: msg.isHtml ? \"HTML\" : \"Text\",\n content: converted.body,\n },\n toRecipients,\n ccRecipients,\n bccRecipients,\n };\n\n // Merge inline attachments (from HTML body) with file attachments\n const allAttachments: unknown[] = [...converted.attachments];\n if (msg.attachments && msg.attachments.length > 0) {\n for (const att of msg.attachments) {\n allAttachments.push({\n \"@odata.type\": \"#microsoft.graph.fileAttachment\",\n name: att.name,\n contentBytes: att.contentBytes,\n contentType: att.contentType ?? \"application/octet-stream\",\n });\n }\n }\n if (allAttachments.length > 0) {\n messagePayload.attachments = allAttachments;\n }\n\n if (mode === \"send\") {\n await client.api(\"/me/sendMail\").post({\n message: messagePayload,\n saveToSentItems: true,\n });\n // Graph's sendMail returns 202 with no body; we don't have an id back.\n return { id: \"\" };\n }\n\n const draft: { id: string } = await client\n .api(\"/me/messages\")\n .post(messagePayload);\n return { id: draft.id };\n}\n\nexport async function updateDraft(\n client: Client,\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n): Promise<{ id: string }> {\n const payload: Record<string, unknown> = {};\n\n if (update.subject !== undefined) {\n payload.subject = update.subject;\n }\n if (update.to !== undefined) {\n payload.toRecipients = update.to.map(toRecipient);\n }\n if (update.cc !== undefined) {\n payload.ccRecipients = update.cc.map(toRecipient);\n }\n if (update.bcc !== undefined) {\n payload.bccRecipients = update.bcc.map(toRecipient);\n }\n if (update.body !== undefined) {\n const converted = convertInlineImages(update.body);\n payload.body = {\n contentType: update.isHtml ? \"HTML\" : \"Text\",\n content: converted.body,\n };\n if (converted.attachments.length > 0) {\n // Patch existing inline attachments: Graph will replace all\n // attachments on the message. We send only the new ones.\n payload.attachments = converted.attachments;\n }\n }\n\n await client\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .patch(payload);\n\n return { id };\n}\n\nexport async function addAttachmentToDraft(\n client: Client,\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n): Promise<{ id: string; attachment: { id: string; name: string; contentType?: string } }> {\n const att = (await client\n .api(`/me/messages/${encodeURIComponent(draftId)}/attachments`)\n .post({\n \"@odata.type\": \"#microsoft.graph.fileAttachment\",\n name,\n contentType: contentType ?? \"application/octet-stream\",\n contentBytes,\n })) as { id: string; name: string; contentType?: string };\n return {\n id: draftId,\n attachment: { id: att.id, name: att.name, contentType: att.contentType },\n };\n}\n\nexport async function removeAttachmentFromDraft(\n client: Client,\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n): Promise<void> {\n await client\n .api(`/me/messages/${encodeURIComponent(draftId)}/attachments/${encodeURIComponent(attachmentId)}`)\n .delete();\n}\n\nexport async function moveEmail(\n client: Client,\n account: AccountRecord,\n id: string,\n destinationId: string,\n): Promise<void> {\n await client\n .api(`/me/messages/${encodeURIComponent(id)}/move`)\n .post({ destinationId });\n}\n\nexport async function sendDraft(\n client: Client,\n account: AccountRecord,\n id: string,\n): Promise<{ id: string }> {\n await client.api(`/me/messages/${encodeURIComponent(id)}/send`).post({});\n return { id };\n}\n\nexport async function markRead(\n client: Client,\n account: AccountRecord,\n id: string,\n isRead: boolean,\n): Promise<void> {\n await client\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .patch({ isRead });\n}\n","import { ResponseType } from \"@microsoft/microsoft-graph-client\";\nimport { writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join as pathJoin } from \"node:path\";\nimport type { Client } from \"@microsoft/microsoft-graph-client\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailFull,\n EmailSummary,\n ListEmailsOptions,\n ListEmailsResult,\n SearchEmailsOptions,\n} from \"../types.js\";\nimport {\n clampLimit,\n type GraphAttachment,\n type GraphMessage,\n mapRecipient,\n mapSummary,\n} from \"./helpers.js\";\n\nexport async function listEmails(\n client: Client,\n account: AccountRecord,\n opts: ListEmailsOptions,\n): Promise<ListEmailsResult> {\n const limit = clampLimit(opts.limit, 25, 100);\n const folder = opts.folder ?? \"inbox\";\n const filterParts: string[] = [];\n if (opts.unreadOnly) filterParts.push(\"isRead eq false\");\n\n let req = client\n .api(`/me/mailFolders/${encodeURIComponent(folder)}/messages`)\n .top(limit)\n .skip(opts.skip ?? 0)\n .select([\n \"id\",\n \"subject\",\n \"from\",\n \"toRecipients\",\n \"receivedDateTime\",\n \"bodyPreview\",\n \"isRead\",\n \"hasAttachments\",\n ].join(\",\"))\n .orderby(\"receivedDateTime DESC\");\n\n if (filterParts.length > 0) req = req.filter(filterParts.join(\" and \"));\n\n const res = (await req.get()) as { value: GraphMessage[]; \"@odata.nextLink\"?: string };\n return {\n items: res.value.map((m) => mapSummary(m, folder)),\n hasMore: !!res[\"@odata.nextLink\"],\n };\n}\n\nexport async function searchEmails(\n client: Client,\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n): Promise<EmailSummary[]> {\n const limit = clampLimit(opts.limit, 25, 100);\n // $search requires the ConsistencyLevel: eventual header\n const res = (await client\n .api(\"/me/messages\")\n .header(\"ConsistencyLevel\", \"eventual\")\n .top(limit)\n .search(`\"${query.replace(/\"/g, '\\\\\"')}\"`)\n .select(\n [\n \"id\",\n \"subject\",\n \"from\",\n \"toRecipients\",\n \"receivedDateTime\",\n \"bodyPreview\",\n \"isRead\",\n \"hasAttachments\",\n ].join(\",\"),\n )\n .get()) as { value: GraphMessage[] };\n return res.value.map((m) => mapSummary(m));\n}\n\nexport async function readEmail(\n client: Client,\n account: AccountRecord,\n id: string,\n): Promise<EmailFull> {\n const m = (await client\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .select(\n [\n \"id\",\n \"subject\",\n \"from\",\n \"toRecipients\",\n \"ccRecipients\",\n \"bccRecipients\",\n \"receivedDateTime\",\n \"bodyPreview\",\n \"isRead\",\n \"hasAttachments\",\n \"body\",\n ].join(\",\"),\n )\n .get()) as GraphMessage;\n\n let attachments: EmailFull[\"attachments\"] = undefined;\n if (m.hasAttachments) {\n try {\n const attRes = (await client\n .api(`/me/messages/${encodeURIComponent(id)}/attachments`)\n .select(\"id,name,contentType,size\")\n .get()) as { value: GraphAttachment[] };\n attachments = attRes.value.map((a) => ({\n id: a.id,\n name: a.name,\n contentType: a.contentType,\n size: a.size,\n }));\n } catch {\n /* ignore attachment listing failure */\n }\n }\n\n const summary = mapSummary(m);\n const body = m.body;\n return {\n ...summary,\n cc: (m.ccRecipients ?? []).map(mapRecipient),\n bcc: (m.bccRecipients ?? []).map(mapRecipient),\n bodyText: body?.contentType === \"text\" ? body.content : undefined,\n bodyHtml: body?.contentType === \"html\" ? body.content : undefined,\n attachments,\n };\n}\n\nexport async function readAttachment(\n client: Client,\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n): Promise<AttachmentContent> {\n // First, get the attachment metadata to know the filename\n const att = (await client\n .api(`/me/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`)\n .select(\"name,contentType\")\n .get()) as { name: string; contentType?: string };\n\n // Download the raw content as ArrayBuffer\n const data = (await client\n .api(`/me/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}/$value`)\n .responseType(ResponseType.ARRAYBUFFER)\n .get()) as ArrayBuffer;\n\n // Write to temp file with original name\n const outPath = pathJoin(tmpdir(), att.name);\n writeFileSync(outPath, Buffer.from(data));\n\n return {\n name: att.name,\n contentType: att.contentType,\n path: outPath,\n };\n}\n","import type { Client } from \"@microsoft/microsoft-graph-client\";\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n CreateFolderInput,\n FolderInfo,\n ListFoldersOptions,\n} from \"../types.js\";\nimport { type GraphFolder, mapFolder } from \"./helpers.js\";\n\nexport async function listFolders(\n client: Client,\n account: AccountRecord,\n opts: ListFoldersOptions,\n): Promise<FolderInfo[]> {\n const endpoint = opts.parentFolderId\n ? `/me/mailFolders/${encodeURIComponent(opts.parentFolderId)}/childFolders`\n : \"/me/mailFolders\";\n const res = (await client\n .api(endpoint)\n .select([\n \"id\",\n \"displayName\",\n \"parentFolderId\",\n \"childFolderCount\",\n \"totalItemCount\",\n \"unreadItemCount\",\n ].join(\",\"))\n .get()) as { value: GraphFolder[] };\n return (res.value ?? []).map(mapFolder);\n}\n\nexport async function createFolder(\n client: Client,\n account: AccountRecord,\n input: CreateFolderInput,\n): Promise<FolderInfo> {\n const parentId = input.parentFolderId ?? \"msgfolderroot\";\n const created = (await client\n .api(`/me/mailFolders/${encodeURIComponent(parentId)}/childFolders`)\n .post({ displayName: input.displayName })) as GraphFolder;\n return mapFolder(created);\n}\n\nexport async function renameFolder(\n client: Client,\n account: AccountRecord,\n folderId: string,\n newName: string,\n): Promise<FolderInfo> {\n const updated = (await client\n .api(`/me/mailFolders/${encodeURIComponent(folderId)}`)\n .patch({ displayName: newName })) as GraphFolder;\n return mapFolder(updated);\n}\n\nexport async function deleteFolder(\n client: Client,\n account: AccountRecord,\n folderId: string,\n): Promise<void> {\n await client\n .api(`/me/mailFolders/${encodeURIComponent(folderId)}`)\n .delete();\n}\n","import { ImapFlow } from \"imapflow\";\nimport type { Readable } from \"node:stream\";\nimport nodemailer from \"nodemailer\";\nimport type { Transporter } from \"nodemailer\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\n\n// ---------- token shape ----------\n\nexport interface ImapTokens {\n host: string;\n port: number;\n secure: boolean;\n user: string;\n password: string;\n smtpHost: string;\n smtpPort: number;\n smtpSecure: boolean;\n}\n\n/** Type guard — validates that an unknown value has the shape of ImapTokens. */\nexport function isImapTokens(obj: unknown): obj is ImapTokens {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return (\n typeof o.host === \"string\" &&\n typeof o.port === \"number\" &&\n typeof o.user === \"string\" &&\n typeof o.password === \"string\" &&\n typeof o.smtpHost === \"string\" &&\n typeof o.smtpPort === \"number\"\n );\n}\n\n/** Extract IMAP tokens from an account record, throwing if malformed. */\nexport function extractTokens(account: AccountRecord): ImapTokens {\n if (!isImapTokens(account.tokens)) {\n throw new Error(\n \"IMAP account tokens are missing or corrupted — re-run add_account\",\n );\n }\n return account.tokens as ImapTokens;\n}\n\n// ---------- client ----------\n\n/**\n * Per-account IMAP+SMTP client. Wraps an {@link ImapFlow} connection and a\n * {@link Transporter} from nodemailer. The factory caches instances so a\n * single account reuses its connection across calls.\n */\nexport class ImapClient {\n private imap: ImapFlow | null = null;\n private transporter: Transporter | null = null;\n private connecting: Promise<void> | null = null;\n\n constructor(private readonly tokens: ImapTokens) {}\n\n /** Get (or create) the ImapFlow instance. */\n async getImap(): Promise<ImapFlow> {\n if (this.imap) return this.imap;\n\n this.imap = new ImapFlow({\n host: this.tokens.host,\n port: this.tokens.port,\n secure: this.tokens.secure,\n auth: {\n user: this.tokens.user,\n pass: this.tokens.password,\n },\n logger: false,\n });\n\n // Connect on first use and serialise concurrent callers.\n if (!this.connecting) {\n this.connecting = this.imap\n .connect()\n .catch((err) => {\n // Clear state so next caller retries\n this.imap = null;\n this.connecting = null;\n throw err;\n });\n }\n await this.connecting;\n return this.imap;\n }\n\n /** Get (or create) a nodemailer SMTP transporter. */\n getTransporter(): Transporter {\n if (this.transporter) return this.transporter;\n this.transporter = nodemailer.createTransport({\n host: this.tokens.smtpHost,\n port: this.tokens.smtpPort,\n secure: this.tokens.smtpSecure,\n auth: {\n user: this.tokens.user,\n pass: this.tokens.password,\n },\n });\n return this.transporter;\n }\n\n /**\n * Acquire a mailbox lock and run `fn` with the mailbox selected.\n * Releases the lock automatically after `fn` completes.\n */\n async withMailbox<T>(mailbox: string, fn: (imap: ImapFlow) => Promise<T>): Promise<T> {\n const imap = await this.getImap();\n const lock = await imap.getMailboxLock(mailbox);\n try {\n return await fn(imap);\n } finally {\n lock.release();\n }\n }\n\n /** Disconnect IMAP and close the SMTP pool. */\n async disconnect(): Promise<void> {\n if (this.imap) {\n try {\n await this.imap.logout();\n } catch {\n /* ignore */\n }\n this.imap = null;\n this.connecting = null;\n }\n if (this.transporter) {\n this.transporter.close();\n this.transporter = null;\n }\n }\n}\n\n// ---------- factory ----------\n\n/**\n * Caches {@link ImapClient} instances per account email so connections are\n * reused across calls. Analogous to {@link OutlookClientFactory}.\n */\nexport class ImapClientFactory {\n private readonly cache = new Map<string, ImapClient>();\n\n get(account: AccountRecord): ImapClient {\n const key = account.email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) return existing;\n\n const tokens = extractTokens(account);\n const client = new ImapClient(tokens);\n this.cache.set(key, client);\n return client;\n }\n\n /** Drop a cached client (e.g. after removeAccount). */\n invalidate(email: string): void {\n const key = email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) {\n existing.disconnect().catch(() => {});\n this.cache.delete(key);\n }\n }\n}\n","import { createWriteStream } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join as pathJoin } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { Readable } from \"node:stream\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailFull,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\nimport {\n BodyNode,\n clampLimit,\n decodeId,\n findAttachments,\n findPartByType,\n ImapEnvelope,\n mapSummary,\n mapEnvelopeAddr,\n mapMailboxToListEntry,\n ImapMailboxEntry,\n resolveFolder,\n} from \"./helpers.js\";\n\n/**\n * Browse operations for IMAP — list, search, read emails, attachments,\n * and folders. All functions are pure and take the client factory as\n * the first argument so the ImapProvider class can delegate to them.\n */\n\nexport async function listEmails(\n clients: ImapClientFactory,\n account: AccountRecord,\n opts: ListEmailsOptions,\n): Promise<ListEmailsResult> {\n const client = clients.get(account);\n const folder = resolveFolder(opts.folder ?? \"INBOX\");\n const limit = clampLimit(opts.limit, 25, 100);\n const skip = opts.skip ?? 0;\n\n return client.withMailbox(folder, async (imap) => {\n const searchCriteria: Record<string, unknown> = {};\n if (opts.unreadOnly) searchCriteria.seen = false;\n\n const allUids = (\n Object.keys(searchCriteria).length > 0\n ? await imap.search(searchCriteria, { uid: true })\n : await imap.search({ all: true }, { uid: true })\n ) as number[];\n\n allUids.sort((a, b) => b - a);\n const pageUids = allUids.slice(skip, skip + limit);\n const hasMore = skip + limit < allUids.length;\n\n if (pageUids.length === 0) {\n return { items: [], hasMore };\n }\n\n const messages = await imap.fetchAll(\n pageUids,\n { envelope: true, flags: true },\n { uid: true },\n );\n\n const items: EmailSummary[] = [];\n for (const msg of messages) {\n items.push(\n mapSummary(\n msg.uid as number,\n folder,\n msg.envelope as ImapEnvelope,\n msg.flags as Set<string>,\n ),\n );\n }\n return { items, hasMore };\n });\n}\n\nexport async function searchEmails(\n clients: ImapClientFactory,\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n): Promise<EmailSummary[]> {\n const client = clients.get(account);\n const limit = clampLimit(opts.limit, 25, 100);\n\n return client.withMailbox(\"INBOX\", async (imap) => {\n const uids = (await imap.search({ text: query }, { uid: true })) as number[];\n uids.sort((a, b) => b - a);\n const pageUids = uids.slice(0, limit);\n\n if (pageUids.length === 0) return [];\n\n const messages = await imap.fetchAll(\n pageUids,\n { envelope: true, flags: true },\n { uid: true },\n );\n\n return messages.map((msg) =>\n mapSummary(\n msg.uid as number,\n \"INBOX\",\n msg.envelope as ImapEnvelope,\n msg.flags as Set<string>,\n ),\n );\n });\n}\n\nexport async function readEmail(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<EmailFull> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n const msg = await imap.fetchOne(\n uid,\n { bodyStructure: true, envelope: true, flags: true },\n { uid: true },\n );\n\n if (!msg || !msg.envelope) {\n throw new Error(`message not found: ${id}`);\n }\n\n const envelope = msg.envelope as ImapEnvelope;\n const structure = msg.bodyStructure as BodyNode;\n const flags = (msg.flags as Set<string>) ?? new Set<string>();\n\n let bodyText: string | undefined;\n let bodyHtml: string | undefined;\n\n const textPart = findPartByType(structure, \"text/plain\");\n const htmlPart = findPartByType(structure, \"text/html\");\n\n if (textPart) {\n const { content } = await imap.download(uid, textPart, { uid: true });\n const chunks: Buffer[] = [];\n for await (const chunk of content as Readable) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n bodyText = Buffer.concat(chunks).toString(\"utf-8\");\n }\n\n if (htmlPart) {\n const { content } = await imap.download(uid, htmlPart, { uid: true });\n const chunks: Buffer[] = [];\n for await (const chunk of content as Readable) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n bodyHtml = Buffer.concat(chunks).toString(\"utf-8\");\n }\n\n const attachments: EmailFull[\"attachments\"] = findAttachments(\n structure,\n ).map((a) => ({\n id: a.part,\n name: a.name,\n contentType: a.contentType,\n size: a.size,\n }));\n\n const summary = mapSummary(uid, folder, envelope, flags);\n\n return {\n ...summary,\n cc: (envelope.cc ?? []).map(mapEnvelopeAddr),\n bcc: (envelope.bcc ?? []).map(mapEnvelopeAddr),\n bodyText,\n bodyHtml,\n attachments: attachments.length > 0 ? attachments : undefined,\n hasAttachments: attachments.length > 0,\n };\n });\n}\n\nexport async function readAttachment(\n clients: ImapClientFactory,\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n): Promise<AttachmentContent> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(messageId);\n\n return client.withMailbox(folder, async (imap) => {\n const msg = (await imap.fetchOne(\n uid,\n { bodyStructure: true },\n { uid: true },\n )) as { bodyStructure?: BodyNode } | false;\n\n let name = \"attachment\";\n let contentType: string | undefined;\n if (msg && msg.bodyStructure) {\n const attachments = findAttachments(msg.bodyStructure);\n const match = attachments.find((a) => a.part === attachmentId);\n if (match) {\n name = match.name;\n contentType = match.contentType;\n }\n }\n\n const { meta, content } = await imap.download(uid, attachmentId, {\n uid: true,\n });\n\n const outPath = pathJoin(tmpdir(), name);\n await pipeline(\n content as unknown as Readable,\n createWriteStream(outPath),\n );\n\n return {\n name,\n contentType: contentType ?? (meta as { contentType?: string }).contentType,\n path: outPath,\n };\n });\n}\n\nexport async function listFolders(\n clients: ImapClientFactory,\n account: AccountRecord,\n opts: ListFoldersOptions,\n): Promise<FolderInfo[]> {\n const client = clients.get(account);\n const imap = await client.getImap();\n\n const mailboxes = await imap.list({\n statusQuery: { messages: true, unseen: true, uidNext: true },\n } as never);\n\n let results: FolderInfo[] = (\n mailboxes as unknown as ImapMailboxEntry[]\n ).map(mapMailboxToListEntry);\n\n if (opts.parentFolderId) {\n const parentPath = opts.parentFolderId;\n results = results.filter(\n (f) =>\n f.parentFolderId === parentPath ||\n (parentPath === \"INBOX\" && f.displayName === \"INBOX\"),\n );\n } else {\n // Top-level: filter out children of other folders\n const allPaths = new Set(results.map((f) => f.displayName));\n results = results.filter((f) => {\n const lastSep = f.displayName.lastIndexOf(\"/\");\n if (lastSep === -1) return true;\n const parent = f.displayName.slice(0, lastSep);\n return !allPaths.has(parent);\n });\n }\n\n return results;\n}\n","import type { EmailAddress, EmailSummary, FolderInfo } from \"../types.js\";\nimport type { AccountRecord } from \"../../store/account-store.js\";\n\n// ---------- well-known folder mapping ----------\n\nconst WELL_KNOWN_TO_IMAP: Record<string, string> = {\n archive: \"Archive\",\n deleteditems: \"Trash\",\n inbox: \"INBOX\",\n drafts: \"Drafts\",\n sentitems: \"Sent\",\n junkemail: \"Junk\",\n outbox: \"Outbox\",\n};\n\nexport function resolveFolder(wellKnownOrPath: string): string {\n return WELL_KNOWN_TO_IMAP[wellKnownOrPath.toLowerCase()] ?? wellKnownOrPath;\n}\n\n// ---------- generic ----------\n\nexport function clampLimit(v: number | undefined, dflt: number, max: number): number {\n if (!v || v <= 0) return dflt;\n return Math.min(v, max);\n}\n\n// ---------- ID encoding ----------\n\n/** Encode a folder path + numeric UID into a composite message ID. */\nexport function encodeId(folder: string, uid: number): string {\n return `${folder}/${uid}`;\n}\n\n/** Decode a composite message ID back into folder + numeric UID. */\nexport function decodeId(id: string): { folder: string; uid: number } {\n const idx = id.lastIndexOf(\"/\");\n if (idx === -1) throw new Error(`invalid message ID: ${id}`);\n const folder = id.slice(0, idx);\n const uid = Number(id.slice(idx + 1));\n if (!Number.isFinite(uid) || uid <= 0) {\n throw new Error(`invalid message UID in ID: ${id}`);\n }\n return { folder, uid };\n}\n\n// ---------- body structure helpers ----------\n\nexport interface BodyNode {\n type?: string;\n part?: string;\n encoding?: string;\n size?: number;\n disposition?: string;\n dispositionParameters?: Record<string, string>;\n parameters?: Record<string, string>;\n childNodes?: BodyNode[];\n}\n\nexport interface ImapAttachmentMeta {\n part: string;\n name: string;\n contentType?: string;\n size?: number;\n}\n\n/** Recursively collect attachment metadata from a bodyStructure node. */\nexport function findAttachments(node: BodyNode): ImapAttachmentMeta[] {\n const attachments: ImapAttachmentMeta[] = [];\n const topType = (node.type ?? \"\").split(\"/\")[0];\n\n const isAttachment =\n node.disposition === \"attachment\" ||\n (!!node.type &&\n topType !== \"text\" &&\n topType !== \"multipart\" &&\n !node.disposition);\n\n if (isAttachment) {\n attachments.push({\n part: node.part ?? \"1\",\n name:\n node.dispositionParameters?.filename ??\n node.parameters?.name ??\n \"attachment\",\n contentType: node.type,\n size: node.size,\n });\n }\n\n if (node.childNodes) {\n for (const child of node.childNodes) {\n attachments.push(...findAttachments(child));\n }\n }\n\n return attachments;\n}\n\n/**\n * Find the part number for a specific content type (e.g. \"text/plain\",\n * \"text/html\") in the body structure tree.\n */\nexport function findPartByType(\n node: BodyNode,\n contentType: string,\n): string | undefined {\n if (node.type === contentType) return node.part ?? \"1\";\n if (node.childNodes) {\n for (const child of node.childNodes) {\n const found = findPartByType(child, contentType);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n// ---------- envelope mapping ----------\n\nexport interface ImapEnvelopeAddr {\n name?: string;\n address?: string;\n}\n\nexport interface ImapEnvelope {\n subject?: string;\n date?: Date;\n messageId?: string;\n inReplyTo?: string;\n from?: ImapEnvelopeAddr[];\n to?: ImapEnvelopeAddr[];\n cc?: ImapEnvelopeAddr[];\n bcc?: ImapEnvelopeAddr[];\n}\n\nexport function mapEnvelopeAddr(a: ImapEnvelopeAddr): EmailAddress {\n return { name: a.name, address: a.address ?? \"\" };\n}\n\nexport function mapSummary(\n uid: number,\n folder: string,\n envelope: ImapEnvelope,\n flags: Set<string> = new Set(),\n): EmailSummary {\n const fromAddr =\n envelope.from && envelope.from.length > 0 && envelope.from[0]\n ? mapEnvelopeAddr(envelope.from[0])\n : undefined;\n return {\n id: encodeId(folder, uid),\n subject: envelope.subject ?? \"\",\n from: fromAddr,\n to: (envelope.to ?? []).map(mapEnvelopeAddr),\n receivedAt: envelope.date ? envelope.date.toISOString() : undefined,\n isRead: flags.has(\"\\\\Seen\"),\n folder,\n };\n}\n\n// ---------- mailbox mapping ----------\n\nexport interface ImapMailboxEntry {\n path: string;\n name?: string;\n specialUse?: string;\n delimiter?: string;\n listed?: boolean;\n subscribed?: boolean;\n status?: {\n messages?: number;\n unseen?: number;\n };\n}\n\nexport function mapMailboxToListEntry(m: ImapMailboxEntry): FolderInfo {\n const lastSep = m.path.lastIndexOf(\"/\");\n const parentFolderId =\n lastSep === -1 ? undefined : m.path.slice(0, lastSep);\n return {\n id: m.path,\n displayName: m.path,\n parentFolderId,\n childFolderCount: 0,\n totalItemCount: m.status?.messages ?? 0,\n unreadItemCount: m.status?.unseen ?? 0,\n };\n}\n","import type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n CompleteAddAccountResult,\n} from \"../types.js\";\nimport { ImapClientFactory, ImapTokens, isImapTokens } from \"./client.js\";\n\nexport async function addAccount(\n clients: ImapClientFactory,\n store: { upsertAccount(rec: AccountRecord): Promise<AccountRecord> },\n input: AddAccountInput,\n): Promise<AddAccountResult> {\n const cfg = input.config ?? {};\n const host = String(cfg.host ?? \"\");\n const port = Number(cfg.port ?? 993);\n const secure = cfg.secure !== false;\n const user = String(cfg.user ?? input.email ?? \"\");\n const password = String(cfg.password ?? \"\");\n const smtpHost = String(cfg.smtpHost ?? host);\n const smtpPort = Number(cfg.smtpPort ?? 587);\n const smtpSecure = cfg.smtpSecure === true;\n\n if (!host || !user || !password) {\n throw new Error(\n \"IMAP requires config: { host, port?, secure?, user, password, smtpHost?, smtpPort?, smtpSecure? }\",\n );\n }\n\n const tokens: ImapTokens = {\n host,\n port,\n secure,\n user,\n password,\n smtpHost: smtpHost || host,\n smtpPort: smtpPort || 587,\n smtpSecure,\n };\n\n // Validate by connecting briefly.\n const client = clients.get({\n email: user.toLowerCase(),\n provider: \"imap\",\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n } as AccountRecord);\n\n try {\n await client.getImap();\n } finally {\n clients.invalidate(user.toLowerCase());\n }\n\n // Optionally validate SMTP — best-effort.\n try {\n const t = client.getTransporter();\n await t.verify();\n } catch {\n /* SMTP verification is optional */\n }\n\n const email = user.toLowerCase();\n const rec: AccountRecord = {\n email,\n provider: \"imap\",\n displayName: input.email ?? user,\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n };\n const saved = await store.upsertAccount(rec);\n return { status: \"ready\", account: saved };\n}\n\nexport function completeAddAccount(): CompleteAddAccountResult {\n return {\n status: \"error\",\n error:\n \"IMAP accounts are set up synchronously — no polling needed. \" +\n \"Call add_account with IMAP config to create the account directly.\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport MailComposer from \"nodemailer/lib/mail-composer/index.js\";\n\nimport type {\n DraftUpdateInput,\n SendInput,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\nimport {\n decodeId,\n encodeId,\n ImapEnvelope,\n resolveFolder,\n} from \"./helpers.js\";\nimport {\n findAttachmentInMime,\n removeMimePart,\n} from \"./mime-utils.js\";\n\n/** Write operations for IMAP — send, draft, move, mark, folders. */\n\nexport async function sendEmail(\n clients: ImapClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const transporter = client.getTransporter();\n\n const mailOptions: import(\"nodemailer\").SendMailOptions = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n to: msg.to\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \"),\n subject: msg.subject,\n };\n\n if (msg.isHtml) {\n mailOptions.html = msg.body;\n } else {\n mailOptions.text = msg.body;\n }\n (mailOptions as Record<string, unknown>).attachDataUrls = true;\n\n if (msg.cc && msg.cc.length > 0) {\n mailOptions.cc = msg.cc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n if (msg.bcc && msg.bcc.length > 0) {\n mailOptions.bcc = msg.bcc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n\n // Handle reply and forward threading\n if (msg.inReplyTo || msg.forwardMessageId) {\n const refId = msg.inReplyTo ?? msg.forwardMessageId;\n if (refId) {\n try {\n const { folder: refFolder, uid: refUid } = decodeId(refId);\n const refMsg = (await client.withMailbox(refFolder, async (imap) => {\n return imap.fetchOne(\n refUid,\n { envelope: true, source: true },\n { uid: true },\n );\n })) as { envelope?: ImapEnvelope; source?: string | ArrayBuffer };\n\n if (refMsg?.envelope) {\n const env = refMsg.envelope as ImapEnvelope;\n if (msg.inReplyTo && env.messageId && !msg.forwardMessageId) {\n mailOptions.inReplyTo = env.messageId;\n (mailOptions as Record<string, unknown>).references =\n env.messageId;\n }\n }\n\n // Embed forwarded message\n if (msg.forwardMessageId && refMsg?.source) {\n const sourceStr =\n typeof refMsg.source === \"string\"\n ? refMsg.source\n : Buffer.from(refMsg.source as ArrayBuffer).toString(\"utf-8\");\n const divider =\n '\\n\\n<div style=\"line-height:12px\"><br></div>\\n\\n' +\n '<div style=\"border-left:2px solid #ccc; padding-left:8px; ' +\n 'margin-left:0; color:#666\">\\n' +\n \"---------- Forwarded message ---------<br>\" +\n sourceStr +\n \"\\n</div>\";\n if (mailOptions.html) {\n mailOptions.html += divider;\n } else if (mailOptions.text) {\n mailOptions.text +=\n \"\\n\\n---------- Forwarded message ---------\\n\" + sourceStr;\n }\n }\n } catch {\n /* If we can't fetch the referenced message, proceed without threading. */\n }\n }\n }\n\n const info = await transporter.sendMail(mailOptions);\n\n // Save a copy to Sent folder\n try {\n const rawMsg = await buildRawMessage(account, msg, info.messageId);\n await client.withMailbox(\"Sent\", async (imap) => {\n await imap.append(\"Sent\", rawMsg, [\"\\\\Seen\"]);\n });\n } catch {\n /* best-effort */\n }\n\n return { id: info.messageId };\n}\n\nexport async function saveDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const rawMsg = await buildRawMessage(account, msg);\n return client.withMailbox(\"Drafts\", async (imap) => {\n const result = (await imap.append(\"Drafts\", rawMsg, [\"\\\\Draft\"])) as { uid: number };\n return { id: encodeId(\"Drafts\", result.uid) };\n });\n}\n\nexport async function updateDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n const existing = (await imap.fetchOne(\n uid,\n { source: true, envelope: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer; envelope?: ImapEnvelope };\n if (!existing?.source) {\n throw new Error(`draft not found: ${id}`);\n }\n\n const origSubject = existing.envelope\n ? (existing.envelope as ImapEnvelope).subject ?? \"\"\n : \"\";\n\n const updatedMsg: Record<string, unknown> = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n subject: update.subject ?? origSubject,\n attachDataUrls: true,\n };\n\n if (update.body !== undefined) {\n if (update.isHtml) {\n updatedMsg.html = update.body;\n } else {\n updatedMsg.text = update.body;\n }\n }\n\n const raw = await new Promise<Buffer>((resolve, reject) => {\n const mc = new MailComposer(updatedMsg);\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf);\n });\n });\n\n await imap.messageDelete(uid, { uid: true });\n const result = (await imap.append(folder, raw, [\"\\\\Draft\"])) as { uid: number };\n return { id: encodeId(folder, result.uid) };\n });\n}\n\nexport async function moveEmail(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n destinationId: string,\n): Promise<void> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n const dest = resolveFolder(destinationId);\n\n return client.withMailbox(folder, async (imap) => {\n await imap.messageMove(uid, dest, { uid: true });\n });\n}\n\nexport async function sendDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n const draft = (await imap.fetchOne(\n uid,\n { source: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer };\n if (!draft?.source) {\n throw new Error(`draft not found: ${id}`);\n }\n\n const sourceStr =\n typeof draft.source === \"string\"\n ? draft.source\n : Buffer.from(draft.source as ArrayBuffer).toString(\"utf-8\");\n\n const transporter = client.getTransporter();\n const info = await transporter.sendMail({ raw: sourceStr });\n\n try {\n await imap.messageMove(uid, \"Sent\", { uid: true });\n } catch {\n /* best-effort */\n }\n\n return { id: info.messageId };\n });\n}\n\nexport async function addAttachmentToDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n): Promise<{\n id: string;\n attachment: { id: string; name: string; contentType?: string };\n}> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(draftId);\n\n return client.withMailbox(folder, async (imap) => {\n const existing = (await imap.fetchOne(\n uid,\n { source: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer };\n if (!existing?.source) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n const sourceStr =\n typeof existing.source === \"string\"\n ? existing.source\n : Buffer.from(existing.source as ArrayBuffer).toString(\"utf-8\");\n\n const built = await new Promise<Buffer>((resolve, reject) => {\n const mc = new MailComposer({\n raw: sourceStr,\n attachments: [\n {\n filename: name,\n content: Buffer.from(contentBytes, \"base64\"),\n contentType: contentType ?? \"application/octet-stream\",\n },\n ],\n });\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf);\n });\n });\n\n await imap.messageDelete(uid, { uid: true });\n const result = (await imap.append(folder, built, [\"\\\\Draft\"])) as { uid: number };\n\n return {\n id: encodeId(folder, result.uid),\n attachment: {\n id: randomUUID(),\n name,\n contentType: contentType ?? \"application/octet-stream\",\n },\n };\n });\n}\n\nexport async function removeAttachmentFromDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n): Promise<void> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(draftId);\n\n return client.withMailbox(folder, async (imap) => {\n const existing = (await imap.fetchOne(\n uid,\n { source: true, structure: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer; structure?: any };\n if (!existing?.source) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n const sourceStr =\n typeof existing.source === \"string\"\n ? existing.source\n : Buffer.from(existing.source as ArrayBuffer).toString(\"utf-8\");\n\n // Parse MIME to find the attachment to remove\n const targetInfo = findAttachmentInMime(existing.structure, attachmentId);\n if (!targetInfo) {\n throw new Error(`attachment not found: ${attachmentId}`);\n }\n\n // Remove the attachment from the MIME source\n const modifiedSource = removeMimePart(sourceStr, targetInfo.filename, targetInfo.contentType);\n\n // Delete old draft and append modified one\n await imap.messageDelete(uid, { uid: true });\n await imap.append(folder, modifiedSource, [\"\\\\Draft\"]);\n });\n}\n\nexport async function markRead(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n isRead: boolean,\n): Promise<void> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n if (isRead) {\n await imap.messageFlagsAdd(uid, [\"\\\\Seen\"], { uid: true });\n } else {\n await imap.messageFlagsRemove(uid, [\"\\\\Seen\"], { uid: true });\n }\n });\n}\n\nasync function buildRawMessage(\n account: AccountRecord,\n msg: SendInput,\n messageId?: string,\n): Promise<string> {\n const mailOptions: Record<string, unknown> = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n to: msg.to\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \"),\n subject: msg.subject,\n attachDataUrls: true,\n };\n\n if (msg.isHtml) {\n mailOptions.html = msg.body;\n } else {\n mailOptions.text = msg.body;\n }\n\n if (msg.cc && msg.cc.length > 0) {\n mailOptions.cc = msg.cc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n if (msg.bcc && msg.bcc.length > 0) {\n mailOptions.bcc = msg.bcc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n\n // Add file attachments from msg.attachments\n if (msg.attachments && msg.attachments.length > 0) {\n const fileAttachments = msg.attachments.map((att) => ({\n filename: att.name,\n content: Buffer.from(att.contentBytes, \"base64\"),\n contentType: att.contentType,\n }));\n mailOptions.attachments = fileAttachments;\n }\n\n if (messageId) {\n mailOptions.messageId = messageId;\n }\n\n return new Promise<string>((resolve, reject) => {\n const mc = new MailComposer(mailOptions);\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf.toString(\"utf-8\"));\n });\n });\n}\n","/**\n * MIME parsing utilities for attachment manipulation.\n */\n\nexport interface AttachmentInfo {\n filename: string;\n contentType: string;\n}\n\n/**\n * Recursively search MIME structure to find an attachment by ID.\n */\nexport function findAttachmentInMime(\n structure: any,\n attachmentId: string,\n): AttachmentInfo | null {\n if (!structure) return null;\n\n // Handle multipart\n if (Array.isArray(structure)) {\n for (const part of structure) {\n const result = findAttachmentInMime(part, attachmentId);\n if (result) return result;\n }\n return null;\n }\n\n // Check if this part is the target attachment\n if (structure.id === attachmentId || structure.partId === attachmentId) {\n return {\n filename: structure.disposition?.filename || structure.filename || \"attachment\",\n contentType: `${structure.type}/${structure.subtype}`,\n };\n }\n\n // Recurse into nested parts\n if (structure.parts) {\n return findAttachmentInMime(structure.parts, attachmentId);\n }\n\n return null;\n}\n\n/**\n * Remove a MIME part from a message source based on filename and content type.\n */\nexport function removeMimePart(\n source: string,\n targetFilename: string,\n targetContentType: string,\n): string {\n const lines = source.split(\"\\r\\n\");\n const result: string[] = [];\n let skip = false;\n let inTargetPart = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lowerLine = line.toLowerCase();\n\n // Check for boundary\n if (line.startsWith(\"--\")) {\n if (inTargetPart) {\n // End of target part, stop skipping\n skip = false;\n inTargetPart = false;\n }\n result.push(line);\n continue;\n }\n\n // Check if this is the start of the target attachment part\n if (\n lowerLine.includes(\"content-disposition:\") &&\n lowerLine.includes(`filename=\"${targetFilename.toLowerCase()}\"`)\n ) {\n inTargetPart = true;\n skip = true;\n continue;\n }\n\n // Also check content-type match\n if (\n inTargetPart &&\n lowerLine.includes(\"content-type:\") &&\n lowerLine.includes(targetContentType.toLowerCase())\n ) {\n skip = true;\n continue;\n }\n\n if (!skip) {\n result.push(line);\n }\n }\n\n return result.join(\"\\r\\n\");\n}\n","import type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n CreateFolderInput,\n FolderInfo,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\n\nexport async function createFolder(\n clients: ImapClientFactory,\n account: AccountRecord,\n input: CreateFolderInput,\n): Promise<FolderInfo> {\n const client = clients.get(account);\n const imap = await client.getImap();\n\n const path = input.parentFolderId\n ? `${input.parentFolderId}/${input.displayName}`\n : input.displayName;\n\n const result = await imap.mailboxCreate(path);\n\n return {\n id: result.path,\n displayName: result.path,\n parentFolderId: input.parentFolderId,\n childFolderCount: 0,\n totalItemCount: 0,\n unreadItemCount: 0,\n };\n}\n\nexport async function renameFolder(\n clients: ImapClientFactory,\n account: AccountRecord,\n folderId: string,\n newName: string,\n): Promise<FolderInfo> {\n const client = clients.get(account);\n const imap = await client.getImap();\n\n const lastSep = folderId.lastIndexOf(\"/\");\n const newPath =\n lastSep === -1 ? newName : folderId.slice(0, lastSep + 1) + newName;\n\n const result = await imap.mailboxRename(folderId, newPath);\n\n return {\n id: result.path,\n displayName: result.path,\n parentFolderId: lastSep === -1 ? undefined : folderId.slice(0, lastSep),\n childFolderCount: 0,\n totalItemCount: 0,\n unreadItemCount: 0,\n };\n}\n\nexport async function deleteFolder(\n clients: ImapClientFactory,\n account: AccountRecord,\n folderId: string,\n): Promise<void> {\n const client = clients.get(account);\n const imap = await client.getImap();\n await imap.mailboxDelete(folderId);\n}\n","import type { AccountRecord, AccountStore } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n AttachmentContent,\n CompleteAddAccountResult,\n CreateFolderInput,\n DraftUpdateInput,\n EmailFull,\n EmailProvider,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n SendInput,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\nimport {\n listEmails,\n searchEmails,\n readEmail,\n readAttachment,\n listFolders,\n} from \"./read-ops.js\";\nimport {\n addAccount,\n completeAddAccount,\n} from \"./account-ops.js\";\nimport {\n sendEmail,\n saveDraft,\n updateDraft,\n moveEmail,\n sendDraft,\n addAttachmentToDraft,\n removeAttachmentFromDraft,\n markRead,\n} from \"./write-ops.js\";\nimport {\n createFolder,\n renameFolder,\n deleteFolder,\n} from \"./folders.js\";\n\nexport class ImapProvider implements EmailProvider {\n readonly id = \"imap\" as const;\n private readonly clients = new ImapClientFactory();\n\n constructor(private readonly store?: AccountStore) {}\n\n // ---------- account lifecycle ----------\n\n async addAccount(input: AddAccountInput): Promise<AddAccountResult> {\n if (!this.store) throw new Error(\"IMAP provider requires an AccountStore\");\n return addAccount(this.clients, this.store, input);\n }\n\n async completeAddAccount(_handle: string): Promise<CompleteAddAccountResult> {\n return completeAddAccount();\n }\n\n // ---------- browse ----------\n\n async listEmails(account: AccountRecord, opts: ListEmailsOptions): Promise<ListEmailsResult> {\n return listEmails(this.clients, account, opts);\n }\n\n async searchEmails(account: AccountRecord, query: string, opts: SearchEmailsOptions): Promise<EmailSummary[]> {\n return searchEmails(this.clients, account, query, opts);\n }\n\n async readEmail(account: AccountRecord, id: string): Promise<EmailFull> {\n return readEmail(this.clients, account, id);\n }\n\n async readAttachment(account: AccountRecord, messageId: string, attachmentId: string): Promise<AttachmentContent> {\n return readAttachment(this.clients, account, messageId, attachmentId);\n }\n\n // ---------- compose ----------\n\n async sendEmail(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return sendEmail(this.clients, account, msg);\n }\n\n async saveDraft(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return saveDraft(this.clients, account, msg);\n }\n\n async updateDraft(account: AccountRecord, id: string, update: DraftUpdateInput): Promise<{ id: string }> {\n return updateDraft(this.clients, account, id, update);\n }\n\n async moveEmail(account: AccountRecord, id: string, destinationId: string): Promise<void> {\n return moveEmail(this.clients, account, id, destinationId);\n }\n\n async sendDraft(account: AccountRecord, id: string): Promise<{ id: string }> {\n return sendDraft(this.clients, account, id);\n }\n\n async addAttachmentToDraft(\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n ): Promise<{ id: string; attachment: { id: string; name: string; contentType?: string } }> {\n return addAttachmentToDraft(this.clients, account, draftId, name, contentBytes, contentType);\n }\n\n async removeAttachmentFromDraft(\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n ): Promise<void> {\n return removeAttachmentFromDraft(this.clients, account, draftId, attachmentId);\n }\n\n // ---------- organize ----------\n\n async markRead(account: AccountRecord, id: string, isRead: boolean): Promise<void> {\n return markRead(this.clients, account, id, isRead);\n }\n\n // ---------- folders ----------\n\n async listFolders(account: AccountRecord, opts: ListFoldersOptions): Promise<FolderInfo[]> {\n return listFolders(this.clients, account, opts);\n }\n\n async createFolder(account: AccountRecord, input: CreateFolderInput): Promise<FolderInfo> {\n return createFolder(this.clients, account, input);\n }\n\n async renameFolder(account: AccountRecord, folderId: string, newName: string): Promise<FolderInfo> {\n return renameFolder(this.clients, account, folderId, newName);\n }\n\n async deleteFolder(account: AccountRecord, folderId: string): Promise<void> {\n return deleteFolder(this.clients, account, folderId);\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { AccountStore, AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n AttachmentContent,\n CompleteAddAccountResult,\n CreateFolderInput,\n DraftUpdateInput,\n EmailFull,\n EmailProvider,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n SendInput,\n} from \"../types.js\";\nimport {\n awaitDeviceCodeReady,\n beginDeviceCode,\n type SerializedGmailTokens,\n} from \"./auth.js\";\nimport { GmailClientFactory } from \"./client.js\";\nimport {\n listEmails,\n searchEmails,\n readEmail,\n readAttachment,\n listFolders,\n} from \"./read-ops.js\";\nimport {\n sendEmail,\n saveDraft,\n updateDraft,\n moveEmail,\n sendDraft,\n addAttachmentToDraft,\n removeAttachmentFromDraft,\n markRead,\n createFolder,\n renameFolder,\n deleteFolder,\n} from \"./write-ops.js\";\n\n// ── pending flow (mirrors Outlook's PendingFlow pattern) ──\n\ninterface PendingFlow {\n begin: ReturnType<typeof beginDeviceCode>;\n emailHint?: string;\n startedAt: number;\n settled: \"pending\" | \"ready\" | \"error\" | \"expired\";\n account?: AccountRecord;\n error?: string;\n}\n\n// ── provider ──\n\nexport interface GmailProviderOptions {\n store: AccountStore;\n clientId?: string;\n clientSecret?: string;\n}\n\nexport class GmailProvider implements EmailProvider {\n readonly id = \"gmail\" as const;\n private readonly clients: GmailClientFactory;\n private readonly pending = new Map<string, PendingFlow>();\n private readonly clientId?: string;\n private readonly clientSecret?: string;\n\n constructor(private readonly opts: GmailProviderOptions) {\n this.clientId = opts.clientId;\n this.clientSecret = opts.clientSecret;\n this.clients = new GmailClientFactory(\n opts.store,\n opts.clientId,\n opts.clientSecret,\n );\n }\n\n // ── account lifecycle ──\n\n async addAccount(input: AddAccountInput): Promise<AddAccountResult> {\n const begin = beginDeviceCode(\n undefined,\n this.clientId,\n this.clientSecret,\n );\n await awaitDeviceCodeReady(begin);\n\n const handle = randomUUID();\n const flow: PendingFlow = {\n begin,\n emailHint: input.email,\n startedAt: Date.now(),\n settled: \"pending\",\n };\n this.pending.set(handle, flow);\n\n begin.result\n .then(async ({ tokens, email }) => {\n const resolvedEmail = (email || input.email || \"\").toLowerCase();\n if (!resolvedEmail) {\n flow.settled = \"error\";\n flow.error = \"no email returned from Google account\";\n return;\n }\n const rec: AccountRecord = {\n email: resolvedEmail,\n provider: \"gmail\",\n displayName: resolvedEmail,\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n };\n const saved = await this.opts.store.upsertAccount(rec);\n flow.account = saved;\n flow.settled = \"ready\";\n })\n .catch((err: unknown) => {\n flow.settled = \"error\";\n flow.error = err instanceof Error ? err.message : String(err);\n });\n\n return {\n status: \"pending\",\n handle,\n verification: {\n userCode: begin.userCode,\n verificationUri: begin.verificationUri,\n expiresAt: begin.expiresAt,\n message: begin.message,\n },\n };\n }\n\n async completeAddAccount(\n handle: string,\n ): Promise<CompleteAddAccountResult> {\n const flow = this.pending.get(handle);\n if (!flow) return { status: \"error\", error: \"unknown handle\" };\n if (\n Date.now() - flow.startedAt > 20 * 60_000 &&\n flow.settled === \"pending\"\n ) {\n flow.settled = \"expired\";\n flow.begin.cancel();\n }\n if (flow.settled === \"ready\" && flow.account) {\n this.pending.delete(handle);\n return { status: \"ready\", account: flow.account };\n }\n if (flow.settled === \"error\") {\n this.pending.delete(handle);\n return { status: \"error\", error: flow.error ?? \"unknown error\" };\n }\n if (flow.settled === \"expired\") {\n this.pending.delete(handle);\n return { status: \"expired\" };\n }\n return { status: \"pending\" };\n }\n\n // ── browse ──\n\n async listEmails(\n account: AccountRecord,\n opts: ListEmailsOptions,\n ): Promise<ListEmailsResult> {\n return listEmails(this.clients, account, opts);\n }\n\n async searchEmails(\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n ): Promise<EmailSummary[]> {\n return searchEmails(this.clients, account, query, opts);\n }\n\n async readEmail(account: AccountRecord, id: string): Promise<EmailFull> {\n return readEmail(this.clients, account, id);\n }\n\n async readAttachment(\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n ): Promise<AttachmentContent> {\n return readAttachment(this.clients, account, messageId, attachmentId);\n }\n\n // ── compose ──\n\n async sendEmail(\n account: AccountRecord,\n msg: SendInput,\n ): Promise<{ id: string }> {\n return sendEmail(this.clients, account, msg);\n }\n\n async saveDraft(\n account: AccountRecord,\n msg: SendInput,\n ): Promise<{ id: string }> {\n return saveDraft(this.clients, account, msg);\n }\n\n async updateDraft(\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n ): Promise<{ id: string }> {\n return updateDraft(this.clients, account, id, update);\n }\n\n async moveEmail(\n account: AccountRecord,\n id: string,\n destinationId: string,\n ): Promise<void> {\n return moveEmail(this.clients, account, id, destinationId);\n }\n\n async sendDraft(\n account: AccountRecord,\n id: string,\n ): Promise<{ id: string }> {\n return sendDraft(this.clients, account, id);\n }\n\n async addAttachmentToDraft(\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n ): Promise<{\n id: string;\n attachment: { id: string; name: string; contentType?: string };\n }> {\n return addAttachmentToDraft(\n this.clients,\n account,\n draftId,\n name,\n contentBytes,\n contentType,\n );\n }\n\n async removeAttachmentFromDraft(\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n ): Promise<void> {\n return removeAttachmentFromDraft(this.clients, account, draftId, attachmentId);\n }\n\n // ── organize ──\n\n async markRead(\n account: AccountRecord,\n id: string,\n isRead: boolean,\n ): Promise<void> {\n return markRead(this.clients, account, id, isRead);\n }\n\n // ── folders ──\n\n async listFolders(\n account: AccountRecord,\n opts: ListFoldersOptions,\n ): Promise<FolderInfo[]> {\n return listFolders(this.clients, account, opts);\n }\n\n async createFolder(\n account: AccountRecord,\n input: CreateFolderInput,\n ): Promise<FolderInfo> {\n return createFolder(this.clients, account, input);\n }\n\n async renameFolder(\n account: AccountRecord,\n folderId: string,\n newName: string,\n ): Promise<FolderInfo> {\n return renameFolder(this.clients, account, folderId, newName);\n }\n\n async deleteFolder(\n account: AccountRecord,\n folderId: string,\n ): Promise<void> {\n return deleteFolder(this.clients, account, folderId);\n }\n}\n","import { OAuth2Client } from \"google-auth-library\";\n\nconst GOOGLE_DEVICE_CODE_URL = \"https://oauth2.googleapis.com/device/code\";\nconst GOOGLE_TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nconst GOOGLE_OAUTH2_REVOKE_URL = \"https://oauth2.googleapis.com/revoke\";\n\nconst DEFAULT_SCOPES = [\n \"https://www.googleapis.com/auth/gmail.modify\",\n];\n\nexport interface DeviceCodeBegin {\n userCode: string;\n verificationUri: string;\n message: string;\n expiresAt: string; // ISO\n /** Resolves with the tokens and email once the user completes the flow. */\n result: Promise<{ tokens: SerializedGmailTokens; email: string }>;\n /** Aborts the in-flight polling promise. */\n cancel(): void;\n}\n\nexport interface SerializedGmailTokens {\n /** Client ID used to authenticate this account. */\n clientId: string;\n /** Client secret, if any (optional for installed/TV apps). */\n clientSecret?: string;\n /** Current access token. */\n accessToken: string;\n /** Long-lived refresh token. */\n refreshToken: string;\n /** Expiry timestamp in milliseconds since epoch. */\n expiryDate: number;\n /** Scopes granted. */\n scopes: string[];\n /** Email address associated with this account. */\n email: string;\n}\n\n/** Type guard — validates that an unknown value has the shape of SerializedGmailTokens. */\nexport function isSerializedGmailTokens(\n obj: unknown,\n): obj is SerializedGmailTokens {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return (\n typeof o.clientId === \"string\" &&\n (o.clientSecret === undefined || typeof o.clientSecret === \"string\") &&\n typeof o.accessToken === \"string\" &&\n typeof o.refreshToken === \"string\" &&\n typeof o.expiryDate === \"number\" &&\n Array.isArray(o.scopes) &&\n typeof o.email === \"string\"\n );\n}\n\n/**\n * Build an {@link OAuth2Client} hydrated with stored tokens.\n * Returns a fresh client that can be used for silent refresh.\n */\nexport function buildOAuth2Client(\n tokens?: SerializedGmailTokens,\n): OAuth2Client {\n const client = new OAuth2Client({\n clientId: tokens?.clientId,\n clientSecret: tokens?.clientSecret,\n });\n if (tokens) {\n client.setCredentials({\n access_token: tokens.accessToken,\n refresh_token: tokens.refreshToken,\n expiry_date: tokens.expiryDate,\n scope: tokens.scopes.join(\" \"),\n });\n }\n return client;\n}\n\n/** Fetch the email address associated with an access token via the Gmail profile endpoint. */\nasync function getEmailFromToken(accessToken: string): Promise<string> {\n const res = await fetch(\n \"https://gmail.googleapis.com/gmail/v1/users/me/profile\",\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n },\n );\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(\n `Failed to get Gmail profile (${res.status}): ${body}`,\n );\n }\n const data = (await res.json()) as { emailAddress: string };\n return data.emailAddress;\n}\n\n/**\n * Start a Google OAuth 2.0 device-authorisation flow.\n *\n * The returned `result` promise resolves once the user has entered the code\n * and consented; callers should poll it (or await it) via `complete_add_account`.\n */\nexport function beginDeviceCode(\n scopes: string[] = DEFAULT_SCOPES,\n clientIdOverride?: string,\n clientSecretOverride?: string,\n): DeviceCodeBegin {\n const clientId = clientIdOverride;\n if (!clientId) {\n throw new Error(\n \"GOOGLE_CLIENT_ID is required for Gmail OAuth — set it via HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID, GOOGLE_CLIENT_ID, or provider config\",\n );\n }\n const clientSecret = clientSecretOverride || undefined;\n\n let resolve!: (v: { tokens: SerializedGmailTokens; email: string }) => void;\n let reject!: (err: unknown) => void;\n const result = new Promise<{ tokens: SerializedGmailTokens; email: string }>(\n (res, rej) => {\n resolve = res;\n reject = rej;\n },\n );\n\n // Placeholders populated once the device-code HTTP call completes.\n let userCode = \"\";\n let verificationUri = \"\";\n let message = \"\";\n let expiresAt = new Date(Date.now() + 15 * 60_000).toISOString();\n let aborted = false;\n\n const ready = (async () => {\n try {\n // ── Step 1: request device code ──\n const dcParams = new URLSearchParams();\n dcParams.set(\"client_id\", clientId);\n if (clientSecret) dcParams.set(\"client_secret\", clientSecret);\n dcParams.set(\"scope\", scopes.join(\" \"));\n\n const dcRes = await fetch(GOOGLE_DEVICE_CODE_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: dcParams.toString(),\n });\n\n if (!dcRes.ok) {\n const errBody = (await dcRes.json().catch(() => ({}))) as {\n error?: string;\n error_description?: string;\n };\n throw new Error(\n `Google device-code request failed: ` +\n `${errBody.error_description ?? errBody.error ?? dcRes.statusText}`,\n );\n }\n\n const dcData = (await dcRes.json()) as {\n device_code: string;\n user_code: string;\n verification_url: string;\n expires_in: number;\n interval?: number;\n };\n\n userCode = dcData.user_code;\n verificationUri = dcData.verification_url;\n const deviceCode = dcData.device_code;\n let interval = dcData.interval ?? 5;\n if (dcData.expires_in) {\n expiresAt = new Date(\n Date.now() + dcData.expires_in * 1000,\n ).toISOString();\n }\n message = `Go to ${verificationUri} and enter code: ${userCode}`;\n\n // ── Step 2: poll for tokens ──\n const tokenParams = new URLSearchParams();\n tokenParams.set(\"client_id\", clientId);\n if (clientSecret) tokenParams.set(\"client_secret\", clientSecret);\n tokenParams.set(\"device_code\", deviceCode);\n tokenParams.set(\n \"grant_type\",\n \"urn:ietf:params:oauth:grant-type:device_code\",\n );\n\n const deadline = Date.now() + (dcData.expires_in * 1000);\n while (Date.now() < deadline && !aborted) {\n await new Promise((r) => setTimeout(r, interval * 1000));\n if (aborted) return;\n\n const tokenRes = await fetch(GOOGLE_TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: tokenParams.toString(),\n });\n\n const tokenData = (await tokenRes.json()) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n error?: string;\n };\n\n if (tokenData.access_token) {\n const email = await getEmailFromToken(tokenData.access_token);\n const tokens: SerializedGmailTokens = {\n clientId,\n clientSecret,\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token ?? \"\",\n expiryDate: tokenData.expires_in\n ? Date.now() + tokenData.expires_in * 1000\n : Date.now() + 3600_000,\n scopes: tokenData.scope\n ? tokenData.scope.split(\" \")\n : scopes,\n email,\n };\n resolve({ tokens, email });\n return;\n }\n\n switch (tokenData.error) {\n case \"authorization_pending\":\n break; // keep polling\n case \"slow_down\":\n interval += 1; // Google says to back off\n break;\n case \"expired_token\":\n throw new Error(\"Device code expired — please try again\");\n case \"access_denied\":\n throw new Error(\"User denied access\");\n default:\n throw new Error(\n `Token request failed: ${tokenData.error ?? \"unknown error\"}`,\n );\n }\n }\n\n if (!aborted) {\n throw new Error(\"Device code expired — please try again\");\n }\n } catch (err) {\n if (!aborted) reject(err);\n }\n })();\n\n return {\n get userCode() {\n return userCode;\n },\n get verificationUri() {\n return verificationUri;\n },\n get message() {\n return message;\n },\n get expiresAt() {\n return expiresAt;\n },\n result,\n cancel() {\n aborted = true;\n },\n ...({ _ready: ready } as Record<string, unknown>),\n } as DeviceCodeBegin;\n}\n\n/** Await `_ready` so the user-code fields are populated. */\nexport async function awaitDeviceCodeReady(b: DeviceCodeBegin): Promise<void> {\n const r = (b as unknown as { _ready: Promise<void> })._ready;\n await r;\n}\n\n/**\n * Acquire a fresh access token for a stored account, refreshing silently from\n * the persisted refresh token. Returns the (possibly-updated) tokens so the\n * caller can write them back to the store.\n */\nexport async function acquireAccessToken(\n tokens: SerializedGmailTokens,\n scopes: string[] = DEFAULT_SCOPES,\n): Promise<{ accessToken: string; tokens: SerializedGmailTokens }> {\n const client = buildOAuth2Client(tokens);\n const res = await client.getAccessToken();\n if (!res.token) {\n throw new Error(\n \"Failed to acquire access token — refresh token may be revoked; re-run add_account\",\n );\n }\n\n const creds = client.credentials;\n const next: SerializedGmailTokens = {\n ...tokens,\n accessToken: res.token,\n refreshToken: creds.refresh_token ?? tokens.refreshToken,\n expiryDate: creds.expiry_date ?? Date.now() + 3600_000,\n scopes,\n };\n return { accessToken: res.token, tokens: next };\n}\n\n/**\n * Revoke a refresh token so the stored account is fully de-authorized.\n * Best-effort — failures are swallowed since we'll delete the stored tokens\n * regardless.\n */\nexport async function revokeRefreshToken(\n tokens: SerializedGmailTokens,\n): Promise<void> {\n try {\n await fetch(GOOGLE_OAUTH2_REVOKE_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ token: tokens.refreshToken }).toString(),\n });\n } catch {\n /* best-effort */\n }\n}\n","import { gmail_v1, google } from \"googleapis\";\n\nimport type { AccountStore, AccountRecord } from \"../../store/account-store.js\";\nimport {\n acquireAccessToken,\n buildOAuth2Client,\n isSerializedGmailTokens,\n type SerializedGmailTokens,\n} from \"./auth.js\";\n\n/**\n * Cached per-account entry: an OAuth2Client + a Gmail API instance.\n * The OAuth2Client handles token refresh automatically; we listen for token\n * events to persist refreshed credentials back to the AccountStore.\n */\ninterface GmailClientEntry {\n auth: ReturnType<typeof buildOAuth2Client>;\n gmail: gmail_v1.Gmail;\n}\n\n/**\n * Builds a Google `gmail_v1.Gmail` client bound to a stored account.\n * The client auto-refreshes access tokens via `google-auth-library` and\n * persists refreshed tokens back into the AccountStore.\n *\n * Clients are cached per email since the underlying library reuses connections.\n */\nexport class GmailClientFactory {\n private readonly cache = new Map<string, GmailClientEntry>();\n /** Serialize token-persist per email to prevent concurrent upsert races. */\n private readonly persistLocks = new Map<string, Promise<void>>();\n\n constructor(\n private readonly store: AccountStore,\n private readonly clientId?: string,\n private readonly clientSecret?: string,\n ) {}\n\n get(account: AccountRecord): GmailClientEntry {\n const key = account.email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) return existing;\n\n if (!isSerializedGmailTokens(account.tokens)) {\n throw new Error(\n \"Gmail account tokens are missing or corrupted — re-run add_account\",\n );\n }\n const tokens: SerializedGmailTokens = account.tokens;\n\n // Use stored clientId/clientSecret, falling back to constructor args\n const resolvedClientId = tokens.clientId || this.clientId;\n const resolvedSecret = tokens.clientSecret || this.clientSecret;\n\n const auth = buildOAuth2Client({\n ...tokens,\n clientId: resolvedClientId ?? tokens.clientId,\n clientSecret: resolvedSecret,\n });\n\n const store = this.store;\n const persistLocks = this.persistLocks;\n auth.on(\"tokens\", (updated) => {\n if (!updated.refresh_token && !updated.access_token) return;\n\n // Serialize persistence per email — two rapid token events can race\n // on the store read-modify-write cycle.\n const existing = persistLocks.get(key);\n const chain = (existing ?? Promise.resolve()).then(async () => {\n const fresh = store.getAccount(account.email) ?? account;\n const currentTokens = isSerializedGmailTokens(fresh.tokens)\n ? (fresh.tokens as unknown as SerializedGmailTokens)\n : tokens;\n\n const nextTokens: SerializedGmailTokens = {\n ...currentTokens,\n accessToken: updated.access_token ?? currentTokens.accessToken,\n refreshToken:\n updated.refresh_token ?? currentTokens.refreshToken,\n expiryDate:\n updated.expiry_date ?? currentTokens.expiryDate,\n scopes: updated.scope\n ? updated.scope.split(\" \")\n : currentTokens.scopes,\n };\n\n await store\n .upsertAccount({\n ...fresh,\n tokens: nextTokens as unknown as Record<string, unknown>,\n })\n .catch(() => {\n /* swallow — next call will refresh again */\n });\n });\n persistLocks.set(key, chain);\n chain.finally(() => {\n if (persistLocks.get(key) === chain) persistLocks.delete(key);\n });\n });\n\n const gmail = google.gmail({ version: \"v1\", auth });\n const entry: GmailClientEntry = { auth, gmail };\n this.cache.set(key, entry);\n return entry;\n }\n\n /** Drop a cached client (e.g. after removeAccount). */\n invalidate(email: string): void {\n this.cache.delete(email.toLowerCase());\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join as pathJoin } from \"node:path\";\n\nimport type { gmail_v1 } from \"googleapis\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailFull,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n EmailAddress,\n} from \"../types.js\";\nimport { GmailClientFactory } from \"./client.js\";\nimport {\n clampLimit,\n findHeader,\n mapHeaderAddr,\n mapSummary,\n mapFolder,\n parsePayload,\n pool,\n resolveLabel,\n type GmailMessageListEntry,\n} from \"./helpers.js\";\n\n/**\n * Browse operations for Gmail — list, search, read emails, attachments,\n * and folders.\n */\n\nexport async function listEmails(\n clients: GmailClientFactory,\n account: AccountRecord,\n opts: ListEmailsOptions,\n): Promise<ListEmailsResult> {\n const { gmail } = clients.get(account);\n const limit = clampLimit(opts.limit, 25, 100);\n const label = resolveLabel(opts.folder ?? \"inbox\");\n\n const params: gmail_v1.Params$Resource$Users$Messages$List = {\n userId: \"me\",\n labelIds: [label],\n maxResults: limit,\n };\n\n if (opts.unreadOnly) {\n params.q = \"is:unread\";\n }\n\n const allIds: GmailMessageListEntry[] = [];\n let pageToken: string | undefined;\n\n do {\n const res = await gmail.users.messages.list({ ...params, pageToken });\n if (res.data.messages) allIds.push(...res.data.messages);\n pageToken = res.data.nextPageToken ?? undefined;\n } while (pageToken && allIds.length < (opts.skip ?? 0) + limit);\n\n const skip = opts.skip ?? 0;\n const pageIds = allIds.slice(skip, skip + limit);\n const hasMore = skip + limit < allIds.length;\n\n if (pageIds.length === 0) {\n return { items: [], hasMore };\n }\n\n const items = await pool(pageIds, 10, async (entry) => {\n const msgId = entry.id ?? \"\";\n const msgRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msgId,\n format: \"metadata\",\n metadataHeaders: [\"From\", \"Subject\", \"To\", \"Date\"],\n });\n const msg = msgRes.data;\n return mapSummary(msgId, msg.payload?.headers ?? [], {\n labelIds: msg.labelIds,\n internalDate: msg.internalDate,\n });\n });\n\n return { items, hasMore };\n}\n\nexport async function searchEmails(\n clients: GmailClientFactory,\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n): Promise<EmailSummary[]> {\n const { gmail } = clients.get(account);\n const limit = clampLimit(opts.limit, 25, 100);\n\n const res = await gmail.users.messages.list({\n userId: \"me\",\n q: query,\n maxResults: limit,\n });\n\n const ids = res.data.messages ?? [];\n if (ids.length === 0) return [];\n\n const items = await pool(ids, 10, async (entry) => {\n const msgId = entry.id ?? \"\";\n const msgRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msgId,\n format: \"metadata\",\n metadataHeaders: [\"From\", \"Subject\", \"To\", \"Date\"],\n });\n const msg = msgRes.data;\n return mapSummary(msgId, msg.payload?.headers ?? [], {\n labelIds: msg.labelIds,\n internalDate: msg.internalDate,\n });\n });\n\n return items;\n}\n\nexport async function readEmail(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<EmailFull> {\n const { gmail } = clients.get(account);\n\n const res = await gmail.users.messages.get({\n userId: \"me\",\n id,\n format: \"full\",\n });\n\n const msg = res.data;\n if (!msg) throw new Error(`message not found: ${id}`);\n\n const headers = msg.payload?.headers ?? [];\n const { bodyText, bodyHtml, attachments } = parsePayload(msg.payload ?? {});\n\n const summary = mapSummary(id, headers, {\n labelIds: msg.labelIds,\n internalDate: msg.internalDate,\n });\n\n return {\n ...summary,\n cc: mapHeaderAddr(findHeader(headers, \"Cc\")),\n bcc: mapHeaderAddr(findHeader(headers, \"Bcc\")),\n bodyText,\n bodyHtml,\n attachments: attachments.length > 0 ? attachments : undefined,\n hasAttachments: attachments.length > 0,\n };\n}\n\nexport async function readAttachment(\n clients: GmailClientFactory,\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n): Promise<AttachmentContent> {\n const { gmail } = clients.get(account);\n\n const msgRes = await gmail.users.messages.get({\n userId: \"me\",\n id: messageId,\n format: \"full\",\n });\n const { attachments } = parsePayload(msgRes.data.payload ?? {});\n const match = attachments.find((a) => a.id === attachmentId);\n\n const name = match?.name ?? \"attachment\";\n const contentType = match?.contentType;\n\n const attRes = await gmail.users.messages.attachments.get({\n userId: \"me\",\n messageId,\n id: attachmentId,\n });\n\n const data = attRes.data.data;\n if (!data) throw new Error(\"attachment data is empty\");\n\n const buf = Buffer.from(\n data.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n );\n\n const outPath = pathJoin(tmpdir(), name);\n writeFileSync(outPath, buf);\n\n return { name, contentType, path: outPath };\n}\n\nexport async function listFolders(\n clients: GmailClientFactory,\n account: AccountRecord,\n _opts: ListFoldersOptions,\n): Promise<FolderInfo[]> {\n const { gmail } = clients.get(account);\n const res = await gmail.users.labels.list({ userId: \"me\" });\n const labels = res.data.labels ?? [];\n return labels.map(mapFolder);\n}\n","import type { gmail_v1 } from \"googleapis\";\nimport MailComposer from \"nodemailer/lib/mail-composer/index.js\";\n\nimport { parseInlineImages } from \"../shared/inline-images.js\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailAddress,\n EmailFull,\n EmailSummary,\n FolderInfo,\n SendInput,\n} from \"../types.js\";\n\n// ── well-known folder ↔ Gmail label mapping ──\n\n/** Map a well-known folder name to its Gmail system-label id. */\nconst WELL_KNOWN_TO_LABEL: Record<string, string> = {\n inbox: \"INBOX\",\n sentitems: \"SENT\",\n drafts: \"DRAFT\",\n deleteditems: \"TRASH\",\n junkemail: \"SPAM\",\n outbox: \"\", // Gmail has no outbox; sendEmail handles this.\n};\n\nexport function resolveLabel(wellKnownOrId: string): string {\n const lower = wellKnownOrId.toLowerCase();\n return WELL_KNOWN_TO_LABEL[lower] ?? wellKnownOrId;\n}\n\n/**\n * For \"archive\" we must *remove* the INBOX label rather than add a\n * destination. Other well-known names map normally.\n */\nexport function resolveLabelsForMove(\n destinationId: string,\n): { addLabelIds: string[]; removeLabelIds: string[] } {\n if (destinationId.toLowerCase() === \"archive\") {\n return { addLabelIds: [], removeLabelIds: [\"INBOX\"] };\n }\n return { addLabelIds: [resolveLabel(destinationId)], removeLabelIds: [] };\n}\n\n// ── map Gmail API responses to shared types ──\n\nexport interface GmailMessageListEntry {\n id?: string | null;\n threadId?: string | null;\n}\n\nexport function mapHeaderAddr(\n raw: string | null | undefined,\n): EmailAddress[] {\n if (!raw) return [];\n const addrs = raw.split(\",\");\n return addrs.map((a) => {\n const trimmed = a.trim();\n const match = trimmed.match(/^(.+?)\\s*<(.+@.+)>$/);\n if (match) return { name: match[1]!.trim(), address: match[2]! };\n return { address: trimmed };\n });\n}\n\ntype GmailMessage = gmail_v1.Schema$Message;\ntype GmailMessagePart = gmail_v1.Schema$MessagePart;\n\nexport function findHeader(\n headers: GmailMessagePart[\"headers\"],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const h = headers.find(\n (h) => h.name?.toLowerCase() === name.toLowerCase(),\n );\n return h?.value ?? undefined;\n}\n\n/** Decode Gmail's base64url-encoded body part into a UTF-8 string. */\nexport function decodeBody(body: gmail_v1.Schema$MessagePartBody): string {\n if (!body?.data) return \"\";\n return Buffer.from(\n body.data.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n}\n\ninterface ParsedPayload {\n bodyText?: string;\n bodyHtml?: string;\n attachments: NonNullable<EmailFull[\"attachments\"]>;\n}\n\n/** Walk the MIME part tree to extract text, HTML, and attachments. */\nexport function parsePayload(\n payload: GmailMessagePart,\n prefix = \"\",\n): ParsedPayload {\n let bodyText: string | undefined;\n let bodyHtml: string | undefined;\n const attachments: NonNullable<EmailFull[\"attachments\"]> = [];\n\n function walk(part: GmailMessagePart, partPrefix: string): void {\n const mime = part.mimeType ?? \"\";\n\n if (mime === \"text/plain\" && bodyText === undefined) {\n bodyText = decodeBody(part.body ?? {});\n return;\n }\n if (mime === \"text/html\" && bodyHtml === undefined) {\n bodyHtml = decodeBody(part.body ?? {});\n return;\n }\n\n if (part.parts) {\n for (let i = 0; i < part.parts.length; i++) {\n walk(part.parts[i]!, (partPrefix ? `${partPrefix}.` : \"\") + String(i));\n }\n return;\n }\n\n const topType = mime.split(\"/\")[0] ?? \"\";\n const hasFilename = !!part.filename || !!part.body?.attachmentId;\n const isAttachment =\n hasFilename ||\n (!!mime && topType !== \"text\" && topType !== \"multipart\");\n\n if (isAttachment && part.body?.attachmentId) {\n attachments.push({\n id: part.body.attachmentId,\n name: part.filename ?? part.partId ?? \"attachment\",\n contentType: mime || undefined,\n size: part.body.size != null ? Number(part.body.size) : undefined,\n });\n }\n }\n\n walk(payload, prefix);\n return { bodyText, bodyHtml, attachments };\n}\n\nexport function mapSummary(\n id: string,\n headers: GmailMessagePart[\"headers\"],\n flags: { labelIds?: (string | null)[] | null; internalDate?: string | null },\n): EmailSummary {\n return {\n id,\n subject: findHeader(headers, \"Subject\") ?? \"\",\n from: mapHeaderAddr(findHeader(headers, \"From\"))[0],\n to: mapHeaderAddr(findHeader(headers, \"To\")),\n receivedAt: flags.internalDate\n ? new Date(Number(flags.internalDate)).toISOString()\n : undefined,\n preview: undefined,\n isRead: !(flags.labelIds?.includes(\"UNREAD\") ?? false),\n hasAttachments: false,\n };\n}\n\nexport function mapFolder(label: gmail_v1.Schema$Label): FolderInfo {\n return {\n id: label.id ?? \"\",\n displayName: label.name ?? \"\",\n parentFolderId: undefined,\n childFolderCount: 0,\n totalItemCount: label.messagesTotal ?? 0,\n unreadItemCount: label.messagesUnread ?? 0,\n };\n}\n\n// ── limit clamping ──\n\nexport function clampLimit(\n v: number | undefined,\n dflt: number,\n max: number,\n): number {\n if (!v || v <= 0) return dflt;\n return Math.min(v, max);\n}\n\n/** Run an async function over items with limited concurrency. */\nexport async function pool<T, R>(\n items: T[],\n concurrency: number,\n fn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const results: R[] = new Array(items.length);\n let idx = 0;\n async function worker(): Promise<void> {\n while (idx < items.length) {\n const i = idx++;\n results[i] = await fn(items[i]!);\n }\n }\n const workers = Array.from(\n { length: Math.min(concurrency, items.length) },\n () => worker(),\n );\n await Promise.all(workers);\n return results;\n}\n\n// ── RFC 2822 message building (reuses nodemailer) ──\n\nexport function base64urlEncode(buf: Buffer): string {\n return buf\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\n/**\n * Build a raw RFC 2822 message string from send/draft input.\n * Uses nodemailer's MailComposer for MIME construction, then\n * base64url-encodes the result for the Gmail API `raw` field.\n */\nexport async function buildRawMessage(\n account: AccountRecord,\n msg: SendInput,\n messageId?: string,\n): Promise<{ raw: string; threadId?: string }> {\n const { body: transformed, images } = parseInlineImages(msg.body);\n\n const mailOptions: Record<string, unknown> = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n to: msg.to\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \"),\n subject: msg.subject,\n attachDataUrls: true,\n };\n\n if (msg.isHtml) {\n mailOptions.html = transformed;\n } else {\n mailOptions.text = transformed;\n }\n\n if (msg.cc && msg.cc.length > 0) {\n mailOptions.cc = msg.cc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n if (msg.bcc && msg.bcc.length > 0) {\n mailOptions.bcc = msg.bcc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n\n if (images.length > 0) {\n mailOptions.attachments = images.map((img) => ({\n filename: img.filename,\n content: Buffer.from(img.contentBytes, \"base64\"),\n contentType: img.contentType,\n cid: img.cid,\n }));\n }\n\n // Add file attachments from msg.attachments\n if (msg.attachments && msg.attachments.length > 0) {\n const fileAttachments = msg.attachments.map((att) => ({\n filename: att.name,\n content: Buffer.from(att.contentBytes, \"base64\"),\n contentType: att.contentType,\n }));\n mailOptions.attachments = [\n ...(mailOptions.attachments || []),\n ...fileAttachments,\n ];\n }\n\n if (messageId) {\n mailOptions.messageId = messageId;\n }\n\n const rawStr = await new Promise<string>((resolve, reject) => {\n const mc = new MailComposer(mailOptions);\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf.toString(\"utf-8\"));\n });\n });\n\n return { raw: base64urlEncode(Buffer.from(rawStr, \"utf-8\")) };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { Buffer } from \"node:buffer\";\n\nimport MailComposer from \"nodemailer/lib/mail-composer/index.js\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n CreateFolderInput,\n DraftUpdateInput,\n EmailAddress,\n FolderInfo,\n SendInput,\n} from \"../types.js\";\nimport {\n GmailClientFactory,\n} from \"./client.js\";\nimport {\n base64urlEncode,\n buildRawMessage,\n mapFolder,\n mapHeaderAddr,\n findHeader,\n resolveLabel,\n resolveLabelsForMove,\n} from \"./helpers.js\";\n\n/**\n * Write operations for Gmail — send, draft, move, mark, folders.\n */\n\nexport async function sendEmail(\n clients: GmailClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n\n let threadId: string | undefined;\n let rawBody: { raw: string };\n\n if (msg.forwardMessageId) {\n const fwdRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.forwardMessageId,\n format: \"raw\",\n });\n threadId = fwdRes.data.threadId ?? undefined;\n const fwdRaw = fwdRes.data.raw;\n if (fwdRaw) {\n const fwdStr = Buffer.from(\n fwdRaw.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n const divider =\n '\\n\\n<div style=\"line-height:12px\"><br></div>\\n\\n' +\n '<div style=\"border-left:2px solid #ccc; padding-left:8px; ' +\n 'margin-left:0; color:#666\">\\n' +\n \"---------- Forwarded message ---------<br>\" +\n fwdStr +\n \"\\n</div>\";\n\n const combinedMsg = { ...msg, body: msg.body + divider };\n rawBody = await buildRawMessage(account, combinedMsg);\n } else {\n rawBody = await buildRawMessage(account, msg);\n }\n } else {\n rawBody = await buildRawMessage(account, msg);\n\n if (msg.inReplyTo) {\n try {\n const refRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.inReplyTo,\n format: \"minimal\",\n });\n threadId = refRes.data.threadId ?? undefined;\n } catch {\n /* proceed without threading */\n }\n }\n }\n\n const sendRes = await gmail.users.messages.send({\n userId: \"me\",\n requestBody: {\n raw: rawBody.raw,\n threadId,\n },\n });\n\n return { id: sendRes.data.id ?? \"\" };\n}\n\nexport async function saveDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n const { raw } = await buildRawMessage(account, msg);\n\n let threadId: string | undefined;\n if (msg.inReplyTo) {\n try {\n const refRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.inReplyTo,\n format: \"minimal\",\n });\n threadId = refRes.data.threadId ?? undefined;\n } catch {\n /* proceed without threading */\n }\n }\n\n const draftRes = await gmail.users.drafts.create({\n userId: \"me\",\n requestBody: {\n message: { raw, threadId },\n },\n });\n\n return { id: draftRes.data.message?.id ?? draftRes.data.id ?? \"\" };\n}\n\nexport async function updateDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n\n const draftRes = await gmail.users.drafts.get({\n userId: \"me\",\n id,\n format: \"raw\",\n });\n\n const existingMessage = draftRes.data.message;\n if (!existingMessage?.raw) {\n throw new Error(`draft not found: ${id}`);\n }\n\n const existingHeaders = existingMessage.payload?.headers ?? [];\n const origSubject = findHeader(existingHeaders, \"Subject\") ?? \"\";\n\n const rawStr = Buffer.from(\n existingMessage.raw.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n // Extract existing To/CC recipients from headers\n const existingTo = update.to ?? mapHeaderAddr(findHeader(existingHeaders, \"To\"));\n const existingCc = update.cc ?? mapHeaderAddr(findHeader(existingHeaders, \"Cc\"));\n const existingBcc = update.bcc ?? mapHeaderAddr(findHeader(existingHeaders, \"Bcc\"));\n\n const { raw } = await buildRawMessage(account, {\n to: existingTo,\n subject: update.subject ?? origSubject,\n body: update.body ?? \"\",\n isHtml: update.isHtml,\n inReplyTo: false,\n cc: existingCc.length > 0 ? existingCc : undefined,\n bcc: existingBcc.length > 0 ? existingBcc : undefined,\n });\n\n const updated = await gmail.users.drafts.update({\n userId: \"me\",\n id,\n requestBody: {\n message: {\n raw,\n threadId: existingMessage.threadId ?? undefined,\n },\n },\n });\n\n return { id: updated.data.message?.id ?? updated.data.id ?? id };\n}\n\nexport async function moveEmail(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n destinationId: string,\n): Promise<void> {\n const { gmail } = clients.get(account);\n const { addLabelIds, removeLabelIds } =\n resolveLabelsForMove(destinationId);\n\n await gmail.users.messages.modify({\n userId: \"me\",\n id,\n requestBody: { addLabelIds, removeLabelIds },\n });\n}\n\nexport async function sendDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n const res = await gmail.users.drafts.send({\n userId: \"me\",\n requestBody: { id },\n });\n return { id: res.data.id ?? id };\n}\n\nexport async function addAttachmentToDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n): Promise<{\n id: string;\n attachment: { id: string; name: string; contentType?: string };\n}> {\n const { gmail } = clients.get(account);\n\n const draftRes = await gmail.users.drafts.get({\n userId: \"me\",\n id: draftId,\n format: \"raw\",\n });\n\n const existingMessage = draftRes.data.message;\n if (!existingMessage?.raw) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n const rawStr = Buffer.from(\n existingMessage.raw.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n const newRawStr = await new Promise<string>((resolve, reject) => {\n const mc = new MailComposer({\n raw: rawStr,\n attachments: [\n {\n filename: name,\n content: Buffer.from(contentBytes, \"base64\"),\n contentType: contentType ?? \"application/octet-stream\",\n },\n ],\n });\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf.toString(\"utf-8\"));\n });\n });\n\n const updated = await gmail.users.drafts.update({\n userId: \"me\",\n id: draftId,\n requestBody: {\n message: {\n raw: base64urlEncode(Buffer.from(newRawStr, \"utf-8\")),\n threadId: existingMessage.threadId ?? undefined,\n },\n },\n });\n\n return {\n id: updated.data.message?.id ?? updated.data.id ?? draftId,\n attachment: {\n id: randomUUID(),\n name,\n contentType: contentType ?? \"application/octet-stream\",\n },\n };\n}\n\nexport async function removeAttachmentFromDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n): Promise<void> {\n const { gmail } = clients.get(account);\n\n // Get the draft with full payload to find the attachment part\n const fullDraft = await gmail.users.drafts.get({\n userId: \"me\",\n id: draftId,\n format: \"full\",\n });\n\n const message = fullDraft.data.message;\n if (!message?.payload) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n // Walk the payload parts to find the attachment with matching attachmentId\n let targetFilename: string | undefined;\n let targetMimeType: string | undefined;\n\n function findAttachment(parts: any[] | undefined): boolean {\n if (!parts) return false;\n for (const part of parts) {\n if (part.body?.attachmentId === attachmentId) {\n targetFilename = part.filename ?? undefined;\n targetMimeType = part.mimeType ?? undefined;\n return true;\n }\n if (part.parts && findAttachment(part.parts)) {\n return true;\n }\n }\n return false;\n }\n\n if (!findAttachment(message.payload.parts)) {\n throw new Error(`attachment not found: ${attachmentId}`);\n }\n\n // Get the raw message\n const rawDraft = await gmail.users.drafts.get({\n userId: \"me\",\n id: draftId,\n format: \"raw\",\n });\n\n const rawStr = Buffer.from(\n rawDraft.data.message!.raw!.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n // Parse and remove the attachment from the MIME message\n const newRawStr = removeMimeAttachment(rawStr, targetFilename, targetMimeType);\n\n // Update the draft with the modified message\n await gmail.users.drafts.update({\n userId: \"me\",\n id: draftId,\n requestBody: {\n message: {\n raw: base64urlEncode(Buffer.from(newRawStr, \"utf-8\")),\n threadId: message.threadId ?? undefined,\n },\n },\n });\n}\n\n/**\n * Remove a specific attachment from a raw MIME message.\n * Uses boundary-based parsing to identify and remove the matching part.\n */\nfunction removeMimeAttachment(\n rawMime: string,\n targetFilename: string | undefined,\n targetMimeType: string | undefined,\n): string {\n // Extract boundary from Content-Type header\n const boundaryMatch = rawMime.match(/boundary=\"?([^\";]+)\"?/i);\n if (!boundaryMatch) {\n // Not a multipart message, can't remove attachment\n return rawMime;\n }\n\n const boundary = boundaryMatch[1];\n const delimiter = `--${boundary}`;\n\n // Split by boundary\n const parts = rawMime.split(delimiter);\n\n // Filter out the part matching the target attachment\n const filtered = parts.filter((part) => {\n if (!part.trim() || part.trim() === \"--\") {\n return true; // Keep preamble and closing delimiter\n }\n\n // Check if this part is the target attachment\n const contentDispMatch = targetFilename &&\n part.match(new RegExp(`Content-Disposition:.*?filename=\"?${escapeRegex(targetFilename)}\"?`, \"i\"));\n\n const contentTypeMatch = targetMimeType &&\n part.match(new RegExp(`Content-Type:\\s*${escapeRegex(targetMimeType)}`, \"i\"));\n\n // If both filename and mime type are specified, both must match\n // If only one is specified, that one must match\n if (targetFilename && targetMimeType) {\n return !(contentDispMatch && contentTypeMatch);\n } else if (targetFilename) {\n return !contentDispMatch;\n } else if (targetMimeType) {\n return !contentTypeMatch;\n }\n\n return true; // No target specified, keep all parts\n });\n\n return filtered.join(delimiter);\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport async function markRead(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n isRead: boolean,\n): Promise<void> {\n const { gmail } = clients.get(account);\n await gmail.users.messages.modify({\n userId: \"me\",\n id,\n requestBody: {\n removeLabelIds: isRead ? [\"UNREAD\"] : undefined,\n addLabelIds: isRead ? undefined : [\"UNREAD\"],\n },\n });\n}\n\nexport async function createFolder(\n clients: GmailClientFactory,\n account: AccountRecord,\n input: CreateFolderInput,\n): Promise<FolderInfo> {\n const { gmail } = clients.get(account);\n const created = await gmail.users.labels.create({\n userId: \"me\",\n requestBody: {\n name: input.displayName,\n messageListVisibility: \"show\",\n labelListVisibility: \"labelShow\",\n },\n });\n return mapFolder(created.data);\n}\n\nexport async function renameFolder(\n clients: GmailClientFactory,\n account: AccountRecord,\n folderId: string,\n newName: string,\n): Promise<FolderInfo> {\n const { gmail } = clients.get(account);\n const updated = await gmail.users.labels.patch({\n userId: \"me\",\n id: folderId,\n requestBody: { name: newName },\n });\n return mapFolder(updated.data);\n}\n\nexport async function deleteFolder(\n clients: GmailClientFactory,\n account: AccountRecord,\n folderId: string,\n): Promise<void> {\n const { gmail } = clients.get(account);\n await gmail.users.labels.delete({\n userId: \"me\",\n id: folderId,\n });\n}\n","import type { AccountStore, AccountRecord } from \"../store/account-store.js\";\nimport type { EmailProvider, ProviderId } from \"./types.js\";\nimport type { ProvidersConfig } from \"../config.js\";\nimport { OutlookProvider } from \"./outlook/index.js\";\nimport { ImapProvider } from \"./imap/index.js\";\nimport { GmailProvider } from \"./gmail/index.js\";\n\nexport interface Registry {\n get(id: ProviderId): EmailProvider;\n resolveByEmail(email: string): { provider: EmailProvider; account: AccountRecord };\n list(): EmailProvider[];\n}\n\nexport interface BuildRegistryOptions {\n store: AccountStore;\n providers?: ProvidersConfig;\n}\n\nexport function buildRegistry(opts: BuildRegistryOptions): Registry {\n const outlookCfg = opts.providers?.outlook;\n const providers = new Map<ProviderId, EmailProvider>();\n providers.set(\"outlook\", new OutlookProvider({\n store: opts.store,\n clientId: outlookCfg?.clientId,\n tenantId: outlookCfg?.tenantId,\n }));\n providers.set(\"imap\", new ImapProvider(opts.store));\n const gmailCfg = opts.providers?.gmail;\n providers.set(\"gmail\", new GmailProvider({\n store: opts.store,\n clientId: gmailCfg?.clientId,\n clientSecret: gmailCfg?.clientSecret,\n }));\n\n function get(id: ProviderId): EmailProvider {\n const p = providers.get(id);\n if (!p) throw new Error(`unknown provider: ${id}`);\n return p;\n }\n\n function resolveByEmail(email: string): {\n provider: EmailProvider;\n account: AccountRecord;\n } {\n const account = opts.store.getAccount(email);\n if (!account) {\n throw new Error(\n `no account registered for \"${email}\". Call add_account first.`,\n );\n }\n return { provider: get(account.provider), account };\n }\n\n return {\n get,\n resolveByEmail,\n list: () => Array.from(providers.values()),\n };\n}\n","import { z } from \"zod\";\nimport type { ResolvedTools } from \"../config.js\";\nimport { markdownToHtml } from \"../markdown-to-html.js\";\nimport { THREAD_MARKER } from \"../providers/outlook/write-ops.js\";\n\n/** JSON-stringify a value into a single MCP text content block. */\nexport function ok(\n data: unknown,\n structuredContent?: Record<string, unknown>,\n) {\n const result: {\n content: Array<{ type: \"text\"; text: string }>;\n structuredContent?: Record<string, unknown>;\n } = {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n };\n if (structuredContent !== undefined) {\n result.structuredContent = structuredContent;\n }\n return result;\n}\n\nexport function fail(message: string) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: message }],\n };\n}\n\nexport function errMsg(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\n// ── shared schemas ──\n\n/** Enum matching {@link import(\"../providers/types.js\").ProviderId}. */\nexport const providerIdEnum = z.enum([\"outlook\", \"imap\", \"gmail\"]);\n\nexport const emailAddrSchema = z.object({\n address: z.string().email(),\n name: z.string().optional(),\n});\n\nexport const emailAddrOutputSchema = z.object({\n name: z.string().optional(),\n address: z.string(),\n});\n\nexport const accountSummaryOutputSchema = z.object({\n email: z.string(),\n provider: providerIdEnum,\n displayName: z.string().optional(),\n addedAt: z.string(),\n hasSignature: z.boolean(),\n hasStyle: z.boolean(),\n});\n\nexport const styleOutputSchema = z.object({\n fontFamily: z.string().optional(),\n fontSize: z.string().optional(),\n fontColor: z.string().optional(),\n});\n\n/** Full account record including tokens, signature, and style. */\nexport const accountFullOutputSchema = z.object({\n email: z.string(),\n provider: providerIdEnum,\n displayName: z.string().optional(),\n tokens: z.record(z.string(), z.unknown()),\n addedAt: z.string(),\n signature: z.string().optional(),\n style: styleOutputSchema.optional(),\n});\n\nexport const emailSummaryOutputSchema = z.object({\n id: z.string(),\n subject: z.string(),\n from: emailAddrOutputSchema.optional(),\n to: z.array(emailAddrOutputSchema).optional(),\n receivedAt: z.string().optional(),\n preview: z.string().optional(),\n isRead: z.boolean().optional(),\n hasAttachments: z.boolean().optional(),\n folder: z.string().optional(),\n});\n\nexport const attachmentMetaOutputSchema = z.object({\n id: z.string(),\n name: z.string(),\n contentType: z.string().optional(),\n size: z.number().optional(),\n});\n\nexport const folderInfoOutputSchema = z.object({\n id: z.string(),\n displayName: z.string(),\n parentFolderId: z.string().optional(),\n childFolderCount: z.number(),\n totalItemCount: z.number(),\n unreadItemCount: z.number(),\n});\n\n// ── body composition helpers ──\n\nexport interface ComposeBodyInput {\n body: string;\n format: \"html\" | \"markdown\";\n signature?: string;\n style?: { fontFamily?: string; fontSize?: string; fontColor?: string };\n includeSignature: boolean;\n}\n\nexport function composeBody(\n input: ComposeBodyInput,\n): { body: string; isHtml: boolean } {\n const { body, format, signature, style, includeSignature } = input;\n\n // Convert markdown to HTML first, then proceed as HTML\n const htmlBody = format === \"markdown\" ? markdownToHtml(body) : body;\n\n const hasSignature = includeSignature && !!signature;\n const hasStyle = !!(\n style &&\n (style.fontFamily || style.fontSize || style.fontColor)\n );\n\n if (!hasSignature && !hasStyle) {\n return { body: htmlBody, isHtml: true };\n }\n\n const styleAttr = hasStyle ? buildStyleAttr(style!) : \"\";\n let result = hasStyle\n ? `<div style=\"${styleAttr}\">${htmlBody}</div>`\n : htmlBody;\n if (hasSignature) result += `\\n<div class=\"signature\">${signature}</div>`;\n return { body: result, isHtml: true };\n}\n\nexport function buildStyleAttr(style: {\n fontFamily?: string;\n fontSize?: string;\n fontColor?: string;\n}): string {\n const parts: string[] = [];\n if (style.fontFamily) parts.push(`font-family: ${style.fontFamily}`);\n if (style.fontSize) parts.push(`font-size: ${style.fontSize}`);\n if (style.fontColor) parts.push(`color: ${style.fontColor}`);\n return parts.join(\"; \");\n}\n\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/\\n/g, \"<br>\");\n}\n\n// ── thread boundary detection ──\n\n/**\n * Find the boundary between the user's answer and the quoted thread in a\n * reply/forward draft. Uses three strategies in order:\n * 1. THREAD_MARKER comment (reliable, survives Graph normalization)\n * 2. Regex spacer match (flexible whitespace/tag variations)\n * 3. Pattern fallback (blockquote, Outlook signature)\n * Returns the boundary indices, or null if no thread content found.\n */\nexport function findThreadBoundary(\n html: string,\n): { threadStart: number; answerEnd: number } | null {\n // ── Tier 1: exact THREAD_MARKER comment ──\n const markerIdx = html.indexOf(THREAD_MARKER);\n if (markerIdx !== -1) {\n // The spacer div sits just before the marker — find it so we replace\n // everything up to the spacer (keeping spacer + marker + thread).\n const before = html.slice(0, markerIdx);\n let answerEnd = before.lastIndexOf(\n '<div style=\"line-height:12px\"><br></div>',\n );\n if (answerEnd === -1) {\n const re = /<div\\s+style=[\"'][^\"']*line-height\\s*:\\s*12px[^\"']*[\"']\\s*>\\s*<br\\s*\\/?>\\s*<\\/div>/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(before)) !== null) answerEnd = m.index;\n }\n return { threadStart: markerIdx, answerEnd: Math.max(answerEnd, 0) };\n }\n\n // ── Tier 2: regex spacer with flexible whitespace/attribute variations ──\n const spacerRe = /<div\\s+style=[\"'][^\"']*line-height\\s*:\\s*12px[^\"']*[\"']\\s*>\\s*<br\\s*\\/?>\\s*<\\/div>/i;\n const spacerMatch = spacerRe.exec(html);\n if (spacerMatch) {\n return { threadStart: spacerMatch.index, answerEnd: spacerMatch.index };\n }\n\n // ── Tier 3: common Outlook thread patterns ──\n for (const re of [/id=[\"']?Signature[\"']?/i, /<blockquote/i]) {\n const idx = html.search(re);\n if (idx !== -1) return { threadStart: idx, answerEnd: idx };\n }\n\n return null;\n}\n\n// ── tool filtering ──\n\n/** Returns true when `name` should be registered given the tool filtering config. */\nexport function shouldRegister(\n name: string,\n tools: ResolvedTools,\n): boolean {\n if (tools.enabledTools) {\n return tools.enabledTools.has(name);\n }\n if (tools.disabledTools) {\n return !tools.disabledTools.has(name);\n }\n return true;\n}\n","import { marked } from \"marked\";\n\n/** Convert Markdown string to HTML. */\nexport function markdownToHtml(md: string): string {\n return marked.parse(md, { async: false }) as string;\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { promises as fs } from \"node:fs\";\nimport { z } from \"zod\";\n\nimport type { AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ProviderId } from \"../providers/types.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport {\n ok,\n fail,\n errMsg,\n providerIdEnum,\n accountSummaryOutputSchema,\n accountFullOutputSchema,\n styleOutputSchema,\n shouldRegister,\n} from \"./shared.js\";\n\nexport function registerAccountTools(\n server: McpServer,\n ctx: {\n store: AccountStore;\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { store, registry, tools } = ctx;\n\n // ---------- list_accounts ----------\n\n const listAccountsOutputSchema = z.object({\n accounts: z.array(accountSummaryOutputSchema),\n });\n\n if (shouldRegister(\"list_accounts\", tools)) {\n server.registerTool(\n \"list_accounts\",\n {\n description:\n \"List all email accounts known to this server (no secrets). \" +\n \"Use the returned `email` value as the `account` argument to other tools.\",\n inputSchema: z.object({}),\n outputSchema: listAccountsOutputSchema,\n },\n async () => {\n const rows = store.listAccounts().map((a) => ({\n email: a.email,\n provider: a.provider,\n displayName: a.displayName,\n addedAt: a.addedAt,\n hasSignature: !!a.signature,\n hasStyle: !!(\n a.style &&\n (a.style.fontFamily || a.style.fontSize || a.style.fontColor)\n ),\n }));\n const data = { accounts: rows };\n return ok(data, data);\n },\n );\n }\n\n // ---------- add_account ----------\n\n const addAccountOutputSchema = z.object({\n status: z.enum([\"pending\", \"ready\"]),\n handle: z.string().optional(),\n verification: z\n .object({\n userCode: z.string(),\n verificationUri: z.string(),\n expiresAt: z.string(),\n message: z.string(),\n })\n .optional(),\n account: accountFullOutputSchema.optional(),\n });\n\n if (shouldRegister(\"add_account\", tools)) {\n server.registerTool(\n \"add_account\",\n {\n description:\n \"Start adding an email account. For Outlook this returns a device code \" +\n \"the user must enter at the verification URL; then call `complete_add_account` \" +\n \"with the returned `handle` to finalize. Disabled in --read-only mode.\",\n inputSchema: z.object({\n provider: providerIdEnum.describe(\"Email backend. 'outlook' (Microsoft Graph) and 'imap' are fully implemented.\"),\n email: z\n .string()\n .email()\n .optional()\n .describe(\n \"Optional hint — the provider will verify it against the auth result.\",\n ),\n config: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Provider-specific config (e.g. IMAP host/port). Unused for Outlook.\",\n ),\n }),\n outputSchema: addAccountOutputSchema,\n },\n async (args) => {\n const provider = registry.get(args.provider as ProviderId);\n try {\n const res = await provider.addAccount({\n email: args.email,\n config: args.config,\n });\n return ok(res, res as unknown as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- complete_add_account ----------\n\n const completeAddAccountOutputSchema = z.object({\n status: z.enum([\"pending\", \"ready\", \"expired\", \"error\"]),\n account: accountFullOutputSchema.optional(),\n error: z.string().optional(),\n });\n\n if (shouldRegister(\"complete_add_account\", tools)) {\n server.registerTool(\n \"complete_add_account\",\n {\n description:\n \"Poll/finalize a pending add_account flow. Returns `pending` until the user \" +\n \"completes the device-code step, then `ready` with the persisted account.\",\n inputSchema: z.object({\n provider: providerIdEnum,\n handle: z.string().min(1),\n }),\n outputSchema: completeAddAccountOutputSchema,\n },\n async (args) => {\n const provider = registry.get(args.provider as ProviderId);\n if (!provider.completeAddAccount) {\n return fail(\n `provider ${args.provider} has no async add-account flow`,\n );\n }\n try {\n const res = await provider.completeAddAccount(args.handle);\n return ok(res, res as unknown as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- account settings ----------\n\n const accountSettingsOutputSchema = z.object({\n signature: z.string().nullable(),\n style: styleOutputSchema.nullable(),\n });\n\n if (shouldRegister(\"get_account_settings\", tools)) {\n server.registerTool(\n \"get_account_settings\",\n {\n description:\n \"Get signature (HTML) and style preferences for an account.\",\n inputSchema: z.object({ account: z.string().email() }),\n outputSchema: accountSettingsOutputSchema,\n },\n async (args) => {\n try {\n const acct = store.getAccount(args.account);\n if (!acct)\n return fail(`no account registered for \"${args.account}\"`);\n const data = {\n signature: acct.signature ?? null,\n style: acct.style ?? null,\n };\n return ok(data, data as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n if (shouldRegister(\"set_account_settings\", tools)) {\n server.registerTool(\n \"set_account_settings\",\n {\n description:\n \"Set signature (HTML snippet) and/or style preferences for an account. \" +\n \"Use `signaturePath` to load a signature from a file (useful for signatures with base64 images). \" +\n \"`signature` and `signaturePath` are mutually exclusive. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: z\n .object({\n account: z.string().email(),\n signature: z\n .string()\n .optional()\n .describe(\n \"HTML snippet — may contain formatting, images, links. \" +\n \"Pass an empty string to clear. \" +\n \"Mutually exclusive with `signaturePath`.\",\n ),\n signaturePath: z\n .string()\n .optional()\n .describe(\n \"Path to a file containing the signature HTML. \" +\n \"The file content is read and stored as the signature. \" +\n \"Useful when the signature contains large base64 images. \" +\n \"Mutually exclusive with `signature`.\",\n ),\n style: z\n .object({\n fontFamily: z.string().optional(),\n fontSize: z.string().optional(),\n fontColor: z.string().optional(),\n })\n .optional()\n .describe(\n \"Font preferences applied to outgoing HTML emails. Pass null to clear.\",\n ),\n })\n .refine(\n (data) => !(data.signature !== undefined && data.signaturePath),\n {\n message:\n \"signature and signaturePath are mutually exclusive — use one or the other\",\n },\n ),\n outputSchema: accountSettingsOutputSchema,\n },\n async (args) => {\n try {\n const acct = store.getAccount(args.account);\n if (!acct)\n return fail(`no account registered for \"${args.account}\"`);\n let resolvedSignature: string | undefined = acct.signature;\n if (args.signaturePath) {\n resolvedSignature = await fs.readFile(args.signaturePath, \"utf-8\");\n } else if (args.signature !== undefined) {\n resolvedSignature = args.signature || undefined;\n }\n const updated = await store.upsertAccount({\n ...acct,\n signature: resolvedSignature,\n style: args.style ?? acct.style,\n });\n const data = {\n signature: updated.signature ?? null,\n style: updated.style ?? null,\n };\n return ok(data, data as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- remove_account ----------\n\n const removeAccountOutputSchema = z.object({\n removed: z.boolean(),\n email: z.string(),\n });\n\n if (shouldRegister(\"remove_account\", tools)) {\n server.registerTool(\n \"remove_account\",\n {\n description:\n \"Forget an account and delete its stored tokens. Disabled in --read-only mode.\",\n inputSchema: z.object({ email: z.string().email() }),\n outputSchema: removeAccountOutputSchema,\n },\n async (args) => {\n const removed = await store.removeAccount(args.email);\n const data = { removed, email: args.email };\n return ok(data, data);\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport { selectBody } from \"../html-to-markdown.js\";\nimport {\n ok,\n fail,\n errMsg,\n emailAddrOutputSchema,\n emailSummaryOutputSchema,\n attachmentMetaOutputSchema,\n shouldRegister,\n} from \"./shared.js\";\n\nexport function registerBrowseTools(\n server: McpServer,\n ctx: {\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { registry, tools } = ctx;\n\n // ---------- email ops ----------\n\n const emailListOutputSchema = z.object({\n account: z.string(),\n count: z.number(),\n items: z.array(emailSummaryOutputSchema),\n skip: z.number(),\n hasMore: z.boolean(),\n });\n\n const searchEmailsOutputSchema = z.object({\n account: z.string(),\n count: z.number(),\n items: z.array(emailSummaryOutputSchema),\n });\n\n if (shouldRegister(\"list_emails\", tools)) {\n server.registerTool(\n \"list_emails\",\n {\n description:\n \"List recent emails in a folder of the given account. Pass the user's email \" +\n \"address as `account`; the server routes to the correct backend automatically.\",\n inputSchema: z.object({\n account: z.string().email(),\n folder: z.string().default(\"inbox\").optional(),\n limit: z.number().int().positive().max(100).optional(),\n unreadOnly: z.boolean().optional(),\n skip: z.number().int().min(0).optional(),\n }),\n outputSchema: emailListOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const { items, hasMore } = await provider.listEmails(account, {\n folder: args.folder,\n limit: args.limit,\n unreadOnly: args.unreadOnly,\n skip: args.skip,\n });\n const data = {\n account: account.email,\n count: items.length,\n items,\n skip: args.skip ?? 0,\n hasMore,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n if (shouldRegister(\"search_emails\", tools)) {\n server.registerTool(\n \"search_emails\",\n {\n description:\n \"Search emails by free-text query (KQL on Outlook). Returns lightweight summaries.\",\n inputSchema: z.object({\n account: z.string().email(),\n query: z.string().min(1),\n limit: z.number().int().positive().max(100).optional(),\n }),\n outputSchema: searchEmailsOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const items = await provider.searchEmails(account, args.query, {\n limit: args.limit,\n });\n const data = {\n account: account.email,\n count: items.length,\n items,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n const readEmailOutputSchema = z.object({\n id: z.string(),\n subject: z.string(),\n from: emailAddrOutputSchema.optional(),\n to: z.array(emailAddrOutputSchema).optional(),\n cc: z.array(emailAddrOutputSchema).optional(),\n bcc: z.array(emailAddrOutputSchema).optional(),\n receivedAt: z.string().optional(),\n preview: z.string().optional(),\n isRead: z.boolean().optional(),\n hasAttachments: z.boolean().optional(),\n folder: z.string().optional(),\n attachments: z.array(attachmentMetaOutputSchema).optional(),\n body: z.string(),\n bodyFormat: z.enum([\"markdown\", \"html\", \"text\"]),\n });\n\n if (shouldRegister(\"read_email\", tools)) {\n server.registerTool(\n \"read_email\",\n {\n description:\n \"Fetch a single email with full body and recipients by id. \" +\n \"Body is returned as `body` with `bodyFormat` indicating the format. \" +\n \"Default format is 'markdown' — HTML is automatically converted to save context tokens.\",\n inputSchema: z.object({\n account: z.string().email(),\n id: z.string().min(1),\n format: z\n .enum([\"markdown\", \"html\", \"text\"])\n .default(\"markdown\")\n .optional()\n .describe(\n \"Output body format. 'markdown' converts HTML to Markdown (default), \" +\n \"'html' returns the raw HTML, 'text' returns plain text.\",\n ),\n }),\n outputSchema: readEmailOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const msg = await provider.readEmail(account, args.id);\n const format = args.format ?? \"markdown\";\n const body = selectBody(msg, format);\n const data = {\n id: msg.id,\n subject: msg.subject,\n from: msg.from,\n to: msg.to,\n cc: msg.cc,\n bcc: msg.bcc,\n receivedAt: msg.receivedAt,\n preview: msg.preview,\n isRead: msg.isRead,\n hasAttachments: msg.hasAttachments,\n folder: msg.folder,\n attachments: msg.attachments,\n body,\n bodyFormat: format,\n };\n return ok(data, data as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n const readAttachmentOutputSchema = z.object({\n name: z.string(),\n contentType: z.string().optional(),\n path: z.string(),\n });\n\n if (shouldRegister(\"read_attachment\", tools)) {\n server.registerTool(\n \"read_attachment\",\n {\n description:\n \"Download an email attachment to a temporary file and return its path. \" +\n \"Use messageId and attachmentId from a prior read_email call.\",\n inputSchema: z.object({\n account: z.string().email(),\n messageId: z.string().min(1),\n attachmentId: z.string().min(1),\n }),\n outputSchema: readAttachmentOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const res = await provider.readAttachment(\n account,\n args.messageId,\n args.attachmentId,\n );\n return ok(res, res as unknown as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import TurndownService from \"turndown\";\n\nconst turndown = new TurndownService();\n\n/** Light wrapper — callers just pass HTML, get markdown back. */\nexport function htmlToMarkdown(html: string): string {\n return turndown.turndown(html);\n}\n\n/** Pick the right body for the requested format. */\nexport function selectBody(\n msg: { bodyHtml?: string; bodyText?: string },\n format: \"markdown\" | \"html\" | \"text\",\n): string {\n switch (format) {\n case \"markdown\": {\n if (msg.bodyHtml) return htmlToMarkdown(msg.bodyHtml);\n if (msg.bodyText) return msg.bodyText;\n return \"\";\n }\n case \"html\": {\n if (msg.bodyHtml) return msg.bodyHtml;\n if (msg.bodyText) return msg.bodyText;\n return \"\";\n }\n case \"text\": {\n if (msg.bodyText) return msg.bodyText;\n if (msg.bodyHtml) return msg.bodyHtml.replace(/<[^>]*>/g, \"\");\n return \"\";\n }\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport {\n ok,\n fail,\n errMsg,\n folderInfoOutputSchema,\n shouldRegister,\n} from \"./shared.js\";\n\nexport function registerFolderTools(\n server: McpServer,\n ctx: {\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { registry, tools } = ctx;\n\n // ---------- list_folders ----------\n\n const listFoldersOutputSchema = z.object({\n account: z.string(),\n count: z.number(),\n items: z.array(folderInfoOutputSchema),\n });\n\n if (shouldRegister(\"list_folders\", tools)) {\n server.registerTool(\n \"list_folders\",\n {\n description:\n \"List available mail folders. Returns top-level folders by default, \" +\n \"or child folders of the given parent when `parentFolderId` is provided.\",\n inputSchema: z.object({\n account: z.string().email(),\n parentFolderId: z\n .string()\n .optional()\n .describe(\n \"When provided, lists child folders of this folder. \" +\n \"When omitted, lists top-level folders (children of the root).\",\n ),\n }),\n outputSchema: listFoldersOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const items = await provider.listFolders(account, {\n parentFolderId: args.parentFolderId,\n });\n const data = {\n account: account.email,\n count: items.length,\n items,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- create_folder ----------\n\n const createFolderOutputSchema = z.object({\n created: z.literal(true),\n folder: folderInfoOutputSchema,\n });\n\n if (shouldRegister(\"create_folder\", tools)) {\n server.registerTool(\n \"create_folder\",\n {\n description:\n \"Create a new mail folder. Creates under the root folder by default, \" +\n \"or under the specified parent when `parentFolderId` is provided. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n displayName: z\n .string()\n .min(1)\n .describe(\"Name of the new folder\"),\n parentFolderId: z\n .string()\n .optional()\n .describe(\n \"When provided, creates the folder as a child of this folder. \" +\n \"When omitted, creates under the root folder.\",\n ),\n }),\n outputSchema: createFolderOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const folder = await provider.createFolder(account, {\n displayName: args.displayName,\n parentFolderId: args.parentFolderId,\n });\n const data = { created: true as const, folder };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- delete_folder ----------\n\n const deleteFolderOutputSchema = z.object({\n deleted: z.literal(true),\n id: z.string(),\n });\n\n if (shouldRegister(\"delete_folder\", tools)) {\n server.registerTool(\n \"delete_folder\",\n {\n description:\n \"Delete a mail folder by ID. Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n folderId: z\n .string()\n .min(1)\n .describe(\"ID of the folder to delete\"),\n }),\n outputSchema: deleteFolderOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.deleteFolder(account, args.folderId);\n const data = { deleted: true as const, id: args.folderId };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- rename_folder ----------\n\n const renameFolderOutputSchema = z.object({\n renamed: z.literal(true),\n folder: folderInfoOutputSchema,\n });\n\n if (shouldRegister(\"rename_folder\", tools)) {\n server.registerTool(\n \"rename_folder\",\n {\n description:\n \"Rename an existing mail folder. Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n folderId: z\n .string()\n .min(1)\n .describe(\"ID of the folder to rename\"),\n newName: z\n .string()\n .min(1)\n .describe(\"New display name for the folder\"),\n }),\n outputSchema: renameFolderOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const folder = await provider.renameFolder(\n account,\n args.folderId,\n args.newName,\n );\n const data = { renamed: true as const, folder };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport { ok, fail, errMsg, shouldRegister } from \"./shared.js\";\n\nexport function registerOrganizeTools(\n server: McpServer,\n ctx: {\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { registry, tools } = ctx;\n\n // Shared helpers — extract the resolved-account lookup and error handling\n // so archive/trash/mark_read/mark_unread handlers stay minimal.\n\n async function moveToWellKnown(\n args: { account: string; id: string },\n destination: string,\n resultKey: string,\n ) {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.moveEmail(account, args.id, destination);\n const data: Record<string, unknown> = { id: args.id };\n data[resultKey] = true;\n return ok(data, data);\n }\n\n async function markReadState(\n args: { account: string; id: string },\n isRead: boolean,\n ) {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.markRead(account, args.id, isRead);\n const data = { marked: true as const, id: args.id, isRead };\n return ok(data, data);\n }\n\n // ---------- archive ----------\n\n const archiveMoveSchema = z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Message ID to move\"),\n });\n\n const archiveOutputSchema = z.object({\n archived: z.literal(true),\n id: z.string(),\n });\n\n if (shouldRegister(\"archive_email\", tools)) {\n server.registerTool(\n \"archive_email\",\n {\n description:\n \"Move a message to the Archive folder. Disabled in --read-only mode.\",\n inputSchema: archiveMoveSchema,\n outputSchema: archiveOutputSchema,\n },\n async (args) => {\n try {\n return await moveToWellKnown(args, \"archive\", \"archived\");\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- trash ----------\n\n const trashOutputSchema = z.object({\n trashed: z.literal(true),\n id: z.string(),\n });\n\n if (shouldRegister(\"trash_email\", tools)) {\n server.registerTool(\n \"trash_email\",\n {\n description:\n \"Move a message to the Deleted Items (trash) folder. Disabled in --read-only mode.\",\n inputSchema: archiveMoveSchema,\n outputSchema: trashOutputSchema,\n },\n async (args) => {\n try {\n return await moveToWellKnown(args, \"deleteditems\", \"trashed\");\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- move ----------\n\n const moveEmailOutputSchema = z.object({\n moved: z.literal(true),\n id: z.string(),\n destination: z.string(),\n });\n\n if (shouldRegister(\"move_email\", tools)) {\n server.registerTool(\n \"move_email\",\n {\n description:\n \"Move a message to any folder by well-known name (e.g. 'inbox', 'drafts', \" +\n \"'junkemail', 'sentitems', 'outbox') or custom folder ID. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Message ID to move\"),\n destination: z\n .string()\n .min(1)\n .describe(\n \"Destination folder — a well-known folder name \" +\n \"('archive', 'deleteditems', 'inbox', 'drafts', 'junkemail', \" +\n \"'sentitems', 'outbox') or a raw folder ID.\",\n ),\n }),\n outputSchema: moveEmailOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.moveEmail(account, args.id, args.destination);\n const data = {\n moved: true as const,\n id: args.id,\n destination: args.destination,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- mark_read / mark_unread ----------\n\n const markReadInputSchema = z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Message ID to mark as read\"),\n });\n\n const markReadOutputSchema = z.object({\n marked: z.literal(true),\n id: z.string(),\n isRead: z.boolean(),\n });\n\n if (shouldRegister(\"mark_read\", tools)) {\n server.registerTool(\n \"mark_read\",\n {\n description:\n \"Mark a message as read. Disabled in --read-only mode.\",\n inputSchema: markReadInputSchema,\n outputSchema: markReadOutputSchema,\n },\n async (args) => {\n try {\n return await markReadState(args, true);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n if (shouldRegister(\"mark_unread\", tools)) {\n server.registerTool(\n \"mark_unread\",\n {\n description:\n \"Mark a message as unread. Disabled in --read-only mode.\",\n inputSchema: markReadInputSchema,\n outputSchema: markReadOutputSchema,\n },\n async (args) => {\n try {\n return await markReadState(args, false);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { readFileSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\n\nimport type { AccountRecord, AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { EmailProvider, SendInput } from \"../providers/types.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport {\n ok,\n fail,\n errMsg,\n emailAddrSchema,\n composeBody,\n shouldRegister,\n findThreadBoundary,\n} from \"./shared.js\";\n\nexport function registerComposeTools(\n server: McpServer,\n ctx: {\n store: AccountStore;\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { store, registry, tools } = ctx;\n\n const MIME_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".webp\": \"image/webp\",\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".csv\": \"text/csv\",\n \".json\": \"application/json\",\n \".xml\": \"application/xml\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".doc\": \"application/msword\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".mp3\": \"audio/mpeg\",\n \".mp4\": \"video/mp4\",\n };\n\n const sendEmailSchema = z.object({\n account: z.string().email(),\n to: z.array(emailAddrSchema).min(1),\n cc: z.array(emailAddrSchema).optional(),\n bcc: z.array(emailAddrSchema).optional(),\n subject: z.string(),\n body: z.string(),\n format: z\n .enum([\"html\", \"markdown\"])\n .describe(\n \"Body format. 'html' sends the body as-is (must be valid HTML). \" +\n \"'markdown' converts the body from Markdown to HTML for clean rendering on the recipient side.\",\n ),\n include_signature: z\n .boolean()\n .describe(\n \"Whether to append the account's saved HTML signature to the email. \" +\n \"If true, don't include a signature in the body param to avoid double signature. \" +\n \"Returns an error if true but no signature is configured for this account.\",\n ),\n inReplyTo: z\n .union([z.string(), z.literal(false)])\n .describe(\n \"Message ID to reply to. When set, sends as a threaded reply \" +\n \"which includes the quoted thread history automatically. \" +\n \"Set to `false` for a new email (not a reply).\",\n ),\n replyAll: z\n .boolean()\n .default(false)\n .optional()\n .describe(\n \"When true and `inReplyTo` is set, reply to all recipients \" +\n \"instead of just the sender.\",\n ),\n forwardMessageId: z\n .string()\n .optional()\n .describe(\n \"Message ID to forward. When set, sends as a forward of the \" +\n \"specified message, preserving the original content. \" +\n \"Mutually exclusive with `inReplyTo`.\",\n ),\n attachments: z\n .array(\n z.object({\n filePath: z\n .string()\n .min(1)\n .describe(\"Absolute path to a local file\"),\n name: z\n .string()\n .optional()\n .describe(\n \"Attachment filename. Defaults to the file's basename.\",\n ),\n }),\n )\n .optional()\n .describe(\n \"File attachments to include. The server reads the files from \" +\n \"disk and base64-encodes them automatically.\",\n ),\n });\n\n type SendEmailArgs = z.infer<typeof sendEmailSchema>;\n\n async function handleSendOrDraft(\n args: SendEmailArgs,\n action: (\n provider: EmailProvider,\n account: AccountRecord,\n msg: SendInput,\n ) => Promise<{ id: string }>,\n resultKey: string,\n toolName: string,\n ) {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n if (args.include_signature && !account.signature) {\n return fail(\n \"include_signature is true but no signature is configured for this account. \" +\n \"Set up a signature first with set_account_settings.\",\n );\n }\n const composed = composeBody({\n body: args.body,\n format: args.format,\n signature: account.signature,\n style: account.style,\n includeSignature: args.include_signature,\n });\n if (args.inReplyTo && args.forwardMessageId) {\n return fail(\n \"inReplyTo and forwardMessageId are mutually exclusive — use one or the other\",\n );\n }\n\n // Process file attachments: read + encode each file\n let processedAttachments: SendInput[\"attachments\"] = undefined;\n if (args.attachments && args.attachments.length > 0) {\n processedAttachments = args.attachments.map((att) => {\n const fileData = readFileSync(att.filePath);\n const ext = extname(att.filePath).toLowerCase();\n return {\n name: att.name ?? basename(att.filePath),\n contentBytes: fileData.toString(\"base64\"),\n contentType: MIME_TYPES[ext] ?? \"application/octet-stream\",\n };\n });\n }\n\n const res = await action(provider, account, {\n to: args.to,\n cc: args.cc,\n bcc: args.bcc,\n subject: args.subject,\n body: composed.body,\n isHtml: composed.isHtml,\n inReplyTo: args.inReplyTo,\n replyAll: args.replyAll,\n forwardMessageId: args.forwardMessageId,\n attachments: processedAttachments,\n });\n const result: Record<string, unknown> = { [resultKey]: true, ...res };\n if (toolName === \"draft_email\" && res.id) {\n const draft = await provider.readEmail(account, res.id);\n result.draftHtml = draft.bodyHtml;\n }\n return ok(result, result);\n } catch (err) {\n return fail(errMsg(err));\n }\n }\n\n // ---------- send_email ----------\n\n const sendEmailOutputSchema = {\n sent: z.literal(true),\n id: z.string(),\n };\n\n if (shouldRegister(\"send_email\", tools)) {\n server.registerTool(\n \"send_email\",\n {\n description:\n \"Send an email from the given account. Appends the \" +\n \"account's signature (HTML) and applies style preferences when \" +\n \"`include_signature` is true. Returns an error if \" +\n \"`include_signature` is true but no signature is configured. \" +\n \"When `inReplyTo` is set, sends as a reply (or reply-all) which \" +\n \"preserves thread history and conversation threading. \" +\n \"When `forwardMessageId` is set, sends as a forward of the \" +\n \"specified message, preserving the original content. \" +\n \"`inReplyTo` and `forwardMessageId` are mutually exclusive. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: sendEmailSchema,\n outputSchema: sendEmailOutputSchema,\n },\n async (args) =>\n handleSendOrDraft(\n args as SendEmailArgs,\n (p, a, m) => p.sendEmail(a, m),\n \"sent\",\n \"send_email\",\n ),\n );\n }\n\n // ---------- draft_email ----------\n\n const draftEmailOutputSchema = {\n draft: z.literal(true),\n id: z.string(),\n draftHtml: z.string().optional(),\n };\n\n if (shouldRegister(\"draft_email\", tools)) {\n server.registerTool(\n \"draft_email\",\n {\n description:\n \"Create a draft email from the given account without sending it. \" +\n \"Works identically to send_email — appends signature when \" +\n \"`include_signature` is true, applies style, and supports replies \" +\n \"and forwards — but saves the message to the Drafts folder \" +\n \"instead of sending. Returns the draft message ID and the draft's \" +\n \"HTML body content (`draftHtml`). Before sending the draft, \" +\n \"inspect `draftHtml` to verify the draft looks correct: no \" +\n \"duplicate signature blocks, no broken or missing inline images, \" +\n \"no malformed HTML, and no other formatting issues. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: sendEmailSchema,\n outputSchema: draftEmailOutputSchema,\n },\n async (args) =>\n handleSendOrDraft(\n args as SendEmailArgs,\n (p, a, m) => p.saveDraft(a, m),\n \"draft\",\n \"draft_email\",\n ),\n );\n }\n\n // ---------- edit_draft ----------\n\n const editDraftSchema = z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Draft message ID to edit\"),\n to: z.array(emailAddrSchema).optional(),\n cc: z.array(emailAddrSchema).optional(),\n bcc: z.array(emailAddrSchema).optional(),\n subject: z.string().optional(),\n body: z.string().optional(),\n format: z\n .enum([\"html\", \"markdown\"])\n .optional()\n .describe(\n \"Body format. Only meaningful when `body` is also provided. \" +\n \"'html' sends the body as-is (must be valid HTML). \" +\n \"'markdown' converts the body from Markdown to HTML for clean rendering on the recipient side.\",\n ),\n include_signature: z\n .boolean()\n .optional()\n .describe(\n \"Whether to re-apply the account's saved HTML signature to the body. \" +\n \"If true, don't include a signature in the body param. \" +\n \"Only meaningful when `body` is also provided. \" +\n \"Returns an error if true but no signature is configured for this account.\",\n ),\n new_attachments: z\n .array(\n z.object({\n filePath: z\n .string()\n .min(1)\n .describe(\"Absolute path to a local file\"),\n name: z\n .string()\n .optional()\n .describe(\n \"Attachment filename. Defaults to the file's basename.\",\n ),\n }),\n )\n .optional()\n .describe(\n \"New file attachments to add to the draft. The server reads \" +\n \"the files from disk and base64-encodes them automatically.\",\n ),\n remove_attachments: z\n .array(z.string().min(1))\n .optional()\n .describe(\n \"Attachment IDs to remove from the draft. Get attachment IDs \" +\n \"from read_email.\",\n ),\n });\n\n type EditDraftArgs = z.infer<typeof editDraftSchema>;\n\n const editDraftOutputSchema = {\n edited: z.literal(true),\n id: z.string(),\n draftHtml: z.string().optional(),\n };\n\n if (shouldRegister(\"edit_draft\", tools)) {\n server.registerTool(\n \"edit_draft\",\n {\n description:\n \"Edit an existing draft email by ID. Only the fields you provide \" +\n \"are updated — unmentioned fields stay unchanged. When `body` is \" +\n \"provided and `include_signature` is true, the account's signature \" +\n \"is re-applied. Returns the draft ID and the draft's updated HTML \" +\n \"body content (`draftHtml`). Before sending, inspect `draftHtml` \" +\n \"to verify the draft looks correct. \" +\n \"Does not support changing `inReplyTo` or `forwardMessageId` — \" +\n \"those are set at creation time via `draft_email`. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: editDraftSchema,\n outputSchema: editDraftOutputSchema,\n },\n async (args) => {\n const a = args as EditDraftArgs;\n try {\n const { provider, account } = registry.resolveByEmail(a.account);\n if (a.include_signature && !account.signature) {\n return fail(\n \"include_signature is true but no signature is configured for this account. \" +\n \"Set up a signature first with set_account_settings.\",\n );\n }\n let bodyPayload: string | undefined;\n let isHtmlPayload: boolean | undefined;\n if (a.body !== undefined) {\n const composed = composeBody({\n body: a.body,\n format: a.format ?? \"html\",\n signature: account.signature,\n style: account.style,\n includeSignature: !!a.include_signature,\n });\n bodyPayload = composed.body;\n isHtmlPayload = composed.isHtml;\n }\n\n // Preserve quoted thread when editing reply/forward drafts.\n // Uses multi-strategy detection: marker → regex spacer → pattern fallback.\n if (bodyPayload !== undefined) {\n try {\n const existing = await provider.readEmail(account, a.id);\n const existingHtml = existing.bodyHtml ?? \"\";\n const boundary = findThreadBoundary(existingHtml);\n if (boundary !== null) {\n // Replace only the old answer; keep the spacer + marker + thread.\n bodyPayload = bodyPayload + existingHtml.slice(boundary.answerEnd);\n }\n } catch {\n // If we can't read the existing draft, proceed with the new\n // body as-is (no thread to preserve).\n }\n }\n\n const res = await provider.updateDraft(account, a.id, {\n to: a.to,\n cc: a.cc,\n bcc: a.bcc,\n subject: a.subject,\n body: bodyPayload,\n isHtml: isHtmlPayload,\n });\n\n // Handle new attachments\n const newAttachmentIds: string[] = [];\n if (a.new_attachments && a.new_attachments.length > 0) {\n for (const att of a.new_attachments) {\n const fileData = readFileSync(att.filePath);\n const ext = extname(att.filePath).toLowerCase();\n const contentType =\n MIME_TYPES[ext] ?? \"application/octet-stream\";\n const attRes = await provider.addAttachmentToDraft(\n account,\n res.id,\n att.name ?? basename(att.filePath),\n fileData.toString(\"base64\"),\n contentType,\n );\n newAttachmentIds.push(attRes.attachment.id);\n }\n }\n\n // Handle attachment removal\n const removedIds: string[] = [];\n if (a.remove_attachments && a.remove_attachments.length > 0) {\n for (const attId of a.remove_attachments) {\n await provider.removeAttachmentFromDraft(\n account,\n res.id,\n attId,\n );\n removedIds.push(attId);\n }\n }\n\n const draft = await provider.readEmail(account, res.id);\n const result = {\n edited: true as const,\n id: res.id,\n draftHtml: draft.bodyHtml ?? \"\",\n };\n return ok(result, result);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- send_draft ----------\n\n const sendDraftOutputSchema = {\n sent: z.literal(true),\n id: z.string(),\n };\n\n if (shouldRegister(\"send_draft\", tools)) {\n server.registerTool(\n \"send_draft\",\n {\n description:\n \"Send an existing draft email by ID. \" +\n \"Use this with draft IDs returned by `draft_email` or `edit_draft`. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: {\n account: z.string().email(),\n id: z.string().min(1).describe(\"Draft message ID to send\"),\n },\n outputSchema: sendDraftOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const res = await provider.sendDraft(account, args.id);\n const data = { sent: true as const, id: res.id };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport type { AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\n\n// Re-export compose helpers for tests\nexport { composeBody, escapeHtml, buildStyleAttr } from \"./shared.js\";\nexport { markdownToHtml } from \"../markdown-to-html.js\";\n\n// Submodule registration functions\nimport { registerAccountTools } from \"./accounts.js\";\nimport { registerBrowseTools } from \"./browse.js\";\nimport { registerFolderTools } from \"./folders.js\";\nimport { registerOrganizeTools } from \"./organize.js\";\nimport { registerComposeTools } from \"./compose.js\";\n\n\nexport interface RegisterToolsOptions {\n store: AccountStore;\n registry: Registry;\n tools: ResolvedTools;\n}\n\nexport function registerTools(\n server: McpServer,\n opts: RegisterToolsOptions,\n): void {\n const { store, registry, tools } = opts;\n\n registerAccountTools(server, { store, registry, tools });\n registerBrowseTools(server, { registry, tools });\n registerFolderTools(server, { registry, tools });\n registerOrganizeTools(server, { registry, tools });\n registerComposeTools(server, { store, registry, tools });\n}\n","{\n \"name\": \"hypermail-mcp\",\n \"version\": \"0.7.5\",\n \"description\": \"Unified email MCP server — operate any inbox (Outlook now, IMAP/Gmail later) by passing an email address.\",\n \"type\": \"module\",\n \"bin\": {\n \"hypermail-mcp\": \"dist/cli.js\"\n },\n \"main\": \"dist/cli.js\",\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"dev:http\": \"tsup && node dist/cli.js --http --config hypermail-config.http.json\",\n \"start\": \"node dist/cli.js\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"prepublishOnly\": \"pnpm build && pnpm test\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"email\",\n \"outlook\",\n \"microsoft-graph\",\n \"imap\"\n ],\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/mateotiedra/hypermail-mcp.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/mateotiedra/hypermail-mcp/issues\"\n },\n \"dependencies\": {\n \"@azure/msal-node\": \"^2.16.2\",\n \"@microsoft/microsoft-graph-client\": \"^3.0.7\",\n \"@modelcontextprotocol/sdk\": \"^1.0.4\",\n \"google-auth-library\": \"^9.15.1\",\n \"googleapis\": \"^144.0.0\",\n \"imapflow\": \"^1.3.3\",\n \"isomorphic-fetch\": \"^3.0.0\",\n \"marked\": \"^18.0.4\",\n \"nodemailer\": \"^8.0.8\",\n \"turndown\": \"^7.2.4\",\n \"zod\": \"^4.4.3\"\n },\n \"optionalDependencies\": {\n \"keytar\": \"^7.9.0\"\n },\n \"devDependencies\": {\n \"@types/isomorphic-fetch\": \"^0.0.39\",\n \"@types/node\": \"^22.10.2\",\n \"@types/nodemailer\": \"^8.0.0\",\n \"@types/turndown\": \"^5.0.6\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.7.2\",\n \"vitest\": \"^2.1.8\"\n }\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nexport const VERSION: string = pkg.version;\n","import type { EmailFull } from \"../providers/types.js\";\nimport type { WatchConfig } from \"../config.js\";\n\n/** Post a new-email event to the configured webhook URL with exponential\n * backoff retry. Returns `true` if delivery succeeded, `false` if all\n * retries were exhausted. */\nexport async function postWebhook(\n email: EmailFull,\n config: WatchConfig,\n): Promise<boolean> {\n if (!config.webhook) return false;\n\n const { url, retry } = config.webhook;\n const maxAttempts = retry.maxAttempts;\n const baseDelayMs = retry.baseDelayMs;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delay = baseDelayMs * (2 ** (attempt - 1));\n await sleep(delay);\n }\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(email),\n });\n\n if (res.ok) return true;\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] webhook POST ${email.id} attempt ${attempt + 1}/${maxAttempts}: HTTP ${res.status}`,\n );\n } catch (err: unknown) {\n const code = (err as { code?: string }).code ?? \"\";\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] webhook POST ${email.id} attempt ${attempt + 1}/${maxAttempts}: ${code || String(err)}`,\n );\n }\n }\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] webhook delivery failed after ${maxAttempts} retries for ${email.id}`,\n );\n return false;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { spawn } from \"node:child_process\";\nimport type { EmailFull } from \"../providers/types.js\";\nimport type { WatchConfig } from \"../config.js\";\n\n/**\n * Execute the configured script with a new-email JSON payload on stdin.\n * Supports exponential backoff retry — mirrors {@link postWebhook}.\n *\n * Returns `true` if the script exited with code 0, `false` if all retries\n * were exhausted or the script timed out.\n */\nexport async function runScript(\n email: EmailFull,\n config: WatchConfig,\n): Promise<boolean> {\n if (!config.script) return false;\n\n const { path: scriptPath, timeoutMs, retry } = config.script;\n const maxAttempts = retry?.maxAttempts ?? 5;\n const baseDelayMs = retry?.baseDelayMs ?? 1000;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delay = baseDelayMs * (2 ** (attempt - 1));\n await sleep(delay);\n }\n\n try {\n const ok = await spawnWithTimeout(\n scriptPath,\n JSON.stringify(email),\n timeoutMs,\n );\n\n if (ok) return true;\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script ${email.id} attempt ${attempt + 1}/${maxAttempts}: non-zero exit code`,\n );\n } catch (err: unknown) {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script ${email.id} attempt ${attempt + 1}/${maxAttempts}: ${String(err)}`,\n );\n }\n }\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script delivery failed after ${maxAttempts} retries for ${email.id}`,\n );\n return false;\n}\n\n// ── helpers ──\n\n/**\n * Spawn `node <scriptPath>`, pipe `stdinData` to stdin, and resolve when the\n * child exits or the timeout fires.\n *\n * Timeout kills the child with SIGTERM and resolves `false`. A non-zero exit\n * code also resolves `false` (retry is handled by the caller).\n */\nfunction spawnWithTimeout(\n scriptPath: string,\n stdinData: string,\n timeoutMs: number,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(\"node\", [scriptPath], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stderr = \"\";\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf-8\");\n });\n\n // Timeout guard — SIGTERM the child and move on.\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\");\n if (stderr) {\n // eslint-disable-next-line no-console\n console.error(`[hypermail-watch] script timed out after ${timeoutMs}ms. stderr:\\n${stderr}`);\n }\n resolve(false);\n }, timeoutMs);\n\n child.on(\"close\", (code: number | null) => {\n clearTimeout(timer);\n if (stderr && code !== 0) {\n // eslint-disable-next-line no-console\n console.error(`[hypermail-watch] script stderr:\\n${stderr}`);\n }\n resolve(code === 0);\n });\n\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n clearTimeout(timer);\n // eslint-disable-next-line no-console\n console.error(`[hypermail-watch] script spawn error: ${err.message}`);\n resolve(false);\n });\n\n // Pipe the full Email JSON to stdin and close the stream.\n child.stdin?.end(stdinData);\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { WatchConfig } from \"../config.js\";\nimport type { EmailFull } from \"../providers/types.js\";\nimport { postWebhook } from \"./webhook.js\";\nimport { runScript } from \"./script.js\";\n\n/**\n * Polls all accounts' inboxes on an interval, detects new emails via\n * {@link AccountRecord.lastSeenIds}, and emits them via the webhook HTTP\n * client.\n *\n * Instantiated once at server startup when `config.watch.enabled` is true.\n * Gated behind `HYPERMAIL_WATCH_ENABLED` or explicit config opt-in — both\n * default to off.\n */\nexport class WatcherManager {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly store: AccountStore,\n private readonly registry: Registry,\n private readonly config: WatchConfig,\n ) {}\n\n /** Start the poll loop. Fires immediately on the first tick, then every\n * `pollIntervalSeconds`. Safe to call multiple times — subsequent calls\n * are no-ops. */\n start(): void {\n if (this.intervalId !== null) return;\n this.poll(); // immediate first poll\n this.intervalId = setInterval(\n () => this.poll(),\n this.config.pollIntervalSeconds * 1000,\n );\n }\n\n /** Stop the poll loop and release the interval. Safe to call when already\n * stopped. */\n stop(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n // ── private ──\n\n private async poll(): Promise<void> {\n const accounts = this.store.listAccounts();\n for (const acct of accounts) {\n try {\n await this.pollAccount(acct.email);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] poll failed for ${acct.email}:`,\n err,\n );\n }\n }\n }\n\n private async pollAccount(email: string): Promise<void> {\n const { provider, account } = this.registry.resolveByEmail(email);\n const result = await provider.listEmails(account, {\n folder: \"inbox\",\n limit: 50,\n });\n\n const knownIds = [...(account.lastSeenIds ?? [])];\n const newEmails = result.items.filter((e) => !knownIds.includes(e.id));\n\n if (newEmails.length === 0) return;\n\n for (const summary of newEmails) {\n try {\n const full: EmailFull = await provider.readEmail(account, summary.id);\n await this.emit(full);\n knownIds.unshift(summary.id);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] emission failed for ${email}/${summary.id}:`,\n err,\n );\n }\n }\n\n // Cap at 200 and persist through the encrypted store.\n const capped = knownIds.slice(0, 200);\n await this.store.upsertAccount({ ...account, lastSeenIds: capped });\n }\n\n private async emit(full: EmailFull): Promise<void> {\n await postWebhook(full, this.config);\n // Fire-and-forget — script execution must not block the poll loop.\n runScript(full, this.config).catch((err: unknown) => {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script unhandled error for ${full.id}:`,\n err,\n );\n });\n }\n}\n","import { z } from \"zod\";\n\n// ── Schema ──\n\nconst httpConfigSchema = z.object({\n enabled: z.boolean().default(false),\n port: z.number().int().min(1).max(65535).default(3000),\n host: z.string().default(\"127.0.0.1\"),\n});\n\nconst toolsConfigSchema = z.object({\n disabled: z.array(z.string()).optional(),\n enabled: z.array(z.string()).optional(),\n});\n\nconst outlookProviderSchema = z.object({\n clientId: z.string().optional(),\n tenantId: z.string().optional(),\n});\n\nconst gmailProviderSchema = z.object({\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n});\n\nconst providersConfigSchema = z.object({\n outlook: outlookProviderSchema.optional(),\n gmail: gmailProviderSchema.optional(),\n});\n\nconst watchRetrySchema = z.object({\n maxAttempts: z.number().int().min(1).max(10).default(5),\n baseDelayMs: z.number().int().min(100).default(1000),\n});\n\nconst watchWebhookSchema = z.object({\n url: z.string(),\n retry: watchRetrySchema.optional(),\n});\n\nconst watchScriptSchema = z.object({\n path: z.string(),\n timeoutMs: z.number().int().min(1000).default(30000),\n retry: watchRetrySchema.optional(),\n});\n\nconst watchConfigSchema = z.object({\n enabled: z.boolean().default(false),\n pollIntervalSeconds: z.number().int().min(10).max(3600).default(10),\n webhook: watchWebhookSchema.optional(),\n script: watchScriptSchema.optional(),\n});\n\nexport const rawConfigSchema = z.object({\n dataDir: z.string().optional(),\n http: httpConfigSchema.optional(),\n tools: toolsConfigSchema.optional(),\n providers: providersConfigSchema.optional(),\n watch: watchConfigSchema.optional(),\n});\n\n// ── Types ──\n\nexport interface HttpConfig {\n enabled: boolean;\n port: number;\n host: string;\n}\n\nexport interface ToolsConfig {\n disabled?: string[];\n enabled?: string[];\n}\n\nexport interface OutlookProviderConfig {\n clientId?: string;\n tenantId?: string;\n}\n\nexport interface GmailProviderConfig {\n clientId?: string;\n clientSecret?: string;\n}\n\nexport interface ProvidersConfig {\n outlook?: OutlookProviderConfig;\n gmail?: GmailProviderConfig;\n}\n\nexport interface WatchRetryConfig {\n /** Maximum number of webhook delivery attempts (default: 5). */\n maxAttempts: number;\n /** Base delay in milliseconds for exponential backoff (default: 1000). */\n baseDelayMs: number;\n}\n\nexport interface WatchWebhookConfig {\n /** URL to POST new-email events to. */\n url: string;\n /** Retry configuration for failed deliveries. */\n retry: WatchRetryConfig;\n}\n\nexport interface WatchScriptConfig {\n /** Absolute path to a script that receives new-email JSON on stdin. */\n path: string;\n /** Maximum time in ms before the child process is killed (default: 30000). */\n timeoutMs: number;\n /** Retry configuration for failed script executions. */\n retry?: WatchRetryConfig;\n}\n\nexport interface WatchConfig {\n /** Whether the email poll loop is enabled (default: false). */\n enabled: boolean;\n /** Seconds between inbox polls (min 10, default 10). */\n pollIntervalSeconds: number;\n /** Webhook delivery configuration. */\n webhook?: WatchWebhookConfig;\n /** Script-based delivery configuration — spawns a child process per new email. */\n script?: WatchScriptConfig;\n}\n\n/** Fully resolved application configuration (after ${VAR} expansion and CLI merge). */\nexport interface AppConfig {\n dataDir?: string;\n http: HttpConfig;\n tools?: ToolsConfig;\n providers?: ProvidersConfig;\n watch?: WatchConfig;\n}\n\n/** CLI flags that can override config file values. */\nexport interface CliOverrides {\n http?: boolean;\n port?: number;\n host?: string;\n dataDir?: string;\n}\n\n// ── Known tool names ──\n\n/**\n * Every tool that {@link registerTools} may register.\n * Used for validation — typos in tools.disabled / tools.enabled are caught at startup.\n */\n// Legacy: `check_notifications` was removed in v0.7.0 but is kept here\n// so existing configs that reference it don't break validation.\nexport const KNOWN_TOOLS = [\n \"list_accounts\",\n \"add_account\",\n \"complete_add_account\",\n \"get_account_settings\",\n \"set_account_settings\",\n \"remove_account\",\n \"list_emails\",\n \"search_emails\",\n \"read_email\",\n \"read_attachment\",\n \"archive_email\",\n \"trash_email\",\n \"move_email\",\n \"mark_read\",\n \"mark_unread\",\n \"list_folders\",\n \"create_folder\",\n \"delete_folder\",\n \"rename_folder\",\n \"send_email\",\n \"draft_email\",\n \"edit_draft\",\n \"send_draft\",\n \"check_notifications\",\n] as const;\n\n// ── Helpers ──\n\n/** Extracted tool filtering state for {@link registerTools}. */\nexport interface ResolvedTools {\n /** If set, only these tools are registered (allowlist mode). */\n enabledTools: Set<string> | null;\n /** If set, these tools are NOT registered (blocklist mode). */\n disabledTools: Set<string> | null;\n}\n\n/** Convert {@link AppConfig.tools} into the sets that {@link registerTools} consumes. */\nexport function resolveTools(config: AppConfig): ResolvedTools {\n if (!config.tools) {\n return { enabledTools: null, disabledTools: null };\n }\n return {\n enabledTools: config.tools.enabled\n ? new Set(config.tools.enabled)\n : null,\n disabledTools: config.tools.disabled\n ? new Set(config.tools.disabled)\n : null,\n };\n}\n\n// ── Re-exports ──\n\nexport { loadConfig } from \"./config/load.js\";\n","import { readFileSync } from \"node:fs\";\n\nimport type {\n AppConfig,\n CliOverrides,\n HttpConfig,\n ProvidersConfig,\n ToolsConfig,\n WatchConfig,\n WatchScriptConfig,\n WatchWebhookConfig,\n} from \"../config.js\";\nimport { KNOWN_TOOLS, rawConfigSchema } from \"../config.js\";\n\n// ── Env var names ──\n\n// Dedicated HYPERMAIL_* env vars — one per config field.\n// Also keep legacy names (MS_CLIENT_ID, etc.) for backward compat.\n\nconst ENV_HTTP_ENABLED = \"HYPERMAIL_HTTP_ENABLED\";\nconst ENV_HTTP_PORT = \"HYPERMAIL_HTTP_PORT\";\nconst ENV_HTTP_HOST = \"HYPERMAIL_HTTP_HOST\";\nconst ENV_TOOLS_DISABLED = \"HYPERMAIL_TOOLS_DISABLED\";\nconst ENV_TOOLS_ENABLED = \"HYPERMAIL_TOOLS_ENABLED\";\nconst ENV_OUTLOOK_CLIENT_ID = \"HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID\";\nconst ENV_OUTLOOK_TENANT_ID = \"HYPERMAIL_PROVIDERS_OUTLOOK_TENANT_ID\";\nconst ENV_GMAIL_CLIENT_ID = \"HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID\";\nconst ENV_GMAIL_CLIENT_SECRET = \"HYPERMAIL_PROVIDERS_GMAIL_CLIENT_SECRET\";\nconst ENV_WATCH_ENABLED = \"HYPERMAIL_WATCH_ENABLED\";\nconst ENV_WATCH_POLL_INTERVAL = \"HYPERMAIL_WATCH_POLL_INTERVAL\";\nconst ENV_WATCH_WEBHOOK_URL = \"HYPERMAIL_WATCH_WEBHOOK_URL\";\nconst ENV_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS = \"HYPERMAIL_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS\";\nconst ENV_WATCH_WEBHOOK_RETRY_BASE_DELAY = \"HYPERMAIL_WATCH_WEBHOOK_RETRY_BASE_DELAY_MS\";\nconst ENV_WATCH_SCRIPT_PATH = \"HYPERMAIL_WATCH_SCRIPT_PATH\";\nconst ENV_WATCH_SCRIPT_TIMEOUT_MS = \"HYPERMAIL_WATCH_SCRIPT_TIMEOUT_MS\";\nconst ENV_WATCH_SCRIPT_RETRY_MAX_ATTEMPTS = \"HYPERMAIL_WATCH_SCRIPT_RETRY_MAX_ATTEMPTS\";\nconst ENV_WATCH_SCRIPT_RETRY_BASE_DELAY = \"HYPERMAIL_WATCH_SCRIPT_RETRY_BASE_DELAY_MS\";\n\n// Legacy env var names (backward compat — read only if dedicated var is unset)\nconst LEGACY_MS_CLIENT_ID = \"MS_CLIENT_ID\";\nconst LEGACY_MS_TENANT_ID = \"MS_TENANT_ID\";\nconst LEGACY_GOOGLE_CLIENT_ID = \"GOOGLE_CLIENT_ID\";\nconst LEGACY_GOOGLE_CLIENT_SECRET = \"GOOGLE_CLIENT_SECRET\";\n\n// ── ${VAR} resolution ──\n\nconst ENV_VAR_RE = /\\$\\{([A-Z_][A-Z0-9_]*)\\}/g;\n\nfunction resolveEnvVars(value: string): string {\n return value.replace(ENV_VAR_RE, (_match, name: string) => {\n return process.env[name] ?? \"\";\n });\n}\n\n/** Recursively resolve `${VAR}` placeholders in all string values. */\nfunction deepResolve(obj: unknown): unknown {\n if (typeof obj === \"string\") return resolveEnvVars(obj);\n if (Array.isArray(obj)) return obj.map(deepResolve);\n if (obj && typeof obj === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {\n out[key] = deepResolve(val);\n }\n return out;\n }\n return obj;\n}\n\n// ── Type coercion helpers ──\n\n/** Parse a boolean from an env-var string. Returns undefined if unrecognised. */\nfunction parseBool(value: string | undefined): boolean | undefined {\n if (value === undefined) return undefined;\n const lower = value.trim().toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") return true;\n if (lower === \"false\" || lower === \"0\" || lower === \"no\" || lower === \"\") return false;\n return undefined;\n}\n\n/** Parse a positive integer from an env-var string. Returns undefined on parse failure. */\nfunction parseIntSafe(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n if (trimmed === \"\") return undefined;\n const n = Number.parseInt(trimmed, 10);\n return Number.isNaN(n) ? undefined : n;\n}\n\n/** Parse a comma-separated string into a trimmed, filtered array.\n * Returns an empty array for empty/whitespace-only strings so callers\n * can distinguish \"set to empty\" from \"not set at all\". */\nfunction parseStringArray(value: string | undefined): string[] | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n if (trimmed === \"\") return [];\n return trimmed\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\n// ── Validation ──\n\nfunction validateToolNames(\n toolNames: string[] | undefined,\n listName: string,\n): void {\n if (!toolNames || toolNames.length === 0) return;\n const known = new Set<string>(KNOWN_TOOLS as readonly string[]);\n for (const name of toolNames) {\n if (!known.has(name)) {\n throw new Error(\n `Unknown tool \"${name}\" in ${listName}. Known tools: ${KNOWN_TOOLS.join(\", \")}`,\n );\n }\n }\n}\n\n// ── Loading ──\n\n/**\n * Load and validate `hypermail-config.json`.\n *\n * @param configPath File path, or `undefined` to use defaults.\n * @param cliOverrides CLI flags that take precedence over config file values.\n * @returns A fully resolved {@link AppConfig}.\n */\nexport function loadConfig(\n configPath: string | undefined,\n cliOverrides: CliOverrides = {},\n): AppConfig {\n let raw: Record<string, unknown> = {};\n\n if (configPath) {\n try {\n raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch (err) {\n const detail =\n err instanceof SyntaxError\n ? \"Invalid JSON\"\n : err instanceof Error\n ? err.message\n : String(err);\n throw new Error(`Failed to read config file \"${configPath}\": ${detail}`);\n }\n }\n\n // Resolve ${VAR} before zod validation so env-var references become real values.\n raw = deepResolve(raw) as Record<string, unknown>;\n\n // Validate structure\n const parsed = rawConfigSchema.parse(raw);\n\n // ── Env var resolution (fallback layer) ──\n // Fields unset in the config file are filled from HYPERMAIL_* env vars.\n // Priority: CLI > config file > env var > hardcoded default.\n\n // -- HTTP --\n const http: HttpConfig = {\n enabled:\n cliOverrides.http ??\n parsed.http?.enabled ??\n parseBool(process.env[ENV_HTTP_ENABLED]) ??\n false,\n port:\n cliOverrides.port ??\n parsed.http?.port ??\n parseIntSafe(process.env[ENV_HTTP_PORT]) ??\n 3000,\n host:\n cliOverrides.host ??\n parsed.http?.host ??\n process.env[ENV_HTTP_HOST] ??\n \"127.0.0.1\",\n };\n\n // -- Tools --\n const toolsDisabled =\n parsed.tools?.disabled ??\n parseStringArray(process.env[ENV_TOOLS_DISABLED]);\n const toolsEnabled =\n parsed.tools?.enabled ??\n parseStringArray(process.env[ENV_TOOLS_ENABLED]);\n\n if (toolsDisabled && toolsEnabled) {\n throw new Error(\n \"tools.disabled and tools.enabled are mutually exclusive — use one or the other\",\n );\n }\n if (toolsEnabled !== undefined && toolsEnabled.length === 0) {\n throw new Error(\n \"tools.enabled is empty — at least one tool must be listed. \" +\n \"To enable all tools, omit the tools section entirely.\",\n );\n }\n validateToolNames(toolsDisabled, \"tools.disabled\");\n validateToolNames(toolsEnabled, \"tools.enabled\");\n\n const tools: ToolsConfig | undefined =\n toolsDisabled || toolsEnabled\n ? { disabled: toolsDisabled, enabled: toolsEnabled }\n : undefined;\n\n // -- Providers --\n\n // Outlook: dedicated env var first, then legacy name for backward compat\n const outlookClientId =\n parsed.providers?.outlook?.clientId ??\n process.env[ENV_OUTLOOK_CLIENT_ID] ??\n process.env[LEGACY_MS_CLIENT_ID];\n const outlookTenantId =\n parsed.providers?.outlook?.tenantId ??\n process.env[ENV_OUTLOOK_TENANT_ID] ??\n process.env[LEGACY_MS_TENANT_ID];\n\n // Gmail: dedicated env var first, then legacy name for backward compat\n const gmailClientId =\n parsed.providers?.gmail?.clientId ??\n process.env[ENV_GMAIL_CLIENT_ID] ??\n process.env[LEGACY_GOOGLE_CLIENT_ID];\n const gmailClientSecret =\n parsed.providers?.gmail?.clientSecret ??\n process.env[ENV_GMAIL_CLIENT_SECRET] ??\n process.env[LEGACY_GOOGLE_CLIENT_SECRET];\n\n let providers: ProvidersConfig | undefined;\n if (outlookClientId || outlookTenantId || gmailClientId || gmailClientSecret) {\n providers = {};\n if (outlookClientId || outlookTenantId) {\n providers.outlook = {};\n if (outlookClientId) providers.outlook.clientId = outlookClientId;\n if (outlookTenantId) providers.outlook.tenantId = outlookTenantId;\n }\n if (gmailClientId || gmailClientSecret) {\n providers.gmail = {};\n if (gmailClientId) providers.gmail.clientId = gmailClientId;\n if (gmailClientSecret) providers.gmail.clientSecret = gmailClientSecret;\n }\n }\n\n // -- Watch --\n\n const watchEnabledEnv = parseBool(process.env[ENV_WATCH_ENABLED]);\n let watch: WatchConfig | undefined;\n if (parsed.watch || watchEnabledEnv !== undefined) {\n // Build webhook if URL is set (from config or env)\n const webhookUrl =\n parsed.watch?.webhook?.url ?? process.env[ENV_WATCH_WEBHOOK_URL];\n let webhook: WatchWebhookConfig | undefined;\n if (webhookUrl) {\n const retryMaxAttempts =\n parsed.watch?.webhook?.retry?.maxAttempts ??\n parseIntSafe(process.env[ENV_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS]) ??\n 5;\n const retryBaseDelayMs =\n parsed.watch?.webhook?.retry?.baseDelayMs ??\n parseIntSafe(process.env[ENV_WATCH_WEBHOOK_RETRY_BASE_DELAY]) ??\n 1000;\n webhook = {\n url: webhookUrl,\n retry: { maxAttempts: retryMaxAttempts, baseDelayMs: retryBaseDelayMs },\n };\n }\n\n // Build script if path is set (from config or env)\n const scriptPath =\n parsed.watch?.script?.path ?? process.env[ENV_WATCH_SCRIPT_PATH];\n let script: WatchScriptConfig | undefined;\n if (scriptPath) {\n const scriptTimeoutMs =\n parsed.watch?.script?.timeoutMs ??\n parseIntSafe(process.env[ENV_WATCH_SCRIPT_TIMEOUT_MS]) ??\n 30000;\n const scriptRetryMaxAttempts =\n parsed.watch?.script?.retry?.maxAttempts ??\n parseIntSafe(process.env[ENV_WATCH_SCRIPT_RETRY_MAX_ATTEMPTS]) ??\n 5;\n const scriptRetryBaseDelayMs =\n parsed.watch?.script?.retry?.baseDelayMs ??\n parseIntSafe(process.env[ENV_WATCH_SCRIPT_RETRY_BASE_DELAY]) ??\n 1000;\n script = {\n path: scriptPath,\n timeoutMs: scriptTimeoutMs,\n retry: {\n maxAttempts: scriptRetryMaxAttempts,\n baseDelayMs: scriptRetryBaseDelayMs,\n },\n };\n }\n\n watch = {\n enabled:\n watchEnabledEnv ??\n parsed.watch?.enabled ??\n false,\n pollIntervalSeconds:\n parsed.watch?.pollIntervalSeconds ??\n parseIntSafe(process.env[ENV_WATCH_POLL_INTERVAL]) ??\n 10,\n webhook,\n script,\n };\n }\n\n return {\n dataDir:\n cliOverrides.dataDir ??\n parsed.dataDir ??\n process.env.HYPERMAIL_MCP_DATA_DIR,\n http,\n tools,\n providers,\n watch,\n };\n}\n"],"mappings":"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","names":["randomBytes","randomUUID","fs","path","fs","path","randomUUID","existing","randomUUID","tmpdir","pathJoin","clampLimit","mapSummary","listEmails","clampLimit","mapSummary","searchEmails","readEmail","readAttachment","pathJoin","tmpdir","listFolders","randomUUID","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","randomUUID","removeAttachmentFromDraft","markRead","createFolder","path","renameFolder","deleteFolder","listEmails","searchEmails","readEmail","readAttachment","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","removeAttachmentFromDraft","markRead","listFolders","createFolder","renameFolder","deleteFolder","randomUUID","DEFAULT_SCOPES","beginDeviceCode","awaitDeviceCodeReady","existing","writeFileSync","tmpdir","pathJoin","MailComposer","h","mapSummary","mapFolder","clampLimit","buildRawMessage","MailComposer","listEmails","clampLimit","mapSummary","searchEmails","readEmail","readAttachment","pathJoin","tmpdir","writeFileSync","listFolders","mapFolder","randomUUID","Buffer","MailComposer","sendEmail","Buffer","buildRawMessage","saveDraft","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","MailComposer","randomUUID","removeAttachmentFromDraft","markRead","createFolder","mapFolder","renameFolder","deleteFolder","beginDeviceCode","awaitDeviceCodeReady","randomUUID","listEmails","searchEmails","readEmail","readAttachment","sendEmail","saveDraft","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","removeAttachmentFromDraft","markRead","listFolders","createFolder","renameFolder","deleteFolder","fs","z","z","fs","z","z","z","z","z","z","z","z","sleep","ok","z","readFileSync","readFileSync","z","randomUUID","randomBytes"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/codegen/code.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/codegen/scope.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/codegen/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/util.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/names.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/errors.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/validate/boolSchema.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/rules.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/validate/applicability.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/validate/dataType.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/validate/defaults.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/code.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/validate/keyword.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/validate/subschema.ts","../node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js","../node_modules/.pnpm/json-schema-traverse@1.0.0/node_modules/json-schema-traverse/index.js","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/resolve.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/validate/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/runtime/validation_error.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/ref_error.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/compile/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/data.json","../node_modules/.pnpm/fast-uri@3.1.2/node_modules/fast-uri/lib/utils.js","../node_modules/.pnpm/fast-uri@3.1.2/node_modules/fast-uri/lib/schemes.js","../node_modules/.pnpm/fast-uri@3.1.2/node_modules/fast-uri/index.js","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/runtime/uri.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/core.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/core/id.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/core/ref.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/core/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/limitNumber.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/multipleOf.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/runtime/ucs2length.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/limitLength.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/pattern.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/limitProperties.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/required.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/limitItems.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/runtime/equal.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/uniqueItems.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/const.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/enum.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/validation/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/additionalItems.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/items.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/prefixItems.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/items2020.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/contains.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/dependencies.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/propertyNames.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/additionalProperties.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/properties.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/patternProperties.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/not.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/anyOf.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/oneOf.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/allOf.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/if.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/thenElse.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/applicator/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/format/format.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/format/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/metadata.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/draft7.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/discriminator/types.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/vocabularies/discriminator/index.ts","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-draft-07.json","../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/lib/ajv.ts","../node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.20.0/node_modules/ajv-formats/src/formats.ts","../node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.20.0/node_modules/ajv-formats/src/limit.ts","../node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.20.0/node_modules/ajv-formats/src/index.ts","../src/cli.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/zod-compat.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/types.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/experimental/tasks/interfaces.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/zod-json-schema-compat.ts","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/Options.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/Refs.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/errorMessages.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/selectParser.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/any.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/array.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/date.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/default.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/record.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/string.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/map.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/never.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/null.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/union.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/number.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/object.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/set.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/parseDef.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@4.4.3/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/shared/protocol.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/validation/ajv-provider.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/experimental/tasks/server.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/experimental/tasks/helpers.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/index.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/completable.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/shared/toolNameValidation.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/experimental/tasks/mcp-server.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/mcp.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/stdio.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/shared/stdio.ts","../node_modules/.pnpm/@hono+node-server@1.19.14_hono@4.12.18/node_modules/@hono/node-server/dist/index.mjs","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/webStandardStreamableHttp.ts","../node_modules/.pnpm/@modelcontextprotocol+sdk@1.29.0_zod@4.4.3/node_modules/@modelcontextprotocol/sdk/src/server/streamableHttp.ts","../src/server.ts","../src/store/account-store.ts","../src/store/crypto.ts","../src/providers/outlook/index.ts","../src/providers/outlook/client.ts","../src/providers/outlook/auth.ts","../src/providers/shared/inline-images.ts","../src/providers/outlook/helpers.ts","../src/providers/outlook/write-ops.ts","../src/providers/outlook/read-ops.ts","../src/providers/outlook/folders.ts","../src/providers/imap/client.ts","../src/providers/imap/read-ops.ts","../src/providers/imap/helpers.ts","../src/providers/imap/account-ops.ts","../src/providers/imap/write-ops.ts","../src/providers/imap/mime-utils.ts","../src/providers/imap/folders.ts","../src/providers/imap/index.ts","../src/providers/gmail/index.ts","../src/providers/gmail/auth.ts","../src/providers/gmail/client.ts","../src/providers/gmail/read-ops.ts","../src/providers/gmail/helpers.ts","../src/providers/gmail/write-ops.ts","../src/providers/registry.ts","../src/tools/shared.ts","../src/markdown-to-html.ts","../src/tools/accounts.ts","../src/tools/browse.ts","../src/html-to-markdown.ts","../src/tools/folders.ts","../src/tools/organize.ts","../src/tools/compose.ts","../src/tools/index.ts","../package.json","../src/version.ts","../src/watcher/webhook.ts","../src/watcher/script.ts","../src/watcher/manager.ts","../src/config.ts","../src/config/load.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport abstract class _CodeOrName {\n abstract readonly str: string\n abstract readonly names: UsedNames\n abstract toString(): string\n abstract emptyStr(): boolean\n}\n\nexport const IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i\n\nexport class Name extends _CodeOrName {\n readonly str: string\n constructor(s: string) {\n super()\n if (!IDENTIFIER.test(s)) throw new Error(\"CodeGen: name must be a valid identifier\")\n this.str = s\n }\n\n toString(): string {\n return this.str\n }\n\n emptyStr(): boolean {\n return false\n }\n\n get names(): UsedNames {\n return {[this.str]: 1}\n }\n}\n\nexport class _Code extends _CodeOrName {\n readonly _items: readonly CodeItem[]\n private _str?: string\n private _names?: UsedNames\n\n constructor(code: string | readonly CodeItem[]) {\n super()\n this._items = typeof code === \"string\" ? [code] : code\n }\n\n toString(): string {\n return this.str\n }\n\n emptyStr(): boolean {\n if (this._items.length > 1) return false\n const item = this._items[0]\n return item === \"\" || item === '\"\"'\n }\n\n get str(): string {\n return (this._str ??= this._items.reduce((s: string, c: CodeItem) => `${s}${c}`, \"\"))\n }\n\n get names(): UsedNames {\n return (this._names ??= this._items.reduce((names: UsedNames, c) => {\n if (c instanceof Name) names[c.str] = (names[c.str] || 0) + 1\n return names\n }, {}))\n }\n}\n\nexport type CodeItem = Name | string | number | boolean | null\n\nexport type UsedNames = Record<string, number | undefined>\n\nexport type Code = _Code | Name\n\nexport type SafeExpr = Code | number | boolean | null\n\nexport const nil = new _Code(\"\")\n\ntype CodeArg = SafeExpr | string | undefined\n\nexport function _(strs: TemplateStringsArray, ...args: CodeArg[]): _Code {\n const code: CodeItem[] = [strs[0]]\n let i = 0\n while (i < args.length) {\n addCodeArg(code, args[i])\n code.push(strs[++i])\n }\n return new _Code(code)\n}\n\nconst plus = new _Code(\"+\")\n\nexport function str(strs: TemplateStringsArray, ...args: (CodeArg | string[])[]): _Code {\n const expr: CodeItem[] = [safeStringify(strs[0])]\n let i = 0\n while (i < args.length) {\n expr.push(plus)\n addCodeArg(expr, args[i])\n expr.push(plus, safeStringify(strs[++i]))\n }\n optimize(expr)\n return new _Code(expr)\n}\n\nexport function addCodeArg(code: CodeItem[], arg: CodeArg | string[]): void {\n if (arg instanceof _Code) code.push(...arg._items)\n else if (arg instanceof Name) code.push(arg)\n else code.push(interpolate(arg))\n}\n\nfunction optimize(expr: CodeItem[]): void {\n let i = 1\n while (i < expr.length - 1) {\n if (expr[i] === plus) {\n const res = mergeExprItems(expr[i - 1], expr[i + 1])\n if (res !== undefined) {\n expr.splice(i - 1, 3, res)\n continue\n }\n expr[i++] = \"+\"\n }\n i++\n }\n}\n\nfunction mergeExprItems(a: CodeItem, b: CodeItem): CodeItem | undefined {\n if (b === '\"\"') return a\n if (a === '\"\"') return b\n if (typeof a == \"string\") {\n if (b instanceof Name || a[a.length - 1] !== '\"') return\n if (typeof b != \"string\") return `${a.slice(0, -1)}${b}\"`\n if (b[0] === '\"') return a.slice(0, -1) + b.slice(1)\n return\n }\n if (typeof b == \"string\" && b[0] === '\"' && !(a instanceof Name)) return `\"${a}${b.slice(1)}`\n return\n}\n\nexport function strConcat(c1: Code, c2: Code): Code {\n return c2.emptyStr() ? c1 : c1.emptyStr() ? c2 : str`${c1}${c2}`\n}\n\n// TODO do not allow arrays here\nfunction interpolate(x?: string | string[] | number | boolean | null): SafeExpr | string {\n return typeof x == \"number\" || typeof x == \"boolean\" || x === null\n ? x\n : safeStringify(Array.isArray(x) ? x.join(\",\") : x)\n}\n\nexport function stringify(x: unknown): Code {\n return new _Code(safeStringify(x))\n}\n\nexport function safeStringify(x: unknown): string {\n return JSON.stringify(x)\n .replace(/\\u2028/g, \"\\\\u2028\")\n .replace(/\\u2029/g, \"\\\\u2029\")\n}\n\nexport function getProperty(key: Code | string | number): Code {\n return typeof key == \"string\" && IDENTIFIER.test(key) ? new _Code(`.${key}`) : _`[${key}]`\n}\n\n//Does best effort to format the name properly\nexport function getEsmExportName(key: Code | string | number): Code {\n if (typeof key == \"string\" && IDENTIFIER.test(key)) {\n return new _Code(`${key}`)\n }\n throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`)\n}\n\nexport function regexpCode(rx: RegExp): Code {\n return new _Code(rx.toString())\n}\n","import {_, nil, Code, Name} from \"./code\"\n\ninterface NameGroup {\n prefix: string\n index: number\n}\n\nexport interface NameValue {\n ref: ValueReference // this is the reference to any value that can be referred to from generated code via `globals` var in the closure\n key?: unknown // any key to identify a global to avoid duplicates, if not passed ref is used\n code?: Code // this is the code creating the value needed for standalone code wit_out closure - can be a primitive value, function or import (`require`)\n}\n\nexport type ValueReference = unknown // possibly make CodeGen parameterized type on this type\n\nclass ValueError extends Error {\n readonly value?: NameValue\n constructor(name: ValueScopeName) {\n super(`CodeGen: \"code\" for ${name} not defined`)\n this.value = name.value\n }\n}\n\ninterface ScopeOptions {\n prefixes?: Set<string>\n parent?: Scope\n}\n\ninterface ValueScopeOptions extends ScopeOptions {\n scope: ScopeStore\n es5?: boolean\n lines?: boolean\n}\n\nexport type ScopeStore = Record<string, ValueReference[] | undefined>\n\ntype ScopeValues = {\n [Prefix in string]?: Map<unknown, ValueScopeName>\n}\n\nexport type ScopeValueSets = {\n [Prefix in string]?: Set<ValueScopeName>\n}\n\nexport enum UsedValueState {\n Started,\n Completed,\n}\n\nexport type UsedScopeValues = {\n [Prefix in string]?: Map<ValueScopeName, UsedValueState | undefined>\n}\n\nexport const varKinds = {\n const: new Name(\"const\"),\n let: new Name(\"let\"),\n var: new Name(\"var\"),\n}\n\nexport class Scope {\n protected readonly _names: {[Prefix in string]?: NameGroup} = {}\n protected readonly _prefixes?: Set<string>\n protected readonly _parent?: Scope\n\n constructor({prefixes, parent}: ScopeOptions = {}) {\n this._prefixes = prefixes\n this._parent = parent\n }\n\n toName(nameOrPrefix: Name | string): Name {\n return nameOrPrefix instanceof Name ? nameOrPrefix : this.name(nameOrPrefix)\n }\n\n name(prefix: string): Name {\n return new Name(this._newName(prefix))\n }\n\n protected _newName(prefix: string): string {\n const ng = this._names[prefix] || this._nameGroup(prefix)\n return `${prefix}${ng.index++}`\n }\n\n private _nameGroup(prefix: string): NameGroup {\n if (this._parent?._prefixes?.has(prefix) || (this._prefixes && !this._prefixes.has(prefix))) {\n throw new Error(`CodeGen: prefix \"${prefix}\" is not allowed in this scope`)\n }\n return (this._names[prefix] = {prefix, index: 0})\n }\n}\n\ninterface ScopePath {\n property: string\n itemIndex: number\n}\n\nexport class ValueScopeName extends Name {\n readonly prefix: string\n value?: NameValue\n scopePath?: Code\n\n constructor(prefix: string, nameStr: string) {\n super(nameStr)\n this.prefix = prefix\n }\n\n setValue(value: NameValue, {property, itemIndex}: ScopePath): void {\n this.value = value\n this.scopePath = _`.${new Name(property)}[${itemIndex}]`\n }\n}\n\ninterface VSOptions extends ValueScopeOptions {\n _n: Code\n}\n\nconst line = _`\\n`\n\nexport class ValueScope extends Scope {\n protected readonly _values: ScopeValues = {}\n protected readonly _scope: ScopeStore\n readonly opts: VSOptions\n\n constructor(opts: ValueScopeOptions) {\n super(opts)\n this._scope = opts.scope\n this.opts = {...opts, _n: opts.lines ? line : nil}\n }\n\n get(): ScopeStore {\n return this._scope\n }\n\n name(prefix: string): ValueScopeName {\n return new ValueScopeName(prefix, this._newName(prefix))\n }\n\n value(nameOrPrefix: ValueScopeName | string, value: NameValue): ValueScopeName {\n if (value.ref === undefined) throw new Error(\"CodeGen: ref must be passed in value\")\n const name = this.toName(nameOrPrefix) as ValueScopeName\n const {prefix} = name\n const valueKey = value.key ?? value.ref\n let vs = this._values[prefix]\n if (vs) {\n const _name = vs.get(valueKey)\n if (_name) return _name\n } else {\n vs = this._values[prefix] = new Map()\n }\n vs.set(valueKey, name)\n\n const s = this._scope[prefix] || (this._scope[prefix] = [])\n const itemIndex = s.length\n s[itemIndex] = value.ref\n name.setValue(value, {property: prefix, itemIndex})\n return name\n }\n\n getValue(prefix: string, keyOrRef: unknown): ValueScopeName | undefined {\n const vs = this._values[prefix]\n if (!vs) return\n return vs.get(keyOrRef)\n }\n\n scopeRefs(scopeName: Name, values: ScopeValues | ScopeValueSets = this._values): Code {\n return this._reduceValues(values, (name: ValueScopeName) => {\n if (name.scopePath === undefined) throw new Error(`CodeGen: name \"${name}\" has no value`)\n return _`${scopeName}${name.scopePath}`\n })\n }\n\n scopeCode(\n values: ScopeValues | ScopeValueSets = this._values,\n usedValues?: UsedScopeValues,\n getCode?: (n: ValueScopeName) => Code | undefined\n ): Code {\n return this._reduceValues(\n values,\n (name: ValueScopeName) => {\n if (name.value === undefined) throw new Error(`CodeGen: name \"${name}\" has no value`)\n return name.value.code\n },\n usedValues,\n getCode\n )\n }\n\n private _reduceValues(\n values: ScopeValues | ScopeValueSets,\n valueCode: (n: ValueScopeName) => Code | undefined,\n usedValues: UsedScopeValues = {},\n getCode?: (n: ValueScopeName) => Code | undefined\n ): Code {\n let code: Code = nil\n for (const prefix in values) {\n const vs = values[prefix]\n if (!vs) continue\n const nameSet = (usedValues[prefix] = usedValues[prefix] || new Map())\n vs.forEach((name: ValueScopeName) => {\n if (nameSet.has(name)) return\n nameSet.set(name, UsedValueState.Started)\n let c = valueCode(name)\n if (c) {\n const def = this.opts.es5 ? varKinds.var : varKinds.const\n code = _`${code}${def} ${name} = ${c};${this.opts._n}`\n } else if ((c = getCode?.(name))) {\n code = _`${code}${c}${this.opts._n}`\n } else {\n throw new ValueError(name)\n }\n nameSet.set(name, UsedValueState.Completed)\n })\n }\n return code\n }\n}\n","import type {ScopeValueSets, NameValue, ValueScope, ValueScopeName} from \"./scope\"\nimport {_, nil, _Code, Code, Name, UsedNames, CodeItem, addCodeArg, _CodeOrName} from \"./code\"\nimport {Scope, varKinds} from \"./scope\"\n\nexport {_, str, strConcat, nil, getProperty, stringify, regexpCode, Name, Code} from \"./code\"\nexport {Scope, ScopeStore, ValueScope, ValueScopeName, ScopeValueSets, varKinds} from \"./scope\"\n\n// type for expressions that can be safely inserted in code without quotes\nexport type SafeExpr = Code | number | boolean | null\n\n// type that is either Code of function that adds code to CodeGen instance using its methods\nexport type Block = Code | (() => void)\n\nexport const operators = {\n GT: new _Code(\">\"),\n GTE: new _Code(\">=\"),\n LT: new _Code(\"<\"),\n LTE: new _Code(\"<=\"),\n EQ: new _Code(\"===\"),\n NEQ: new _Code(\"!==\"),\n NOT: new _Code(\"!\"),\n OR: new _Code(\"||\"),\n AND: new _Code(\"&&\"),\n ADD: new _Code(\"+\"),\n}\n\nabstract class Node {\n abstract readonly names: UsedNames\n\n optimizeNodes(): this | ChildNode | ChildNode[] | undefined {\n return this\n }\n\n optimizeNames(_names: UsedNames, _constants: Constants): this | undefined {\n return this\n }\n\n // get count(): number {\n // return 1\n // }\n}\n\nclass Def extends Node {\n constructor(\n private readonly varKind: Name,\n private readonly name: Name,\n private rhs?: SafeExpr\n ) {\n super()\n }\n\n render({es5, _n}: CGOptions): string {\n const varKind = es5 ? varKinds.var : this.varKind\n const rhs = this.rhs === undefined ? \"\" : ` = ${this.rhs}`\n return `${varKind} ${this.name}${rhs};` + _n\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n if (!names[this.name.str]) return\n if (this.rhs) this.rhs = optimizeExpr(this.rhs, names, constants)\n return this\n }\n\n get names(): UsedNames {\n return this.rhs instanceof _CodeOrName ? this.rhs.names : {}\n }\n}\n\nclass Assign extends Node {\n constructor(\n readonly lhs: Code,\n public rhs: SafeExpr,\n private readonly sideEffects?: boolean\n ) {\n super()\n }\n\n render({_n}: CGOptions): string {\n return `${this.lhs} = ${this.rhs};` + _n\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n if (this.lhs instanceof Name && !names[this.lhs.str] && !this.sideEffects) return\n this.rhs = optimizeExpr(this.rhs, names, constants)\n return this\n }\n\n get names(): UsedNames {\n const names = this.lhs instanceof Name ? {} : {...this.lhs.names}\n return addExprNames(names, this.rhs)\n }\n}\n\nclass AssignOp extends Assign {\n constructor(\n lhs: Code,\n private readonly op: Code,\n rhs: SafeExpr,\n sideEffects?: boolean\n ) {\n super(lhs, rhs, sideEffects)\n }\n\n render({_n}: CGOptions): string {\n return `${this.lhs} ${this.op}= ${this.rhs};` + _n\n }\n}\n\nclass Label extends Node {\n readonly names: UsedNames = {}\n constructor(readonly label: Name) {\n super()\n }\n\n render({_n}: CGOptions): string {\n return `${this.label}:` + _n\n }\n}\n\nclass Break extends Node {\n readonly names: UsedNames = {}\n constructor(readonly label?: Code) {\n super()\n }\n\n render({_n}: CGOptions): string {\n const label = this.label ? ` ${this.label}` : \"\"\n return `break${label};` + _n\n }\n}\n\nclass Throw extends Node {\n constructor(readonly error: Code) {\n super()\n }\n\n render({_n}: CGOptions): string {\n return `throw ${this.error};` + _n\n }\n\n get names(): UsedNames {\n return this.error.names\n }\n}\n\nclass AnyCode extends Node {\n constructor(private code: SafeExpr) {\n super()\n }\n\n render({_n}: CGOptions): string {\n return `${this.code};` + _n\n }\n\n optimizeNodes(): this | undefined {\n return `${this.code}` ? this : undefined\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this {\n this.code = optimizeExpr(this.code, names, constants)\n return this\n }\n\n get names(): UsedNames {\n return this.code instanceof _CodeOrName ? this.code.names : {}\n }\n}\n\nabstract class ParentNode extends Node {\n constructor(readonly nodes: ChildNode[] = []) {\n super()\n }\n\n render(opts: CGOptions): string {\n return this.nodes.reduce((code, n) => code + n.render(opts), \"\")\n }\n\n optimizeNodes(): this | ChildNode | ChildNode[] | undefined {\n const {nodes} = this\n let i = nodes.length\n while (i--) {\n const n = nodes[i].optimizeNodes()\n if (Array.isArray(n)) nodes.splice(i, 1, ...n)\n else if (n) nodes[i] = n\n else nodes.splice(i, 1)\n }\n return nodes.length > 0 ? this : undefined\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n const {nodes} = this\n let i = nodes.length\n while (i--) {\n // iterating backwards improves 1-pass optimization\n const n = nodes[i]\n if (n.optimizeNames(names, constants)) continue\n subtractNames(names, n.names)\n nodes.splice(i, 1)\n }\n return nodes.length > 0 ? this : undefined\n }\n\n get names(): UsedNames {\n return this.nodes.reduce((names: UsedNames, n) => addNames(names, n.names), {})\n }\n\n // get count(): number {\n // return this.nodes.reduce((c, n) => c + n.count, 1)\n // }\n}\n\nabstract class BlockNode extends ParentNode {\n render(opts: CGOptions): string {\n return \"{\" + opts._n + super.render(opts) + \"}\" + opts._n\n }\n}\n\nclass Root extends ParentNode {}\n\nclass Else extends BlockNode {\n static readonly kind = \"else\"\n}\n\nclass If extends BlockNode {\n static readonly kind = \"if\"\n else?: If | Else\n constructor(\n private condition: Code | boolean,\n nodes?: ChildNode[]\n ) {\n super(nodes)\n }\n\n render(opts: CGOptions): string {\n let code = `if(${this.condition})` + super.render(opts)\n if (this.else) code += \"else \" + this.else.render(opts)\n return code\n }\n\n optimizeNodes(): If | ChildNode[] | undefined {\n super.optimizeNodes()\n const cond = this.condition\n if (cond === true) return this.nodes // else is ignored here\n let e = this.else\n if (e) {\n const ns = e.optimizeNodes()\n e = this.else = Array.isArray(ns) ? new Else(ns) : (ns as Else | undefined)\n }\n if (e) {\n if (cond === false) return e instanceof If ? e : e.nodes\n if (this.nodes.length) return this\n return new If(not(cond), e instanceof If ? [e] : e.nodes)\n }\n if (cond === false || !this.nodes.length) return undefined\n return this\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n this.else = this.else?.optimizeNames(names, constants)\n if (!(super.optimizeNames(names, constants) || this.else)) return\n this.condition = optimizeExpr(this.condition, names, constants)\n return this\n }\n\n get names(): UsedNames {\n const names = super.names\n addExprNames(names, this.condition)\n if (this.else) addNames(names, this.else.names)\n return names\n }\n\n // get count(): number {\n // return super.count + (this.else?.count || 0)\n // }\n}\n\nabstract class For extends BlockNode {\n static readonly kind = \"for\"\n}\n\nclass ForLoop extends For {\n constructor(private iteration: Code) {\n super()\n }\n\n render(opts: CGOptions): string {\n return `for(${this.iteration})` + super.render(opts)\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n if (!super.optimizeNames(names, constants)) return\n this.iteration = optimizeExpr(this.iteration, names, constants)\n return this\n }\n\n get names(): UsedNames {\n return addNames(super.names, this.iteration.names)\n }\n}\n\nclass ForRange extends For {\n constructor(\n private readonly varKind: Name,\n private readonly name: Name,\n private readonly from: SafeExpr,\n private readonly to: SafeExpr\n ) {\n super()\n }\n\n render(opts: CGOptions): string {\n const varKind = opts.es5 ? varKinds.var : this.varKind\n const {name, from, to} = this\n return `for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)` + super.render(opts)\n }\n\n get names(): UsedNames {\n const names = addExprNames(super.names, this.from)\n return addExprNames(names, this.to)\n }\n}\n\nclass ForIter extends For {\n constructor(\n private readonly loop: \"of\" | \"in\",\n private readonly varKind: Name,\n private readonly name: Name,\n private iterable: Code\n ) {\n super()\n }\n\n render(opts: CGOptions): string {\n return `for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})` + super.render(opts)\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this | undefined {\n if (!super.optimizeNames(names, constants)) return\n this.iterable = optimizeExpr(this.iterable, names, constants)\n return this\n }\n\n get names(): UsedNames {\n return addNames(super.names, this.iterable.names)\n }\n}\n\nclass Func extends BlockNode {\n static readonly kind = \"func\"\n constructor(\n public name: Name,\n public args: Code,\n public async?: boolean\n ) {\n super()\n }\n\n render(opts: CGOptions): string {\n const _async = this.async ? \"async \" : \"\"\n return `${_async}function ${this.name}(${this.args})` + super.render(opts)\n }\n}\n\nclass Return extends ParentNode {\n static readonly kind = \"return\"\n\n render(opts: CGOptions): string {\n return \"return \" + super.render(opts)\n }\n}\n\nclass Try extends BlockNode {\n catch?: Catch\n finally?: Finally\n\n render(opts: CGOptions): string {\n let code = \"try\" + super.render(opts)\n if (this.catch) code += this.catch.render(opts)\n if (this.finally) code += this.finally.render(opts)\n return code\n }\n\n optimizeNodes(): this {\n super.optimizeNodes()\n this.catch?.optimizeNodes() as Catch | undefined\n this.finally?.optimizeNodes() as Finally | undefined\n return this\n }\n\n optimizeNames(names: UsedNames, constants: Constants): this {\n super.optimizeNames(names, constants)\n this.catch?.optimizeNames(names, constants)\n this.finally?.optimizeNames(names, constants)\n return this\n }\n\n get names(): UsedNames {\n const names = super.names\n if (this.catch) addNames(names, this.catch.names)\n if (this.finally) addNames(names, this.finally.names)\n return names\n }\n\n // get count(): number {\n // return super.count + (this.catch?.count || 0) + (this.finally?.count || 0)\n // }\n}\n\nclass Catch extends BlockNode {\n static readonly kind = \"catch\"\n constructor(readonly error: Name) {\n super()\n }\n\n render(opts: CGOptions): string {\n return `catch(${this.error})` + super.render(opts)\n }\n}\n\nclass Finally extends BlockNode {\n static readonly kind = \"finally\"\n render(opts: CGOptions): string {\n return \"finally\" + super.render(opts)\n }\n}\n\ntype StartBlockNode = If | For | Func | Return | Try\n\ntype LeafNode = Def | Assign | Label | Break | Throw | AnyCode\n\ntype ChildNode = StartBlockNode | LeafNode\n\ntype EndBlockNodeType =\n | typeof If\n | typeof Else\n | typeof For\n | typeof Func\n | typeof Return\n | typeof Catch\n | typeof Finally\n\ntype Constants = Record<string, SafeExpr | undefined>\n\nexport interface CodeGenOptions {\n es5?: boolean\n lines?: boolean\n ownProperties?: boolean\n}\n\ninterface CGOptions extends CodeGenOptions {\n _n: \"\\n\" | \"\"\n}\n\nexport class CodeGen {\n readonly _scope: Scope\n readonly _extScope: ValueScope\n readonly _values: ScopeValueSets = {}\n private readonly _nodes: ParentNode[]\n private readonly _blockStarts: number[] = []\n private readonly _constants: Constants = {}\n private readonly opts: CGOptions\n\n constructor(extScope: ValueScope, opts: CodeGenOptions = {}) {\n this.opts = {...opts, _n: opts.lines ? \"\\n\" : \"\"}\n this._extScope = extScope\n this._scope = new Scope({parent: extScope})\n this._nodes = [new Root()]\n }\n\n toString(): string {\n return this._root.render(this.opts)\n }\n\n // returns unique name in the internal scope\n name(prefix: string): Name {\n return this._scope.name(prefix)\n }\n\n // reserves unique name in the external scope\n scopeName(prefix: string): ValueScopeName {\n return this._extScope.name(prefix)\n }\n\n // reserves unique name in the external scope and assigns value to it\n scopeValue(prefixOrName: ValueScopeName | string, value: NameValue): Name {\n const name = this._extScope.value(prefixOrName, value)\n const vs = this._values[name.prefix] || (this._values[name.prefix] = new Set())\n vs.add(name)\n return name\n }\n\n getScopeValue(prefix: string, keyOrRef: unknown): ValueScopeName | undefined {\n return this._extScope.getValue(prefix, keyOrRef)\n }\n\n // return code that assigns values in the external scope to the names that are used internally\n // (same names that were returned by gen.scopeName or gen.scopeValue)\n scopeRefs(scopeName: Name): Code {\n return this._extScope.scopeRefs(scopeName, this._values)\n }\n\n scopeCode(): Code {\n return this._extScope.scopeCode(this._values)\n }\n\n private _def(\n varKind: Name,\n nameOrPrefix: Name | string,\n rhs?: SafeExpr,\n constant?: boolean\n ): Name {\n const name = this._scope.toName(nameOrPrefix)\n if (rhs !== undefined && constant) this._constants[name.str] = rhs\n this._leafNode(new Def(varKind, name, rhs))\n return name\n }\n\n // `const` declaration (`var` in es5 mode)\n const(nameOrPrefix: Name | string, rhs: SafeExpr, _constant?: boolean): Name {\n return this._def(varKinds.const, nameOrPrefix, rhs, _constant)\n }\n\n // `let` declaration with optional assignment (`var` in es5 mode)\n let(nameOrPrefix: Name | string, rhs?: SafeExpr, _constant?: boolean): Name {\n return this._def(varKinds.let, nameOrPrefix, rhs, _constant)\n }\n\n // `var` declaration with optional assignment\n var(nameOrPrefix: Name | string, rhs?: SafeExpr, _constant?: boolean): Name {\n return this._def(varKinds.var, nameOrPrefix, rhs, _constant)\n }\n\n // assignment code\n assign(lhs: Code, rhs: SafeExpr, sideEffects?: boolean): CodeGen {\n return this._leafNode(new Assign(lhs, rhs, sideEffects))\n }\n\n // `+=` code\n add(lhs: Code, rhs: SafeExpr): CodeGen {\n return this._leafNode(new AssignOp(lhs, operators.ADD, rhs))\n }\n\n // appends passed SafeExpr to code or executes Block\n code(c: Block | SafeExpr): CodeGen {\n if (typeof c == \"function\") c()\n else if (c !== nil) this._leafNode(new AnyCode(c))\n return this\n }\n\n // returns code for object literal for the passed argument list of key-value pairs\n object(...keyValues: [Name | string, SafeExpr | string][]): _Code {\n const code: CodeItem[] = [\"{\"]\n for (const [key, value] of keyValues) {\n if (code.length > 1) code.push(\",\")\n code.push(key)\n if (key !== value || this.opts.es5) {\n code.push(\":\")\n addCodeArg(code, value)\n }\n }\n code.push(\"}\")\n return new _Code(code)\n }\n\n // `if` clause (or statement if `thenBody` and, optionally, `elseBody` are passed)\n if(condition: Code | boolean, thenBody?: Block, elseBody?: Block): CodeGen {\n this._blockNode(new If(condition))\n\n if (thenBody && elseBody) {\n this.code(thenBody).else().code(elseBody).endIf()\n } else if (thenBody) {\n this.code(thenBody).endIf()\n } else if (elseBody) {\n throw new Error('CodeGen: \"else\" body without \"then\" body')\n }\n return this\n }\n\n // `else if` clause - invalid without `if` or after `else` clauses\n elseIf(condition: Code | boolean): CodeGen {\n return this._elseNode(new If(condition))\n }\n\n // `else` clause - only valid after `if` or `else if` clauses\n else(): CodeGen {\n return this._elseNode(new Else())\n }\n\n // end `if` statement (needed if gen.if was used only with condition)\n endIf(): CodeGen {\n return this._endBlockNode(If, Else)\n }\n\n private _for(node: For, forBody?: Block): CodeGen {\n this._blockNode(node)\n if (forBody) this.code(forBody).endFor()\n return this\n }\n\n // a generic `for` clause (or statement if `forBody` is passed)\n for(iteration: Code, forBody?: Block): CodeGen {\n return this._for(new ForLoop(iteration), forBody)\n }\n\n // `for` statement for a range of values\n forRange(\n nameOrPrefix: Name | string,\n from: SafeExpr,\n to: SafeExpr,\n forBody: (index: Name) => void,\n varKind: Code = this.opts.es5 ? varKinds.var : varKinds.let\n ): CodeGen {\n const name = this._scope.toName(nameOrPrefix)\n return this._for(new ForRange(varKind, name, from, to), () => forBody(name))\n }\n\n // `for-of` statement (in es5 mode replace with a normal for loop)\n forOf(\n nameOrPrefix: Name | string,\n iterable: Code,\n forBody: (item: Name) => void,\n varKind: Code = varKinds.const\n ): CodeGen {\n const name = this._scope.toName(nameOrPrefix)\n if (this.opts.es5) {\n const arr = iterable instanceof Name ? iterable : this.var(\"_arr\", iterable)\n return this.forRange(\"_i\", 0, _`${arr}.length`, (i) => {\n this.var(name, _`${arr}[${i}]`)\n forBody(name)\n })\n }\n return this._for(new ForIter(\"of\", varKind, name, iterable), () => forBody(name))\n }\n\n // `for-in` statement.\n // With option `ownProperties` replaced with a `for-of` loop for object keys\n forIn(\n nameOrPrefix: Name | string,\n obj: Code,\n forBody: (item: Name) => void,\n varKind: Code = this.opts.es5 ? varKinds.var : varKinds.const\n ): CodeGen {\n if (this.opts.ownProperties) {\n return this.forOf(nameOrPrefix, _`Object.keys(${obj})`, forBody)\n }\n const name = this._scope.toName(nameOrPrefix)\n return this._for(new ForIter(\"in\", varKind, name, obj), () => forBody(name))\n }\n\n // end `for` loop\n endFor(): CodeGen {\n return this._endBlockNode(For)\n }\n\n // `label` statement\n label(label: Name): CodeGen {\n return this._leafNode(new Label(label))\n }\n\n // `break` statement\n break(label?: Code): CodeGen {\n return this._leafNode(new Break(label))\n }\n\n // `return` statement\n return(value: Block | SafeExpr): CodeGen {\n const node = new Return()\n this._blockNode(node)\n this.code(value)\n if (node.nodes.length !== 1) throw new Error('CodeGen: \"return\" should have one node')\n return this._endBlockNode(Return)\n }\n\n // `try` statement\n try(tryBody: Block, catchCode?: (e: Name) => void, finallyCode?: Block): CodeGen {\n if (!catchCode && !finallyCode) throw new Error('CodeGen: \"try\" without \"catch\" and \"finally\"')\n const node = new Try()\n this._blockNode(node)\n this.code(tryBody)\n if (catchCode) {\n const error = this.name(\"e\")\n this._currNode = node.catch = new Catch(error)\n catchCode(error)\n }\n if (finallyCode) {\n this._currNode = node.finally = new Finally()\n this.code(finallyCode)\n }\n return this._endBlockNode(Catch, Finally)\n }\n\n // `throw` statement\n throw(error: Code): CodeGen {\n return this._leafNode(new Throw(error))\n }\n\n // start self-balancing block\n block(body?: Block, nodeCount?: number): CodeGen {\n this._blockStarts.push(this._nodes.length)\n if (body) this.code(body).endBlock(nodeCount)\n return this\n }\n\n // end the current self-balancing block\n endBlock(nodeCount?: number): CodeGen {\n const len = this._blockStarts.pop()\n if (len === undefined) throw new Error(\"CodeGen: not in self-balancing block\")\n const toClose = this._nodes.length - len\n if (toClose < 0 || (nodeCount !== undefined && toClose !== nodeCount)) {\n throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`)\n }\n this._nodes.length = len\n return this\n }\n\n // `function` heading (or definition if funcBody is passed)\n func(name: Name, args: Code = nil, async?: boolean, funcBody?: Block): CodeGen {\n this._blockNode(new Func(name, args, async))\n if (funcBody) this.code(funcBody).endFunc()\n return this\n }\n\n // end function definition\n endFunc(): CodeGen {\n return this._endBlockNode(Func)\n }\n\n optimize(n = 1): void {\n while (n-- > 0) {\n this._root.optimizeNodes()\n this._root.optimizeNames(this._root.names, this._constants)\n }\n }\n\n private _leafNode(node: LeafNode): CodeGen {\n this._currNode.nodes.push(node)\n return this\n }\n\n private _blockNode(node: StartBlockNode): void {\n this._currNode.nodes.push(node)\n this._nodes.push(node)\n }\n\n private _endBlockNode(N1: EndBlockNodeType, N2?: EndBlockNodeType): CodeGen {\n const n = this._currNode\n if (n instanceof N1 || (N2 && n instanceof N2)) {\n this._nodes.pop()\n return this\n }\n throw new Error(`CodeGen: not in block \"${N2 ? `${N1.kind}/${N2.kind}` : N1.kind}\"`)\n }\n\n private _elseNode(node: If | Else): CodeGen {\n const n = this._currNode\n if (!(n instanceof If)) {\n throw new Error('CodeGen: \"else\" without \"if\"')\n }\n this._currNode = n.else = node\n return this\n }\n\n private get _root(): Root {\n return this._nodes[0] as Root\n }\n\n private get _currNode(): ParentNode {\n const ns = this._nodes\n return ns[ns.length - 1]\n }\n\n private set _currNode(node: ParentNode) {\n const ns = this._nodes\n ns[ns.length - 1] = node\n }\n\n // get nodeCount(): number {\n // return this._root.count\n // }\n}\n\nfunction addNames(names: UsedNames, from: UsedNames): UsedNames {\n for (const n in from) names[n] = (names[n] || 0) + (from[n] || 0)\n return names\n}\n\nfunction addExprNames(names: UsedNames, from: SafeExpr): UsedNames {\n return from instanceof _CodeOrName ? addNames(names, from.names) : names\n}\n\nfunction optimizeExpr<T extends SafeExpr | Code>(expr: T, names: UsedNames, constants: Constants): T\nfunction optimizeExpr(expr: SafeExpr, names: UsedNames, constants: Constants): SafeExpr {\n if (expr instanceof Name) return replaceName(expr)\n if (!canOptimize(expr)) return expr\n return new _Code(\n expr._items.reduce((items: CodeItem[], c: SafeExpr | string) => {\n if (c instanceof Name) c = replaceName(c)\n if (c instanceof _Code) items.push(...c._items)\n else items.push(c)\n return items\n }, [])\n )\n\n function replaceName(n: Name): SafeExpr {\n const c = constants[n.str]\n if (c === undefined || names[n.str] !== 1) return n\n delete names[n.str]\n return c\n }\n\n function canOptimize(e: SafeExpr): e is _Code {\n return (\n e instanceof _Code &&\n e._items.some(\n (c) => c instanceof Name && names[c.str] === 1 && constants[c.str] !== undefined\n )\n )\n }\n}\n\nfunction subtractNames(names: UsedNames, from: UsedNames): void {\n for (const n in from) names[n] = (names[n] || 0) - (from[n] || 0)\n}\n\nexport function not<T extends Code | SafeExpr>(x: T): T\nexport function not(x: Code | SafeExpr): Code | SafeExpr {\n return typeof x == \"boolean\" || typeof x == \"number\" || x === null ? !x : _`!${par(x)}`\n}\n\nconst andCode = mappend(operators.AND)\n\n// boolean AND (&&) expression with the passed arguments\nexport function and(...args: Code[]): Code {\n return args.reduce(andCode)\n}\n\nconst orCode = mappend(operators.OR)\n\n// boolean OR (||) expression with the passed arguments\nexport function or(...args: Code[]): Code {\n return args.reduce(orCode)\n}\n\ntype MAppend = (x: Code, y: Code) => Code\n\nfunction mappend(op: Code): MAppend {\n return (x, y) => (x === nil ? y : y === nil ? x : _`${par(x)} ${op} ${par(y)}`)\n}\n\nfunction par(x: Code): Code {\n return x instanceof Name ? x : _`(${x})`\n}\n","import type {AnySchema, EvaluatedProperties, EvaluatedItems} from \"../types\"\nimport type {SchemaCxt, SchemaObjCxt} from \".\"\nimport {_, getProperty, Code, Name, CodeGen} from \"./codegen\"\nimport {_Code} from \"./codegen/code\"\nimport type {Rule, ValidationRules} from \"./rules\"\n\n// TODO refactor to use Set\nexport function toHash<T extends string = string>(arr: T[]): {[K in T]?: true} {\n const hash: {[K in T]?: true} = {}\n for (const item of arr) hash[item] = true\n return hash\n}\n\nexport function alwaysValidSchema(it: SchemaCxt, schema: AnySchema): boolean | void {\n if (typeof schema == \"boolean\") return schema\n if (Object.keys(schema).length === 0) return true\n checkUnknownRules(it, schema)\n return !schemaHasRules(schema, it.self.RULES.all)\n}\n\nexport function checkUnknownRules(it: SchemaCxt, schema: AnySchema = it.schema): void {\n const {opts, self} = it\n if (!opts.strictSchema) return\n if (typeof schema === \"boolean\") return\n const rules = self.RULES.keywords\n for (const key in schema) {\n if (!rules[key]) checkStrictMode(it, `unknown keyword: \"${key}\"`)\n }\n}\n\nexport function schemaHasRules(\n schema: AnySchema,\n rules: {[Key in string]?: boolean | Rule}\n): boolean {\n if (typeof schema == \"boolean\") return !schema\n for (const key in schema) if (rules[key]) return true\n return false\n}\n\nexport function schemaHasRulesButRef(schema: AnySchema, RULES: ValidationRules): boolean {\n if (typeof schema == \"boolean\") return !schema\n for (const key in schema) if (key !== \"$ref\" && RULES.all[key]) return true\n return false\n}\n\nexport function schemaRefOrVal(\n {topSchemaRef, schemaPath}: SchemaObjCxt,\n schema: unknown,\n keyword: string,\n $data?: string | false\n): Code | number | boolean {\n if (!$data) {\n if (typeof schema == \"number\" || typeof schema == \"boolean\") return schema\n if (typeof schema == \"string\") return _`${schema}`\n }\n return _`${topSchemaRef}${schemaPath}${getProperty(keyword)}`\n}\n\nexport function unescapeFragment(str: string): string {\n return unescapeJsonPointer(decodeURIComponent(str))\n}\n\nexport function escapeFragment(str: string | number): string {\n return encodeURIComponent(escapeJsonPointer(str))\n}\n\nexport function escapeJsonPointer(str: string | number): string {\n if (typeof str == \"number\") return `${str}`\n return str.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")\n}\n\nexport function unescapeJsonPointer(str: string): string {\n return str.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n}\n\nexport function eachItem<T>(xs: T | T[], f: (x: T) => void): void {\n if (Array.isArray(xs)) {\n for (const x of xs) f(x)\n } else {\n f(xs)\n }\n}\n\ntype SomeEvaluated = EvaluatedProperties | EvaluatedItems\n\ntype MergeEvaluatedFunc<T extends SomeEvaluated> = (\n gen: CodeGen,\n from: Name | T,\n to: Name | Exclude<T, true> | undefined,\n toName?: typeof Name\n) => Name | T\n\ninterface MakeMergeFuncArgs<T extends SomeEvaluated> {\n mergeNames: (gen: CodeGen, from: Name, to: Name) => void\n mergeToName: (gen: CodeGen, from: T, to: Name) => void\n mergeValues: (from: T, to: Exclude<T, true>) => T\n resultToName: (gen: CodeGen, res?: T) => Name\n}\n\nfunction makeMergeEvaluated<T extends SomeEvaluated>({\n mergeNames,\n mergeToName,\n mergeValues,\n resultToName,\n}: MakeMergeFuncArgs<T>): MergeEvaluatedFunc<T> {\n return (gen, from, to, toName) => {\n const res =\n to === undefined\n ? from\n : to instanceof Name\n ? (from instanceof Name ? mergeNames(gen, from, to) : mergeToName(gen, from, to), to)\n : from instanceof Name\n ? (mergeToName(gen, to, from), from)\n : mergeValues(from, to)\n return toName === Name && !(res instanceof Name) ? resultToName(gen, res) : res\n }\n}\n\ninterface MergeEvaluated {\n props: MergeEvaluatedFunc<EvaluatedProperties>\n items: MergeEvaluatedFunc<EvaluatedItems>\n}\n\nexport const mergeEvaluated: MergeEvaluated = {\n props: makeMergeEvaluated({\n mergeNames: (gen, from, to) =>\n gen.if(_`${to} !== true && ${from} !== undefined`, () => {\n gen.if(\n _`${from} === true`,\n () => gen.assign(to, true),\n () => gen.assign(to, _`${to} || {}`).code(_`Object.assign(${to}, ${from})`)\n )\n }),\n mergeToName: (gen, from, to) =>\n gen.if(_`${to} !== true`, () => {\n if (from === true) {\n gen.assign(to, true)\n } else {\n gen.assign(to, _`${to} || {}`)\n setEvaluated(gen, to, from)\n }\n }),\n mergeValues: (from, to) => (from === true ? true : {...from, ...to}),\n resultToName: evaluatedPropsToName,\n }),\n items: makeMergeEvaluated({\n mergeNames: (gen, from, to) =>\n gen.if(_`${to} !== true && ${from} !== undefined`, () =>\n gen.assign(to, _`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)\n ),\n mergeToName: (gen, from, to) =>\n gen.if(_`${to} !== true`, () =>\n gen.assign(to, from === true ? true : _`${to} > ${from} ? ${to} : ${from}`)\n ),\n mergeValues: (from, to) => (from === true ? true : Math.max(from, to)),\n resultToName: (gen, items) => gen.var(\"items\", items),\n }),\n}\n\nexport function evaluatedPropsToName(gen: CodeGen, ps?: EvaluatedProperties): Name {\n if (ps === true) return gen.var(\"props\", true)\n const props = gen.var(\"props\", _`{}`)\n if (ps !== undefined) setEvaluated(gen, props, ps)\n return props\n}\n\nexport function setEvaluated(gen: CodeGen, props: Name, ps: {[K in string]?: true}): void {\n Object.keys(ps).forEach((p) => gen.assign(_`${props}${getProperty(p)}`, true))\n}\n\nconst snippets: {[S in string]?: _Code} = {}\n\nexport function useFunc(gen: CodeGen, f: {code: string}): Name {\n return gen.scopeValue(\"func\", {\n ref: f,\n code: snippets[f.code] || (snippets[f.code] = new _Code(f.code)),\n })\n}\n\nexport enum Type {\n Num,\n Str,\n}\n\nexport function getErrorPath(\n dataProp: Name | string | number,\n dataPropType?: Type,\n jsPropertySyntax?: boolean\n): Code | string {\n // let path\n if (dataProp instanceof Name) {\n const isNumber = dataPropType === Type.Num\n return jsPropertySyntax\n ? isNumber\n ? _`\"[\" + ${dataProp} + \"]\"`\n : _`\"['\" + ${dataProp} + \"']\"`\n : isNumber\n ? _`\"/\" + ${dataProp}`\n : _`\"/\" + ${dataProp}.replace(/~/g, \"~0\").replace(/\\\\//g, \"~1\")` // TODO maybe use global escapePointer\n }\n return jsPropertySyntax ? getProperty(dataProp).toString() : \"/\" + escapeJsonPointer(dataProp)\n}\n\nexport function checkStrictMode(\n it: SchemaCxt,\n msg: string,\n mode: boolean | \"log\" = it.opts.strictSchema\n): void {\n if (!mode) return\n msg = `strict mode: ${msg}`\n if (mode === true) throw new Error(msg)\n it.self.logger.warn(msg)\n}\n","import {Name} from \"./codegen\"\n\nconst names = {\n // validation function arguments\n data: new Name(\"data\"), // data passed to validation function\n // args passed from referencing schema\n valCxt: new Name(\"valCxt\"), // validation/data context - should not be used directly, it is destructured to the names below\n instancePath: new Name(\"instancePath\"),\n parentData: new Name(\"parentData\"),\n parentDataProperty: new Name(\"parentDataProperty\"),\n rootData: new Name(\"rootData\"), // root data - same as the data passed to the first/top validation function\n dynamicAnchors: new Name(\"dynamicAnchors\"), // used to support recursiveRef and dynamicRef\n // function scoped variables\n vErrors: new Name(\"vErrors\"), // null or array of validation errors\n errors: new Name(\"errors\"), // counter of validation errors\n this: new Name(\"this\"),\n // \"globals\"\n self: new Name(\"self\"),\n scope: new Name(\"scope\"),\n // JTD serialize/parse name for JSON string and position\n json: new Name(\"json\"),\n jsonPos: new Name(\"jsonPos\"),\n jsonLen: new Name(\"jsonLen\"),\n jsonPart: new Name(\"jsonPart\"),\n}\n\nexport default names\n","import type {KeywordErrorCxt, KeywordErrorDefinition} from \"../types\"\nimport type {SchemaCxt} from \"./index\"\nimport {CodeGen, _, str, strConcat, Code, Name} from \"./codegen\"\nimport {SafeExpr} from \"./codegen/code\"\nimport {getErrorPath, Type} from \"./util\"\nimport N from \"./names\"\n\nexport const keywordError: KeywordErrorDefinition = {\n message: ({keyword}) => str`must pass \"${keyword}\" keyword validation`,\n}\n\nexport const keyword$DataError: KeywordErrorDefinition = {\n message: ({keyword, schemaType}) =>\n schemaType\n ? str`\"${keyword}\" keyword must be ${schemaType} ($data)`\n : str`\"${keyword}\" keyword is invalid ($data)`,\n}\n\nexport interface ErrorPaths {\n instancePath?: Code\n schemaPath?: string\n parentSchema?: boolean\n}\n\nexport function reportError(\n cxt: KeywordErrorCxt,\n error: KeywordErrorDefinition = keywordError,\n errorPaths?: ErrorPaths,\n overrideAllErrors?: boolean\n): void {\n const {it} = cxt\n const {gen, compositeRule, allErrors} = it\n const errObj = errorObjectCode(cxt, error, errorPaths)\n if (overrideAllErrors ?? (compositeRule || allErrors)) {\n addError(gen, errObj)\n } else {\n returnErrors(it, _`[${errObj}]`)\n }\n}\n\nexport function reportExtraError(\n cxt: KeywordErrorCxt,\n error: KeywordErrorDefinition = keywordError,\n errorPaths?: ErrorPaths\n): void {\n const {it} = cxt\n const {gen, compositeRule, allErrors} = it\n const errObj = errorObjectCode(cxt, error, errorPaths)\n addError(gen, errObj)\n if (!(compositeRule || allErrors)) {\n returnErrors(it, N.vErrors)\n }\n}\n\nexport function resetErrorsCount(gen: CodeGen, errsCount: Name): void {\n gen.assign(N.errors, errsCount)\n gen.if(_`${N.vErrors} !== null`, () =>\n gen.if(\n errsCount,\n () => gen.assign(_`${N.vErrors}.length`, errsCount),\n () => gen.assign(N.vErrors, null)\n )\n )\n}\n\nexport function extendErrors({\n gen,\n keyword,\n schemaValue,\n data,\n errsCount,\n it,\n}: KeywordErrorCxt): void {\n /* istanbul ignore if */\n if (errsCount === undefined) throw new Error(\"ajv implementation error\")\n const err = gen.name(\"err\")\n gen.forRange(\"i\", errsCount, N.errors, (i) => {\n gen.const(err, _`${N.vErrors}[${i}]`)\n gen.if(_`${err}.instancePath === undefined`, () =>\n gen.assign(_`${err}.instancePath`, strConcat(N.instancePath, it.errorPath))\n )\n gen.assign(_`${err}.schemaPath`, str`${it.errSchemaPath}/${keyword}`)\n if (it.opts.verbose) {\n gen.assign(_`${err}.schema`, schemaValue)\n gen.assign(_`${err}.data`, data)\n }\n })\n}\n\nfunction addError(gen: CodeGen, errObj: Code): void {\n const err = gen.const(\"err\", errObj)\n gen.if(\n _`${N.vErrors} === null`,\n () => gen.assign(N.vErrors, _`[${err}]`),\n _`${N.vErrors}.push(${err})`\n )\n gen.code(_`${N.errors}++`)\n}\n\nfunction returnErrors(it: SchemaCxt, errs: Code): void {\n const {gen, validateName, schemaEnv} = it\n if (schemaEnv.$async) {\n gen.throw(_`new ${it.ValidationError as Name}(${errs})`)\n } else {\n gen.assign(_`${validateName}.errors`, errs)\n gen.return(false)\n }\n}\n\nconst E = {\n keyword: new Name(\"keyword\"),\n schemaPath: new Name(\"schemaPath\"), // also used in JTD errors\n params: new Name(\"params\"),\n propertyName: new Name(\"propertyName\"),\n message: new Name(\"message\"),\n schema: new Name(\"schema\"),\n parentSchema: new Name(\"parentSchema\"),\n}\n\nfunction errorObjectCode(\n cxt: KeywordErrorCxt,\n error: KeywordErrorDefinition,\n errorPaths?: ErrorPaths\n): Code {\n const {createErrors} = cxt.it\n if (createErrors === false) return _`{}`\n return errorObject(cxt, error, errorPaths)\n}\n\nfunction errorObject(\n cxt: KeywordErrorCxt,\n error: KeywordErrorDefinition,\n errorPaths: ErrorPaths = {}\n): Code {\n const {gen, it} = cxt\n const keyValues: [Name, SafeExpr | string][] = [\n errorInstancePath(it, errorPaths),\n errorSchemaPath(cxt, errorPaths),\n ]\n extraErrorProps(cxt, error, keyValues)\n return gen.object(...keyValues)\n}\n\nfunction errorInstancePath({errorPath}: SchemaCxt, {instancePath}: ErrorPaths): [Name, Code] {\n const instPath = instancePath\n ? str`${errorPath}${getErrorPath(instancePath, Type.Str)}`\n : errorPath\n return [N.instancePath, strConcat(N.instancePath, instPath)]\n}\n\nfunction errorSchemaPath(\n {keyword, it: {errSchemaPath}}: KeywordErrorCxt,\n {schemaPath, parentSchema}: ErrorPaths\n): [Name, string | Code] {\n let schPath = parentSchema ? errSchemaPath : str`${errSchemaPath}/${keyword}`\n if (schemaPath) {\n schPath = str`${schPath}${getErrorPath(schemaPath, Type.Str)}`\n }\n return [E.schemaPath, schPath]\n}\n\nfunction extraErrorProps(\n cxt: KeywordErrorCxt,\n {params, message}: KeywordErrorDefinition,\n keyValues: [Name, SafeExpr | string][]\n): void {\n const {keyword, data, schemaValue, it} = cxt\n const {opts, propertyName, topSchemaRef, schemaPath} = it\n keyValues.push(\n [E.keyword, keyword],\n [E.params, typeof params == \"function\" ? params(cxt) : params || _`{}`]\n )\n if (opts.messages) {\n keyValues.push([E.message, typeof message == \"function\" ? message(cxt) : message])\n }\n if (opts.verbose) {\n keyValues.push(\n [E.schema, schemaValue],\n [E.parentSchema, _`${topSchemaRef}${schemaPath}`],\n [N.data, data]\n )\n }\n if (propertyName) keyValues.push([E.propertyName, propertyName])\n}\n","import type {KeywordErrorDefinition, KeywordErrorCxt} from \"../../types\"\nimport type {SchemaCxt} from \"..\"\nimport {reportError} from \"../errors\"\nimport {_, Name} from \"../codegen\"\nimport N from \"../names\"\n\nconst boolError: KeywordErrorDefinition = {\n message: \"boolean schema is false\",\n}\n\nexport function topBoolOrEmptySchema(it: SchemaCxt): void {\n const {gen, schema, validateName} = it\n if (schema === false) {\n falseSchemaError(it, false)\n } else if (typeof schema == \"object\" && schema.$async === true) {\n gen.return(N.data)\n } else {\n gen.assign(_`${validateName}.errors`, null)\n gen.return(true)\n }\n}\n\nexport function boolOrEmptySchema(it: SchemaCxt, valid: Name): void {\n const {gen, schema} = it\n if (schema === false) {\n gen.var(valid, false) // TODO var\n falseSchemaError(it)\n } else {\n gen.var(valid, true) // TODO var\n }\n}\n\nfunction falseSchemaError(it: SchemaCxt, overrideAllErrors?: boolean): void {\n const {gen, data} = it\n // TODO maybe some other interface should be used for non-keyword validation errors...\n const cxt: KeywordErrorCxt = {\n gen,\n keyword: \"false schema\",\n data,\n schema: false,\n schemaCode: false,\n schemaValue: false,\n params: {},\n it,\n }\n reportError(cxt, boolError, undefined, overrideAllErrors)\n}\n","import type {AddedKeywordDefinition} from \"../types\"\n\nconst _jsonTypes = [\"string\", \"number\", \"integer\", \"boolean\", \"null\", \"object\", \"array\"] as const\n\nexport type JSONType = (typeof _jsonTypes)[number]\n\nconst jsonTypes: Set<string> = new Set(_jsonTypes)\n\nexport function isJSONType(x: unknown): x is JSONType {\n return typeof x == \"string\" && jsonTypes.has(x)\n}\n\ntype ValidationTypes = {\n [K in JSONType]: boolean | RuleGroup | undefined\n}\n\nexport interface ValidationRules {\n rules: RuleGroup[]\n post: RuleGroup\n all: {[Key in string]?: boolean | Rule} // rules that have to be validated\n keywords: {[Key in string]?: boolean} // all known keywords (superset of \"all\")\n types: ValidationTypes\n}\n\nexport interface RuleGroup {\n type?: JSONType\n rules: Rule[]\n}\n\n// This interface wraps KeywordDefinition because definition can have multiple keywords\nexport interface Rule {\n keyword: string\n definition: AddedKeywordDefinition\n}\n\nexport function getRules(): ValidationRules {\n const groups: Record<\"number\" | \"string\" | \"array\" | \"object\", RuleGroup> = {\n number: {type: \"number\", rules: []},\n string: {type: \"string\", rules: []},\n array: {type: \"array\", rules: []},\n object: {type: \"object\", rules: []},\n }\n return {\n types: {...groups, integer: true, boolean: true, null: true},\n rules: [{rules: []}, groups.number, groups.string, groups.array, groups.object],\n post: {rules: []},\n all: {},\n keywords: {},\n }\n}\n","import type {AnySchemaObject} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport type {JSONType, RuleGroup, Rule} from \"../rules\"\n\nexport function schemaHasRulesForType(\n {schema, self}: SchemaObjCxt,\n type: JSONType\n): boolean | undefined {\n const group = self.RULES.types[type]\n return group && group !== true && shouldUseGroup(schema, group)\n}\n\nexport function shouldUseGroup(schema: AnySchemaObject, group: RuleGroup): boolean {\n return group.rules.some((rule) => shouldUseRule(schema, rule))\n}\n\nexport function shouldUseRule(schema: AnySchemaObject, rule: Rule): boolean | undefined {\n return (\n schema[rule.keyword] !== undefined ||\n rule.definition.implements?.some((kwd) => schema[kwd] !== undefined)\n )\n}\n","import type {\n KeywordErrorDefinition,\n KeywordErrorCxt,\n ErrorObject,\n AnySchemaObject,\n} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport {isJSONType, JSONType} from \"../rules\"\nimport {schemaHasRulesForType} from \"./applicability\"\nimport {reportError} from \"../errors\"\nimport {_, nil, and, not, operators, Code, Name} from \"../codegen\"\nimport {toHash, schemaRefOrVal} from \"../util\"\n\nexport enum DataType {\n Correct,\n Wrong,\n}\n\nexport function getSchemaTypes(schema: AnySchemaObject): JSONType[] {\n const types = getJSONTypes(schema.type)\n const hasNull = types.includes(\"null\")\n if (hasNull) {\n if (schema.nullable === false) throw new Error(\"type: null contradicts nullable: false\")\n } else {\n if (!types.length && schema.nullable !== undefined) {\n throw new Error('\"nullable\" cannot be used without \"type\"')\n }\n if (schema.nullable === true) types.push(\"null\")\n }\n return types\n}\n\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport function getJSONTypes(ts: unknown | unknown[]): JSONType[] {\n const types: unknown[] = Array.isArray(ts) ? ts : ts ? [ts] : []\n if (types.every(isJSONType)) return types\n throw new Error(\"type must be JSONType or JSONType[]: \" + types.join(\",\"))\n}\n\nexport function coerceAndCheckDataType(it: SchemaObjCxt, types: JSONType[]): boolean {\n const {gen, data, opts} = it\n const coerceTo = coerceToTypes(types, opts.coerceTypes)\n const checkTypes =\n types.length > 0 &&\n !(coerceTo.length === 0 && types.length === 1 && schemaHasRulesForType(it, types[0]))\n if (checkTypes) {\n const wrongType = checkDataTypes(types, data, opts.strictNumbers, DataType.Wrong)\n gen.if(wrongType, () => {\n if (coerceTo.length) coerceData(it, types, coerceTo)\n else reportTypeError(it)\n })\n }\n return checkTypes\n}\n\nconst COERCIBLE: Set<JSONType> = new Set([\"string\", \"number\", \"integer\", \"boolean\", \"null\"])\nfunction coerceToTypes(types: JSONType[], coerceTypes?: boolean | \"array\"): JSONType[] {\n return coerceTypes\n ? types.filter((t) => COERCIBLE.has(t) || (coerceTypes === \"array\" && t === \"array\"))\n : []\n}\n\nfunction coerceData(it: SchemaObjCxt, types: JSONType[], coerceTo: JSONType[]): void {\n const {gen, data, opts} = it\n const dataType = gen.let(\"dataType\", _`typeof ${data}`)\n const coerced = gen.let(\"coerced\", _`undefined`)\n if (opts.coerceTypes === \"array\") {\n gen.if(_`${dataType} == 'object' && Array.isArray(${data}) && ${data}.length == 1`, () =>\n gen\n .assign(data, _`${data}[0]`)\n .assign(dataType, _`typeof ${data}`)\n .if(checkDataTypes(types, data, opts.strictNumbers), () => gen.assign(coerced, data))\n )\n }\n gen.if(_`${coerced} !== undefined`)\n for (const t of coerceTo) {\n if (COERCIBLE.has(t) || (t === \"array\" && opts.coerceTypes === \"array\")) {\n coerceSpecificType(t)\n }\n }\n gen.else()\n reportTypeError(it)\n gen.endIf()\n\n gen.if(_`${coerced} !== undefined`, () => {\n gen.assign(data, coerced)\n assignParentData(it, coerced)\n })\n\n function coerceSpecificType(t: string): void {\n switch (t) {\n case \"string\":\n gen\n .elseIf(_`${dataType} == \"number\" || ${dataType} == \"boolean\"`)\n .assign(coerced, _`\"\" + ${data}`)\n .elseIf(_`${data} === null`)\n .assign(coerced, _`\"\"`)\n return\n case \"number\":\n gen\n .elseIf(\n _`${dataType} == \"boolean\" || ${data} === null\n || (${dataType} == \"string\" && ${data} && ${data} == +${data})`\n )\n .assign(coerced, _`+${data}`)\n return\n case \"integer\":\n gen\n .elseIf(\n _`${dataType} === \"boolean\" || ${data} === null\n || (${dataType} === \"string\" && ${data} && ${data} == +${data} && !(${data} % 1))`\n )\n .assign(coerced, _`+${data}`)\n return\n case \"boolean\":\n gen\n .elseIf(_`${data} === \"false\" || ${data} === 0 || ${data} === null`)\n .assign(coerced, false)\n .elseIf(_`${data} === \"true\" || ${data} === 1`)\n .assign(coerced, true)\n return\n case \"null\":\n gen.elseIf(_`${data} === \"\" || ${data} === 0 || ${data} === false`)\n gen.assign(coerced, null)\n return\n\n case \"array\":\n gen\n .elseIf(\n _`${dataType} === \"string\" || ${dataType} === \"number\"\n || ${dataType} === \"boolean\" || ${data} === null`\n )\n .assign(coerced, _`[${data}]`)\n }\n }\n}\n\nfunction assignParentData({gen, parentData, parentDataProperty}: SchemaObjCxt, expr: Name): void {\n // TODO use gen.property\n gen.if(_`${parentData} !== undefined`, () =>\n gen.assign(_`${parentData}[${parentDataProperty}]`, expr)\n )\n}\n\nexport function checkDataType(\n dataType: JSONType,\n data: Name,\n strictNums?: boolean | \"log\",\n correct = DataType.Correct\n): Code {\n const EQ = correct === DataType.Correct ? operators.EQ : operators.NEQ\n let cond: Code\n switch (dataType) {\n case \"null\":\n return _`${data} ${EQ} null`\n case \"array\":\n cond = _`Array.isArray(${data})`\n break\n case \"object\":\n cond = _`${data} && typeof ${data} == \"object\" && !Array.isArray(${data})`\n break\n case \"integer\":\n cond = numCond(_`!(${data} % 1) && !isNaN(${data})`)\n break\n case \"number\":\n cond = numCond()\n break\n default:\n return _`typeof ${data} ${EQ} ${dataType}`\n }\n return correct === DataType.Correct ? cond : not(cond)\n\n function numCond(_cond: Code = nil): Code {\n return and(_`typeof ${data} == \"number\"`, _cond, strictNums ? _`isFinite(${data})` : nil)\n }\n}\n\nexport function checkDataTypes(\n dataTypes: JSONType[],\n data: Name,\n strictNums?: boolean | \"log\",\n correct?: DataType\n): Code {\n if (dataTypes.length === 1) {\n return checkDataType(dataTypes[0], data, strictNums, correct)\n }\n let cond: Code\n const types = toHash(dataTypes)\n if (types.array && types.object) {\n const notObj = _`typeof ${data} != \"object\"`\n cond = types.null ? notObj : _`!${data} || ${notObj}`\n delete types.null\n delete types.array\n delete types.object\n } else {\n cond = nil\n }\n if (types.number) delete types.integer\n for (const t in types) cond = and(cond, checkDataType(t as JSONType, data, strictNums, correct))\n return cond\n}\n\nexport type TypeError = ErrorObject<\"type\", {type: string}>\n\nconst typeError: KeywordErrorDefinition = {\n message: ({schema}) => `must be ${schema}`,\n params: ({schema, schemaValue}) =>\n typeof schema == \"string\" ? _`{type: ${schema}}` : _`{type: ${schemaValue}}`,\n}\n\nexport function reportTypeError(it: SchemaObjCxt): void {\n const cxt = getTypeErrorContext(it)\n reportError(cxt, typeError)\n}\n\nfunction getTypeErrorContext(it: SchemaObjCxt): KeywordErrorCxt {\n const {gen, data, schema} = it\n const schemaCode = schemaRefOrVal(it, schema, \"type\")\n return {\n gen,\n keyword: \"type\",\n data,\n schema: schema.type,\n schemaCode,\n schemaValue: schemaCode,\n parentSchema: schema,\n params: {},\n it,\n }\n}\n","import type {SchemaObjCxt} from \"..\"\nimport {_, getProperty, stringify} from \"../codegen\"\nimport {checkStrictMode} from \"../util\"\n\nexport function assignDefaults(it: SchemaObjCxt, ty?: string): void {\n const {properties, items} = it.schema\n if (ty === \"object\" && properties) {\n for (const key in properties) {\n assignDefault(it, key, properties[key].default)\n }\n } else if (ty === \"array\" && Array.isArray(items)) {\n items.forEach((sch, i: number) => assignDefault(it, i, sch.default))\n }\n}\n\nfunction assignDefault(it: SchemaObjCxt, prop: string | number, defaultValue: unknown): void {\n const {gen, compositeRule, data, opts} = it\n if (defaultValue === undefined) return\n const childData = _`${data}${getProperty(prop)}`\n if (compositeRule) {\n checkStrictMode(it, `default is ignored for: ${childData}`)\n return\n }\n\n let condition = _`${childData} === undefined`\n if (opts.useDefaults === \"empty\") {\n condition = _`${condition} || ${childData} === null || ${childData} === \"\"`\n }\n // `${childData} === undefined` +\n // (opts.useDefaults === \"empty\" ? ` || ${childData} === null || ${childData} === \"\"` : \"\")\n gen.if(condition, _`${childData} = ${stringify(defaultValue)}`)\n}\n","import type {AnySchema, SchemaMap} from \"../types\"\nimport type {SchemaCxt} from \"../compile\"\nimport type {KeywordCxt} from \"../compile/validate\"\nimport {CodeGen, _, and, or, not, nil, strConcat, getProperty, Code, Name} from \"../compile/codegen\"\nimport {alwaysValidSchema, Type} from \"../compile/util\"\nimport N from \"../compile/names\"\nimport {useFunc} from \"../compile/util\"\nexport function checkReportMissingProp(cxt: KeywordCxt, prop: string): void {\n const {gen, data, it} = cxt\n gen.if(noPropertyInData(gen, data, prop, it.opts.ownProperties), () => {\n cxt.setParams({missingProperty: _`${prop}`}, true)\n cxt.error()\n })\n}\n\nexport function checkMissingProp(\n {gen, data, it: {opts}}: KeywordCxt,\n properties: string[],\n missing: Name\n): Code {\n return or(\n ...properties.map((prop) =>\n and(noPropertyInData(gen, data, prop, opts.ownProperties), _`${missing} = ${prop}`)\n )\n )\n}\n\nexport function reportMissingProp(cxt: KeywordCxt, missing: Name): void {\n cxt.setParams({missingProperty: missing}, true)\n cxt.error()\n}\n\nexport function hasPropFunc(gen: CodeGen): Name {\n return gen.scopeValue(\"func\", {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n ref: Object.prototype.hasOwnProperty,\n code: _`Object.prototype.hasOwnProperty`,\n })\n}\n\nexport function isOwnProperty(gen: CodeGen, data: Name, property: Name | string): Code {\n return _`${hasPropFunc(gen)}.call(${data}, ${property})`\n}\n\nexport function propertyInData(\n gen: CodeGen,\n data: Name,\n property: Name | string,\n ownProperties?: boolean\n): Code {\n const cond = _`${data}${getProperty(property)} !== undefined`\n return ownProperties ? _`${cond} && ${isOwnProperty(gen, data, property)}` : cond\n}\n\nexport function noPropertyInData(\n gen: CodeGen,\n data: Name,\n property: Name | string,\n ownProperties?: boolean\n): Code {\n const cond = _`${data}${getProperty(property)} === undefined`\n return ownProperties ? or(cond, not(isOwnProperty(gen, data, property))) : cond\n}\n\nexport function allSchemaProperties(schemaMap?: SchemaMap): string[] {\n return schemaMap ? Object.keys(schemaMap).filter((p) => p !== \"__proto__\") : []\n}\n\nexport function schemaProperties(it: SchemaCxt, schemaMap: SchemaMap): string[] {\n return allSchemaProperties(schemaMap).filter(\n (p) => !alwaysValidSchema(it, schemaMap[p] as AnySchema)\n )\n}\n\nexport function callValidateCode(\n {schemaCode, data, it: {gen, topSchemaRef, schemaPath, errorPath}, it}: KeywordCxt,\n func: Code,\n context: Code,\n passSchema?: boolean\n): Code {\n const dataAndSchema = passSchema ? _`${schemaCode}, ${data}, ${topSchemaRef}${schemaPath}` : data\n const valCxt: [Name, Code | number][] = [\n [N.instancePath, strConcat(N.instancePath, errorPath)],\n [N.parentData, it.parentData],\n [N.parentDataProperty, it.parentDataProperty],\n [N.rootData, N.rootData],\n ]\n if (it.opts.dynamicRef) valCxt.push([N.dynamicAnchors, N.dynamicAnchors])\n const args = _`${dataAndSchema}, ${gen.object(...valCxt)}`\n return context !== nil ? _`${func}.call(${context}, ${args})` : _`${func}(${args})`\n}\n\nconst newRegExp = _`new RegExp`\n\nexport function usePattern({gen, it: {opts}}: KeywordCxt, pattern: string): Name {\n const u = opts.unicodeRegExp ? \"u\" : \"\"\n const {regExp} = opts.code\n const rx = regExp(pattern, u)\n\n return gen.scopeValue(\"pattern\", {\n key: rx.toString(),\n ref: rx,\n code: _`${regExp.code === \"new RegExp\" ? newRegExp : useFunc(gen, regExp)}(${pattern}, ${u})`,\n })\n}\n\nexport function validateArray(cxt: KeywordCxt): Name {\n const {gen, data, keyword, it} = cxt\n const valid = gen.name(\"valid\")\n if (it.allErrors) {\n const validArr = gen.let(\"valid\", true)\n validateItems(() => gen.assign(validArr, false))\n return validArr\n }\n gen.var(valid, true)\n validateItems(() => gen.break())\n return valid\n\n function validateItems(notValid: () => void): void {\n const len = gen.const(\"len\", _`${data}.length`)\n gen.forRange(\"i\", 0, len, (i) => {\n cxt.subschema(\n {\n keyword,\n dataProp: i,\n dataPropType: Type.Num,\n },\n valid\n )\n gen.if(not(valid), notValid)\n })\n }\n}\n\nexport function validateUnion(cxt: KeywordCxt): void {\n const {gen, schema, keyword, it} = cxt\n /* istanbul ignore if */\n if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n const alwaysValid = schema.some((sch: AnySchema) => alwaysValidSchema(it, sch))\n if (alwaysValid && !it.opts.unevaluated) return\n\n const valid = gen.let(\"valid\", false)\n const schValid = gen.name(\"_valid\")\n\n gen.block(() =>\n schema.forEach((_sch: AnySchema, i: number) => {\n const schCxt = cxt.subschema(\n {\n keyword,\n schemaProp: i,\n compositeRule: true,\n },\n schValid\n )\n gen.assign(valid, _`${valid} || ${schValid}`)\n const merged = cxt.mergeValidEvaluated(schCxt, schValid)\n // can short-circuit if `unevaluatedProperties/Items` not supported (opts.unevaluated !== true)\n // or if all properties and items were evaluated (it.props === true && it.items === true)\n if (!merged) gen.if(not(valid))\n })\n )\n\n cxt.result(\n valid,\n () => cxt.reset(),\n () => cxt.error(true)\n )\n}\n","import type {KeywordCxt} from \".\"\nimport type {\n AnySchema,\n SchemaValidateFunction,\n AnyValidateFunction,\n AddedKeywordDefinition,\n MacroKeywordDefinition,\n FuncKeywordDefinition,\n} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport {_, nil, not, stringify, Code, Name, CodeGen} from \"../codegen\"\nimport N from \"../names\"\nimport type {JSONType} from \"../rules\"\nimport {callValidateCode} from \"../../vocabularies/code\"\nimport {extendErrors} from \"../errors\"\n\ntype KeywordCompilationResult = AnySchema | SchemaValidateFunction | AnyValidateFunction\n\nexport function macroKeywordCode(cxt: KeywordCxt, def: MacroKeywordDefinition): void {\n const {gen, keyword, schema, parentSchema, it} = cxt\n const macroSchema = def.macro.call(it.self, schema, parentSchema, it)\n const schemaRef = useKeyword(gen, keyword, macroSchema)\n if (it.opts.validateSchema !== false) it.self.validateSchema(macroSchema, true)\n\n const valid = gen.name(\"valid\")\n cxt.subschema(\n {\n schema: macroSchema,\n schemaPath: nil,\n errSchemaPath: `${it.errSchemaPath}/${keyword}`,\n topSchemaRef: schemaRef,\n compositeRule: true,\n },\n valid\n )\n cxt.pass(valid, () => cxt.error(true))\n}\n\nexport function funcKeywordCode(cxt: KeywordCxt, def: FuncKeywordDefinition): void {\n const {gen, keyword, schema, parentSchema, $data, it} = cxt\n checkAsyncKeyword(it, def)\n const validate =\n !$data && def.compile ? def.compile.call(it.self, schema, parentSchema, it) : def.validate\n const validateRef = useKeyword(gen, keyword, validate)\n const valid = gen.let(\"valid\")\n cxt.block$data(valid, validateKeyword)\n cxt.ok(def.valid ?? valid)\n\n function validateKeyword(): void {\n if (def.errors === false) {\n assignValid()\n if (def.modifying) modifyData(cxt)\n reportErrs(() => cxt.error())\n } else {\n const ruleErrs = def.async ? validateAsync() : validateSync()\n if (def.modifying) modifyData(cxt)\n reportErrs(() => addErrs(cxt, ruleErrs))\n }\n }\n\n function validateAsync(): Name {\n const ruleErrs = gen.let(\"ruleErrs\", null)\n gen.try(\n () => assignValid(_`await `),\n (e) =>\n gen.assign(valid, false).if(\n _`${e} instanceof ${it.ValidationError as Name}`,\n () => gen.assign(ruleErrs, _`${e}.errors`),\n () => gen.throw(e)\n )\n )\n return ruleErrs\n }\n\n function validateSync(): Code {\n const validateErrs = _`${validateRef}.errors`\n gen.assign(validateErrs, null)\n assignValid(nil)\n return validateErrs\n }\n\n function assignValid(_await: Code = def.async ? _`await ` : nil): void {\n const passCxt = it.opts.passContext ? N.this : N.self\n const passSchema = !((\"compile\" in def && !$data) || def.schema === false)\n gen.assign(\n valid,\n _`${_await}${callValidateCode(cxt, validateRef, passCxt, passSchema)}`,\n def.modifying\n )\n }\n\n function reportErrs(errors: () => void): void {\n gen.if(not(def.valid ?? valid), errors)\n }\n}\n\nfunction modifyData(cxt: KeywordCxt): void {\n const {gen, data, it} = cxt\n gen.if(it.parentData, () => gen.assign(data, _`${it.parentData}[${it.parentDataProperty}]`))\n}\n\nfunction addErrs(cxt: KeywordCxt, errs: Code): void {\n const {gen} = cxt\n gen.if(\n _`Array.isArray(${errs})`,\n () => {\n gen\n .assign(N.vErrors, _`${N.vErrors} === null ? ${errs} : ${N.vErrors}.concat(${errs})`)\n .assign(N.errors, _`${N.vErrors}.length`)\n extendErrors(cxt)\n },\n () => cxt.error()\n )\n}\n\nfunction checkAsyncKeyword({schemaEnv}: SchemaObjCxt, def: FuncKeywordDefinition): void {\n if (def.async && !schemaEnv.$async) throw new Error(\"async keyword in sync schema\")\n}\n\nfunction useKeyword(gen: CodeGen, keyword: string, result?: KeywordCompilationResult): Name {\n if (result === undefined) throw new Error(`keyword \"${keyword}\" failed to compile`)\n return gen.scopeValue(\n \"keyword\",\n typeof result == \"function\" ? {ref: result} : {ref: result, code: stringify(result)}\n )\n}\n\nexport function validSchemaType(\n schema: unknown,\n schemaType: JSONType[],\n allowUndefined = false\n): boolean {\n // TODO add tests\n return (\n !schemaType.length ||\n schemaType.some((st) =>\n st === \"array\"\n ? Array.isArray(schema)\n : st === \"object\"\n ? schema && typeof schema == \"object\" && !Array.isArray(schema)\n : typeof schema == st || (allowUndefined && typeof schema == \"undefined\")\n )\n )\n}\n\nexport function validateKeywordUsage(\n {schema, opts, self, errSchemaPath}: SchemaObjCxt,\n def: AddedKeywordDefinition,\n keyword: string\n): void {\n /* istanbul ignore if */\n if (Array.isArray(def.keyword) ? !def.keyword.includes(keyword) : def.keyword !== keyword) {\n throw new Error(\"ajv implementation error\")\n }\n\n const deps = def.dependencies\n if (deps?.some((kwd) => !Object.prototype.hasOwnProperty.call(schema, kwd))) {\n throw new Error(`parent schema must have dependencies of ${keyword}: ${deps.join(\",\")}`)\n }\n\n if (def.validateSchema) {\n const valid = def.validateSchema(schema[keyword])\n if (!valid) {\n const msg =\n `keyword \"${keyword}\" value is invalid at path \"${errSchemaPath}\": ` +\n self.errorsText(def.validateSchema.errors)\n if (opts.validateSchema === \"log\") self.logger.error(msg)\n else throw new Error(msg)\n }\n }\n}\n","import type {AnySchema} from \"../../types\"\nimport type {SchemaObjCxt} from \"..\"\nimport {_, str, getProperty, Code, Name} from \"../codegen\"\nimport {escapeFragment, getErrorPath, Type} from \"../util\"\nimport type {JSONType} from \"../rules\"\n\nexport interface SubschemaContext {\n // TODO use Optional? align with SchemCxt property types\n schema: AnySchema\n schemaPath: Code\n errSchemaPath: string\n topSchemaRef?: Code\n errorPath?: Code\n dataLevel?: number\n dataTypes?: JSONType[]\n data?: Name\n parentData?: Name\n parentDataProperty?: Code | number\n dataNames?: Name[]\n dataPathArr?: (Code | number)[]\n propertyName?: Name\n jtdDiscriminator?: string\n jtdMetadata?: boolean\n compositeRule?: true\n createErrors?: boolean\n allErrors?: boolean\n}\n\nexport type SubschemaArgs = Partial<{\n keyword: string\n schemaProp: string | number\n schema: AnySchema\n schemaPath: Code\n errSchemaPath: string\n topSchemaRef: Code\n data: Name | Code\n dataProp: Code | string | number\n dataTypes: JSONType[]\n definedProperties: Set<string>\n propertyName: Name\n dataPropType: Type\n jtdDiscriminator: string\n jtdMetadata: boolean\n compositeRule: true\n createErrors: boolean\n allErrors: boolean\n}>\n\nexport function getSubschema(\n it: SchemaObjCxt,\n {keyword, schemaProp, schema, schemaPath, errSchemaPath, topSchemaRef}: SubschemaArgs\n): SubschemaContext {\n if (keyword !== undefined && schema !== undefined) {\n throw new Error('both \"keyword\" and \"schema\" passed, only one allowed')\n }\n\n if (keyword !== undefined) {\n const sch = it.schema[keyword]\n return schemaProp === undefined\n ? {\n schema: sch,\n schemaPath: _`${it.schemaPath}${getProperty(keyword)}`,\n errSchemaPath: `${it.errSchemaPath}/${keyword}`,\n }\n : {\n schema: sch[schemaProp],\n schemaPath: _`${it.schemaPath}${getProperty(keyword)}${getProperty(schemaProp)}`,\n errSchemaPath: `${it.errSchemaPath}/${keyword}/${escapeFragment(schemaProp)}`,\n }\n }\n\n if (schema !== undefined) {\n if (schemaPath === undefined || errSchemaPath === undefined || topSchemaRef === undefined) {\n throw new Error('\"schemaPath\", \"errSchemaPath\" and \"topSchemaRef\" are required with \"schema\"')\n }\n return {\n schema,\n schemaPath,\n topSchemaRef,\n errSchemaPath,\n }\n }\n\n throw new Error('either \"keyword\" or \"schema\" must be passed')\n}\n\nexport function extendSubschemaData(\n subschema: SubschemaContext,\n it: SchemaObjCxt,\n {dataProp, dataPropType: dpType, data, dataTypes, propertyName}: SubschemaArgs\n): void {\n if (data !== undefined && dataProp !== undefined) {\n throw new Error('both \"data\" and \"dataProp\" passed, only one allowed')\n }\n\n const {gen} = it\n\n if (dataProp !== undefined) {\n const {errorPath, dataPathArr, opts} = it\n const nextData = gen.let(\"data\", _`${it.data}${getProperty(dataProp)}`, true)\n dataContextProps(nextData)\n subschema.errorPath = str`${errorPath}${getErrorPath(dataProp, dpType, opts.jsPropertySyntax)}`\n subschema.parentDataProperty = _`${dataProp}`\n subschema.dataPathArr = [...dataPathArr, subschema.parentDataProperty]\n }\n\n if (data !== undefined) {\n const nextData = data instanceof Name ? data : gen.let(\"data\", data, true) // replaceable if used once?\n dataContextProps(nextData)\n if (propertyName !== undefined) subschema.propertyName = propertyName\n // TODO something is possibly wrong here with not changing parentDataProperty and not appending dataPathArr\n }\n\n if (dataTypes) subschema.dataTypes = dataTypes\n\n function dataContextProps(_nextData: Name): void {\n subschema.data = _nextData\n subschema.dataLevel = it.dataLevel + 1\n subschema.dataTypes = []\n it.definedProperties = new Set<string>()\n subschema.parentData = it.data\n subschema.dataNames = [...it.dataNames, _nextData]\n }\n}\n\nexport function extendSubschemaMode(\n subschema: SubschemaContext,\n {jtdDiscriminator, jtdMetadata, compositeRule, createErrors, allErrors}: SubschemaArgs\n): void {\n if (compositeRule !== undefined) subschema.compositeRule = compositeRule\n if (createErrors !== undefined) subschema.createErrors = createErrors\n if (allErrors !== undefined) subschema.allErrors = allErrors\n subschema.jtdDiscriminator = jtdDiscriminator // not inherited\n subschema.jtdMetadata = jtdMetadata // not inherited\n}\n","'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","'use strict';\n\nvar traverse = module.exports = function (schema, opts, cb) {\n // Legacy support for v0.3.1 and earlier.\n if (typeof opts == 'function') {\n cb = opts;\n opts = {};\n }\n\n cb = opts.cb || cb;\n var pre = (typeof cb == 'function') ? cb : cb.pre || function() {};\n var post = cb.post || function() {};\n\n _traverse(opts, pre, post, schema, '', schema);\n};\n\n\ntraverse.keywords = {\n additionalItems: true,\n items: true,\n contains: true,\n additionalProperties: true,\n propertyNames: true,\n not: true,\n if: true,\n then: true,\n else: true\n};\n\ntraverse.arrayKeywords = {\n items: true,\n allOf: true,\n anyOf: true,\n oneOf: true\n};\n\ntraverse.propsKeywords = {\n $defs: true,\n definitions: true,\n properties: true,\n patternProperties: true,\n dependencies: true\n};\n\ntraverse.skipKeywords = {\n default: true,\n enum: true,\n const: true,\n required: true,\n maximum: true,\n minimum: true,\n exclusiveMaximum: true,\n exclusiveMinimum: true,\n multipleOf: true,\n maxLength: true,\n minLength: true,\n pattern: true,\n format: true,\n maxItems: true,\n minItems: true,\n uniqueItems: true,\n maxProperties: true,\n minProperties: true\n};\n\n\nfunction _traverse(opts, pre, post, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {\n if (schema && typeof schema == 'object' && !Array.isArray(schema)) {\n pre(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);\n for (var key in schema) {\n var sch = schema[key];\n if (Array.isArray(sch)) {\n if (key in traverse.arrayKeywords) {\n for (var i=0; i<sch.length; i++)\n _traverse(opts, pre, post, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i);\n }\n } else if (key in traverse.propsKeywords) {\n if (sch && typeof sch == 'object') {\n for (var prop in sch)\n _traverse(opts, pre, post, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);\n }\n } else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) {\n _traverse(opts, pre, post, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema);\n }\n }\n post(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);\n }\n}\n\n\nfunction escapeJsonPtr(str) {\n return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n","import type {AnySchema, AnySchemaObject, UriResolver} from \"../types\"\nimport type Ajv from \"../ajv\"\nimport type {URIComponent} from \"fast-uri\"\nimport {eachItem} from \"./util\"\nimport * as equal from \"fast-deep-equal\"\nimport * as traverse from \"json-schema-traverse\"\n\n// the hash of local references inside the schema (created by getSchemaRefs), used for inline resolution\nexport type LocalRefs = {[Ref in string]?: AnySchemaObject}\n\n// TODO refactor to use keyword definitions\nconst SIMPLE_INLINED = new Set([\n \"type\",\n \"format\",\n \"pattern\",\n \"maxLength\",\n \"minLength\",\n \"maxProperties\",\n \"minProperties\",\n \"maxItems\",\n \"minItems\",\n \"maximum\",\n \"minimum\",\n \"uniqueItems\",\n \"multipleOf\",\n \"required\",\n \"enum\",\n \"const\",\n])\n\nexport function inlineRef(schema: AnySchema, limit: boolean | number = true): boolean {\n if (typeof schema == \"boolean\") return true\n if (limit === true) return !hasRef(schema)\n if (!limit) return false\n return countKeys(schema) <= limit\n}\n\nconst REF_KEYWORDS = new Set([\n \"$ref\",\n \"$recursiveRef\",\n \"$recursiveAnchor\",\n \"$dynamicRef\",\n \"$dynamicAnchor\",\n])\n\nfunction hasRef(schema: AnySchemaObject): boolean {\n for (const key in schema) {\n if (REF_KEYWORDS.has(key)) return true\n const sch = schema[key]\n if (Array.isArray(sch) && sch.some(hasRef)) return true\n if (typeof sch == \"object\" && hasRef(sch)) return true\n }\n return false\n}\n\nfunction countKeys(schema: AnySchemaObject): number {\n let count = 0\n for (const key in schema) {\n if (key === \"$ref\") return Infinity\n count++\n if (SIMPLE_INLINED.has(key)) continue\n if (typeof schema[key] == \"object\") {\n eachItem(schema[key], (sch) => (count += countKeys(sch)))\n }\n if (count === Infinity) return Infinity\n }\n return count\n}\n\nexport function getFullPath(resolver: UriResolver, id = \"\", normalize?: boolean): string {\n if (normalize !== false) id = normalizeId(id)\n const p = resolver.parse(id)\n return _getFullPath(resolver, p)\n}\n\nexport function _getFullPath(resolver: UriResolver, p: URIComponent): string {\n const serialized = resolver.serialize(p)\n return serialized.split(\"#\")[0] + \"#\"\n}\n\nconst TRAILING_SLASH_HASH = /#\\/?$/\nexport function normalizeId(id: string | undefined): string {\n return id ? id.replace(TRAILING_SLASH_HASH, \"\") : \"\"\n}\n\nexport function resolveUrl(resolver: UriResolver, baseId: string, id: string): string {\n id = normalizeId(id)\n return resolver.resolve(baseId, id)\n}\n\nconst ANCHOR = /^[a-z_][-a-z0-9._]*$/i\n\nexport function getSchemaRefs(this: Ajv, schema: AnySchema, baseId: string): LocalRefs {\n if (typeof schema == \"boolean\") return {}\n const {schemaId, uriResolver} = this.opts\n const schId = normalizeId(schema[schemaId] || baseId)\n const baseIds: {[JsonPtr in string]?: string} = {\"\": schId}\n const pathPrefix = getFullPath(uriResolver, schId, false)\n const localRefs: LocalRefs = {}\n const schemaRefs: Set<string> = new Set()\n\n traverse(schema, {allKeys: true}, (sch, jsonPtr, _, parentJsonPtr) => {\n if (parentJsonPtr === undefined) return\n const fullPath = pathPrefix + jsonPtr\n let innerBaseId = baseIds[parentJsonPtr]\n if (typeof sch[schemaId] == \"string\") innerBaseId = addRef.call(this, sch[schemaId])\n addAnchor.call(this, sch.$anchor)\n addAnchor.call(this, sch.$dynamicAnchor)\n baseIds[jsonPtr] = innerBaseId\n\n function addRef(this: Ajv, ref: string): string {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const _resolve = this.opts.uriResolver.resolve\n ref = normalizeId(innerBaseId ? _resolve(innerBaseId, ref) : ref)\n if (schemaRefs.has(ref)) throw ambiguos(ref)\n schemaRefs.add(ref)\n let schOrRef = this.refs[ref]\n if (typeof schOrRef == \"string\") schOrRef = this.refs[schOrRef]\n if (typeof schOrRef == \"object\") {\n checkAmbiguosRef(sch, schOrRef.schema, ref)\n } else if (ref !== normalizeId(fullPath)) {\n if (ref[0] === \"#\") {\n checkAmbiguosRef(sch, localRefs[ref], ref)\n localRefs[ref] = sch\n } else {\n this.refs[ref] = fullPath\n }\n }\n return ref\n }\n\n function addAnchor(this: Ajv, anchor: unknown): void {\n if (typeof anchor == \"string\") {\n if (!ANCHOR.test(anchor)) throw new Error(`invalid anchor \"${anchor}\"`)\n addRef.call(this, `#${anchor}`)\n }\n }\n })\n\n return localRefs\n\n function checkAmbiguosRef(sch1: AnySchema, sch2: AnySchema | undefined, ref: string): void {\n if (sch2 !== undefined && !equal(sch1, sch2)) throw ambiguos(ref)\n }\n\n function ambiguos(ref: string): Error {\n return new Error(`reference \"${ref}\" resolves to more than one schema`)\n }\n}\n","import type {\n AddedKeywordDefinition,\n AnySchema,\n AnySchemaObject,\n KeywordErrorCxt,\n KeywordCxtParams,\n} from \"../../types\"\nimport type {SchemaCxt, SchemaObjCxt} from \"..\"\nimport type {InstanceOptions} from \"../../core\"\nimport {boolOrEmptySchema, topBoolOrEmptySchema} from \"./boolSchema\"\nimport {coerceAndCheckDataType, getSchemaTypes} from \"./dataType\"\nimport {shouldUseGroup, shouldUseRule} from \"./applicability\"\nimport {checkDataType, checkDataTypes, reportTypeError, DataType} from \"./dataType\"\nimport {assignDefaults} from \"./defaults\"\nimport {funcKeywordCode, macroKeywordCode, validateKeywordUsage, validSchemaType} from \"./keyword\"\nimport {getSubschema, extendSubschemaData, SubschemaArgs, extendSubschemaMode} from \"./subschema\"\nimport {_, nil, str, or, not, getProperty, Block, Code, Name, CodeGen} from \"../codegen\"\nimport N from \"../names\"\nimport {resolveUrl} from \"../resolve\"\nimport {\n schemaRefOrVal,\n schemaHasRulesButRef,\n checkUnknownRules,\n checkStrictMode,\n unescapeJsonPointer,\n mergeEvaluated,\n} from \"../util\"\nimport type {JSONType, Rule, RuleGroup} from \"../rules\"\nimport {\n ErrorPaths,\n reportError,\n reportExtraError,\n resetErrorsCount,\n keyword$DataError,\n} from \"../errors\"\n\n// schema compilation - generates validation function, subschemaCode (below) is used for subschemas\nexport function validateFunctionCode(it: SchemaCxt): void {\n if (isSchemaObj(it)) {\n checkKeywords(it)\n if (schemaCxtHasRules(it)) {\n topSchemaObjCode(it)\n return\n }\n }\n validateFunction(it, () => topBoolOrEmptySchema(it))\n}\n\nfunction validateFunction(\n {gen, validateName, schema, schemaEnv, opts}: SchemaCxt,\n body: Block\n): void {\n if (opts.code.es5) {\n gen.func(validateName, _`${N.data}, ${N.valCxt}`, schemaEnv.$async, () => {\n gen.code(_`\"use strict\"; ${funcSourceUrl(schema, opts)}`)\n destructureValCxtES5(gen, opts)\n gen.code(body)\n })\n } else {\n gen.func(validateName, _`${N.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () =>\n gen.code(funcSourceUrl(schema, opts)).code(body)\n )\n }\n}\n\nfunction destructureValCxt(opts: InstanceOptions): Code {\n return _`{${N.instancePath}=\"\", ${N.parentData}, ${N.parentDataProperty}, ${N.rootData}=${\n N.data\n }${opts.dynamicRef ? _`, ${N.dynamicAnchors}={}` : nil}}={}`\n}\n\nfunction destructureValCxtES5(gen: CodeGen, opts: InstanceOptions): void {\n gen.if(\n N.valCxt,\n () => {\n gen.var(N.instancePath, _`${N.valCxt}.${N.instancePath}`)\n gen.var(N.parentData, _`${N.valCxt}.${N.parentData}`)\n gen.var(N.parentDataProperty, _`${N.valCxt}.${N.parentDataProperty}`)\n gen.var(N.rootData, _`${N.valCxt}.${N.rootData}`)\n if (opts.dynamicRef) gen.var(N.dynamicAnchors, _`${N.valCxt}.${N.dynamicAnchors}`)\n },\n () => {\n gen.var(N.instancePath, _`\"\"`)\n gen.var(N.parentData, _`undefined`)\n gen.var(N.parentDataProperty, _`undefined`)\n gen.var(N.rootData, N.data)\n if (opts.dynamicRef) gen.var(N.dynamicAnchors, _`{}`)\n }\n )\n}\n\nfunction topSchemaObjCode(it: SchemaObjCxt): void {\n const {schema, opts, gen} = it\n validateFunction(it, () => {\n if (opts.$comment && schema.$comment) commentKeyword(it)\n checkNoDefault(it)\n gen.let(N.vErrors, null)\n gen.let(N.errors, 0)\n if (opts.unevaluated) resetEvaluated(it)\n typeAndKeywords(it)\n returnResults(it)\n })\n return\n}\n\nfunction resetEvaluated(it: SchemaObjCxt): void {\n // TODO maybe some hook to execute it in the end to check whether props/items are Name, as in assignEvaluated\n const {gen, validateName} = it\n it.evaluated = gen.const(\"evaluated\", _`${validateName}.evaluated`)\n gen.if(_`${it.evaluated}.dynamicProps`, () => gen.assign(_`${it.evaluated}.props`, _`undefined`))\n gen.if(_`${it.evaluated}.dynamicItems`, () => gen.assign(_`${it.evaluated}.items`, _`undefined`))\n}\n\nfunction funcSourceUrl(schema: AnySchema, opts: InstanceOptions): Code {\n const schId = typeof schema == \"object\" && schema[opts.schemaId]\n return schId && (opts.code.source || opts.code.process) ? _`/*# sourceURL=${schId} */` : nil\n}\n\n// schema compilation - this function is used recursively to generate code for sub-schemas\nfunction subschemaCode(it: SchemaCxt, valid: Name): void {\n if (isSchemaObj(it)) {\n checkKeywords(it)\n if (schemaCxtHasRules(it)) {\n subSchemaObjCode(it, valid)\n return\n }\n }\n boolOrEmptySchema(it, valid)\n}\n\nfunction schemaCxtHasRules({schema, self}: SchemaCxt): boolean {\n if (typeof schema == \"boolean\") return !schema\n for (const key in schema) if (self.RULES.all[key]) return true\n return false\n}\n\nfunction isSchemaObj(it: SchemaCxt): it is SchemaObjCxt {\n return typeof it.schema != \"boolean\"\n}\n\nfunction subSchemaObjCode(it: SchemaObjCxt, valid: Name): void {\n const {schema, gen, opts} = it\n if (opts.$comment && schema.$comment) commentKeyword(it)\n updateContext(it)\n checkAsyncSchema(it)\n const errsCount = gen.const(\"_errs\", N.errors)\n typeAndKeywords(it, errsCount)\n // TODO var\n gen.var(valid, _`${errsCount} === ${N.errors}`)\n}\n\nfunction checkKeywords(it: SchemaObjCxt): void {\n checkUnknownRules(it)\n checkRefsAndKeywords(it)\n}\n\nfunction typeAndKeywords(it: SchemaObjCxt, errsCount?: Name): void {\n if (it.opts.jtd) return schemaKeywords(it, [], false, errsCount)\n const types = getSchemaTypes(it.schema)\n const checkedTypes = coerceAndCheckDataType(it, types)\n schemaKeywords(it, types, !checkedTypes, errsCount)\n}\n\nfunction checkRefsAndKeywords(it: SchemaObjCxt): void {\n const {schema, errSchemaPath, opts, self} = it\n if (schema.$ref && opts.ignoreKeywordsWithRef && schemaHasRulesButRef(schema, self.RULES)) {\n self.logger.warn(`$ref: keywords ignored in schema at path \"${errSchemaPath}\"`)\n }\n}\n\nfunction checkNoDefault(it: SchemaObjCxt): void {\n const {schema, opts} = it\n if (schema.default !== undefined && opts.useDefaults && opts.strictSchema) {\n checkStrictMode(it, \"default is ignored in the schema root\")\n }\n}\n\nfunction updateContext(it: SchemaObjCxt): void {\n const schId = it.schema[it.opts.schemaId]\n if (schId) it.baseId = resolveUrl(it.opts.uriResolver, it.baseId, schId)\n}\n\nfunction checkAsyncSchema(it: SchemaObjCxt): void {\n if (it.schema.$async && !it.schemaEnv.$async) throw new Error(\"async schema in sync schema\")\n}\n\nfunction commentKeyword({gen, schemaEnv, schema, errSchemaPath, opts}: SchemaObjCxt): void {\n const msg = schema.$comment\n if (opts.$comment === true) {\n gen.code(_`${N.self}.logger.log(${msg})`)\n } else if (typeof opts.$comment == \"function\") {\n const schemaPath = str`${errSchemaPath}/$comment`\n const rootName = gen.scopeValue(\"root\", {ref: schemaEnv.root})\n gen.code(_`${N.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`)\n }\n}\n\nfunction returnResults(it: SchemaCxt): void {\n const {gen, schemaEnv, validateName, ValidationError, opts} = it\n if (schemaEnv.$async) {\n // TODO assign unevaluated\n gen.if(\n _`${N.errors} === 0`,\n () => gen.return(N.data),\n () => gen.throw(_`new ${ValidationError as Name}(${N.vErrors})`)\n )\n } else {\n gen.assign(_`${validateName}.errors`, N.vErrors)\n if (opts.unevaluated) assignEvaluated(it)\n gen.return(_`${N.errors} === 0`)\n }\n}\n\nfunction assignEvaluated({gen, evaluated, props, items}: SchemaCxt): void {\n if (props instanceof Name) gen.assign(_`${evaluated}.props`, props)\n if (items instanceof Name) gen.assign(_`${evaluated}.items`, items)\n}\n\nfunction schemaKeywords(\n it: SchemaObjCxt,\n types: JSONType[],\n typeErrors: boolean,\n errsCount?: Name\n): void {\n const {gen, schema, data, allErrors, opts, self} = it\n const {RULES} = self\n if (schema.$ref && (opts.ignoreKeywordsWithRef || !schemaHasRulesButRef(schema, RULES))) {\n gen.block(() => keywordCode(it, \"$ref\", (RULES.all.$ref as Rule).definition)) // TODO typecast\n return\n }\n if (!opts.jtd) checkStrictTypes(it, types)\n gen.block(() => {\n for (const group of RULES.rules) groupKeywords(group)\n groupKeywords(RULES.post)\n })\n\n function groupKeywords(group: RuleGroup): void {\n if (!shouldUseGroup(schema, group)) return\n if (group.type) {\n gen.if(checkDataType(group.type, data, opts.strictNumbers))\n iterateKeywords(it, group)\n if (types.length === 1 && types[0] === group.type && typeErrors) {\n gen.else()\n reportTypeError(it)\n }\n gen.endIf()\n } else {\n iterateKeywords(it, group)\n }\n // TODO make it \"ok\" call?\n if (!allErrors) gen.if(_`${N.errors} === ${errsCount || 0}`)\n }\n}\n\nfunction iterateKeywords(it: SchemaObjCxt, group: RuleGroup): void {\n const {\n gen,\n schema,\n opts: {useDefaults},\n } = it\n if (useDefaults) assignDefaults(it, group.type)\n gen.block(() => {\n for (const rule of group.rules) {\n if (shouldUseRule(schema, rule)) {\n keywordCode(it, rule.keyword, rule.definition, group.type)\n }\n }\n })\n}\n\nfunction checkStrictTypes(it: SchemaObjCxt, types: JSONType[]): void {\n if (it.schemaEnv.meta || !it.opts.strictTypes) return\n checkContextTypes(it, types)\n if (!it.opts.allowUnionTypes) checkMultipleTypes(it, types)\n checkKeywordTypes(it, it.dataTypes)\n}\n\nfunction checkContextTypes(it: SchemaObjCxt, types: JSONType[]): void {\n if (!types.length) return\n if (!it.dataTypes.length) {\n it.dataTypes = types\n return\n }\n types.forEach((t) => {\n if (!includesType(it.dataTypes, t)) {\n strictTypesError(it, `type \"${t}\" not allowed by context \"${it.dataTypes.join(\",\")}\"`)\n }\n })\n narrowSchemaTypes(it, types)\n}\n\nfunction checkMultipleTypes(it: SchemaObjCxt, ts: JSONType[]): void {\n if (ts.length > 1 && !(ts.length === 2 && ts.includes(\"null\"))) {\n strictTypesError(it, \"use allowUnionTypes to allow union type keyword\")\n }\n}\n\nfunction checkKeywordTypes(it: SchemaObjCxt, ts: JSONType[]): void {\n const rules = it.self.RULES.all\n for (const keyword in rules) {\n const rule = rules[keyword]\n if (typeof rule == \"object\" && shouldUseRule(it.schema, rule)) {\n const {type} = rule.definition\n if (type.length && !type.some((t) => hasApplicableType(ts, t))) {\n strictTypesError(it, `missing type \"${type.join(\",\")}\" for keyword \"${keyword}\"`)\n }\n }\n }\n}\n\nfunction hasApplicableType(schTs: JSONType[], kwdT: JSONType): boolean {\n return schTs.includes(kwdT) || (kwdT === \"number\" && schTs.includes(\"integer\"))\n}\n\nfunction includesType(ts: JSONType[], t: JSONType): boolean {\n return ts.includes(t) || (t === \"integer\" && ts.includes(\"number\"))\n}\n\nfunction narrowSchemaTypes(it: SchemaObjCxt, withTypes: JSONType[]): void {\n const ts: JSONType[] = []\n for (const t of it.dataTypes) {\n if (includesType(withTypes, t)) ts.push(t)\n else if (withTypes.includes(\"integer\") && t === \"number\") ts.push(\"integer\")\n }\n it.dataTypes = ts\n}\n\nfunction strictTypesError(it: SchemaObjCxt, msg: string): void {\n const schemaPath = it.schemaEnv.baseId + it.errSchemaPath\n msg += ` at \"${schemaPath}\" (strictTypes)`\n checkStrictMode(it, msg, it.opts.strictTypes)\n}\n\nexport class KeywordCxt implements KeywordErrorCxt {\n readonly gen: CodeGen\n readonly allErrors?: boolean\n readonly keyword: string\n readonly data: Name // Name referencing the current level of the data instance\n readonly $data?: string | false\n schema: any // keyword value in the schema\n readonly schemaValue: Code | number | boolean // Code reference to keyword schema value or primitive value\n readonly schemaCode: Code | number | boolean // Code reference to resolved schema value (different if schema is $data)\n readonly schemaType: JSONType[] // allowed type(s) of keyword value in the schema\n readonly parentSchema: AnySchemaObject\n readonly errsCount?: Name // Name reference to the number of validation errors collected before this keyword,\n // requires option trackErrors in keyword definition\n params: KeywordCxtParams // object to pass parameters to error messages from keyword code\n readonly it: SchemaObjCxt // schema compilation context (schema is guaranteed to be an object, not boolean)\n readonly def: AddedKeywordDefinition\n\n constructor(it: SchemaObjCxt, def: AddedKeywordDefinition, keyword: string) {\n validateKeywordUsage(it, def, keyword)\n this.gen = it.gen\n this.allErrors = it.allErrors\n this.keyword = keyword\n this.data = it.data\n this.schema = it.schema[keyword]\n this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data\n this.schemaValue = schemaRefOrVal(it, this.schema, keyword, this.$data)\n this.schemaType = def.schemaType\n this.parentSchema = it.schema\n this.params = {}\n this.it = it\n this.def = def\n\n if (this.$data) {\n this.schemaCode = it.gen.const(\"vSchema\", getData(this.$data, it))\n } else {\n this.schemaCode = this.schemaValue\n if (!validSchemaType(this.schema, def.schemaType, def.allowUndefined)) {\n throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`)\n }\n }\n\n if (\"code\" in def ? def.trackErrors : def.errors !== false) {\n this.errsCount = it.gen.const(\"_errs\", N.errors)\n }\n }\n\n result(condition: Code, successAction?: () => void, failAction?: () => void): void {\n this.failResult(not(condition), successAction, failAction)\n }\n\n failResult(condition: Code, successAction?: () => void, failAction?: () => void): void {\n this.gen.if(condition)\n if (failAction) failAction()\n else this.error()\n if (successAction) {\n this.gen.else()\n successAction()\n if (this.allErrors) this.gen.endIf()\n } else {\n if (this.allErrors) this.gen.endIf()\n else this.gen.else()\n }\n }\n\n pass(condition: Code, failAction?: () => void): void {\n this.failResult(not(condition), undefined, failAction)\n }\n\n fail(condition?: Code): void {\n if (condition === undefined) {\n this.error()\n if (!this.allErrors) this.gen.if(false) // this branch will be removed by gen.optimize\n return\n }\n this.gen.if(condition)\n this.error()\n if (this.allErrors) this.gen.endIf()\n else this.gen.else()\n }\n\n fail$data(condition: Code): void {\n if (!this.$data) return this.fail(condition)\n const {schemaCode} = this\n this.fail(_`${schemaCode} !== undefined && (${or(this.invalid$data(), condition)})`)\n }\n\n error(append?: boolean, errorParams?: KeywordCxtParams, errorPaths?: ErrorPaths): void {\n if (errorParams) {\n this.setParams(errorParams)\n this._error(append, errorPaths)\n this.setParams({})\n return\n }\n this._error(append, errorPaths)\n }\n\n private _error(append?: boolean, errorPaths?: ErrorPaths): void {\n ;(append ? reportExtraError : reportError)(this, this.def.error, errorPaths)\n }\n\n $dataError(): void {\n reportError(this, this.def.$dataError || keyword$DataError)\n }\n\n reset(): void {\n if (this.errsCount === undefined) throw new Error('add \"trackErrors\" to keyword definition')\n resetErrorsCount(this.gen, this.errsCount)\n }\n\n ok(cond: Code | boolean): void {\n if (!this.allErrors) this.gen.if(cond)\n }\n\n setParams(obj: KeywordCxtParams, assign?: true): void {\n if (assign) Object.assign(this.params, obj)\n else this.params = obj\n }\n\n block$data(valid: Name, codeBlock: () => void, $dataValid: Code = nil): void {\n this.gen.block(() => {\n this.check$data(valid, $dataValid)\n codeBlock()\n })\n }\n\n check$data(valid: Name = nil, $dataValid: Code = nil): void {\n if (!this.$data) return\n const {gen, schemaCode, schemaType, def} = this\n gen.if(or(_`${schemaCode} === undefined`, $dataValid))\n if (valid !== nil) gen.assign(valid, true)\n if (schemaType.length || def.validateSchema) {\n gen.elseIf(this.invalid$data())\n this.$dataError()\n if (valid !== nil) gen.assign(valid, false)\n }\n gen.else()\n }\n\n invalid$data(): Code {\n const {gen, schemaCode, schemaType, def, it} = this\n return or(wrong$DataType(), invalid$DataSchema())\n\n function wrong$DataType(): Code {\n if (schemaType.length) {\n /* istanbul ignore if */\n if (!(schemaCode instanceof Name)) throw new Error(\"ajv implementation error\")\n const st = Array.isArray(schemaType) ? schemaType : [schemaType]\n return _`${checkDataTypes(st, schemaCode, it.opts.strictNumbers, DataType.Wrong)}`\n }\n return nil\n }\n\n function invalid$DataSchema(): Code {\n if (def.validateSchema) {\n const validateSchemaRef = gen.scopeValue(\"validate$data\", {ref: def.validateSchema}) // TODO value.code for standalone\n return _`!${validateSchemaRef}(${schemaCode})`\n }\n return nil\n }\n }\n\n subschema(appl: SubschemaArgs, valid: Name): SchemaCxt {\n const subschema = getSubschema(this.it, appl)\n extendSubschemaData(subschema, this.it, appl)\n extendSubschemaMode(subschema, appl)\n const nextContext = {...this.it, ...subschema, items: undefined, props: undefined}\n subschemaCode(nextContext, valid)\n return nextContext\n }\n\n mergeEvaluated(schemaCxt: SchemaCxt, toName?: typeof Name): void {\n const {it, gen} = this\n if (!it.opts.unevaluated) return\n if (it.props !== true && schemaCxt.props !== undefined) {\n it.props = mergeEvaluated.props(gen, schemaCxt.props, it.props, toName)\n }\n if (it.items !== true && schemaCxt.items !== undefined) {\n it.items = mergeEvaluated.items(gen, schemaCxt.items, it.items, toName)\n }\n }\n\n mergeValidEvaluated(schemaCxt: SchemaCxt, valid: Name): boolean | void {\n const {it, gen} = this\n if (it.opts.unevaluated && (it.props !== true || it.items !== true)) {\n gen.if(valid, () => this.mergeEvaluated(schemaCxt, Name))\n return true\n }\n }\n}\n\nfunction keywordCode(\n it: SchemaObjCxt,\n keyword: string,\n def: AddedKeywordDefinition,\n ruleType?: JSONType\n): void {\n const cxt = new KeywordCxt(it, def, keyword)\n if (\"code\" in def) {\n def.code(cxt, ruleType)\n } else if (cxt.$data && def.validate) {\n funcKeywordCode(cxt, def)\n } else if (\"macro\" in def) {\n macroKeywordCode(cxt, def)\n } else if (def.compile || def.validate) {\n funcKeywordCode(cxt, def)\n }\n}\n\nconst JSON_POINTER = /^\\/(?:[^~]|~0|~1)*$/\nconst RELATIVE_JSON_POINTER = /^([0-9]+)(#|\\/(?:[^~]|~0|~1)*)?$/\nexport function getData(\n $data: string,\n {dataLevel, dataNames, dataPathArr}: SchemaCxt\n): Code | number {\n let jsonPointer\n let data: Code\n if ($data === \"\") return N.rootData\n if ($data[0] === \"/\") {\n if (!JSON_POINTER.test($data)) throw new Error(`Invalid JSON-pointer: ${$data}`)\n jsonPointer = $data\n data = N.rootData\n } else {\n const matches = RELATIVE_JSON_POINTER.exec($data)\n if (!matches) throw new Error(`Invalid JSON-pointer: ${$data}`)\n const up: number = +matches[1]\n jsonPointer = matches[2]\n if (jsonPointer === \"#\") {\n if (up >= dataLevel) throw new Error(errorMsg(\"property/index\", up))\n return dataPathArr[dataLevel - up]\n }\n if (up > dataLevel) throw new Error(errorMsg(\"data\", up))\n data = dataNames[dataLevel - up]\n if (!jsonPointer) return data\n }\n\n let expr = data\n const segments = jsonPointer.split(\"/\")\n for (const segment of segments) {\n if (segment) {\n data = _`${data}${getProperty(unescapeJsonPointer(segment))}`\n expr = _`${expr} && ${data}`\n }\n }\n return expr\n\n function errorMsg(pointerType: string, up: number): string {\n return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`\n }\n}\n","import type {ErrorObject} from \"../types\"\n\nexport default class ValidationError extends Error {\n readonly errors: Partial<ErrorObject>[]\n readonly ajv: true\n readonly validation: true\n\n constructor(errors: Partial<ErrorObject>[]) {\n super(\"validation failed\")\n this.errors = errors\n this.ajv = this.validation = true\n }\n}\n","import {resolveUrl, normalizeId, getFullPath} from \"./resolve\"\nimport type {UriResolver} from \"../types\"\n\nexport default class MissingRefError extends Error {\n readonly missingRef: string\n readonly missingSchema: string\n\n constructor(resolver: UriResolver, baseId: string, ref: string, msg?: string) {\n super(msg || `can't resolve reference ${ref} from id ${baseId}`)\n this.missingRef = resolveUrl(resolver, baseId, ref)\n this.missingSchema = normalizeId(getFullPath(resolver, this.missingRef))\n }\n}\n","import type {\n AnySchema,\n AnySchemaObject,\n AnyValidateFunction,\n AsyncValidateFunction,\n EvaluatedProperties,\n EvaluatedItems,\n} from \"../types\"\nimport type Ajv from \"../core\"\nimport type {InstanceOptions} from \"../core\"\nimport {CodeGen, _, nil, stringify, Name, Code, ValueScopeName} from \"./codegen\"\nimport ValidationError from \"../runtime/validation_error\"\nimport N from \"./names\"\nimport {LocalRefs, getFullPath, _getFullPath, inlineRef, normalizeId, resolveUrl} from \"./resolve\"\nimport {schemaHasRulesButRef, unescapeFragment} from \"./util\"\nimport {validateFunctionCode} from \"./validate\"\nimport {URIComponent} from \"fast-uri\"\nimport {JSONType} from \"./rules\"\n\nexport type SchemaRefs = {\n [Ref in string]?: SchemaEnv | AnySchema\n}\n\nexport interface SchemaCxt {\n readonly gen: CodeGen\n readonly allErrors?: boolean // validation mode - whether to collect all errors or break on error\n readonly data: Name // Name with reference to the current part of data instance\n readonly parentData: Name // should be used in keywords modifying data\n readonly parentDataProperty: Code | number // should be used in keywords modifying data\n readonly dataNames: Name[]\n readonly dataPathArr: (Code | number)[]\n readonly dataLevel: number // the level of the currently validated data,\n // it can be used to access both the property names and the data on all levels from the top.\n dataTypes: JSONType[] // data types applied to the current part of data instance\n definedProperties: Set<string> // set of properties to keep track of for required checks\n readonly topSchemaRef: Code\n readonly validateName: Name\n evaluated?: Name\n readonly ValidationError?: Name\n readonly schema: AnySchema // current schema object - equal to parentSchema passed via KeywordCxt\n readonly schemaEnv: SchemaEnv\n readonly rootId: string\n baseId: string // the current schema base URI that should be used as the base for resolving URIs in references (\\$ref)\n readonly schemaPath: Code // the run-time expression that evaluates to the property name of the current schema\n readonly errSchemaPath: string // this is actual string, should not be changed to Code\n readonly errorPath: Code\n readonly propertyName?: Name\n readonly compositeRule?: boolean // true indicates that the current schema is inside the compound keyword,\n // where failing some rule doesn't mean validation failure (`anyOf`, `oneOf`, `not`, `if`).\n // This flag is used to determine whether you can return validation result immediately after any error in case the option `allErrors` is not `true.\n // You only need to use it if you have many steps in your keywords and potentially can define multiple errors.\n props?: EvaluatedProperties | Name // properties evaluated by this schema - used by parent schema or assigned to validation function\n items?: EvaluatedItems | Name // last item evaluated by this schema - used by parent schema or assigned to validation function\n jtdDiscriminator?: string\n jtdMetadata?: boolean\n readonly createErrors?: boolean\n readonly opts: InstanceOptions // Ajv instance option.\n readonly self: Ajv // current Ajv instance\n}\n\nexport interface SchemaObjCxt extends SchemaCxt {\n readonly schema: AnySchemaObject\n}\ninterface SchemaEnvArgs {\n readonly schema: AnySchema\n readonly schemaId?: \"$id\" | \"id\"\n readonly root?: SchemaEnv\n readonly baseId?: string\n readonly schemaPath?: string\n readonly localRefs?: LocalRefs\n readonly meta?: boolean\n}\n\nexport class SchemaEnv implements SchemaEnvArgs {\n readonly schema: AnySchema\n readonly schemaId?: \"$id\" | \"id\"\n readonly root: SchemaEnv\n baseId: string // TODO possibly, it should be readonly\n schemaPath?: string\n localRefs?: LocalRefs\n readonly meta?: boolean\n readonly $async?: boolean // true if the current schema is asynchronous.\n readonly refs: SchemaRefs = {}\n readonly dynamicAnchors: {[Ref in string]?: true} = {}\n validate?: AnyValidateFunction\n validateName?: ValueScopeName\n serialize?: (data: unknown) => string\n serializeName?: ValueScopeName\n parse?: (data: string) => unknown\n parseName?: ValueScopeName\n\n constructor(env: SchemaEnvArgs) {\n let schema: AnySchemaObject | undefined\n if (typeof env.schema == \"object\") schema = env.schema\n this.schema = env.schema\n this.schemaId = env.schemaId\n this.root = env.root || this\n this.baseId = env.baseId ?? normalizeId(schema?.[env.schemaId || \"$id\"])\n this.schemaPath = env.schemaPath\n this.localRefs = env.localRefs\n this.meta = env.meta\n this.$async = schema?.$async\n this.refs = {}\n }\n}\n\n// let codeSize = 0\n// let nodeCount = 0\n\n// Compiles schema in SchemaEnv\nexport function compileSchema(this: Ajv, sch: SchemaEnv): SchemaEnv {\n // TODO refactor - remove compilations\n const _sch = getCompilingSchema.call(this, sch)\n if (_sch) return _sch\n const rootId = getFullPath(this.opts.uriResolver, sch.root.baseId) // TODO if getFullPath removed 1 tests fails\n const {es5, lines} = this.opts.code\n const {ownProperties} = this.opts\n const gen = new CodeGen(this.scope, {es5, lines, ownProperties})\n let _ValidationError\n if (sch.$async) {\n _ValidationError = gen.scopeValue(\"Error\", {\n ref: ValidationError,\n code: _`require(\"ajv/dist/runtime/validation_error\").default`,\n })\n }\n\n const validateName = gen.scopeName(\"validate\")\n sch.validateName = validateName\n\n const schemaCxt: SchemaCxt = {\n gen,\n allErrors: this.opts.allErrors,\n data: N.data,\n parentData: N.parentData,\n parentDataProperty: N.parentDataProperty,\n dataNames: [N.data],\n dataPathArr: [nil], // TODO can its length be used as dataLevel if nil is removed?\n dataLevel: 0,\n dataTypes: [],\n definedProperties: new Set<string>(),\n topSchemaRef: gen.scopeValue(\n \"schema\",\n this.opts.code.source === true\n ? {ref: sch.schema, code: stringify(sch.schema)}\n : {ref: sch.schema}\n ),\n validateName,\n ValidationError: _ValidationError,\n schema: sch.schema,\n schemaEnv: sch,\n rootId,\n baseId: sch.baseId || rootId,\n schemaPath: nil,\n errSchemaPath: sch.schemaPath || (this.opts.jtd ? \"\" : \"#\"),\n errorPath: _`\"\"`,\n opts: this.opts,\n self: this,\n }\n\n let sourceCode: string | undefined\n try {\n this._compilations.add(sch)\n validateFunctionCode(schemaCxt)\n gen.optimize(this.opts.code.optimize)\n // gen.optimize(1)\n const validateCode = gen.toString()\n sourceCode = `${gen.scopeRefs(N.scope)}return ${validateCode}`\n // console.log((codeSize += sourceCode.length), (nodeCount += gen.nodeCount))\n if (this.opts.code.process) sourceCode = this.opts.code.process(sourceCode, sch)\n // console.log(\"\\n\\n\\n *** \\n\", sourceCode)\n const makeValidate = new Function(`${N.self}`, `${N.scope}`, sourceCode)\n const validate: AnyValidateFunction = makeValidate(this, this.scope.get())\n this.scope.value(validateName, {ref: validate})\n\n validate.errors = null\n validate.schema = sch.schema\n validate.schemaEnv = sch\n if (sch.$async) (validate as AsyncValidateFunction).$async = true\n if (this.opts.code.source === true) {\n validate.source = {validateName, validateCode, scopeValues: gen._values}\n }\n if (this.opts.unevaluated) {\n const {props, items} = schemaCxt\n validate.evaluated = {\n props: props instanceof Name ? undefined : props,\n items: items instanceof Name ? undefined : items,\n dynamicProps: props instanceof Name,\n dynamicItems: items instanceof Name,\n }\n if (validate.source) validate.source.evaluated = stringify(validate.evaluated)\n }\n sch.validate = validate\n return sch\n } catch (e) {\n delete sch.validate\n delete sch.validateName\n if (sourceCode) this.logger.error(\"Error compiling schema, function code:\", sourceCode)\n // console.log(\"\\n\\n\\n *** \\n\", sourceCode, this.opts)\n throw e\n } finally {\n this._compilations.delete(sch)\n }\n}\n\nexport function resolveRef(\n this: Ajv,\n root: SchemaEnv,\n baseId: string,\n ref: string\n): AnySchema | SchemaEnv | undefined {\n ref = resolveUrl(this.opts.uriResolver, baseId, ref)\n const schOrFunc = root.refs[ref]\n if (schOrFunc) return schOrFunc\n\n let _sch = resolve.call(this, root, ref)\n if (_sch === undefined) {\n const schema = root.localRefs?.[ref] // TODO maybe localRefs should hold SchemaEnv\n const {schemaId} = this.opts\n if (schema) _sch = new SchemaEnv({schema, schemaId, root, baseId})\n }\n\n if (_sch === undefined) return\n return (root.refs[ref] = inlineOrCompile.call(this, _sch))\n}\n\nfunction inlineOrCompile(this: Ajv, sch: SchemaEnv): AnySchema | SchemaEnv {\n if (inlineRef(sch.schema, this.opts.inlineRefs)) return sch.schema\n return sch.validate ? sch : compileSchema.call(this, sch)\n}\n\n// Index of schema compilation in the currently compiled list\nexport function getCompilingSchema(this: Ajv, schEnv: SchemaEnv): SchemaEnv | void {\n for (const sch of this._compilations) {\n if (sameSchemaEnv(sch, schEnv)) return sch\n }\n}\n\nfunction sameSchemaEnv(s1: SchemaEnv, s2: SchemaEnv): boolean {\n return s1.schema === s2.schema && s1.root === s2.root && s1.baseId === s2.baseId\n}\n\n// resolve and compile the references ($ref)\n// TODO returns AnySchemaObject (if the schema can be inlined) or validation function\nfunction resolve(\n this: Ajv,\n root: SchemaEnv, // information about the root schema for the current schema\n ref: string // reference to resolve\n): SchemaEnv | undefined {\n let sch\n while (typeof (sch = this.refs[ref]) == \"string\") ref = sch\n return sch || this.schemas[ref] || resolveSchema.call(this, root, ref)\n}\n\n// Resolve schema, its root and baseId\nexport function resolveSchema(\n this: Ajv,\n root: SchemaEnv, // root object with properties schema, refs TODO below SchemaEnv is assigned to it\n ref: string // reference to resolve\n): SchemaEnv | undefined {\n const p = this.opts.uriResolver.parse(ref)\n const refPath = _getFullPath(this.opts.uriResolver, p)\n let baseId = getFullPath(this.opts.uriResolver, root.baseId, undefined)\n // TODO `Object.keys(root.schema).length > 0` should not be needed - but removing breaks 2 tests\n if (Object.keys(root.schema).length > 0 && refPath === baseId) {\n return getJsonPointer.call(this, p, root)\n }\n\n const id = normalizeId(refPath)\n const schOrRef = this.refs[id] || this.schemas[id]\n if (typeof schOrRef == \"string\") {\n const sch = resolveSchema.call(this, root, schOrRef)\n if (typeof sch?.schema !== \"object\") return\n return getJsonPointer.call(this, p, sch)\n }\n\n if (typeof schOrRef?.schema !== \"object\") return\n if (!schOrRef.validate) compileSchema.call(this, schOrRef)\n if (id === normalizeId(ref)) {\n const {schema} = schOrRef\n const {schemaId} = this.opts\n const schId = schema[schemaId]\n if (schId) baseId = resolveUrl(this.opts.uriResolver, baseId, schId)\n return new SchemaEnv({schema, schemaId, root, baseId})\n }\n return getJsonPointer.call(this, p, schOrRef)\n}\n\nconst PREVENT_SCOPE_CHANGE = new Set([\n \"properties\",\n \"patternProperties\",\n \"enum\",\n \"dependencies\",\n \"definitions\",\n])\n\nfunction getJsonPointer(\n this: Ajv,\n parsedRef: URIComponent,\n {baseId, schema, root}: SchemaEnv\n): SchemaEnv | undefined {\n if (parsedRef.fragment?.[0] !== \"/\") return\n for (const part of parsedRef.fragment.slice(1).split(\"/\")) {\n if (typeof schema === \"boolean\") return\n const partSchema = schema[unescapeFragment(part)]\n if (partSchema === undefined) return\n schema = partSchema\n // TODO PREVENT_SCOPE_CHANGE could be defined in keyword def?\n const schId = typeof schema === \"object\" && schema[this.opts.schemaId]\n if (!PREVENT_SCOPE_CHANGE.has(part) && schId) {\n baseId = resolveUrl(this.opts.uriResolver, baseId, schId)\n }\n }\n let env: SchemaEnv | undefined\n if (typeof schema != \"boolean\" && schema.$ref && !schemaHasRulesButRef(schema, this.RULES)) {\n const $ref = resolveUrl(this.opts.uriResolver, baseId, schema.$ref)\n env = resolveSchema.call(this, root, $ref)\n }\n // even though resolution failed we need to return SchemaEnv to throw exception\n // so that compileAsync loads missing schema.\n const {schemaId} = this.opts\n env = env || new SchemaEnv({schema, schemaId, root, baseId})\n if (env.schema !== env.root.schema) return env\n return undefined\n}\n","{\n \"$id\": \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#\",\n \"description\": \"Meta-schema for $data reference (JSON AnySchema extension proposal)\",\n \"type\": \"object\",\n \"required\": [\"$data\"],\n \"properties\": {\n \"$data\": {\n \"type\": \"string\",\n \"anyOf\": [{\"format\": \"relative-json-pointer\"}, {\"format\": \"json-pointer\"}]\n }\n },\n \"additionalProperties\": false\n}\n","'use strict'\n\n/** @type {(value: string) => boolean} */\nconst isUUID = RegExp.prototype.test.bind(/^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}$/iu)\n\n/** @type {(value: string) => boolean} */\nconst isIPv4 = RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)$/u)\n\n/** @type {(value: string) => boolean} */\nconst isHexPair = RegExp.prototype.test.bind(/^[\\da-f]{2}$/iu)\n\n/** @type {(value: string) => boolean} */\nconst isUnreserved = RegExp.prototype.test.bind(/^[\\da-z\\-._~]$/iu)\n\n/** @type {(value: string) => boolean} */\nconst isPathCharacter = RegExp.prototype.test.bind(/^[\\da-z\\-._~!$&'()*+,;=:@/]$/iu)\n\n/**\n * @param {Array<string>} input\n * @returns {string}\n */\nfunction stringArrayToHexStripped (input) {\n let acc = ''\n let code = 0\n let i = 0\n\n for (i = 0; i < input.length; i++) {\n code = input[i].charCodeAt(0)\n if (code === 48) {\n continue\n }\n if (!((code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102))) {\n return ''\n }\n acc += input[i]\n break\n }\n\n for (i += 1; i < input.length; i++) {\n code = input[i].charCodeAt(0)\n if (!((code >= 48 && code <= 57) || (code >= 65 && code <= 70) || (code >= 97 && code <= 102))) {\n return ''\n }\n acc += input[i]\n }\n return acc\n}\n\n/**\n * @typedef {Object} GetIPV6Result\n * @property {boolean} error - Indicates if there was an error parsing the IPv6 address.\n * @property {string} address - The parsed IPv6 address.\n * @property {string} [zone] - The zone identifier, if present.\n */\n\n/**\n * @param {string} value\n * @returns {boolean}\n */\nconst nonSimpleDomain = RegExp.prototype.test.bind(/[^!\"$&'()*+,\\-.;=_`a-z{}~]/u)\n\n/**\n * @param {Array<string>} buffer\n * @returns {boolean}\n */\nfunction consumeIsZone (buffer) {\n buffer.length = 0\n return true\n}\n\n/**\n * @param {Array<string>} buffer\n * @param {Array<string>} address\n * @param {GetIPV6Result} output\n * @returns {boolean}\n */\nfunction consumeHextets (buffer, address, output) {\n if (buffer.length) {\n const hex = stringArrayToHexStripped(buffer)\n if (hex !== '') {\n address.push(hex)\n } else {\n output.error = true\n return false\n }\n buffer.length = 0\n }\n return true\n}\n\n/**\n * @param {string} input\n * @returns {GetIPV6Result}\n */\nfunction getIPV6 (input) {\n let tokenCount = 0\n const output = { error: false, address: '', zone: '' }\n /** @type {Array<string>} */\n const address = []\n /** @type {Array<string>} */\n const buffer = []\n let endipv6Encountered = false\n let endIpv6 = false\n\n let consume = consumeHextets\n\n for (let i = 0; i < input.length; i++) {\n const cursor = input[i]\n if (cursor === '[' || cursor === ']') { continue }\n if (cursor === ':') {\n if (endipv6Encountered === true) {\n endIpv6 = true\n }\n if (!consume(buffer, address, output)) { break }\n if (++tokenCount > 7) {\n // not valid\n output.error = true\n break\n }\n if (i > 0 && input[i - 1] === ':') {\n endipv6Encountered = true\n }\n address.push(':')\n continue\n } else if (cursor === '%') {\n if (!consume(buffer, address, output)) { break }\n // switch to zone detection\n consume = consumeIsZone\n } else {\n buffer.push(cursor)\n continue\n }\n }\n if (buffer.length) {\n if (consume === consumeIsZone) {\n output.zone = buffer.join('')\n } else if (endIpv6) {\n address.push(buffer.join(''))\n } else {\n address.push(stringArrayToHexStripped(buffer))\n }\n }\n output.address = address.join('')\n return output\n}\n\n/**\n * @typedef {Object} NormalizeIPv6Result\n * @property {string} host - The normalized host.\n * @property {string} [escapedHost] - The escaped host.\n * @property {boolean} isIPV6 - Indicates if the host is an IPv6 address.\n */\n\n/**\n * @param {string} host\n * @returns {NormalizeIPv6Result}\n */\nfunction normalizeIPv6 (host) {\n if (findToken(host, ':') < 2) { return { host, isIPV6: false } }\n const ipv6 = getIPV6(host)\n\n if (!ipv6.error) {\n let newHost = ipv6.address\n let escapedHost = ipv6.address\n if (ipv6.zone) {\n newHost += '%' + ipv6.zone\n escapedHost += '%25' + ipv6.zone\n }\n return { host: newHost, isIPV6: true, escapedHost }\n } else {\n return { host, isIPV6: false }\n }\n}\n\n/**\n * @param {string} str\n * @param {string} token\n * @returns {number}\n */\nfunction findToken (str, token) {\n let ind = 0\n for (let i = 0; i < str.length; i++) {\n if (str[i] === token) ind++\n }\n return ind\n}\n\n/**\n * @param {string} path\n * @returns {string}\n *\n * @see https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4\n */\nfunction removeDotSegments (path) {\n let input = path\n const output = []\n let nextSlash = -1\n let len = 0\n\n // eslint-disable-next-line no-cond-assign\n while (len = input.length) {\n if (len === 1) {\n if (input === '.') {\n break\n } else if (input === '/') {\n output.push('/')\n break\n } else {\n output.push(input)\n break\n }\n } else if (len === 2) {\n if (input[0] === '.') {\n if (input[1] === '.') {\n break\n } else if (input[1] === '/') {\n input = input.slice(2)\n continue\n }\n } else if (input[0] === '/') {\n if (input[1] === '.' || input[1] === '/') {\n output.push('/')\n break\n }\n }\n } else if (len === 3) {\n if (input === '/..') {\n if (output.length !== 0) {\n output.pop()\n }\n output.push('/')\n break\n }\n }\n if (input[0] === '.') {\n if (input[1] === '.') {\n if (input[2] === '/') {\n input = input.slice(3)\n continue\n }\n } else if (input[1] === '/') {\n input = input.slice(2)\n continue\n }\n } else if (input[0] === '/') {\n if (input[1] === '.') {\n if (input[2] === '/') {\n input = input.slice(2)\n continue\n } else if (input[2] === '.') {\n if (input[3] === '/') {\n input = input.slice(3)\n if (output.length !== 0) {\n output.pop()\n }\n continue\n }\n }\n }\n }\n\n // Rule 2E: Move normal path segment to output\n if ((nextSlash = input.indexOf('/', 1)) === -1) {\n output.push(input)\n break\n } else {\n output.push(input.slice(0, nextSlash))\n input = input.slice(nextSlash)\n }\n }\n\n return output.join('')\n}\n\n/**\n * Re-escape RFC 3986 gen-delims that must not appear literally in the host.\n * After the URI regex parses, these characters cannot be literal in the host\n * field, so any that appear after decoding came from percent-encoding and\n * must be restored to prevent authority structure changes.\n *\n * @param {string} host\n * @param {boolean} isIP - true for IPv4/IPv6 hosts (skip colon re-escaping)\n * @returns {string}\n */\nconst HOST_DELIMS = { '@': '%40', '/': '%2F', '?': '%3F', '#': '%23', ':': '%3A' }\nconst HOST_DELIM_RE = /[@/?#:]/g\nconst HOST_DELIM_NO_COLON_RE = /[@/?#]/g\n\nfunction reescapeHostDelimiters (host, isIP) {\n const re = isIP ? HOST_DELIM_NO_COLON_RE : HOST_DELIM_RE\n re.lastIndex = 0\n return host.replace(re, (ch) => HOST_DELIMS[ch])\n}\n\n/**\n * Normalizes percent escapes and optionally decodes only unreserved ASCII bytes.\n * Reserved delimiters such as `%2F` and `%2E` stay escaped.\n *\n * @param {string} input\n * @param {boolean} [decodeUnreserved=false]\n * @returns {string}\n */\nfunction normalizePercentEncoding (input, decodeUnreserved = false) {\n if (input.indexOf('%') === -1) {\n return input\n }\n\n let output = ''\n\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '%' && i + 2 < input.length) {\n const hex = input.slice(i + 1, i + 3)\n if (isHexPair(hex)) {\n const normalizedHex = hex.toUpperCase()\n const decoded = String.fromCharCode(parseInt(normalizedHex, 16))\n\n if (decodeUnreserved && isUnreserved(decoded)) {\n output += decoded\n } else {\n output += '%' + normalizedHex\n }\n\n i += 2\n continue\n }\n }\n\n output += input[i]\n }\n\n return output\n}\n\n/**\n * Normalizes path data without turning reserved escapes into live path syntax.\n * Valid escapes are uppercased, raw unsafe characters are escaped, and only\n * unreserved bytes that are not `.` are decoded.\n *\n * @param {string} input\n * @returns {string}\n */\nfunction normalizePathEncoding (input) {\n let output = ''\n\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '%' && i + 2 < input.length) {\n const hex = input.slice(i + 1, i + 3)\n if (isHexPair(hex)) {\n const normalizedHex = hex.toUpperCase()\n const decoded = String.fromCharCode(parseInt(normalizedHex, 16))\n\n if (decoded !== '.' && isUnreserved(decoded)) {\n output += decoded\n } else {\n output += '%' + normalizedHex\n }\n\n i += 2\n continue\n }\n }\n\n if (isPathCharacter(input[i])) {\n output += input[i]\n } else {\n output += escape(input[i])\n }\n }\n\n return output\n}\n\n/**\n * Escapes a component while preserving existing valid percent escapes.\n *\n * @param {string} input\n * @returns {string}\n */\nfunction escapePreservingEscapes (input) {\n let output = ''\n\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '%' && i + 2 < input.length) {\n const hex = input.slice(i + 1, i + 3)\n if (isHexPair(hex)) {\n output += '%' + hex.toUpperCase()\n i += 2\n continue\n }\n }\n\n output += escape(input[i])\n }\n\n return output\n}\n\n/**\n * @param {import('../types/index').URIComponent} component\n * @returns {string|undefined}\n */\nfunction recomposeAuthority (component) {\n const uriTokens = []\n\n if (component.userinfo !== undefined) {\n uriTokens.push(component.userinfo)\n uriTokens.push('@')\n }\n\n if (component.host !== undefined) {\n let host = unescape(component.host)\n if (!isIPv4(host)) {\n const ipV6res = normalizeIPv6(host)\n if (ipV6res.isIPV6 === true) {\n host = `[${ipV6res.escapedHost}]`\n } else {\n host = reescapeHostDelimiters(host, false)\n }\n }\n uriTokens.push(host)\n }\n\n if (typeof component.port === 'number' || typeof component.port === 'string') {\n uriTokens.push(':')\n uriTokens.push(String(component.port))\n }\n\n return uriTokens.length ? uriTokens.join('') : undefined\n};\n\nmodule.exports = {\n nonSimpleDomain,\n recomposeAuthority,\n reescapeHostDelimiters,\n normalizePercentEncoding,\n normalizePathEncoding,\n escapePreservingEscapes,\n removeDotSegments,\n isIPv4,\n isUUID,\n normalizeIPv6,\n stringArrayToHexStripped\n}\n","'use strict'\n\nconst { isUUID } = require('./utils')\nconst URN_REG = /([\\da-z][\\d\\-a-z]{0,31}):((?:[\\w!$'()*+,\\-.:;=@]|%[\\da-f]{2})+)/iu\n\nconst supportedSchemeNames = /** @type {const} */ (['http', 'https', 'ws',\n 'wss', 'urn', 'urn:uuid'])\n\n/** @typedef {supportedSchemeNames[number]} SchemeName */\n\n/**\n * @param {string} name\n * @returns {name is SchemeName}\n */\nfunction isValidSchemeName (name) {\n return supportedSchemeNames.indexOf(/** @type {*} */ (name)) !== -1\n}\n\n/**\n * @callback SchemeFn\n * @param {import('../types/index').URIComponent} component\n * @param {import('../types/index').Options} options\n * @returns {import('../types/index').URIComponent}\n */\n\n/**\n * @typedef {Object} SchemeHandler\n * @property {SchemeName} scheme - The scheme name.\n * @property {boolean} [domainHost] - Indicates if the scheme supports domain hosts.\n * @property {SchemeFn} parse - Function to parse the URI component for this scheme.\n * @property {SchemeFn} serialize - Function to serialize the URI component for this scheme.\n * @property {boolean} [skipNormalize] - Indicates if normalization should be skipped for this scheme.\n * @property {boolean} [absolutePath] - Indicates if the scheme uses absolute paths.\n * @property {boolean} [unicodeSupport] - Indicates if the scheme supports Unicode.\n */\n\n/**\n * @param {import('../types/index').URIComponent} wsComponent\n * @returns {boolean}\n */\nfunction wsIsSecure (wsComponent) {\n if (wsComponent.secure === true) {\n return true\n } else if (wsComponent.secure === false) {\n return false\n } else if (wsComponent.scheme) {\n return (\n wsComponent.scheme.length === 3 &&\n (wsComponent.scheme[0] === 'w' || wsComponent.scheme[0] === 'W') &&\n (wsComponent.scheme[1] === 's' || wsComponent.scheme[1] === 'S') &&\n (wsComponent.scheme[2] === 's' || wsComponent.scheme[2] === 'S')\n )\n } else {\n return false\n }\n}\n\n/** @type {SchemeFn} */\nfunction httpParse (component) {\n if (!component.host) {\n component.error = component.error || 'HTTP URIs must have a host.'\n }\n\n return component\n}\n\n/** @type {SchemeFn} */\nfunction httpSerialize (component) {\n const secure = String(component.scheme).toLowerCase() === 'https'\n\n // normalize the default port\n if (component.port === (secure ? 443 : 80) || component.port === '') {\n component.port = undefined\n }\n\n // normalize the empty path\n if (!component.path) {\n component.path = '/'\n }\n\n // NOTE: We do not parse query strings for HTTP URIs\n // as WWW Form Url Encoded query strings are part of the HTML4+ spec,\n // and not the HTTP spec.\n\n return component\n}\n\n/** @type {SchemeFn} */\nfunction wsParse (wsComponent) {\n// indicate if the secure flag is set\n wsComponent.secure = wsIsSecure(wsComponent)\n\n // construct resouce name\n wsComponent.resourceName = (wsComponent.path || '/') + (wsComponent.query ? '?' + wsComponent.query : '')\n wsComponent.path = undefined\n wsComponent.query = undefined\n\n return wsComponent\n}\n\n/** @type {SchemeFn} */\nfunction wsSerialize (wsComponent) {\n// normalize the default port\n if (wsComponent.port === (wsIsSecure(wsComponent) ? 443 : 80) || wsComponent.port === '') {\n wsComponent.port = undefined\n }\n\n // ensure scheme matches secure flag\n if (typeof wsComponent.secure === 'boolean') {\n wsComponent.scheme = (wsComponent.secure ? 'wss' : 'ws')\n wsComponent.secure = undefined\n }\n\n // reconstruct path from resource name\n if (wsComponent.resourceName) {\n const [path, query] = wsComponent.resourceName.split('?')\n wsComponent.path = (path && path !== '/' ? path : undefined)\n wsComponent.query = query\n wsComponent.resourceName = undefined\n }\n\n // forbid fragment component\n wsComponent.fragment = undefined\n\n return wsComponent\n}\n\n/** @type {SchemeFn} */\nfunction urnParse (urnComponent, options) {\n if (!urnComponent.path) {\n urnComponent.error = 'URN can not be parsed'\n return urnComponent\n }\n const matches = urnComponent.path.match(URN_REG)\n if (matches) {\n const scheme = options.scheme || urnComponent.scheme || 'urn'\n urnComponent.nid = matches[1].toLowerCase()\n urnComponent.nss = matches[2]\n const urnScheme = `${scheme}:${options.nid || urnComponent.nid}`\n const schemeHandler = getSchemeHandler(urnScheme)\n urnComponent.path = undefined\n\n if (schemeHandler) {\n urnComponent = schemeHandler.parse(urnComponent, options)\n }\n } else {\n urnComponent.error = urnComponent.error || 'URN can not be parsed.'\n }\n\n return urnComponent\n}\n\n/** @type {SchemeFn} */\nfunction urnSerialize (urnComponent, options) {\n if (urnComponent.nid === undefined) {\n throw new Error('URN without nid cannot be serialized')\n }\n const scheme = options.scheme || urnComponent.scheme || 'urn'\n const nid = urnComponent.nid.toLowerCase()\n const urnScheme = `${scheme}:${options.nid || nid}`\n const schemeHandler = getSchemeHandler(urnScheme)\n\n if (schemeHandler) {\n urnComponent = schemeHandler.serialize(urnComponent, options)\n }\n\n const uriComponent = urnComponent\n const nss = urnComponent.nss\n uriComponent.path = `${nid || options.nid}:${nss}`\n\n options.skipEscape = true\n return uriComponent\n}\n\n/** @type {SchemeFn} */\nfunction urnuuidParse (urnComponent, options) {\n const uuidComponent = urnComponent\n uuidComponent.uuid = uuidComponent.nss\n uuidComponent.nss = undefined\n\n if (!options.tolerant && (!uuidComponent.uuid || !isUUID(uuidComponent.uuid))) {\n uuidComponent.error = uuidComponent.error || 'UUID is not valid.'\n }\n\n return uuidComponent\n}\n\n/** @type {SchemeFn} */\nfunction urnuuidSerialize (uuidComponent) {\n const urnComponent = uuidComponent\n // normalize UUID\n urnComponent.nss = (uuidComponent.uuid || '').toLowerCase()\n return urnComponent\n}\n\nconst http = /** @type {SchemeHandler} */ ({\n scheme: 'http',\n domainHost: true,\n parse: httpParse,\n serialize: httpSerialize\n})\n\nconst https = /** @type {SchemeHandler} */ ({\n scheme: 'https',\n domainHost: http.domainHost,\n parse: httpParse,\n serialize: httpSerialize\n})\n\nconst ws = /** @type {SchemeHandler} */ ({\n scheme: 'ws',\n domainHost: true,\n parse: wsParse,\n serialize: wsSerialize\n})\n\nconst wss = /** @type {SchemeHandler} */ ({\n scheme: 'wss',\n domainHost: ws.domainHost,\n parse: ws.parse,\n serialize: ws.serialize\n})\n\nconst urn = /** @type {SchemeHandler} */ ({\n scheme: 'urn',\n parse: urnParse,\n serialize: urnSerialize,\n skipNormalize: true\n})\n\nconst urnuuid = /** @type {SchemeHandler} */ ({\n scheme: 'urn:uuid',\n parse: urnuuidParse,\n serialize: urnuuidSerialize,\n skipNormalize: true\n})\n\nconst SCHEMES = /** @type {Record<SchemeName, SchemeHandler>} */ ({\n http,\n https,\n ws,\n wss,\n urn,\n 'urn:uuid': urnuuid\n})\n\nObject.setPrototypeOf(SCHEMES, null)\n\n/**\n * @param {string|undefined} scheme\n * @returns {SchemeHandler|undefined}\n */\nfunction getSchemeHandler (scheme) {\n return (\n scheme && (\n SCHEMES[/** @type {SchemeName} */ (scheme)] ||\n SCHEMES[/** @type {SchemeName} */(scheme.toLowerCase())])\n ) ||\n undefined\n}\n\nmodule.exports = {\n wsIsSecure,\n SCHEMES,\n isValidSchemeName,\n getSchemeHandler,\n}\n","'use strict'\n\nconst { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require('./lib/utils')\nconst { SCHEMES, getSchemeHandler } = require('./lib/schemes')\n\n/**\n * @template {import('./types/index').URIComponent|string} T\n * @param {T} uri\n * @param {import('./types/index').Options} [options]\n * @returns {T}\n */\nfunction normalize (uri, options) {\n if (typeof uri === 'string') {\n uri = /** @type {T} */ (normalizeString(uri, options))\n } else if (typeof uri === 'object') {\n uri = /** @type {T} */ (parse(serialize(uri, options), options))\n }\n return uri\n}\n\n/**\n * @param {string} baseURI\n * @param {string} relativeURI\n * @param {import('./types/index').Options} [options]\n * @returns {string}\n */\nfunction resolve (baseURI, relativeURI, options) {\n const schemelessOptions = options ? Object.assign({ scheme: 'null' }, options) : { scheme: 'null' }\n const resolved = resolveComponent(parse(baseURI, schemelessOptions), parse(relativeURI, schemelessOptions), schemelessOptions, true)\n schemelessOptions.skipEscape = true\n return serialize(resolved, schemelessOptions)\n}\n\n/**\n * @param {import ('./types/index').URIComponent} base\n * @param {import ('./types/index').URIComponent} relative\n * @param {import('./types/index').Options} [options]\n * @param {boolean} [skipNormalization=false]\n * @returns {import ('./types/index').URIComponent}\n */\nfunction resolveComponent (base, relative, options, skipNormalization) {\n /** @type {import('./types/index').URIComponent} */\n const target = {}\n if (!skipNormalization) {\n base = parse(serialize(base, options), options) // normalize base component\n relative = parse(serialize(relative, options), options) // normalize relative component\n }\n options = options || {}\n\n if (!options.tolerant && relative.scheme) {\n target.scheme = relative.scheme\n // target.authority = relative.authority;\n target.userinfo = relative.userinfo\n target.host = relative.host\n target.port = relative.port\n target.path = removeDotSegments(relative.path || '')\n target.query = relative.query\n } else {\n if (relative.userinfo !== undefined || relative.host !== undefined || relative.port !== undefined) {\n // target.authority = relative.authority;\n target.userinfo = relative.userinfo\n target.host = relative.host\n target.port = relative.port\n target.path = removeDotSegments(relative.path || '')\n target.query = relative.query\n } else {\n if (!relative.path) {\n target.path = base.path\n if (relative.query !== undefined) {\n target.query = relative.query\n } else {\n target.query = base.query\n }\n } else {\n if (relative.path[0] === '/') {\n target.path = removeDotSegments(relative.path)\n } else {\n if ((base.userinfo !== undefined || base.host !== undefined || base.port !== undefined) && !base.path) {\n target.path = '/' + relative.path\n } else if (!base.path) {\n target.path = relative.path\n } else {\n target.path = base.path.slice(0, base.path.lastIndexOf('/') + 1) + relative.path\n }\n target.path = removeDotSegments(target.path)\n }\n target.query = relative.query\n }\n // target.authority = base.authority;\n target.userinfo = base.userinfo\n target.host = base.host\n target.port = base.port\n }\n target.scheme = base.scheme\n }\n\n target.fragment = relative.fragment\n\n return target\n}\n\n/**\n * @param {import ('./types/index').URIComponent|string} uriA\n * @param {import ('./types/index').URIComponent|string} uriB\n * @param {import ('./types/index').Options} options\n * @returns {boolean}\n */\nfunction equal (uriA, uriB, options) {\n const normalizedA = normalizeComparableURI(uriA, options)\n const normalizedB = normalizeComparableURI(uriB, options)\n\n return normalizedA !== undefined && normalizedB !== undefined && normalizedA.toLowerCase() === normalizedB.toLowerCase()\n}\n\n/**\n * @param {Readonly<import('./types/index').URIComponent>} cmpts\n * @param {import('./types/index').Options} [opts]\n * @returns {string}\n */\nfunction serialize (cmpts, opts) {\n const component = {\n host: cmpts.host,\n scheme: cmpts.scheme,\n userinfo: cmpts.userinfo,\n port: cmpts.port,\n path: cmpts.path,\n query: cmpts.query,\n nid: cmpts.nid,\n nss: cmpts.nss,\n uuid: cmpts.uuid,\n fragment: cmpts.fragment,\n reference: cmpts.reference,\n resourceName: cmpts.resourceName,\n secure: cmpts.secure,\n error: ''\n }\n const options = Object.assign({}, opts)\n const uriTokens = []\n\n // find scheme handler\n const schemeHandler = getSchemeHandler(options.scheme || component.scheme)\n\n // perform scheme specific serialization\n if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options)\n\n if (component.path !== undefined) {\n if (!options.skipEscape) {\n component.path = escapePreservingEscapes(component.path)\n\n if (component.scheme !== undefined) {\n component.path = component.path.split('%3A').join(':')\n }\n } else {\n component.path = normalizePercentEncoding(component.path)\n }\n }\n\n if (options.reference !== 'suffix' && component.scheme) {\n uriTokens.push(component.scheme, ':')\n }\n\n const authority = recomposeAuthority(component)\n if (authority !== undefined) {\n if (options.reference !== 'suffix') {\n uriTokens.push('//')\n }\n\n uriTokens.push(authority)\n\n if (component.path && component.path[0] !== '/') {\n uriTokens.push('/')\n }\n }\n if (component.path !== undefined) {\n let s = component.path\n\n if (!options.absolutePath && (!schemeHandler || !schemeHandler.absolutePath)) {\n s = removeDotSegments(s)\n }\n\n if (\n authority === undefined &&\n s[0] === '/' &&\n s[1] === '/'\n ) {\n // don't allow the path to start with \"//\"\n s = '/%2F' + s.slice(2)\n }\n\n uriTokens.push(s)\n }\n\n if (component.query !== undefined) {\n uriTokens.push('?', component.query)\n }\n\n if (component.fragment !== undefined) {\n uriTokens.push('#', component.fragment)\n }\n return uriTokens.join('')\n}\n\nconst URI_PARSE = /^(?:([^#/:?]+):)?(?:\\/\\/((?:([^#/?@]*)@)?(\\[[^#/?\\]]+\\]|[^#/:?]*)(?::(\\d*))?))?([^#?]*)(?:\\?([^#]*))?(?:#((?:.|[\\n\\r])*))?/u\n\n/**\n * @param {import('./types/index').URIComponent} parsed\n * @param {RegExpMatchArray} matches\n * @returns {string|undefined}\n */\nfunction getParseError (parsed, matches) {\n if (matches[2] !== undefined && parsed.path && parsed.path[0] !== '/') {\n return 'URI path must start with \"/\" when authority is present.'\n }\n\n if (typeof parsed.port === 'number' && (parsed.port < 0 || parsed.port > 65535)) {\n return 'URI port is malformed.'\n }\n\n return undefined\n}\n\n/**\n * @param {string} uri\n * @param {import('./types/index').Options} [opts]\n * @returns {{ parsed: import('./types/index').URIComponent, malformedAuthorityOrPort: boolean }}\n */\nfunction parseWithStatus (uri, opts) {\n const options = Object.assign({}, opts)\n /** @type {import('./types/index').URIComponent} */\n const parsed = {\n scheme: undefined,\n userinfo: undefined,\n host: '',\n port: undefined,\n path: '',\n query: undefined,\n fragment: undefined\n }\n\n let malformedAuthorityOrPort = false\n\n let isIP = false\n if (options.reference === 'suffix') {\n if (options.scheme) {\n uri = options.scheme + ':' + uri\n } else {\n uri = '//' + uri\n }\n }\n\n const matches = uri.match(URI_PARSE)\n\n if (matches) {\n // store each component\n parsed.scheme = matches[1]\n parsed.userinfo = matches[3]\n parsed.host = matches[4]\n parsed.port = parseInt(matches[5], 10)\n parsed.path = matches[6] || ''\n parsed.query = matches[7]\n parsed.fragment = matches[8]\n\n // fix port number\n if (isNaN(parsed.port)) {\n parsed.port = matches[5]\n }\n\n const parseError = getParseError(parsed, matches)\n if (parseError !== undefined) {\n parsed.error = parsed.error || parseError\n malformedAuthorityOrPort = true\n }\n\n if (parsed.host) {\n const ipv4result = isIPv4(parsed.host)\n if (ipv4result === false) {\n const ipv6result = normalizeIPv6(parsed.host)\n parsed.host = ipv6result.host.toLowerCase()\n isIP = ipv6result.isIPV6\n } else {\n isIP = true\n }\n }\n if (parsed.scheme === undefined && parsed.userinfo === undefined && parsed.host === undefined && parsed.port === undefined && parsed.query === undefined && !parsed.path) {\n parsed.reference = 'same-document'\n } else if (parsed.scheme === undefined) {\n parsed.reference = 'relative'\n } else if (parsed.fragment === undefined) {\n parsed.reference = 'absolute'\n } else {\n parsed.reference = 'uri'\n }\n\n // check for reference errors\n if (options.reference && options.reference !== 'suffix' && options.reference !== parsed.reference) {\n parsed.error = parsed.error || 'URI is not a ' + options.reference + ' reference.'\n }\n\n // find scheme handler\n const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme)\n\n // check if scheme can't handle IRIs\n if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {\n // if host component is a domain name\n if (parsed.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost)) && isIP === false && nonSimpleDomain(parsed.host)) {\n // convert Unicode IDN -> ASCII IDN\n try {\n parsed.host = URL.domainToASCII(parsed.host.toLowerCase())\n } catch (e) {\n parsed.error = parsed.error || \"Host's domain name can not be converted to ASCII: \" + e\n }\n }\n // convert IRI -> URI\n }\n\n if (!schemeHandler || (schemeHandler && !schemeHandler.skipNormalize)) {\n if (uri.indexOf('%') !== -1) {\n if (parsed.scheme !== undefined) {\n parsed.scheme = unescape(parsed.scheme)\n }\n if (parsed.host !== undefined) {\n parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP)\n }\n }\n if (parsed.path) {\n parsed.path = normalizePathEncoding(parsed.path)\n }\n if (parsed.fragment) {\n try {\n parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment))\n } catch {\n parsed.error = parsed.error || 'URI malformed'\n }\n }\n }\n\n // perform scheme specific parsing\n if (schemeHandler && schemeHandler.parse) {\n schemeHandler.parse(parsed, options)\n }\n } else {\n parsed.error = parsed.error || 'URI can not be parsed.'\n }\n return { parsed, malformedAuthorityOrPort }\n}\n\n/**\n * @param {string} uri\n * @param {import('./types/index').Options} [opts]\n * @returns\n */\nfunction parse (uri, opts) {\n return parseWithStatus(uri, opts).parsed\n}\n\n/**\n * @param {string} uri\n * @param {import('./types/index').Options} [opts]\n * @returns {string}\n */\nfunction normalizeString (uri, opts) {\n return normalizeStringWithStatus(uri, opts).normalized\n}\n\n/**\n * @param {string} uri\n * @param {import('./types/index').Options} [opts]\n * @returns {{ normalized: string, malformedAuthorityOrPort: boolean }}\n */\nfunction normalizeStringWithStatus (uri, opts) {\n const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts)\n return {\n normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),\n malformedAuthorityOrPort\n }\n}\n\n/**\n * @param {import ('./types/index').URIComponent|string} uri\n * @param {import('./types/index').Options} [opts]\n * @returns {string|undefined}\n */\nfunction normalizeComparableURI (uri, opts) {\n if (typeof uri === 'string') {\n const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts)\n return malformedAuthorityOrPort ? undefined : normalized\n }\n\n if (typeof uri === 'object') {\n return serialize(uri, opts)\n }\n}\n\nconst fastUri = {\n SCHEMES,\n normalize,\n resolve,\n resolveComponent,\n equal,\n serialize,\n parse\n}\n\nmodule.exports = fastUri\nmodule.exports.default = fastUri\nmodule.exports.fastUri = fastUri\n","import * as uri from \"fast-uri\"\n\ntype URI = typeof uri & {code: string}\n;(uri as URI).code = 'require(\"ajv/dist/runtime/uri\").default'\n\nexport default uri as URI\n","export {\n Format,\n FormatDefinition,\n AsyncFormatDefinition,\n KeywordDefinition,\n KeywordErrorDefinition,\n CodeKeywordDefinition,\n MacroKeywordDefinition,\n FuncKeywordDefinition,\n Vocabulary,\n Schema,\n SchemaObject,\n AnySchemaObject,\n AsyncSchema,\n AnySchema,\n ValidateFunction,\n AsyncValidateFunction,\n AnyValidateFunction,\n ErrorObject,\n ErrorNoParams,\n} from \"./types\"\n\nexport {SchemaCxt, SchemaObjCxt} from \"./compile\"\nexport interface Plugin<Opts> {\n (ajv: Ajv, options?: Opts): Ajv\n [prop: string]: any\n}\n\nexport {KeywordCxt} from \"./compile/validate\"\nexport {DefinedError} from \"./vocabularies/errors\"\nexport {JSONType} from \"./compile/rules\"\nexport {JSONSchemaType} from \"./types/json-schema\"\nexport {JTDSchemaType, SomeJTDSchemaType, JTDDataType} from \"./types/jtd-schema\"\nexport {_, str, stringify, nil, Name, Code, CodeGen, CodeGenOptions} from \"./compile/codegen\"\n\nimport type {\n Schema,\n AnySchema,\n AnySchemaObject,\n SchemaObject,\n AsyncSchema,\n Vocabulary,\n KeywordDefinition,\n AddedKeywordDefinition,\n AnyValidateFunction,\n ValidateFunction,\n AsyncValidateFunction,\n ErrorObject,\n Format,\n AddedFormat,\n RegExpEngine,\n UriResolver,\n} from \"./types\"\nimport type {JSONSchemaType} from \"./types/json-schema\"\nimport type {JTDSchemaType, SomeJTDSchemaType, JTDDataType} from \"./types/jtd-schema\"\nimport ValidationError from \"./runtime/validation_error\"\nimport MissingRefError from \"./compile/ref_error\"\nimport {getRules, ValidationRules, Rule, RuleGroup, JSONType} from \"./compile/rules\"\nimport {SchemaEnv, compileSchema, resolveSchema} from \"./compile\"\nimport {Code, ValueScope} from \"./compile/codegen\"\nimport {normalizeId, getSchemaRefs} from \"./compile/resolve\"\nimport {getJSONTypes} from \"./compile/validate/dataType\"\nimport {eachItem} from \"./compile/util\"\nimport * as $dataRefSchema from \"./refs/data.json\"\n\nimport DefaultUriResolver from \"./runtime/uri\"\n\nconst defaultRegExp: RegExpEngine = (str, flags) => new RegExp(str, flags)\ndefaultRegExp.code = \"new RegExp\"\n\nconst META_IGNORE_OPTIONS: (keyof Options)[] = [\"removeAdditional\", \"useDefaults\", \"coerceTypes\"]\nconst EXT_SCOPE_NAMES = new Set([\n \"validate\",\n \"serialize\",\n \"parse\",\n \"wrapper\",\n \"root\",\n \"schema\",\n \"keyword\",\n \"pattern\",\n \"formats\",\n \"validate$data\",\n \"func\",\n \"obj\",\n \"Error\",\n])\n\nexport type Options = CurrentOptions & DeprecatedOptions\n\nexport interface CurrentOptions {\n // strict mode options (NEW)\n strict?: boolean | \"log\"\n strictSchema?: boolean | \"log\"\n strictNumbers?: boolean | \"log\"\n strictTypes?: boolean | \"log\"\n strictTuples?: boolean | \"log\"\n strictRequired?: boolean | \"log\"\n allowMatchingProperties?: boolean // disables a strict mode restriction\n allowUnionTypes?: boolean\n validateFormats?: boolean\n // validation and reporting options:\n $data?: boolean\n allErrors?: boolean\n verbose?: boolean\n discriminator?: boolean\n unicodeRegExp?: boolean\n timestamp?: \"string\" | \"date\" // JTD only\n parseDate?: boolean // JTD only\n allowDate?: boolean // JTD only\n specialNumbers?: \"fast\" | \"null\" // JTD only\n $comment?:\n | true\n | ((comment: string, schemaPath?: string, rootSchema?: AnySchemaObject) => unknown)\n formats?: {[Name in string]?: Format}\n keywords?: Vocabulary\n schemas?: AnySchema[] | {[Key in string]?: AnySchema}\n logger?: Logger | false\n loadSchema?: (uri: string) => Promise<AnySchemaObject>\n // options to modify validated data:\n removeAdditional?: boolean | \"all\" | \"failing\"\n useDefaults?: boolean | \"empty\"\n coerceTypes?: boolean | \"array\"\n // advanced options:\n next?: boolean // NEW\n unevaluated?: boolean // NEW\n dynamicRef?: boolean // NEW\n schemaId?: \"id\" | \"$id\"\n jtd?: boolean // NEW\n meta?: SchemaObject | boolean\n defaultMeta?: string | AnySchemaObject\n validateSchema?: boolean | \"log\"\n addUsedSchema?: boolean\n inlineRefs?: boolean | number\n passContext?: boolean\n loopRequired?: number\n loopEnum?: number // NEW\n ownProperties?: boolean\n multipleOfPrecision?: number\n int32range?: boolean // JTD only\n messages?: boolean\n code?: CodeOptions // NEW\n uriResolver?: UriResolver\n}\n\nexport interface CodeOptions {\n es5?: boolean\n esm?: boolean\n lines?: boolean\n optimize?: boolean | number\n formats?: Code // code to require (or construct) map of available formats - for standalone code\n source?: boolean\n process?: (code: string, schema?: SchemaEnv) => string\n regExp?: RegExpEngine\n}\n\ninterface InstanceCodeOptions extends CodeOptions {\n regExp: RegExpEngine\n optimize: number\n}\n\ninterface DeprecatedOptions {\n /** @deprecated */\n ignoreKeywordsWithRef?: boolean\n /** @deprecated */\n jsPropertySyntax?: boolean // added instead of jsonPointers\n /** @deprecated */\n unicode?: boolean\n}\n\ninterface RemovedOptions {\n format?: boolean\n errorDataPath?: \"object\" | \"property\"\n nullable?: boolean // \"nullable\" keyword is supported by default\n jsonPointers?: boolean\n extendRefs?: true | \"ignore\" | \"fail\"\n missingRefs?: true | \"ignore\" | \"fail\"\n processCode?: (code: string, schema?: SchemaEnv) => string\n sourceCode?: boolean\n strictDefaults?: boolean\n strictKeywords?: boolean\n uniqueItems?: boolean\n unknownFormats?: true | string[] | \"ignore\"\n cache?: any\n serialize?: (schema: AnySchema) => unknown\n ajvErrors?: boolean\n}\n\ntype OptionsInfo<T extends RemovedOptions | DeprecatedOptions> = {\n [K in keyof T]-?: string | undefined\n}\n\nconst removedOptions: OptionsInfo<RemovedOptions> = {\n errorDataPath: \"\",\n format: \"`validateFormats: false` can be used instead.\",\n nullable: '\"nullable\" keyword is supported by default.',\n jsonPointers: \"Deprecated jsPropertySyntax can be used instead.\",\n extendRefs: \"Deprecated ignoreKeywordsWithRef can be used instead.\",\n missingRefs: \"Pass empty schema with $id that should be ignored to ajv.addSchema.\",\n processCode: \"Use option `code: {process: (code, schemaEnv: object) => string}`\",\n sourceCode: \"Use option `code: {source: true}`\",\n strictDefaults: \"It is default now, see option `strict`.\",\n strictKeywords: \"It is default now, see option `strict`.\",\n uniqueItems: '\"uniqueItems\" keyword is always validated.',\n unknownFormats: \"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).\",\n cache: \"Map is used as cache, schema object as key.\",\n serialize: \"Map is used as cache, schema object as key.\",\n ajvErrors: \"It is default now.\",\n}\n\nconst deprecatedOptions: OptionsInfo<DeprecatedOptions> = {\n ignoreKeywordsWithRef: \"\",\n jsPropertySyntax: \"\",\n unicode: '\"minLength\"/\"maxLength\" account for unicode characters by default.',\n}\n\ntype RequiredInstanceOptions = {\n [K in\n | \"strictSchema\"\n | \"strictNumbers\"\n | \"strictTypes\"\n | \"strictTuples\"\n | \"strictRequired\"\n | \"inlineRefs\"\n | \"loopRequired\"\n | \"loopEnum\"\n | \"meta\"\n | \"messages\"\n | \"schemaId\"\n | \"addUsedSchema\"\n | \"validateSchema\"\n | \"validateFormats\"\n | \"int32range\"\n | \"unicodeRegExp\"\n | \"uriResolver\"]: NonNullable<Options[K]>\n} & {code: InstanceCodeOptions}\n\nexport type InstanceOptions = Options & RequiredInstanceOptions\n\nconst MAX_EXPRESSION = 200\n\n// eslint-disable-next-line complexity\nfunction requiredOptions(o: Options): RequiredInstanceOptions {\n const s = o.strict\n const _optz = o.code?.optimize\n const optimize = _optz === true || _optz === undefined ? 1 : _optz || 0\n const regExp = o.code?.regExp ?? defaultRegExp\n const uriResolver = o.uriResolver ?? DefaultUriResolver\n return {\n strictSchema: o.strictSchema ?? s ?? true,\n strictNumbers: o.strictNumbers ?? s ?? true,\n strictTypes: o.strictTypes ?? s ?? \"log\",\n strictTuples: o.strictTuples ?? s ?? \"log\",\n strictRequired: o.strictRequired ?? s ?? false,\n code: o.code ? {...o.code, optimize, regExp} : {optimize, regExp},\n loopRequired: o.loopRequired ?? MAX_EXPRESSION,\n loopEnum: o.loopEnum ?? MAX_EXPRESSION,\n meta: o.meta ?? true,\n messages: o.messages ?? true,\n inlineRefs: o.inlineRefs ?? true,\n schemaId: o.schemaId ?? \"$id\",\n addUsedSchema: o.addUsedSchema ?? true,\n validateSchema: o.validateSchema ?? true,\n validateFormats: o.validateFormats ?? true,\n unicodeRegExp: o.unicodeRegExp ?? true,\n int32range: o.int32range ?? true,\n uriResolver: uriResolver,\n }\n}\n\nexport interface Logger {\n log(...args: unknown[]): unknown\n warn(...args: unknown[]): unknown\n error(...args: unknown[]): unknown\n}\n\nexport default class Ajv {\n opts: InstanceOptions\n errors?: ErrorObject[] | null // errors from the last validation\n logger: Logger\n // shared external scope values for compiled functions\n readonly scope: ValueScope\n readonly schemas: {[Key in string]?: SchemaEnv} = {}\n readonly refs: {[Ref in string]?: SchemaEnv | string} = {}\n readonly formats: {[Name in string]?: AddedFormat} = Object.create(null)\n readonly RULES: ValidationRules\n readonly _compilations: Set<SchemaEnv> = new Set()\n private readonly _loading: {[Ref in string]?: Promise<AnySchemaObject>} = {}\n private readonly _cache: Map<AnySchema, SchemaEnv> = new Map()\n private readonly _metaOpts: InstanceOptions\n\n static ValidationError = ValidationError\n static MissingRefError = MissingRefError\n\n constructor(opts: Options = {}) {\n opts = this.opts = {...opts, ...requiredOptions(opts)}\n const {es5, lines} = this.opts.code\n\n this.scope = new ValueScope({scope: {}, prefixes: EXT_SCOPE_NAMES, es5, lines})\n this.logger = getLogger(opts.logger)\n const formatOpt = opts.validateFormats\n opts.validateFormats = false\n\n this.RULES = getRules()\n checkOptions.call(this, removedOptions, opts, \"NOT SUPPORTED\")\n checkOptions.call(this, deprecatedOptions, opts, \"DEPRECATED\", \"warn\")\n this._metaOpts = getMetaSchemaOptions.call(this)\n\n if (opts.formats) addInitialFormats.call(this)\n this._addVocabularies()\n this._addDefaultMetaSchema()\n if (opts.keywords) addInitialKeywords.call(this, opts.keywords)\n if (typeof opts.meta == \"object\") this.addMetaSchema(opts.meta)\n addInitialSchemas.call(this)\n opts.validateFormats = formatOpt\n }\n\n _addVocabularies(): void {\n this.addKeyword(\"$async\")\n }\n\n _addDefaultMetaSchema(): void {\n const {$data, meta, schemaId} = this.opts\n let _dataRefSchema: SchemaObject = $dataRefSchema\n if (schemaId === \"id\") {\n _dataRefSchema = {...$dataRefSchema}\n _dataRefSchema.id = _dataRefSchema.$id\n delete _dataRefSchema.$id\n }\n if (meta && $data) this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false)\n }\n\n defaultMeta(): string | AnySchemaObject | undefined {\n const {meta, schemaId} = this.opts\n return (this.opts.defaultMeta = typeof meta == \"object\" ? meta[schemaId] || meta : undefined)\n }\n\n // Validate data using schema\n // AnySchema will be compiled and cached using schema itself as a key for Map\n validate(schema: Schema | string, data: unknown): boolean\n validate(schemaKeyRef: AnySchema | string, data: unknown): boolean | Promise<unknown>\n validate<T>(schema: Schema | JSONSchemaType<T> | string, data: unknown): data is T\n // Separated for type inference to work\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n validate<T>(schema: JTDSchemaType<T>, data: unknown): data is T\n // This overload is only intended for typescript inference, the first\n // argument prevents manual type annotation from matching this overload\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n validate<N extends never, T extends SomeJTDSchemaType>(\n schema: T,\n data: unknown\n ): data is JTDDataType<T>\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n validate<T>(schema: AsyncSchema, data: unknown | T): Promise<T>\n validate<T>(schemaKeyRef: AnySchema | string, data: unknown): data is T | Promise<T>\n validate<T>(\n schemaKeyRef: AnySchema | string, // key, ref or schema object\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\n data: unknown | T // to be validated\n ): boolean | Promise<T> {\n let v: AnyValidateFunction | undefined\n if (typeof schemaKeyRef == \"string\") {\n v = this.getSchema<T>(schemaKeyRef)\n if (!v) throw new Error(`no schema with key or ref \"${schemaKeyRef}\"`)\n } else {\n v = this.compile<T>(schemaKeyRef)\n }\n\n const valid = v(data)\n if (!(\"$async\" in v)) this.errors = v.errors\n return valid\n }\n\n // Create validation function for passed schema\n // _meta: true if schema is a meta-schema. Used internally to compile meta schemas of user-defined keywords.\n compile<T = unknown>(schema: Schema | JSONSchemaType<T>, _meta?: boolean): ValidateFunction<T>\n // Separated for type inference to work\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n compile<T = unknown>(schema: JTDSchemaType<T>, _meta?: boolean): ValidateFunction<T>\n // This overload is only intended for typescript inference, the first\n // argument prevents manual type annotation from matching this overload\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n compile<N extends never, T extends SomeJTDSchemaType>(\n schema: T,\n _meta?: boolean\n ): ValidateFunction<JTDDataType<T>>\n compile<T = unknown>(schema: AsyncSchema, _meta?: boolean): AsyncValidateFunction<T>\n compile<T = unknown>(schema: AnySchema, _meta?: boolean): AnyValidateFunction<T>\n compile<T = unknown>(schema: AnySchema, _meta?: boolean): AnyValidateFunction<T> {\n const sch = this._addSchema(schema, _meta)\n return (sch.validate || this._compileSchemaEnv(sch)) as AnyValidateFunction<T>\n }\n\n // Creates validating function for passed schema with asynchronous loading of missing schemas.\n // `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.\n // TODO allow passing schema URI\n // meta - optional true to compile meta-schema\n compileAsync<T = unknown>(\n schema: SchemaObject | JSONSchemaType<T>,\n _meta?: boolean\n ): Promise<ValidateFunction<T>>\n // Separated for type inference to work\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n compileAsync<T = unknown>(schema: JTDSchemaType<T>, _meta?: boolean): Promise<ValidateFunction<T>>\n compileAsync<T = unknown>(schema: AsyncSchema, meta?: boolean): Promise<AsyncValidateFunction<T>>\n // eslint-disable-next-line @typescript-eslint/unified-signatures\n compileAsync<T = unknown>(\n schema: AnySchemaObject,\n meta?: boolean\n ): Promise<AnyValidateFunction<T>>\n compileAsync<T = unknown>(\n schema: AnySchemaObject,\n meta?: boolean\n ): Promise<AnyValidateFunction<T>> {\n if (typeof this.opts.loadSchema != \"function\") {\n throw new Error(\"options.loadSchema should be a function\")\n }\n const {loadSchema} = this.opts\n return runCompileAsync.call(this, schema, meta)\n\n async function runCompileAsync(\n this: Ajv,\n _schema: AnySchemaObject,\n _meta?: boolean\n ): Promise<AnyValidateFunction> {\n await loadMetaSchema.call(this, _schema.$schema)\n const sch = this._addSchema(_schema, _meta)\n return sch.validate || _compileAsync.call(this, sch)\n }\n\n async function loadMetaSchema(this: Ajv, $ref?: string): Promise<void> {\n if ($ref && !this.getSchema($ref)) {\n await runCompileAsync.call(this, {$ref}, true)\n }\n }\n\n async function _compileAsync(this: Ajv, sch: SchemaEnv): Promise<AnyValidateFunction> {\n try {\n return this._compileSchemaEnv(sch)\n } catch (e) {\n if (!(e instanceof MissingRefError)) throw e\n checkLoaded.call(this, e)\n await loadMissingSchema.call(this, e.missingSchema)\n return _compileAsync.call(this, sch)\n }\n }\n\n function checkLoaded(this: Ajv, {missingSchema: ref, missingRef}: MissingRefError): void {\n if (this.refs[ref]) {\n throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`)\n }\n }\n\n async function loadMissingSchema(this: Ajv, ref: string): Promise<void> {\n const _schema = await _loadSchema.call(this, ref)\n if (!this.refs[ref]) await loadMetaSchema.call(this, _schema.$schema)\n if (!this.refs[ref]) this.addSchema(_schema, ref, meta)\n }\n\n async function _loadSchema(this: Ajv, ref: string): Promise<AnySchemaObject> {\n const p = this._loading[ref]\n if (p) return p\n try {\n return await (this._loading[ref] = loadSchema(ref))\n } finally {\n delete this._loading[ref]\n }\n }\n }\n\n // Adds schema to the instance\n addSchema(\n schema: AnySchema | AnySchema[], // If array is passed, `key` will be ignored\n key?: string, // Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.\n _meta?: boolean, // true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.\n _validateSchema = this.opts.validateSchema // false to skip schema validation. Used internally, option validateSchema should be used instead.\n ): Ajv {\n if (Array.isArray(schema)) {\n for (const sch of schema) this.addSchema(sch, undefined, _meta, _validateSchema)\n return this\n }\n let id: string | undefined\n if (typeof schema === \"object\") {\n const {schemaId} = this.opts\n id = schema[schemaId]\n if (id !== undefined && typeof id != \"string\") {\n throw new Error(`schema ${schemaId} must be string`)\n }\n }\n key = normalizeId(key || id)\n this._checkUnique(key)\n this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true)\n return this\n }\n\n // Add schema that will be used to validate other schemas\n // options in META_IGNORE_OPTIONS are alway set to false\n addMetaSchema(\n schema: AnySchemaObject,\n key?: string, // schema key\n _validateSchema = this.opts.validateSchema // false to skip schema validation, can be used to override validateSchema option for meta-schema\n ): Ajv {\n this.addSchema(schema, key, true, _validateSchema)\n return this\n }\n\n // Validate schema against its meta-schema\n validateSchema(schema: AnySchema, throwOrLogError?: boolean): boolean | Promise<unknown> {\n if (typeof schema == \"boolean\") return true\n let $schema: string | AnySchemaObject | undefined\n $schema = schema.$schema\n if ($schema !== undefined && typeof $schema != \"string\") {\n throw new Error(\"$schema must be a string\")\n }\n $schema = $schema || this.opts.defaultMeta || this.defaultMeta()\n if (!$schema) {\n this.logger.warn(\"meta-schema not available\")\n this.errors = null\n return true\n }\n const valid = this.validate($schema, schema)\n if (!valid && throwOrLogError) {\n const message = \"schema is invalid: \" + this.errorsText()\n if (this.opts.validateSchema === \"log\") this.logger.error(message)\n else throw new Error(message)\n }\n return valid\n }\n\n // Get compiled schema by `key` or `ref`.\n // (`key` that was passed to `addSchema` or full schema reference - `schema.$id` or resolved id)\n getSchema<T = unknown>(keyRef: string): AnyValidateFunction<T> | undefined {\n let sch\n while (typeof (sch = getSchEnv.call(this, keyRef)) == \"string\") keyRef = sch\n if (sch === undefined) {\n const {schemaId} = this.opts\n const root = new SchemaEnv({schema: {}, schemaId})\n sch = resolveSchema.call(this, root, keyRef)\n if (!sch) return\n this.refs[keyRef] = sch\n }\n return (sch.validate || this._compileSchemaEnv(sch)) as AnyValidateFunction<T> | undefined\n }\n\n // Remove cached schema(s).\n // If no parameter is passed all schemas but meta-schemas are removed.\n // If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.\n // Even if schema is referenced by other schemas it still can be removed as other schemas have local references.\n removeSchema(schemaKeyRef?: AnySchema | string | RegExp): Ajv {\n if (schemaKeyRef instanceof RegExp) {\n this._removeAllSchemas(this.schemas, schemaKeyRef)\n this._removeAllSchemas(this.refs, schemaKeyRef)\n return this\n }\n switch (typeof schemaKeyRef) {\n case \"undefined\":\n this._removeAllSchemas(this.schemas)\n this._removeAllSchemas(this.refs)\n this._cache.clear()\n return this\n case \"string\": {\n const sch = getSchEnv.call(this, schemaKeyRef)\n if (typeof sch == \"object\") this._cache.delete(sch.schema)\n delete this.schemas[schemaKeyRef]\n delete this.refs[schemaKeyRef]\n return this\n }\n case \"object\": {\n const cacheKey = schemaKeyRef\n this._cache.delete(cacheKey)\n let id = schemaKeyRef[this.opts.schemaId]\n if (id) {\n id = normalizeId(id)\n delete this.schemas[id]\n delete this.refs[id]\n }\n return this\n }\n default:\n throw new Error(\"ajv.removeSchema: invalid parameter\")\n }\n }\n\n // add \"vocabulary\" - a collection of keywords\n addVocabulary(definitions: Vocabulary): Ajv {\n for (const def of definitions) this.addKeyword(def)\n return this\n }\n\n addKeyword(\n kwdOrDef: string | KeywordDefinition,\n def?: KeywordDefinition // deprecated\n ): Ajv {\n let keyword: string | string[]\n if (typeof kwdOrDef == \"string\") {\n keyword = kwdOrDef\n if (typeof def == \"object\") {\n this.logger.warn(\"these parameters are deprecated, see docs for addKeyword\")\n def.keyword = keyword\n }\n } else if (typeof kwdOrDef == \"object\" && def === undefined) {\n def = kwdOrDef\n keyword = def.keyword\n if (Array.isArray(keyword) && !keyword.length) {\n throw new Error(\"addKeywords: keyword must be string or non-empty array\")\n }\n } else {\n throw new Error(\"invalid addKeywords parameters\")\n }\n\n checkKeyword.call(this, keyword, def)\n if (!def) {\n eachItem(keyword, (kwd) => addRule.call(this, kwd))\n return this\n }\n keywordMetaschema.call(this, def)\n const definition: AddedKeywordDefinition = {\n ...def,\n type: getJSONTypes(def.type),\n schemaType: getJSONTypes(def.schemaType),\n }\n eachItem(\n keyword,\n definition.type.length === 0\n ? (k) => addRule.call(this, k, definition)\n : (k) => definition.type.forEach((t) => addRule.call(this, k, definition, t))\n )\n return this\n }\n\n getKeyword(keyword: string): AddedKeywordDefinition | boolean {\n const rule = this.RULES.all[keyword]\n return typeof rule == \"object\" ? rule.definition : !!rule\n }\n\n // Remove keyword\n removeKeyword(keyword: string): Ajv {\n // TODO return type should be Ajv\n const {RULES} = this\n delete RULES.keywords[keyword]\n delete RULES.all[keyword]\n for (const group of RULES.rules) {\n const i = group.rules.findIndex((rule) => rule.keyword === keyword)\n if (i >= 0) group.rules.splice(i, 1)\n }\n return this\n }\n\n // Add format\n addFormat(name: string, format: Format): Ajv {\n if (typeof format == \"string\") format = new RegExp(format)\n this.formats[name] = format\n return this\n }\n\n errorsText(\n errors: ErrorObject[] | null | undefined = this.errors, // optional array of validation errors\n {separator = \", \", dataVar = \"data\"}: ErrorsTextOptions = {} // optional options with properties `separator` and `dataVar`\n ): string {\n if (!errors || errors.length === 0) return \"No errors\"\n return errors\n .map((e) => `${dataVar}${e.instancePath} ${e.message}`)\n .reduce((text, msg) => text + separator + msg)\n }\n\n $dataMetaSchema(metaSchema: AnySchemaObject, keywordsJsonPointers: string[]): AnySchemaObject {\n const rules = this.RULES.all\n metaSchema = JSON.parse(JSON.stringify(metaSchema))\n for (const jsonPointer of keywordsJsonPointers) {\n const segments = jsonPointer.split(\"/\").slice(1) // first segment is an empty string\n let keywords = metaSchema\n for (const seg of segments) keywords = keywords[seg] as AnySchemaObject\n\n for (const key in rules) {\n const rule = rules[key]\n if (typeof rule != \"object\") continue\n const {$data} = rule.definition\n const schema = keywords[key] as AnySchemaObject | undefined\n if ($data && schema) keywords[key] = schemaOrData(schema)\n }\n }\n\n return metaSchema\n }\n\n private _removeAllSchemas(schemas: {[Ref in string]?: SchemaEnv | string}, regex?: RegExp): void {\n for (const keyRef in schemas) {\n const sch = schemas[keyRef]\n if (!regex || regex.test(keyRef)) {\n if (typeof sch == \"string\") {\n delete schemas[keyRef]\n } else if (sch && !sch.meta) {\n this._cache.delete(sch.schema)\n delete schemas[keyRef]\n }\n }\n }\n }\n\n _addSchema(\n schema: AnySchema,\n meta?: boolean,\n baseId?: string,\n validateSchema = this.opts.validateSchema,\n addSchema = this.opts.addUsedSchema\n ): SchemaEnv {\n let id: string | undefined\n const {schemaId} = this.opts\n if (typeof schema == \"object\") {\n id = schema[schemaId]\n } else {\n if (this.opts.jtd) throw new Error(\"schema must be object\")\n else if (typeof schema != \"boolean\") throw new Error(\"schema must be object or boolean\")\n }\n let sch = this._cache.get(schema)\n if (sch !== undefined) return sch\n\n baseId = normalizeId(id || baseId)\n const localRefs = getSchemaRefs.call(this, schema, baseId)\n sch = new SchemaEnv({schema, schemaId, meta, baseId, localRefs})\n this._cache.set(sch.schema, sch)\n if (addSchema && !baseId.startsWith(\"#\")) {\n // TODO atm it is allowed to overwrite schemas without id (instead of not adding them)\n if (baseId) this._checkUnique(baseId)\n this.refs[baseId] = sch\n }\n if (validateSchema) this.validateSchema(schema, true)\n return sch\n }\n\n private _checkUnique(id: string): void {\n if (this.schemas[id] || this.refs[id]) {\n throw new Error(`schema with key or id \"${id}\" already exists`)\n }\n }\n\n private _compileSchemaEnv(sch: SchemaEnv): AnyValidateFunction {\n if (sch.meta) this._compileMetaSchema(sch)\n else compileSchema.call(this, sch)\n\n /* istanbul ignore if */\n if (!sch.validate) throw new Error(\"ajv implementation error\")\n return sch.validate\n }\n\n private _compileMetaSchema(sch: SchemaEnv): void {\n const currentOpts = this.opts\n this.opts = this._metaOpts\n try {\n compileSchema.call(this, sch)\n } finally {\n this.opts = currentOpts\n }\n }\n}\n\nexport interface ErrorsTextOptions {\n separator?: string\n dataVar?: string\n}\n\nfunction checkOptions(\n this: Ajv,\n checkOpts: OptionsInfo<RemovedOptions | DeprecatedOptions>,\n options: Options & RemovedOptions,\n msg: string,\n log: \"warn\" | \"error\" = \"error\"\n): void {\n for (const key in checkOpts) {\n const opt = key as keyof typeof checkOpts\n if (opt in options) this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`)\n }\n}\n\nfunction getSchEnv(this: Ajv, keyRef: string): SchemaEnv | string | undefined {\n keyRef = normalizeId(keyRef) // TODO tests fail without this line\n return this.schemas[keyRef] || this.refs[keyRef]\n}\n\nfunction addInitialSchemas(this: Ajv): void {\n const optsSchemas = this.opts.schemas\n if (!optsSchemas) return\n if (Array.isArray(optsSchemas)) this.addSchema(optsSchemas)\n else for (const key in optsSchemas) this.addSchema(optsSchemas[key] as AnySchema, key)\n}\n\nfunction addInitialFormats(this: Ajv): void {\n for (const name in this.opts.formats) {\n const format = this.opts.formats[name]\n if (format) this.addFormat(name, format)\n }\n}\n\nfunction addInitialKeywords(\n this: Ajv,\n defs: Vocabulary | {[K in string]?: KeywordDefinition}\n): void {\n if (Array.isArray(defs)) {\n this.addVocabulary(defs)\n return\n }\n this.logger.warn(\"keywords option as map is deprecated, pass array\")\n for (const keyword in defs) {\n const def = defs[keyword] as KeywordDefinition\n if (!def.keyword) def.keyword = keyword\n this.addKeyword(def)\n }\n}\n\nfunction getMetaSchemaOptions(this: Ajv): InstanceOptions {\n const metaOpts = {...this.opts}\n for (const opt of META_IGNORE_OPTIONS) delete metaOpts[opt]\n return metaOpts\n}\n\nconst noLogs = {log() {}, warn() {}, error() {}}\n\nfunction getLogger(logger?: Partial<Logger> | false): Logger {\n if (logger === false) return noLogs\n if (logger === undefined) return console\n if (logger.log && logger.warn && logger.error) return logger as Logger\n throw new Error(\"logger must implement log, warn and error methods\")\n}\n\nconst KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i\n\nfunction checkKeyword(this: Ajv, keyword: string | string[], def?: KeywordDefinition): void {\n const {RULES} = this\n eachItem(keyword, (kwd) => {\n if (RULES.keywords[kwd]) throw new Error(`Keyword ${kwd} is already defined`)\n if (!KEYWORD_NAME.test(kwd)) throw new Error(`Keyword ${kwd} has invalid name`)\n })\n if (!def) return\n if (def.$data && !(\"code\" in def || \"validate\" in def)) {\n throw new Error('$data keyword must have \"code\" or \"validate\" function')\n }\n}\n\nfunction addRule(\n this: Ajv,\n keyword: string,\n definition?: AddedKeywordDefinition,\n dataType?: JSONType\n): void {\n const post = definition?.post\n if (dataType && post) throw new Error('keyword with \"post\" flag cannot have \"type\"')\n const {RULES} = this\n let ruleGroup = post ? RULES.post : RULES.rules.find(({type: t}) => t === dataType)\n if (!ruleGroup) {\n ruleGroup = {type: dataType, rules: []}\n RULES.rules.push(ruleGroup)\n }\n RULES.keywords[keyword] = true\n if (!definition) return\n\n const rule: Rule = {\n keyword,\n definition: {\n ...definition,\n type: getJSONTypes(definition.type),\n schemaType: getJSONTypes(definition.schemaType),\n },\n }\n if (definition.before) addBeforeRule.call(this, ruleGroup, rule, definition.before)\n else ruleGroup.rules.push(rule)\n RULES.all[keyword] = rule\n definition.implements?.forEach((kwd) => this.addKeyword(kwd))\n}\n\nfunction addBeforeRule(this: Ajv, ruleGroup: RuleGroup, rule: Rule, before: string): void {\n const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before)\n if (i >= 0) {\n ruleGroup.rules.splice(i, 0, rule)\n } else {\n ruleGroup.rules.push(rule)\n this.logger.warn(`rule ${before} is not defined`)\n }\n}\n\nfunction keywordMetaschema(this: Ajv, def: KeywordDefinition): void {\n let {metaSchema} = def\n if (metaSchema === undefined) return\n if (def.$data && this.opts.$data) metaSchema = schemaOrData(metaSchema)\n def.validateSchema = this.compile(metaSchema, true)\n}\n\nconst $dataRef = {\n $ref: \"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#\",\n}\n\nfunction schemaOrData(schema: AnySchema): AnySchemaObject {\n return {anyOf: [schema, $dataRef]}\n}\n","import type {CodeKeywordDefinition} from \"../../types\"\n\nconst def: CodeKeywordDefinition = {\n keyword: \"id\",\n code() {\n throw new Error('NOT SUPPORTED: keyword \"id\", use \"$id\" for schema ID')\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, AnySchema} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport MissingRefError from \"../../compile/ref_error\"\nimport {callValidateCode} from \"../code\"\nimport {_, nil, stringify, Code, Name} from \"../../compile/codegen\"\nimport N from \"../../compile/names\"\nimport {SchemaEnv, resolveRef} from \"../../compile\"\nimport {mergeEvaluated} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n keyword: \"$ref\",\n schemaType: \"string\",\n code(cxt: KeywordCxt): void {\n const {gen, schema: $ref, it} = cxt\n const {baseId, schemaEnv: env, validateName, opts, self} = it\n const {root} = env\n if (($ref === \"#\" || $ref === \"#/\") && baseId === root.baseId) return callRootRef()\n const schOrEnv = resolveRef.call(self, root, baseId, $ref)\n if (schOrEnv === undefined) throw new MissingRefError(it.opts.uriResolver, baseId, $ref)\n if (schOrEnv instanceof SchemaEnv) return callValidate(schOrEnv)\n return inlineRefSchema(schOrEnv)\n\n function callRootRef(): void {\n if (env === root) return callRef(cxt, validateName, env, env.$async)\n const rootName = gen.scopeValue(\"root\", {ref: root})\n return callRef(cxt, _`${rootName}.validate`, root, root.$async)\n }\n\n function callValidate(sch: SchemaEnv): void {\n const v = getValidate(cxt, sch)\n callRef(cxt, v, sch, sch.$async)\n }\n\n function inlineRefSchema(sch: AnySchema): void {\n const schName = gen.scopeValue(\n \"schema\",\n opts.code.source === true ? {ref: sch, code: stringify(sch)} : {ref: sch}\n )\n const valid = gen.name(\"valid\")\n const schCxt = cxt.subschema(\n {\n schema: sch,\n dataTypes: [],\n schemaPath: nil,\n topSchemaRef: schName,\n errSchemaPath: $ref,\n },\n valid\n )\n cxt.mergeEvaluated(schCxt)\n cxt.ok(valid)\n }\n },\n}\n\nexport function getValidate(cxt: KeywordCxt, sch: SchemaEnv): Code {\n const {gen} = cxt\n return sch.validate\n ? gen.scopeValue(\"validate\", {ref: sch.validate})\n : _`${gen.scopeValue(\"wrapper\", {ref: sch})}.validate`\n}\n\nexport function callRef(cxt: KeywordCxt, v: Code, sch?: SchemaEnv, $async?: boolean): void {\n const {gen, it} = cxt\n const {allErrors, schemaEnv: env, opts} = it\n const passCxt = opts.passContext ? N.this : nil\n if ($async) callAsyncRef()\n else callSyncRef()\n\n function callAsyncRef(): void {\n if (!env.$async) throw new Error(\"async schema referenced by sync schema\")\n const valid = gen.let(\"valid\")\n gen.try(\n () => {\n gen.code(_`await ${callValidateCode(cxt, v, passCxt)}`)\n addEvaluatedFrom(v) // TODO will not work with async, it has to be returned with the result\n if (!allErrors) gen.assign(valid, true)\n },\n (e) => {\n gen.if(_`!(${e} instanceof ${it.ValidationError as Name})`, () => gen.throw(e))\n addErrorsFrom(e)\n if (!allErrors) gen.assign(valid, false)\n }\n )\n cxt.ok(valid)\n }\n\n function callSyncRef(): void {\n cxt.result(\n callValidateCode(cxt, v, passCxt),\n () => addEvaluatedFrom(v),\n () => addErrorsFrom(v)\n )\n }\n\n function addErrorsFrom(source: Code): void {\n const errs = _`${source}.errors`\n gen.assign(N.vErrors, _`${N.vErrors} === null ? ${errs} : ${N.vErrors}.concat(${errs})`) // TODO tagged\n gen.assign(N.errors, _`${N.vErrors}.length`)\n }\n\n function addEvaluatedFrom(source: Code): void {\n if (!it.opts.unevaluated) return\n const schEvaluated = sch?.validate?.evaluated\n // TODO refactor\n if (it.props !== true) {\n if (schEvaluated && !schEvaluated.dynamicProps) {\n if (schEvaluated.props !== undefined) {\n it.props = mergeEvaluated.props(gen, schEvaluated.props, it.props)\n }\n } else {\n const props = gen.var(\"props\", _`${source}.evaluated.props`)\n it.props = mergeEvaluated.props(gen, props, it.props, Name)\n }\n }\n if (it.items !== true) {\n if (schEvaluated && !schEvaluated.dynamicItems) {\n if (schEvaluated.items !== undefined) {\n it.items = mergeEvaluated.items(gen, schEvaluated.items, it.items)\n }\n } else {\n const items = gen.var(\"items\", _`${source}.evaluated.items`)\n it.items = mergeEvaluated.items(gen, items, it.items, Name)\n }\n }\n }\n}\n\nexport default def\n","import type {Vocabulary} from \"../../types\"\nimport idKeyword from \"./id\"\nimport refKeyword from \"./ref\"\n\nconst core: Vocabulary = [\n \"$schema\",\n \"$id\",\n \"$defs\",\n \"$vocabulary\",\n {keyword: \"$comment\"},\n \"definitions\",\n idKeyword,\n refKeyword,\n]\n\nexport default core\n","import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators, Code} from \"../../compile/codegen\"\n\nconst ops = operators\n\ntype Kwd = \"maximum\" | \"minimum\" | \"exclusiveMaximum\" | \"exclusiveMinimum\"\n\ntype Comparison = \"<=\" | \">=\" | \"<\" | \">\"\n\nconst KWDs: {[K in Kwd]: {okStr: Comparison; ok: Code; fail: Code}} = {\n maximum: {okStr: \"<=\", ok: ops.LTE, fail: ops.GT},\n minimum: {okStr: \">=\", ok: ops.GTE, fail: ops.LT},\n exclusiveMaximum: {okStr: \"<\", ok: ops.LT, fail: ops.GTE},\n exclusiveMinimum: {okStr: \">\", ok: ops.GT, fail: ops.LTE},\n}\n\nexport type LimitNumberError = ErrorObject<\n Kwd,\n {limit: number; comparison: Comparison},\n number | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n message: ({keyword, schemaCode}) => str`must be ${KWDs[keyword as Kwd].okStr} ${schemaCode}`,\n params: ({keyword, schemaCode}) =>\n _`{comparison: ${KWDs[keyword as Kwd].okStr}, limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: Object.keys(KWDs),\n type: \"number\",\n schemaType: \"number\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {keyword, data, schemaCode} = cxt\n cxt.fail$data(_`${data} ${KWDs[keyword as Kwd].fail} ${schemaCode} || isNaN(${data})`)\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str} from \"../../compile/codegen\"\n\nexport type MultipleOfError = ErrorObject<\n \"multipleOf\",\n {multipleOf: number},\n number | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n message: ({schemaCode}) => str`must be multiple of ${schemaCode}`,\n params: ({schemaCode}) => _`{multipleOf: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"multipleOf\",\n type: \"number\",\n schemaType: \"number\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, data, schemaCode, it} = cxt\n // const bdt = bad$DataType(schemaCode, <string>def.schemaType, $data)\n const prec = it.opts.multipleOfPrecision\n const res = gen.let(\"res\")\n const invalid = prec\n ? _`Math.abs(Math.round(${res}) - ${res}) > 1e-${prec}`\n : _`${res} !== parseInt(${res})`\n cxt.fail$data(_`(${schemaCode} === 0 || (${res} = ${data}/${schemaCode}, ${invalid}))`)\n },\n}\n\nexport default def\n","// https://mathiasbynens.be/notes/javascript-encoding\n// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\nexport default function ucs2length(str: string): number {\n const len = str.length\n let length = 0\n let pos = 0\n let value: number\n while (pos < len) {\n length++\n value = str.charCodeAt(pos++)\n if (value >= 0xd800 && value <= 0xdbff && pos < len) {\n // high surrogate, and there is a next character\n value = str.charCodeAt(pos)\n if ((value & 0xfc00) === 0xdc00) pos++ // low surrogate\n }\n }\n return length\n}\n\nucs2length.code = 'require(\"ajv/dist/runtime/ucs2length\").default'\n","import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport ucs2length from \"../../runtime/ucs2length\"\n\nconst error: KeywordErrorDefinition = {\n message({keyword, schemaCode}) {\n const comp = keyword === \"maxLength\" ? \"more\" : \"fewer\"\n return str`must NOT have ${comp} than ${schemaCode} characters`\n },\n params: ({schemaCode}) => _`{limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: [\"maxLength\", \"minLength\"],\n type: \"string\",\n schemaType: \"number\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {keyword, data, schemaCode, it} = cxt\n const op = keyword === \"maxLength\" ? operators.GT : operators.LT\n const len =\n it.opts.unicode === false ? _`${data}.length` : _`${useFunc(cxt.gen, ucs2length)}(${data})`\n cxt.fail$data(_`${len} ${op} ${schemaCode}`)\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {usePattern} from \"../code\"\nimport {useFunc} from \"../../compile/util\"\nimport {_, str} from \"../../compile/codegen\"\n\nexport type PatternError = ErrorObject<\"pattern\", {pattern: string}, string | {$data: string}>\n\nconst error: KeywordErrorDefinition = {\n message: ({schemaCode}) => str`must match pattern \"${schemaCode}\"`,\n params: ({schemaCode}) => _`{pattern: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"pattern\",\n type: \"string\",\n schemaType: \"string\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, data, $data, schema, schemaCode, it} = cxt\n const u = it.opts.unicodeRegExp ? \"u\" : \"\"\n if ($data) {\n const {regExp} = it.opts.code\n const regExpCode = regExp.code === \"new RegExp\" ? _`new RegExp` : useFunc(gen, regExp)\n const valid = gen.let(\"valid\")\n gen.try(\n () => gen.assign(valid, _`${regExpCode}(${schemaCode}, ${u}).test(${data})`),\n () => gen.assign(valid, false)\n )\n cxt.fail$data(_`!${valid}`)\n } else {\n const regExp = usePattern(cxt, schema)\n cxt.fail$data(_`!${regExp}.test(${data})`)\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators} from \"../../compile/codegen\"\n\nconst error: KeywordErrorDefinition = {\n message({keyword, schemaCode}) {\n const comp = keyword === \"maxProperties\" ? \"more\" : \"fewer\"\n return str`must NOT have ${comp} than ${schemaCode} properties`\n },\n params: ({schemaCode}) => _`{limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: [\"maxProperties\", \"minProperties\"],\n type: \"object\",\n schemaType: \"number\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {keyword, data, schemaCode} = cxt\n const op = keyword === \"maxProperties\" ? operators.GT : operators.LT\n cxt.fail$data(_`Object.keys(${data}).length ${op} ${schemaCode}`)\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {\n checkReportMissingProp,\n checkMissingProp,\n reportMissingProp,\n propertyInData,\n noPropertyInData,\n} from \"../code\"\nimport {_, str, nil, not, Name, Code} from \"../../compile/codegen\"\nimport {checkStrictMode} from \"../../compile/util\"\n\nexport type RequiredError = ErrorObject<\n \"required\",\n {missingProperty: string},\n string[] | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n message: ({params: {missingProperty}}) => str`must have required property '${missingProperty}'`,\n params: ({params: {missingProperty}}) => _`{missingProperty: ${missingProperty}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"required\",\n type: \"object\",\n schemaType: \"array\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, schema, schemaCode, data, $data, it} = cxt\n const {opts} = it\n if (!$data && schema.length === 0) return\n const useLoop = schema.length >= opts.loopRequired\n if (it.allErrors) allErrorsMode()\n else exitOnErrorMode()\n\n if (opts.strictRequired) {\n const props = cxt.parentSchema.properties\n const {definedProperties} = cxt.it\n for (const requiredKey of schema) {\n if (props?.[requiredKey] === undefined && !definedProperties.has(requiredKey)) {\n const schemaPath = it.schemaEnv.baseId + it.errSchemaPath\n const msg = `required property \"${requiredKey}\" is not defined at \"${schemaPath}\" (strictRequired)`\n checkStrictMode(it, msg, it.opts.strictRequired)\n }\n }\n }\n\n function allErrorsMode(): void {\n if (useLoop || $data) {\n cxt.block$data(nil, loopAllRequired)\n } else {\n for (const prop of schema) {\n checkReportMissingProp(cxt, prop)\n }\n }\n }\n\n function exitOnErrorMode(): void {\n const missing = gen.let(\"missing\")\n if (useLoop || $data) {\n const valid = gen.let(\"valid\", true)\n cxt.block$data(valid, () => loopUntilMissing(missing, valid))\n cxt.ok(valid)\n } else {\n gen.if(checkMissingProp(cxt, schema, missing))\n reportMissingProp(cxt, missing)\n gen.else()\n }\n }\n\n function loopAllRequired(): void {\n gen.forOf(\"prop\", schemaCode as Code, (prop) => {\n cxt.setParams({missingProperty: prop})\n gen.if(noPropertyInData(gen, data, prop, opts.ownProperties), () => cxt.error())\n })\n }\n\n function loopUntilMissing(missing: Name, valid: Name): void {\n cxt.setParams({missingProperty: missing})\n gen.forOf(\n missing,\n schemaCode as Code,\n () => {\n gen.assign(valid, propertyInData(gen, data, missing, opts.ownProperties))\n gen.if(not(valid), () => {\n cxt.error()\n gen.break()\n })\n },\n nil\n )\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, operators} from \"../../compile/codegen\"\n\nconst error: KeywordErrorDefinition = {\n message({keyword, schemaCode}) {\n const comp = keyword === \"maxItems\" ? \"more\" : \"fewer\"\n return str`must NOT have ${comp} than ${schemaCode} items`\n },\n params: ({schemaCode}) => _`{limit: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: [\"maxItems\", \"minItems\"],\n type: \"array\",\n schemaType: \"number\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {keyword, data, schemaCode} = cxt\n const op = keyword === \"maxItems\" ? operators.GT : operators.LT\n cxt.fail$data(_`${data}.length ${op} ${schemaCode}`)\n },\n}\n\nexport default def\n","// https://github.com/ajv-validator/ajv/issues/889\nimport * as equal from \"fast-deep-equal\"\n\ntype Equal = typeof equal & {code: string}\n;(equal as Equal).code = 'require(\"ajv/dist/runtime/equal\").default'\n\nexport default equal as Equal\n","import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {checkDataTypes, getSchemaTypes, DataType} from \"../../compile/validate/dataType\"\nimport {_, str, Name} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport equal from \"../../runtime/equal\"\n\nexport type UniqueItemsError = ErrorObject<\n \"uniqueItems\",\n {i: number; j: number},\n boolean | {$data: string}\n>\n\nconst error: KeywordErrorDefinition = {\n message: ({params: {i, j}}) =>\n str`must NOT have duplicate items (items ## ${j} and ${i} are identical)`,\n params: ({params: {i, j}}) => _`{i: ${i}, j: ${j}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"uniqueItems\",\n type: \"array\",\n schemaType: \"boolean\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, data, $data, schema, parentSchema, schemaCode, it} = cxt\n if (!$data && !schema) return\n const valid = gen.let(\"valid\")\n const itemTypes = parentSchema.items ? getSchemaTypes(parentSchema.items) : []\n cxt.block$data(valid, validateUniqueItems, _`${schemaCode} === false`)\n cxt.ok(valid)\n\n function validateUniqueItems(): void {\n const i = gen.let(\"i\", _`${data}.length`)\n const j = gen.let(\"j\")\n cxt.setParams({i, j})\n gen.assign(valid, true)\n gen.if(_`${i} > 1`, () => (canOptimize() ? loopN : loopN2)(i, j))\n }\n\n function canOptimize(): boolean {\n return itemTypes.length > 0 && !itemTypes.some((t) => t === \"object\" || t === \"array\")\n }\n\n function loopN(i: Name, j: Name): void {\n const item = gen.name(\"item\")\n const wrongType = checkDataTypes(itemTypes, item, it.opts.strictNumbers, DataType.Wrong)\n const indices = gen.const(\"indices\", _`{}`)\n gen.for(_`;${i}--;`, () => {\n gen.let(item, _`${data}[${i}]`)\n gen.if(wrongType, _`continue`)\n if (itemTypes.length > 1) gen.if(_`typeof ${item} == \"string\"`, _`${item} += \"_\"`)\n gen\n .if(_`typeof ${indices}[${item}] == \"number\"`, () => {\n gen.assign(j, _`${indices}[${item}]`)\n cxt.error()\n gen.assign(valid, false).break()\n })\n .code(_`${indices}[${item}] = ${i}`)\n })\n }\n\n function loopN2(i: Name, j: Name): void {\n const eql = useFunc(gen, equal)\n const outer = gen.name(\"outer\")\n gen.label(outer).for(_`;${i}--;`, () =>\n gen.for(_`${j} = ${i}; ${j}--;`, () =>\n gen.if(_`${eql}(${data}[${i}], ${data}[${j}])`, () => {\n cxt.error()\n gen.assign(valid, false).break(outer)\n })\n )\n )\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport equal from \"../../runtime/equal\"\n\nexport type ConstError = ErrorObject<\"const\", {allowedValue: any}>\n\nconst error: KeywordErrorDefinition = {\n message: \"must be equal to constant\",\n params: ({schemaCode}) => _`{allowedValue: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"const\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, data, $data, schemaCode, schema} = cxt\n if ($data || (schema && typeof schema == \"object\")) {\n cxt.fail$data(_`!${useFunc(gen, equal)}(${data}, ${schemaCode})`)\n } else {\n cxt.fail(_`${schema} !== ${data}`)\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, ErrorObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, or, Name, Code} from \"../../compile/codegen\"\nimport {useFunc} from \"../../compile/util\"\nimport equal from \"../../runtime/equal\"\n\nexport type EnumError = ErrorObject<\"enum\", {allowedValues: any[]}, any[] | {$data: string}>\n\nconst error: KeywordErrorDefinition = {\n message: \"must be equal to one of the allowed values\",\n params: ({schemaCode}) => _`{allowedValues: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"enum\",\n schemaType: \"array\",\n $data: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, data, $data, schema, schemaCode, it} = cxt\n if (!$data && schema.length === 0) throw new Error(\"enum must have non-empty array\")\n const useLoop = schema.length >= it.opts.loopEnum\n let eql: Name | undefined\n const getEql = (): Name => (eql ??= useFunc(gen, equal))\n\n let valid: Code\n if (useLoop || $data) {\n valid = gen.let(\"valid\")\n cxt.block$data(valid, loopEnum)\n } else {\n /* istanbul ignore if */\n if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n const vSchema = gen.const(\"vSchema\", schemaCode)\n valid = or(...schema.map((_x: unknown, i: number) => equalCode(vSchema, i)))\n }\n cxt.pass(valid)\n\n function loopEnum(): void {\n gen.assign(valid, false)\n gen.forOf(\"v\", schemaCode as Code, (v) =>\n gen.if(_`${getEql()}(${data}, ${v})`, () => gen.assign(valid, true).break())\n )\n }\n\n function equalCode(vSchema: Name, i: number): Code {\n const sch = schema[i]\n return typeof sch === \"object\" && sch !== null\n ? _`${getEql()}(${data}, ${vSchema}[${i}])`\n : _`${data} === ${sch}`\n }\n },\n}\n\nexport default def\n","import type {ErrorObject, Vocabulary} from \"../../types\"\nimport limitNumber, {LimitNumberError} from \"./limitNumber\"\nimport multipleOf, {MultipleOfError} from \"./multipleOf\"\nimport limitLength from \"./limitLength\"\nimport pattern, {PatternError} from \"./pattern\"\nimport limitProperties from \"./limitProperties\"\nimport required, {RequiredError} from \"./required\"\nimport limitItems from \"./limitItems\"\nimport uniqueItems, {UniqueItemsError} from \"./uniqueItems\"\nimport constKeyword, {ConstError} from \"./const\"\nimport enumKeyword, {EnumError} from \"./enum\"\n\nconst validation: Vocabulary = [\n // number\n limitNumber,\n multipleOf,\n // string\n limitLength,\n pattern,\n // object\n limitProperties,\n required,\n // array\n limitItems,\n uniqueItems,\n // any\n {keyword: \"type\", schemaType: [\"string\", \"array\"]},\n {keyword: \"nullable\", schemaType: \"boolean\"},\n constKeyword,\n enumKeyword,\n]\n\nexport default validation\n\ntype LimitError = ErrorObject<\n \"maxItems\" | \"minItems\" | \"minProperties\" | \"maxProperties\" | \"minLength\" | \"maxLength\",\n {limit: number},\n number | {$data: string}\n>\n\nexport type ValidationKeywordError =\n | LimitError\n | LimitNumberError\n | MultipleOfError\n | PatternError\n | RequiredError\n | UniqueItemsError\n | ConstError\n | EnumError\n","import type {\n CodeKeywordDefinition,\n ErrorObject,\n KeywordErrorDefinition,\n AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, not, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode, Type} from \"../../compile/util\"\n\nexport type AdditionalItemsError = ErrorObject<\"additionalItems\", {limit: number}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n message: ({params: {len}}) => str`must NOT have more than ${len} items`,\n params: ({params: {len}}) => _`{limit: ${len}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"additionalItems\" as const,\n type: \"array\",\n schemaType: [\"boolean\", \"object\"],\n before: \"uniqueItems\",\n error,\n code(cxt: KeywordCxt) {\n const {parentSchema, it} = cxt\n const {items} = parentSchema\n if (!Array.isArray(items)) {\n checkStrictMode(it, '\"additionalItems\" is ignored when \"items\" is not an array of schemas')\n return\n }\n validateAdditionalItems(cxt, items)\n },\n}\n\nexport function validateAdditionalItems(cxt: KeywordCxt, items: AnySchema[]): void {\n const {gen, schema, data, keyword, it} = cxt\n it.items = true\n const len = gen.const(\"len\", _`${data}.length`)\n if (schema === false) {\n cxt.setParams({len: items.length})\n cxt.pass(_`${len} <= ${items.length}`)\n } else if (typeof schema == \"object\" && !alwaysValidSchema(it, schema)) {\n const valid = gen.var(\"valid\", _`${len} <= ${items.length}`) // TODO var\n gen.if(not(valid), () => validateItems(valid))\n cxt.ok(valid)\n }\n\n function validateItems(valid: Name): void {\n gen.forRange(\"i\", items.length, len, (i) => {\n cxt.subschema({keyword, dataProp: i, dataPropType: Type.Num}, valid)\n if (!it.allErrors) gen.if(not(valid), () => gen.break())\n })\n }\n}\n\nexport default def\n","import type {CodeKeywordDefinition, AnySchema, AnySchemaObject} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_} from \"../../compile/codegen\"\nimport {alwaysValidSchema, mergeEvaluated, checkStrictMode} from \"../../compile/util\"\nimport {validateArray} from \"../code\"\n\nconst def: CodeKeywordDefinition = {\n keyword: \"items\",\n type: \"array\",\n schemaType: [\"object\", \"array\", \"boolean\"],\n before: \"uniqueItems\",\n code(cxt: KeywordCxt) {\n const {schema, it} = cxt\n if (Array.isArray(schema)) return validateTuple(cxt, \"additionalItems\", schema)\n it.items = true\n if (alwaysValidSchema(it, schema)) return\n cxt.ok(validateArray(cxt))\n },\n}\n\nexport function validateTuple(\n cxt: KeywordCxt,\n extraItems: string,\n schArr: AnySchema[] = cxt.schema\n): void {\n const {gen, parentSchema, data, keyword, it} = cxt\n checkStrictTuple(parentSchema)\n if (it.opts.unevaluated && schArr.length && it.items !== true) {\n it.items = mergeEvaluated.items(gen, schArr.length, it.items)\n }\n const valid = gen.name(\"valid\")\n const len = gen.const(\"len\", _`${data}.length`)\n schArr.forEach((sch: AnySchema, i: number) => {\n if (alwaysValidSchema(it, sch)) return\n gen.if(_`${len} > ${i}`, () =>\n cxt.subschema(\n {\n keyword,\n schemaProp: i,\n dataProp: i,\n },\n valid\n )\n )\n cxt.ok(valid)\n })\n\n function checkStrictTuple(sch: AnySchemaObject): void {\n const {opts, errSchemaPath} = it\n const l = schArr.length\n const fullTuple = l === sch.minItems && (l === sch.maxItems || sch[extraItems] === false)\n if (opts.strictTuples && !fullTuple) {\n const msg = `\"${keyword}\" is ${l}-tuple, but minItems or maxItems/${extraItems} are not specified or different at path \"${errSchemaPath}\"`\n checkStrictMode(it, msg, opts.strictTuples)\n }\n }\n}\n\nexport default def\n","import type {CodeKeywordDefinition} from \"../../types\"\nimport {validateTuple} from \"./items\"\n\nconst def: CodeKeywordDefinition = {\n keyword: \"prefixItems\",\n type: \"array\",\n schemaType: [\"array\"],\n before: \"uniqueItems\",\n code: (cxt) => validateTuple(cxt, \"items\"),\n}\n\nexport default def\n","import type {\n CodeKeywordDefinition,\n KeywordErrorDefinition,\n ErrorObject,\n AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\nimport {validateArray} from \"../code\"\nimport {validateAdditionalItems} from \"./additionalItems\"\n\nexport type ItemsError = ErrorObject<\"items\", {limit: number}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n message: ({params: {len}}) => str`must NOT have more than ${len} items`,\n params: ({params: {len}}) => _`{limit: ${len}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"items\",\n type: \"array\",\n schemaType: [\"object\", \"boolean\"],\n before: \"uniqueItems\",\n error,\n code(cxt: KeywordCxt) {\n const {schema, parentSchema, it} = cxt\n const {prefixItems} = parentSchema\n it.items = true\n if (alwaysValidSchema(it, schema)) return\n if (prefixItems) validateAdditionalItems(cxt, prefixItems)\n else cxt.ok(validateArray(cxt))\n },\n}\n\nexport default def\n","import type {\n CodeKeywordDefinition,\n KeywordErrorDefinition,\n ErrorObject,\n AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode, Type} from \"../../compile/util\"\n\nexport type ContainsError = ErrorObject<\n \"contains\",\n {minContains: number; maxContains?: number},\n AnySchema\n>\n\nconst error: KeywordErrorDefinition = {\n message: ({params: {min, max}}) =>\n max === undefined\n ? str`must contain at least ${min} valid item(s)`\n : str`must contain at least ${min} and no more than ${max} valid item(s)`,\n params: ({params: {min, max}}) =>\n max === undefined ? _`{minContains: ${min}}` : _`{minContains: ${min}, maxContains: ${max}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"contains\",\n type: \"array\",\n schemaType: [\"object\", \"boolean\"],\n before: \"uniqueItems\",\n trackErrors: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, schema, parentSchema, data, it} = cxt\n let min: number\n let max: number | undefined\n const {minContains, maxContains} = parentSchema\n if (it.opts.next) {\n min = minContains === undefined ? 1 : minContains\n max = maxContains\n } else {\n min = 1\n }\n const len = gen.const(\"len\", _`${data}.length`)\n cxt.setParams({min, max})\n if (max === undefined && min === 0) {\n checkStrictMode(it, `\"minContains\" == 0 without \"maxContains\": \"contains\" keyword ignored`)\n return\n }\n if (max !== undefined && min > max) {\n checkStrictMode(it, `\"minContains\" > \"maxContains\" is always invalid`)\n cxt.fail()\n return\n }\n if (alwaysValidSchema(it, schema)) {\n let cond = _`${len} >= ${min}`\n if (max !== undefined) cond = _`${cond} && ${len} <= ${max}`\n cxt.pass(cond)\n return\n }\n\n it.items = true\n const valid = gen.name(\"valid\")\n if (max === undefined && min === 1) {\n validateItems(valid, () => gen.if(valid, () => gen.break()))\n } else if (min === 0) {\n gen.let(valid, true)\n if (max !== undefined) gen.if(_`${data}.length > 0`, validateItemsWithCount)\n } else {\n gen.let(valid, false)\n validateItemsWithCount()\n }\n cxt.result(valid, () => cxt.reset())\n\n function validateItemsWithCount(): void {\n const schValid = gen.name(\"_valid\")\n const count = gen.let(\"count\", 0)\n validateItems(schValid, () => gen.if(schValid, () => checkLimits(count)))\n }\n\n function validateItems(_valid: Name, block: () => void): void {\n gen.forRange(\"i\", 0, len, (i) => {\n cxt.subschema(\n {\n keyword: \"contains\",\n dataProp: i,\n dataPropType: Type.Num,\n compositeRule: true,\n },\n _valid\n )\n block()\n })\n }\n\n function checkLimits(count: Name): void {\n gen.code(_`${count}++`)\n if (max === undefined) {\n gen.if(_`${count} >= ${min}`, () => gen.assign(valid, true).break())\n } else {\n gen.if(_`${count} > ${max}`, () => gen.assign(valid, false).break())\n if (min === 1) gen.assign(valid, true)\n else gen.if(_`${count} >= ${min}`, () => gen.assign(valid, true))\n }\n }\n },\n}\n\nexport default def\n","import type {\n CodeKeywordDefinition,\n ErrorObject,\n KeywordErrorDefinition,\n SchemaMap,\n AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\nimport {checkReportMissingProp, checkMissingProp, reportMissingProp, propertyInData} from \"../code\"\n\nexport type PropertyDependencies = {[K in string]?: string[]}\n\nexport interface DependenciesErrorParams {\n property: string\n missingProperty: string\n depsCount: number\n deps: string // TODO change to string[]\n}\n\ntype SchemaDependencies = SchemaMap\n\nexport type DependenciesError = ErrorObject<\n \"dependencies\",\n DependenciesErrorParams,\n {[K in string]?: string[] | AnySchema}\n>\n\nexport const error: KeywordErrorDefinition = {\n message: ({params: {property, depsCount, deps}}) => {\n const property_ies = depsCount === 1 ? \"property\" : \"properties\"\n return str`must have ${property_ies} ${deps} when property ${property} is present`\n },\n params: ({params: {property, depsCount, deps, missingProperty}}) =>\n _`{property: ${property},\n missingProperty: ${missingProperty},\n depsCount: ${depsCount},\n deps: ${deps}}`, // TODO change to reference\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"dependencies\",\n type: \"object\",\n schemaType: \"object\",\n error,\n code(cxt: KeywordCxt) {\n const [propDeps, schDeps] = splitDependencies(cxt)\n validatePropertyDeps(cxt, propDeps)\n validateSchemaDeps(cxt, schDeps)\n },\n}\n\nfunction splitDependencies({schema}: KeywordCxt): [PropertyDependencies, SchemaDependencies] {\n const propertyDeps: PropertyDependencies = {}\n const schemaDeps: SchemaDependencies = {}\n for (const key in schema) {\n if (key === \"__proto__\") continue\n const deps = Array.isArray(schema[key]) ? propertyDeps : schemaDeps\n deps[key] = schema[key]\n }\n return [propertyDeps, schemaDeps]\n}\n\nexport function validatePropertyDeps(\n cxt: KeywordCxt,\n propertyDeps: {[K in string]?: string[]} = cxt.schema\n): void {\n const {gen, data, it} = cxt\n if (Object.keys(propertyDeps).length === 0) return\n const missing = gen.let(\"missing\")\n for (const prop in propertyDeps) {\n const deps = propertyDeps[prop] as string[]\n if (deps.length === 0) continue\n const hasProperty = propertyInData(gen, data, prop, it.opts.ownProperties)\n cxt.setParams({\n property: prop,\n depsCount: deps.length,\n deps: deps.join(\", \"),\n })\n if (it.allErrors) {\n gen.if(hasProperty, () => {\n for (const depProp of deps) {\n checkReportMissingProp(cxt, depProp)\n }\n })\n } else {\n gen.if(_`${hasProperty} && (${checkMissingProp(cxt, deps, missing)})`)\n reportMissingProp(cxt, missing)\n gen.else()\n }\n }\n}\n\nexport function validateSchemaDeps(cxt: KeywordCxt, schemaDeps: SchemaMap = cxt.schema): void {\n const {gen, data, keyword, it} = cxt\n const valid = gen.name(\"valid\")\n for (const prop in schemaDeps) {\n if (alwaysValidSchema(it, schemaDeps[prop] as AnySchema)) continue\n gen.if(\n propertyInData(gen, data, prop, it.opts.ownProperties),\n () => {\n const schCxt = cxt.subschema({keyword, schemaProp: prop}, valid)\n cxt.mergeValidEvaluated(schCxt, valid)\n },\n () => gen.var(valid, true) // TODO var\n )\n cxt.ok(valid)\n }\n}\n\nexport default def\n","import type {\n CodeKeywordDefinition,\n ErrorObject,\n KeywordErrorDefinition,\n AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, not} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\n\nexport type PropertyNamesError = ErrorObject<\"propertyNames\", {propertyName: string}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n message: \"property name must be valid\",\n params: ({params}) => _`{propertyName: ${params.propertyName}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"propertyNames\",\n type: \"object\",\n schemaType: [\"object\", \"boolean\"],\n error,\n code(cxt: KeywordCxt) {\n const {gen, schema, data, it} = cxt\n if (alwaysValidSchema(it, schema)) return\n const valid = gen.name(\"valid\")\n\n gen.forIn(\"key\", data, (key) => {\n cxt.setParams({propertyName: key})\n cxt.subschema(\n {\n keyword: \"propertyNames\",\n data: key,\n dataTypes: [\"string\"],\n propertyName: key,\n compositeRule: true,\n },\n valid\n )\n gen.if(not(valid), () => {\n cxt.error(true)\n if (!it.allErrors) gen.break()\n })\n })\n\n cxt.ok(valid)\n },\n}\n\nexport default def\n","import type {\n CodeKeywordDefinition,\n AddedKeywordDefinition,\n ErrorObject,\n KeywordErrorDefinition,\n AnySchema,\n} from \"../../types\"\nimport {allSchemaProperties, usePattern, isOwnProperty} from \"../code\"\nimport {_, nil, or, not, Code, Name} from \"../../compile/codegen\"\nimport N from \"../../compile/names\"\nimport type {SubschemaArgs} from \"../../compile/validate/subschema\"\nimport {alwaysValidSchema, schemaRefOrVal, Type} from \"../../compile/util\"\n\nexport type AdditionalPropertiesError = ErrorObject<\n \"additionalProperties\",\n {additionalProperty: string},\n AnySchema\n>\n\nconst error: KeywordErrorDefinition = {\n message: \"must NOT have additional properties\",\n params: ({params}) => _`{additionalProperty: ${params.additionalProperty}}`,\n}\n\nconst def: CodeKeywordDefinition & AddedKeywordDefinition = {\n keyword: \"additionalProperties\",\n type: [\"object\"],\n schemaType: [\"boolean\", \"object\"],\n allowUndefined: true,\n trackErrors: true,\n error,\n code(cxt) {\n const {gen, schema, parentSchema, data, errsCount, it} = cxt\n /* istanbul ignore if */\n if (!errsCount) throw new Error(\"ajv implementation error\")\n const {allErrors, opts} = it\n it.props = true\n if (opts.removeAdditional !== \"all\" && alwaysValidSchema(it, schema)) return\n const props = allSchemaProperties(parentSchema.properties)\n const patProps = allSchemaProperties(parentSchema.patternProperties)\n checkAdditionalProperties()\n cxt.ok(_`${errsCount} === ${N.errors}`)\n\n function checkAdditionalProperties(): void {\n gen.forIn(\"key\", data, (key: Name) => {\n if (!props.length && !patProps.length) additionalPropertyCode(key)\n else gen.if(isAdditional(key), () => additionalPropertyCode(key))\n })\n }\n\n function isAdditional(key: Name): Code {\n let definedProp: Code\n if (props.length > 8) {\n // TODO maybe an option instead of hard-coded 8?\n const propsSchema = schemaRefOrVal(it, parentSchema.properties, \"properties\")\n definedProp = isOwnProperty(gen, propsSchema as Code, key)\n } else if (props.length) {\n definedProp = or(...props.map((p) => _`${key} === ${p}`))\n } else {\n definedProp = nil\n }\n if (patProps.length) {\n definedProp = or(definedProp, ...patProps.map((p) => _`${usePattern(cxt, p)}.test(${key})`))\n }\n return not(definedProp)\n }\n\n function deleteAdditional(key: Name): void {\n gen.code(_`delete ${data}[${key}]`)\n }\n\n function additionalPropertyCode(key: Name): void {\n if (opts.removeAdditional === \"all\" || (opts.removeAdditional && schema === false)) {\n deleteAdditional(key)\n return\n }\n\n if (schema === false) {\n cxt.setParams({additionalProperty: key})\n cxt.error()\n if (!allErrors) gen.break()\n return\n }\n\n if (typeof schema == \"object\" && !alwaysValidSchema(it, schema)) {\n const valid = gen.name(\"valid\")\n if (opts.removeAdditional === \"failing\") {\n applyAdditionalSchema(key, valid, false)\n gen.if(not(valid), () => {\n cxt.reset()\n deleteAdditional(key)\n })\n } else {\n applyAdditionalSchema(key, valid)\n if (!allErrors) gen.if(not(valid), () => gen.break())\n }\n }\n }\n\n function applyAdditionalSchema(key: Name, valid: Name, errors?: false): void {\n const subschema: SubschemaArgs = {\n keyword: \"additionalProperties\",\n dataProp: key,\n dataPropType: Type.Str,\n }\n if (errors === false) {\n Object.assign(subschema, {\n compositeRule: true,\n createErrors: false,\n allErrors: false,\n })\n }\n cxt.subschema(subschema, valid)\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition} from \"../../types\"\nimport {KeywordCxt} from \"../../compile/validate\"\nimport {propertyInData, allSchemaProperties} from \"../code\"\nimport {alwaysValidSchema, toHash, mergeEvaluated} from \"../../compile/util\"\nimport apDef from \"./additionalProperties\"\n\nconst def: CodeKeywordDefinition = {\n keyword: \"properties\",\n type: \"object\",\n schemaType: \"object\",\n code(cxt: KeywordCxt) {\n const {gen, schema, parentSchema, data, it} = cxt\n if (it.opts.removeAdditional === \"all\" && parentSchema.additionalProperties === undefined) {\n apDef.code(new KeywordCxt(it, apDef, \"additionalProperties\"))\n }\n const allProps = allSchemaProperties(schema)\n for (const prop of allProps) {\n it.definedProperties.add(prop)\n }\n if (it.opts.unevaluated && allProps.length && it.props !== true) {\n it.props = mergeEvaluated.props(gen, toHash(allProps), it.props)\n }\n const properties = allProps.filter((p) => !alwaysValidSchema(it, schema[p]))\n if (properties.length === 0) return\n const valid = gen.name(\"valid\")\n\n for (const prop of properties) {\n if (hasDefault(prop)) {\n applyPropertySchema(prop)\n } else {\n gen.if(propertyInData(gen, data, prop, it.opts.ownProperties))\n applyPropertySchema(prop)\n if (!it.allErrors) gen.else().var(valid, true)\n gen.endIf()\n }\n cxt.it.definedProperties.add(prop)\n cxt.ok(valid)\n }\n\n function hasDefault(prop: string): boolean | undefined {\n return it.opts.useDefaults && !it.compositeRule && schema[prop].default !== undefined\n }\n\n function applyPropertySchema(prop: string): void {\n cxt.subschema(\n {\n keyword: \"properties\",\n schemaProp: prop,\n dataProp: prop,\n },\n valid\n )\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {allSchemaProperties, usePattern} from \"../code\"\nimport {_, not, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode} from \"../../compile/util\"\nimport {evaluatedPropsToName, Type} from \"../../compile/util\"\nimport {AnySchema} from \"../../types\"\n\nconst def: CodeKeywordDefinition = {\n keyword: \"patternProperties\",\n type: \"object\",\n schemaType: \"object\",\n code(cxt: KeywordCxt) {\n const {gen, schema, data, parentSchema, it} = cxt\n const {opts} = it\n const patterns = allSchemaProperties(schema)\n const alwaysValidPatterns = patterns.filter((p) =>\n alwaysValidSchema(it, schema[p] as AnySchema)\n )\n\n if (\n patterns.length === 0 ||\n (alwaysValidPatterns.length === patterns.length &&\n (!it.opts.unevaluated || it.props === true))\n ) {\n return\n }\n\n const checkProperties =\n opts.strictSchema && !opts.allowMatchingProperties && parentSchema.properties\n const valid = gen.name(\"valid\")\n if (it.props !== true && !(it.props instanceof Name)) {\n it.props = evaluatedPropsToName(gen, it.props)\n }\n const {props} = it\n validatePatternProperties()\n\n function validatePatternProperties(): void {\n for (const pat of patterns) {\n if (checkProperties) checkMatchingProperties(pat)\n if (it.allErrors) {\n validateProperties(pat)\n } else {\n gen.var(valid, true) // TODO var\n validateProperties(pat)\n gen.if(valid)\n }\n }\n }\n\n function checkMatchingProperties(pat: string): void {\n for (const prop in checkProperties) {\n if (new RegExp(pat).test(prop)) {\n checkStrictMode(\n it,\n `property ${prop} matches pattern ${pat} (use allowMatchingProperties)`\n )\n }\n }\n }\n\n function validateProperties(pat: string): void {\n gen.forIn(\"key\", data, (key) => {\n gen.if(_`${usePattern(cxt, pat)}.test(${key})`, () => {\n const alwaysValid = alwaysValidPatterns.includes(pat)\n if (!alwaysValid) {\n cxt.subschema(\n {\n keyword: \"patternProperties\",\n schemaProp: pat,\n dataProp: key,\n dataPropType: Type.Str,\n },\n valid\n )\n }\n\n if (it.opts.unevaluated && props !== true) {\n gen.assign(_`${props}[${key}]`, true)\n } else if (!alwaysValid && !it.allErrors) {\n // can short-circuit if `unevaluatedProperties` is not supported (opts.next === false)\n // or if all properties were evaluated (props === true)\n gen.if(not(valid), () => gen.break())\n }\n })\n })\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, ErrorNoParams, AnySchema} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {alwaysValidSchema} from \"../../compile/util\"\n\nexport type NotKeywordError = ErrorNoParams<\"not\", AnySchema>\n\nconst def: CodeKeywordDefinition = {\n keyword: \"not\",\n schemaType: [\"object\", \"boolean\"],\n trackErrors: true,\n code(cxt: KeywordCxt) {\n const {gen, schema, it} = cxt\n if (alwaysValidSchema(it, schema)) {\n cxt.fail()\n return\n }\n\n const valid = gen.name(\"valid\")\n cxt.subschema(\n {\n keyword: \"not\",\n compositeRule: true,\n createErrors: false,\n allErrors: false,\n },\n valid\n )\n\n cxt.failResult(\n valid,\n () => cxt.reset(),\n () => cxt.error()\n )\n },\n error: {message: \"must NOT be valid\"},\n}\n\nexport default def\n","import type {CodeKeywordDefinition, ErrorNoParams, AnySchema} from \"../../types\"\nimport {validateUnion} from \"../code\"\n\nexport type AnyOfError = ErrorNoParams<\"anyOf\", AnySchema[]>\n\nconst def: CodeKeywordDefinition = {\n keyword: \"anyOf\",\n schemaType: \"array\",\n trackErrors: true,\n code: validateUnion,\n error: {message: \"must match a schema in anyOf\"},\n}\n\nexport default def\n","import type {\n CodeKeywordDefinition,\n ErrorObject,\n KeywordErrorDefinition,\n AnySchema,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema} from \"../../compile/util\"\nimport {SchemaCxt} from \"../../compile\"\n\nexport type OneOfError = ErrorObject<\n \"oneOf\",\n {passingSchemas: [number, number] | null},\n AnySchema[]\n>\n\nconst error: KeywordErrorDefinition = {\n message: \"must match exactly one schema in oneOf\",\n params: ({params}) => _`{passingSchemas: ${params.passing}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"oneOf\",\n schemaType: \"array\",\n trackErrors: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, schema, parentSchema, it} = cxt\n /* istanbul ignore if */\n if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n if (it.opts.discriminator && parentSchema.discriminator) return\n const schArr: AnySchema[] = schema\n const valid = gen.let(\"valid\", false)\n const passing = gen.let(\"passing\", null)\n const schValid = gen.name(\"_valid\")\n cxt.setParams({passing})\n // TODO possibly fail straight away (with warning or exception) if there are two empty always valid schemas\n\n gen.block(validateOneOf)\n\n cxt.result(\n valid,\n () => cxt.reset(),\n () => cxt.error(true)\n )\n\n function validateOneOf(): void {\n schArr.forEach((sch: AnySchema, i: number) => {\n let schCxt: SchemaCxt | undefined\n if (alwaysValidSchema(it, sch)) {\n gen.var(schValid, true)\n } else {\n schCxt = cxt.subschema(\n {\n keyword: \"oneOf\",\n schemaProp: i,\n compositeRule: true,\n },\n schValid\n )\n }\n\n if (i > 0) {\n gen\n .if(_`${schValid} && ${valid}`)\n .assign(valid, false)\n .assign(passing, _`[${passing}, ${i}]`)\n .else()\n }\n\n gen.if(schValid, () => {\n gen.assign(valid, true)\n gen.assign(passing, i)\n if (schCxt) cxt.mergeEvaluated(schCxt, Name)\n })\n })\n }\n },\n}\n\nexport default def\n","import type {CodeKeywordDefinition, AnySchema} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {alwaysValidSchema} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n keyword: \"allOf\",\n schemaType: \"array\",\n code(cxt: KeywordCxt) {\n const {gen, schema, it} = cxt\n /* istanbul ignore if */\n if (!Array.isArray(schema)) throw new Error(\"ajv implementation error\")\n const valid = gen.name(\"valid\")\n schema.forEach((sch: AnySchema, i: number) => {\n if (alwaysValidSchema(it, sch)) return\n const schCxt = cxt.subschema({keyword: \"allOf\", schemaProp: i}, valid)\n cxt.ok(valid)\n cxt.mergeEvaluated(schCxt)\n })\n },\n}\n\nexport default def\n","import type {\n CodeKeywordDefinition,\n ErrorObject,\n KeywordErrorDefinition,\n AnySchema,\n} from \"../../types\"\nimport type {SchemaObjCxt} from \"../../compile\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, not, Name} from \"../../compile/codegen\"\nimport {alwaysValidSchema, checkStrictMode} from \"../../compile/util\"\n\nexport type IfKeywordError = ErrorObject<\"if\", {failingKeyword: string}, AnySchema>\n\nconst error: KeywordErrorDefinition = {\n message: ({params}) => str`must match \"${params.ifClause}\" schema`,\n params: ({params}) => _`{failingKeyword: ${params.ifClause}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"if\",\n schemaType: [\"object\", \"boolean\"],\n trackErrors: true,\n error,\n code(cxt: KeywordCxt) {\n const {gen, parentSchema, it} = cxt\n if (parentSchema.then === undefined && parentSchema.else === undefined) {\n checkStrictMode(it, '\"if\" without \"then\" and \"else\" is ignored')\n }\n const hasThen = hasSchema(it, \"then\")\n const hasElse = hasSchema(it, \"else\")\n if (!hasThen && !hasElse) return\n\n const valid = gen.let(\"valid\", true)\n const schValid = gen.name(\"_valid\")\n validateIf()\n cxt.reset()\n\n if (hasThen && hasElse) {\n const ifClause = gen.let(\"ifClause\")\n cxt.setParams({ifClause})\n gen.if(schValid, validateClause(\"then\", ifClause), validateClause(\"else\", ifClause))\n } else if (hasThen) {\n gen.if(schValid, validateClause(\"then\"))\n } else {\n gen.if(not(schValid), validateClause(\"else\"))\n }\n\n cxt.pass(valid, () => cxt.error(true))\n\n function validateIf(): void {\n const schCxt = cxt.subschema(\n {\n keyword: \"if\",\n compositeRule: true,\n createErrors: false,\n allErrors: false,\n },\n schValid\n )\n cxt.mergeEvaluated(schCxt)\n }\n\n function validateClause(keyword: string, ifClause?: Name): () => void {\n return () => {\n const schCxt = cxt.subschema({keyword}, schValid)\n gen.assign(valid, schValid)\n cxt.mergeValidEvaluated(schCxt, valid)\n if (ifClause) gen.assign(ifClause, _`${keyword}`)\n else cxt.setParams({ifClause: keyword})\n }\n }\n },\n}\n\nfunction hasSchema(it: SchemaObjCxt, keyword: string): boolean {\n const schema = it.schema[keyword]\n return schema !== undefined && !alwaysValidSchema(it, schema)\n}\n\nexport default def\n","import type {CodeKeywordDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {checkStrictMode} from \"../../compile/util\"\n\nconst def: CodeKeywordDefinition = {\n keyword: [\"then\", \"else\"],\n schemaType: [\"object\", \"boolean\"],\n code({keyword, parentSchema, it}: KeywordCxt) {\n if (parentSchema.if === undefined) checkStrictMode(it, `\"${keyword}\" without \"if\" is ignored`)\n },\n}\n\nexport default def\n","import type {ErrorNoParams, Vocabulary} from \"../../types\"\nimport additionalItems, {AdditionalItemsError} from \"./additionalItems\"\nimport prefixItems from \"./prefixItems\"\nimport items from \"./items\"\nimport items2020, {ItemsError} from \"./items2020\"\nimport contains, {ContainsError} from \"./contains\"\nimport dependencies, {DependenciesError} from \"./dependencies\"\nimport propertyNames, {PropertyNamesError} from \"./propertyNames\"\nimport additionalProperties, {AdditionalPropertiesError} from \"./additionalProperties\"\nimport properties from \"./properties\"\nimport patternProperties from \"./patternProperties\"\nimport notKeyword, {NotKeywordError} from \"./not\"\nimport anyOf, {AnyOfError} from \"./anyOf\"\nimport oneOf, {OneOfError} from \"./oneOf\"\nimport allOf from \"./allOf\"\nimport ifKeyword, {IfKeywordError} from \"./if\"\nimport thenElse from \"./thenElse\"\n\nexport default function getApplicator(draft2020 = false): Vocabulary {\n const applicator = [\n // any\n notKeyword,\n anyOf,\n oneOf,\n allOf,\n ifKeyword,\n thenElse,\n // object\n propertyNames,\n additionalProperties,\n dependencies,\n properties,\n patternProperties,\n ]\n // array\n if (draft2020) applicator.push(prefixItems, items2020)\n else applicator.push(additionalItems, items)\n applicator.push(contains)\n return applicator\n}\n\nexport type ApplicatorKeywordError =\n | ErrorNoParams<\"false schema\">\n | AdditionalItemsError\n | ItemsError\n | ContainsError\n | AdditionalPropertiesError\n | DependenciesError\n | IfKeywordError\n | AnyOfError\n | OneOfError\n | NotKeywordError\n | PropertyNamesError\n","import type {\n AddedFormat,\n FormatValidator,\n AsyncFormatValidator,\n CodeKeywordDefinition,\n KeywordErrorDefinition,\n ErrorObject,\n} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, str, nil, or, Code, getProperty, regexpCode} from \"../../compile/codegen\"\n\ntype FormatValidate =\n | FormatValidator<string>\n | FormatValidator<number>\n | AsyncFormatValidator<string>\n | AsyncFormatValidator<number>\n | RegExp\n | string\n | true\n\nexport type FormatError = ErrorObject<\"format\", {format: string}, string | {$data: string}>\n\nconst error: KeywordErrorDefinition = {\n message: ({schemaCode}) => str`must match format \"${schemaCode}\"`,\n params: ({schemaCode}) => _`{format: ${schemaCode}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"format\",\n type: [\"number\", \"string\"],\n schemaType: \"string\",\n $data: true,\n error,\n code(cxt: KeywordCxt, ruleType?: string) {\n const {gen, data, $data, schema, schemaCode, it} = cxt\n const {opts, errSchemaPath, schemaEnv, self} = it\n if (!opts.validateFormats) return\n\n if ($data) validate$DataFormat()\n else validateFormat()\n\n function validate$DataFormat(): void {\n const fmts = gen.scopeValue(\"formats\", {\n ref: self.formats,\n code: opts.code.formats,\n })\n const fDef = gen.const(\"fDef\", _`${fmts}[${schemaCode}]`)\n const fType = gen.let(\"fType\")\n const format = gen.let(\"format\")\n // TODO simplify\n gen.if(\n _`typeof ${fDef} == \"object\" && !(${fDef} instanceof RegExp)`,\n () => gen.assign(fType, _`${fDef}.type || \"string\"`).assign(format, _`${fDef}.validate`),\n () => gen.assign(fType, _`\"string\"`).assign(format, fDef)\n )\n cxt.fail$data(or(unknownFmt(), invalidFmt()))\n\n function unknownFmt(): Code {\n if (opts.strictSchema === false) return nil\n return _`${schemaCode} && !${format}`\n }\n\n function invalidFmt(): Code {\n const callFormat = schemaEnv.$async\n ? _`(${fDef}.async ? await ${format}(${data}) : ${format}(${data}))`\n : _`${format}(${data})`\n const validData = _`(typeof ${format} == \"function\" ? ${callFormat} : ${format}.test(${data}))`\n return _`${format} && ${format} !== true && ${fType} === ${ruleType} && !${validData}`\n }\n }\n\n function validateFormat(): void {\n const formatDef: AddedFormat | undefined = self.formats[schema]\n if (!formatDef) {\n unknownFormat()\n return\n }\n if (formatDef === true) return\n const [fmtType, format, fmtRef] = getFormat(formatDef)\n if (fmtType === ruleType) cxt.pass(validCondition())\n\n function unknownFormat(): void {\n if (opts.strictSchema === false) {\n self.logger.warn(unknownMsg())\n return\n }\n throw new Error(unknownMsg())\n\n function unknownMsg(): string {\n return `unknown format \"${schema as string}\" ignored in schema at path \"${errSchemaPath}\"`\n }\n }\n\n function getFormat(fmtDef: AddedFormat): [string, FormatValidate, Code] {\n const code =\n fmtDef instanceof RegExp\n ? regexpCode(fmtDef)\n : opts.code.formats\n ? _`${opts.code.formats}${getProperty(schema)}`\n : undefined\n const fmt = gen.scopeValue(\"formats\", {key: schema, ref: fmtDef, code})\n if (typeof fmtDef == \"object\" && !(fmtDef instanceof RegExp)) {\n return [fmtDef.type || \"string\", fmtDef.validate, _`${fmt}.validate`]\n }\n\n return [\"string\", fmtDef, fmt]\n }\n\n function validCondition(): Code {\n if (typeof formatDef == \"object\" && !(formatDef instanceof RegExp) && formatDef.async) {\n if (!schemaEnv.$async) throw new Error(\"async format in sync schema\")\n return _`await ${fmtRef}(${data})`\n }\n return typeof format == \"function\" ? _`${fmtRef}(${data})` : _`${fmtRef}.test(${data})`\n }\n }\n },\n}\n\nexport default def\n","import type {Vocabulary} from \"../../types\"\nimport formatKeyword from \"./format\"\n\nconst format: Vocabulary = [formatKeyword]\n\nexport default format\n","import type {Vocabulary} from \"../types\"\n\nexport const metadataVocabulary: Vocabulary = [\n \"title\",\n \"description\",\n \"default\",\n \"deprecated\",\n \"readOnly\",\n \"writeOnly\",\n \"examples\",\n]\n\nexport const contentVocabulary: Vocabulary = [\n \"contentMediaType\",\n \"contentEncoding\",\n \"contentSchema\",\n]\n","import type {Vocabulary} from \"../types\"\nimport coreVocabulary from \"./core\"\nimport validationVocabulary from \"./validation\"\nimport getApplicatorVocabulary from \"./applicator\"\nimport formatVocabulary from \"./format\"\nimport {metadataVocabulary, contentVocabulary} from \"./metadata\"\n\nconst draft7Vocabularies: Vocabulary[] = [\n coreVocabulary,\n validationVocabulary,\n getApplicatorVocabulary(),\n formatVocabulary,\n metadataVocabulary,\n contentVocabulary,\n]\n\nexport default draft7Vocabularies\n","import type {ErrorObject} from \"../../types\"\n\nexport enum DiscrError {\n Tag = \"tag\",\n Mapping = \"mapping\",\n}\n\nexport type DiscrErrorObj<E extends DiscrError> = ErrorObject<\n \"discriminator\",\n {error: E; tag: string; tagValue: unknown},\n string\n>\n","import type {CodeKeywordDefinition, AnySchemaObject, KeywordErrorDefinition} from \"../../types\"\nimport type {KeywordCxt} from \"../../compile/validate\"\nimport {_, getProperty, Name} from \"../../compile/codegen\"\nimport {DiscrError, DiscrErrorObj} from \"../discriminator/types\"\nimport {resolveRef, SchemaEnv} from \"../../compile\"\nimport MissingRefError from \"../../compile/ref_error\"\nimport {schemaHasRulesButRef} from \"../../compile/util\"\n\nexport type DiscriminatorError = DiscrErrorObj<DiscrError.Tag> | DiscrErrorObj<DiscrError.Mapping>\n\nconst error: KeywordErrorDefinition = {\n message: ({params: {discrError, tagName}}) =>\n discrError === DiscrError.Tag\n ? `tag \"${tagName}\" must be string`\n : `value of tag \"${tagName}\" must be in oneOf`,\n params: ({params: {discrError, tag, tagName}}) =>\n _`{error: ${discrError}, tag: ${tagName}, tagValue: ${tag}}`,\n}\n\nconst def: CodeKeywordDefinition = {\n keyword: \"discriminator\",\n type: \"object\",\n schemaType: \"object\",\n error,\n code(cxt: KeywordCxt) {\n const {gen, data, schema, parentSchema, it} = cxt\n const {oneOf} = parentSchema\n if (!it.opts.discriminator) {\n throw new Error(\"discriminator: requires discriminator option\")\n }\n const tagName = schema.propertyName\n if (typeof tagName != \"string\") throw new Error(\"discriminator: requires propertyName\")\n if (schema.mapping) throw new Error(\"discriminator: mapping is not supported\")\n if (!oneOf) throw new Error(\"discriminator: requires oneOf keyword\")\n const valid = gen.let(\"valid\", false)\n const tag = gen.const(\"tag\", _`${data}${getProperty(tagName)}`)\n gen.if(\n _`typeof ${tag} == \"string\"`,\n () => validateMapping(),\n () => cxt.error(false, {discrError: DiscrError.Tag, tag, tagName})\n )\n cxt.ok(valid)\n\n function validateMapping(): void {\n const mapping = getMapping()\n gen.if(false)\n for (const tagValue in mapping) {\n gen.elseIf(_`${tag} === ${tagValue}`)\n gen.assign(valid, applyTagSchema(mapping[tagValue]))\n }\n gen.else()\n cxt.error(false, {discrError: DiscrError.Mapping, tag, tagName})\n gen.endIf()\n }\n\n function applyTagSchema(schemaProp?: number): Name {\n const _valid = gen.name(\"valid\")\n const schCxt = cxt.subschema({keyword: \"oneOf\", schemaProp}, _valid)\n cxt.mergeEvaluated(schCxt, Name)\n return _valid\n }\n\n function getMapping(): {[T in string]?: number} {\n const oneOfMapping: {[T in string]?: number} = {}\n const topRequired = hasRequired(parentSchema)\n let tagRequired = true\n for (let i = 0; i < oneOf.length; i++) {\n let sch = oneOf[i]\n if (sch?.$ref && !schemaHasRulesButRef(sch, it.self.RULES)) {\n const ref = sch.$ref\n sch = resolveRef.call(it.self, it.schemaEnv.root, it.baseId, ref)\n if (sch instanceof SchemaEnv) sch = sch.schema\n if (sch === undefined) throw new MissingRefError(it.opts.uriResolver, it.baseId, ref)\n }\n const propSch = sch?.properties?.[tagName]\n if (typeof propSch != \"object\") {\n throw new Error(\n `discriminator: oneOf subschemas (or referenced schemas) must have \"properties/${tagName}\"`\n )\n }\n tagRequired = tagRequired && (topRequired || hasRequired(sch))\n addMappings(propSch, i)\n }\n if (!tagRequired) throw new Error(`discriminator: \"${tagName}\" must be required`)\n return oneOfMapping\n\n function hasRequired({required}: AnySchemaObject): boolean {\n return Array.isArray(required) && required.includes(tagName)\n }\n\n function addMappings(sch: AnySchemaObject, i: number): void {\n if (sch.const) {\n addMapping(sch.const, i)\n } else if (sch.enum) {\n for (const tagValue of sch.enum) {\n addMapping(tagValue, i)\n }\n } else {\n throw new Error(`discriminator: \"properties/${tagName}\" must have \"const\" or \"enum\"`)\n }\n }\n\n function addMapping(tagValue: unknown, i: number): void {\n if (typeof tagValue != \"string\" || tagValue in oneOfMapping) {\n throw new Error(`discriminator: \"${tagName}\" values must be unique strings`)\n }\n oneOfMapping[tagValue] = i\n }\n }\n },\n}\n\nexport default def\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Core schema meta-schema\",\n \"definitions\": {\n \"schemaArray\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\"$ref\": \"#\"}\n },\n \"nonNegativeInteger\": {\n \"type\": \"integer\",\n \"minimum\": 0\n },\n \"nonNegativeIntegerDefault0\": {\n \"allOf\": [{\"$ref\": \"#/definitions/nonNegativeInteger\"}, {\"default\": 0}]\n },\n \"simpleTypes\": {\n \"enum\": [\"array\", \"boolean\", \"integer\", \"null\", \"number\", \"object\", \"string\"]\n },\n \"stringArray\": {\n \"type\": \"array\",\n \"items\": {\"type\": \"string\"},\n \"uniqueItems\": true,\n \"default\": []\n }\n },\n \"type\": [\"object\", \"boolean\"],\n \"properties\": {\n \"$id\": {\n \"type\": \"string\",\n \"format\": \"uri-reference\"\n },\n \"$schema\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n \"$ref\": {\n \"type\": \"string\",\n \"format\": \"uri-reference\"\n },\n \"$comment\": {\n \"type\": \"string\"\n },\n \"title\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"default\": true,\n \"readOnly\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"examples\": {\n \"type\": \"array\",\n \"items\": true\n },\n \"multipleOf\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"maximum\": {\n \"type\": \"number\"\n },\n \"exclusiveMaximum\": {\n \"type\": \"number\"\n },\n \"minimum\": {\n \"type\": \"number\"\n },\n \"exclusiveMinimum\": {\n \"type\": \"number\"\n },\n \"maxLength\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n \"minLength\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n \"pattern\": {\n \"type\": \"string\",\n \"format\": \"regex\"\n },\n \"additionalItems\": {\"$ref\": \"#\"},\n \"items\": {\n \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/schemaArray\"}],\n \"default\": true\n },\n \"maxItems\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n \"minItems\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n \"uniqueItems\": {\n \"type\": \"boolean\",\n \"default\": false\n },\n \"contains\": {\"$ref\": \"#\"},\n \"maxProperties\": {\"$ref\": \"#/definitions/nonNegativeInteger\"},\n \"minProperties\": {\"$ref\": \"#/definitions/nonNegativeIntegerDefault0\"},\n \"required\": {\"$ref\": \"#/definitions/stringArray\"},\n \"additionalProperties\": {\"$ref\": \"#\"},\n \"definitions\": {\n \"type\": \"object\",\n \"additionalProperties\": {\"$ref\": \"#\"},\n \"default\": {}\n },\n \"properties\": {\n \"type\": \"object\",\n \"additionalProperties\": {\"$ref\": \"#\"},\n \"default\": {}\n },\n \"patternProperties\": {\n \"type\": \"object\",\n \"additionalProperties\": {\"$ref\": \"#\"},\n \"propertyNames\": {\"format\": \"regex\"},\n \"default\": {}\n },\n \"dependencies\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"anyOf\": [{\"$ref\": \"#\"}, {\"$ref\": \"#/definitions/stringArray\"}]\n }\n },\n \"propertyNames\": {\"$ref\": \"#\"},\n \"const\": true,\n \"enum\": {\n \"type\": \"array\",\n \"items\": true,\n \"minItems\": 1,\n \"uniqueItems\": true\n },\n \"type\": {\n \"anyOf\": [\n {\"$ref\": \"#/definitions/simpleTypes\"},\n {\n \"type\": \"array\",\n \"items\": {\"$ref\": \"#/definitions/simpleTypes\"},\n \"minItems\": 1,\n \"uniqueItems\": true\n }\n ]\n },\n \"format\": {\"type\": \"string\"},\n \"contentMediaType\": {\"type\": \"string\"},\n \"contentEncoding\": {\"type\": \"string\"},\n \"if\": {\"$ref\": \"#\"},\n \"then\": {\"$ref\": \"#\"},\n \"else\": {\"$ref\": \"#\"},\n \"allOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n \"anyOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n \"oneOf\": {\"$ref\": \"#/definitions/schemaArray\"},\n \"not\": {\"$ref\": \"#\"}\n },\n \"default\": true\n}\n","import type {AnySchemaObject} from \"./types\"\nimport AjvCore from \"./core\"\nimport draft7Vocabularies from \"./vocabularies/draft7\"\nimport discriminator from \"./vocabularies/discriminator\"\nimport * as draft7MetaSchema from \"./refs/json-schema-draft-07.json\"\n\nconst META_SUPPORT_DATA = [\"/properties\"]\n\nconst META_SCHEMA_ID = \"http://json-schema.org/draft-07/schema\"\n\nexport class Ajv extends AjvCore {\n _addVocabularies(): void {\n super._addVocabularies()\n draft7Vocabularies.forEach((v) => this.addVocabulary(v))\n if (this.opts.discriminator) this.addKeyword(discriminator)\n }\n\n _addDefaultMetaSchema(): void {\n super._addDefaultMetaSchema()\n if (!this.opts.meta) return\n const metaSchema = this.opts.$data\n ? this.$dataMetaSchema(draft7MetaSchema, META_SUPPORT_DATA)\n : draft7MetaSchema\n this.addMetaSchema(metaSchema, META_SCHEMA_ID, false)\n this.refs[\"http://json-schema.org/schema\"] = META_SCHEMA_ID\n }\n\n defaultMeta(): string | AnySchemaObject | undefined {\n return (this.opts.defaultMeta =\n super.defaultMeta() || (this.getSchema(META_SCHEMA_ID) ? META_SCHEMA_ID : undefined))\n }\n}\n\nmodule.exports = exports = Ajv\nmodule.exports.Ajv = Ajv\nObject.defineProperty(exports, \"__esModule\", {value: true})\n\nexport default Ajv\n\nexport {\n Format,\n FormatDefinition,\n AsyncFormatDefinition,\n KeywordDefinition,\n KeywordErrorDefinition,\n CodeKeywordDefinition,\n MacroKeywordDefinition,\n FuncKeywordDefinition,\n Vocabulary,\n Schema,\n SchemaObject,\n AnySchemaObject,\n AsyncSchema,\n AnySchema,\n ValidateFunction,\n AsyncValidateFunction,\n SchemaValidateFunction,\n ErrorObject,\n ErrorNoParams,\n} from \"./types\"\n\nexport {Plugin, Options, CodeOptions, InstanceOptions, Logger, ErrorsTextOptions} from \"./core\"\nexport {SchemaCxt, SchemaObjCxt} from \"./compile\"\nexport {KeywordCxt} from \"./compile/validate\"\nexport {DefinedError} from \"./vocabularies/errors\"\nexport {JSONType} from \"./compile/rules\"\nexport {JSONSchemaType} from \"./types/json-schema\"\nexport {_, str, stringify, nil, Name, Code, CodeGen, CodeGenOptions} from \"./compile/codegen\"\nexport {default as ValidationError} from \"./runtime/validation_error\"\nexport {default as MissingRefError} from \"./compile/ref_error\"\n","import type {Format, FormatDefinition} from \"ajv\"\nimport type {FormatValidator, FormatCompare} from \"ajv/dist/types\"\n\nexport type FormatMode = \"fast\" | \"full\"\n\nexport type FormatName =\n | \"date\"\n | \"time\"\n | \"date-time\"\n | \"iso-time\"\n | \"iso-date-time\"\n | \"duration\"\n | \"uri\"\n | \"uri-reference\"\n | \"uri-template\"\n | \"url\"\n | \"email\"\n | \"hostname\"\n | \"ipv4\"\n | \"ipv6\"\n | \"regex\"\n | \"uuid\"\n | \"json-pointer\"\n | \"json-pointer-uri-fragment\"\n | \"relative-json-pointer\"\n | \"byte\"\n | \"int32\"\n | \"int64\"\n | \"float\"\n | \"double\"\n | \"password\"\n | \"binary\"\n\nexport type DefinedFormats = {\n [key in FormatName]: Format\n}\n\nfunction fmtDef(\n validate: RegExp | FormatValidator<string>,\n compare: FormatCompare<string>\n): FormatDefinition<string> {\n return {validate, compare}\n}\n\nexport const fullFormats: DefinedFormats = {\n // date: http://tools.ietf.org/html/rfc3339#section-5.6\n date: fmtDef(date, compareDate),\n // date-time: http://tools.ietf.org/html/rfc3339#section-5.6\n time: fmtDef(getTime(true), compareTime),\n \"date-time\": fmtDef(getDateTime(true), compareDateTime),\n \"iso-time\": fmtDef(getTime(), compareIsoTime),\n \"iso-date-time\": fmtDef(getDateTime(), compareIsoDateTime),\n // duration: https://tools.ietf.org/html/rfc3339#appendix-A\n duration: /^P(?!$)((\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+S)?)?|(\\d+W)?)$/,\n uri,\n \"uri-reference\":\n /^(?:[a-z][a-z0-9+\\-.]*:)?(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'\"()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\\?(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,\n // uri-template: https://tools.ietf.org/html/rfc6570\n \"uri-template\":\n /^(?:(?:[^\\x00-\\x20\"'<>%\\\\^`{|}]|%[0-9a-f]{2})|\\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?)*\\})*$/i,\n // For the source: https://gist.github.com/dperini/729294\n // For test cases: https://mathiasbynens.be/demo/url-regex\n url: /^(?:https?|ftp):\\/\\/(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z0-9\\u{00a1}-\\u{ffff}]+-)*[a-z0-9\\u{00a1}-\\u{ffff}]+)(?:\\.(?:[a-z0-9\\u{00a1}-\\u{ffff}]+-)*[a-z0-9\\u{00a1}-\\u{ffff}]+)*(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?$/iu,\n email:\n /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,\n hostname:\n /^(?=.{1,253}\\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\\.?$/i,\n // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\n ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)$/,\n ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))$/i,\n regex,\n // uuid: http://tools.ietf.org/html/rfc4122\n uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,\n // JSON-pointer: https://tools.ietf.org/html/rfc6901\n // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A\n \"json-pointer\": /^(?:\\/(?:[^~/]|~0|~1)*)*$/,\n \"json-pointer-uri-fragment\": /^#(?:\\/(?:[a-z0-9_\\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,\n // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00\n \"relative-json-pointer\": /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/,\n // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types\n // byte: https://github.com/miguelmota/is-base64\n byte,\n // signed 32 bit integer\n int32: {type: \"number\", validate: validateInt32},\n // signed 64 bit integer\n int64: {type: \"number\", validate: validateInt64},\n // C-type float\n float: {type: \"number\", validate: validateNumber},\n // C-type double\n double: {type: \"number\", validate: validateNumber},\n // hint to the UI to hide input strings\n password: true,\n // unchecked string payload\n binary: true,\n}\n\nexport const fastFormats: DefinedFormats = {\n ...fullFormats,\n date: fmtDef(/^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/, compareDate),\n time: fmtDef(\n /^(?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)$/i,\n compareTime\n ),\n \"date-time\": fmtDef(\n /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\dt(?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)$/i,\n compareDateTime\n ),\n \"iso-time\": fmtDef(\n /^(?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)?$/i,\n compareIsoTime\n ),\n \"iso-date-time\": fmtDef(\n /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d[t\\s](?:[0-2]\\d:[0-5]\\d:[0-5]\\d|23:59:60)(?:\\.\\d+)?(?:z|[+-]\\d\\d(?::?\\d\\d)?)?$/i,\n compareIsoDateTime\n ),\n // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js\n uri: /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/)?[^\\s]*$/i,\n \"uri-reference\": /^(?:(?:[a-z][a-z0-9+\\-.]*:)?\\/?\\/)?(?:[^\\\\\\s#][^\\s#]*)?(?:#[^\\\\\\s]*)?$/i,\n // email (sources from jsen validator):\n // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363\n // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation')\n email:\n /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,\n}\n\nexport const formatNames = Object.keys(fullFormats) as FormatName[]\n\nfunction isLeapYear(year: number): boolean {\n // https://tools.ietf.org/html/rfc3339#appendix-C\n return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)\n}\n\nconst DATE = /^(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)$/\nconst DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n\nfunction date(str: string): boolean {\n // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n const matches: string[] | null = DATE.exec(str)\n if (!matches) return false\n const year: number = +matches[1]\n const month: number = +matches[2]\n const day: number = +matches[3]\n return (\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month])\n )\n}\n\nfunction compareDate(d1: string, d2: string): number | undefined {\n if (!(d1 && d2)) return undefined\n if (d1 > d2) return 1\n if (d1 < d2) return -1\n return 0\n}\n\nconst TIME = /^(\\d\\d):(\\d\\d):(\\d\\d(?:\\.\\d+)?)(z|([+-])(\\d\\d)(?::?(\\d\\d))?)?$/i\n\nfunction getTime(strictTimeZone?: boolean): (str: string) => boolean {\n return function time(str: string): boolean {\n const matches: string[] | null = TIME.exec(str)\n if (!matches) return false\n const hr: number = +matches[1]\n const min: number = +matches[2]\n const sec: number = +matches[3]\n const tz: string | undefined = matches[4]\n const tzSign: number = matches[5] === \"-\" ? -1 : 1\n const tzH: number = +(matches[6] || 0)\n const tzM: number = +(matches[7] || 0)\n if (tzH > 23 || tzM > 59 || (strictTimeZone && !tz)) return false\n if (hr <= 23 && min <= 59 && sec < 60) return true\n // leap second\n const utcMin = min - tzM * tzSign\n const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0)\n return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61\n }\n}\n\nfunction compareTime(s1: string, s2: string): number | undefined {\n if (!(s1 && s2)) return undefined\n const t1 = new Date(\"2020-01-01T\" + s1).valueOf()\n const t2 = new Date(\"2020-01-01T\" + s2).valueOf()\n if (!(t1 && t2)) return undefined\n return t1 - t2\n}\n\nfunction compareIsoTime(t1: string, t2: string): number | undefined {\n if (!(t1 && t2)) return undefined\n const a1 = TIME.exec(t1)\n const a2 = TIME.exec(t2)\n if (!(a1 && a2)) return undefined\n t1 = a1[1] + a1[2] + a1[3]\n t2 = a2[1] + a2[2] + a2[3]\n if (t1 > t2) return 1\n if (t1 < t2) return -1\n return 0\n}\n\nconst DATE_TIME_SEPARATOR = /t|\\s/i\nfunction getDateTime(strictTimeZone?: boolean): (str: string) => boolean {\n const time = getTime(strictTimeZone)\n\n return function date_time(str: string): boolean {\n // http://tools.ietf.org/html/rfc3339#section-5.6\n const dateTime: string[] = str.split(DATE_TIME_SEPARATOR)\n return dateTime.length === 2 && date(dateTime[0]) && time(dateTime[1])\n }\n}\n\nfunction compareDateTime(dt1: string, dt2: string): number | undefined {\n if (!(dt1 && dt2)) return undefined\n const d1 = new Date(dt1).valueOf()\n const d2 = new Date(dt2).valueOf()\n if (!(d1 && d2)) return undefined\n return d1 - d2\n}\n\nfunction compareIsoDateTime(dt1: string, dt2: string): number | undefined {\n if (!(dt1 && dt2)) return undefined\n const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR)\n const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR)\n const res = compareDate(d1, d2)\n if (res === undefined) return undefined\n return res || compareTime(t1, t2)\n}\n\nconst NOT_URI_FRAGMENT = /\\/|:/\nconst URI =\n /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\\?(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i\n\nfunction uri(str: string): boolean {\n // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n return NOT_URI_FRAGMENT.test(str) && URI.test(str)\n}\n\nconst BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm\n\nfunction byte(str: string): boolean {\n BYTE.lastIndex = 0\n return BYTE.test(str)\n}\n\nconst MIN_INT32 = -(2 ** 31)\nconst MAX_INT32 = 2 ** 31 - 1\n\nfunction validateInt32(value: number): boolean {\n return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32\n}\n\nfunction validateInt64(value: number): boolean {\n // JSON and javascript max Int is 2**53, so any int that passes isInteger is valid for Int64\n return Number.isInteger(value)\n}\n\nfunction validateNumber(): boolean {\n return true\n}\n\nconst Z_ANCHOR = /[^\\\\]\\\\Z/\nfunction regex(str: string): boolean {\n if (Z_ANCHOR.test(str)) return false\n try {\n new RegExp(str)\n return true\n } catch (e) {\n return false\n }\n}\n","import type Ajv from \"ajv\"\nimport type {\n Plugin,\n CodeKeywordDefinition,\n KeywordErrorDefinition,\n Code,\n Name,\n ErrorObject,\n} from \"ajv\"\nimport type {AddedFormat} from \"ajv/dist/types\"\nimport type {Rule} from \"ajv/dist/compile/rules\"\nimport {KeywordCxt} from \"ajv\"\nimport {_, str, or, getProperty, operators} from \"ajv/dist/compile/codegen\"\n\ntype Kwd = \"formatMaximum\" | \"formatMinimum\" | \"formatExclusiveMaximum\" | \"formatExclusiveMinimum\"\n\ntype Comparison = \"<=\" | \">=\" | \"<\" | \">\"\n\nconst ops = operators\n\nconst KWDs: {[K in Kwd]: {okStr: Comparison; ok: Code; fail: Code}} = {\n formatMaximum: {okStr: \"<=\", ok: ops.LTE, fail: ops.GT},\n formatMinimum: {okStr: \">=\", ok: ops.GTE, fail: ops.LT},\n formatExclusiveMaximum: {okStr: \"<\", ok: ops.LT, fail: ops.GTE},\n formatExclusiveMinimum: {okStr: \">\", ok: ops.GT, fail: ops.LTE},\n}\n\nexport type LimitFormatError = ErrorObject<Kwd, {limit: string; comparison: Comparison}>\n\nconst error: KeywordErrorDefinition = {\n message: ({keyword, schemaCode}) => str`should be ${KWDs[keyword as Kwd].okStr} ${schemaCode}`,\n params: ({keyword, schemaCode}) =>\n _`{comparison: ${KWDs[keyword as Kwd].okStr}, limit: ${schemaCode}}`,\n}\n\nexport const formatLimitDefinition: CodeKeywordDefinition = {\n keyword: Object.keys(KWDs),\n type: \"string\",\n schemaType: \"string\",\n $data: true,\n error,\n code(cxt) {\n const {gen, data, schemaCode, keyword, it} = cxt\n const {opts, self} = it\n if (!opts.validateFormats) return\n\n const fCxt = new KeywordCxt(it, (self.RULES.all.format as Rule).definition, \"format\")\n if (fCxt.$data) validate$DataFormat()\n else validateFormat()\n\n function validate$DataFormat(): void {\n const fmts = gen.scopeValue(\"formats\", {\n ref: self.formats,\n code: opts.code.formats,\n })\n const fmt = gen.const(\"fmt\", _`${fmts}[${fCxt.schemaCode}]`)\n cxt.fail$data(\n or(\n _`typeof ${fmt} != \"object\"`,\n _`${fmt} instanceof RegExp`,\n _`typeof ${fmt}.compare != \"function\"`,\n compareCode(fmt)\n )\n )\n }\n\n function validateFormat(): void {\n const format = fCxt.schema as string\n const fmtDef: AddedFormat | undefined = self.formats[format]\n if (!fmtDef || fmtDef === true) return\n if (\n typeof fmtDef != \"object\" ||\n fmtDef instanceof RegExp ||\n typeof fmtDef.compare != \"function\"\n ) {\n throw new Error(`\"${keyword}\": format \"${format}\" does not define \"compare\" function`)\n }\n const fmt = gen.scopeValue(\"formats\", {\n key: format,\n ref: fmtDef,\n code: opts.code.formats ? _`${opts.code.formats}${getProperty(format)}` : undefined,\n })\n\n cxt.fail$data(compareCode(fmt))\n }\n\n function compareCode(fmt: Name): Code {\n return _`${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword as Kwd].fail} 0`\n }\n },\n dependencies: [\"format\"],\n}\n\nconst formatLimitPlugin: Plugin<undefined> = (ajv: Ajv): Ajv => {\n ajv.addKeyword(formatLimitDefinition)\n return ajv\n}\n\nexport default formatLimitPlugin\n","import {\n DefinedFormats,\n FormatMode,\n FormatName,\n formatNames,\n fastFormats,\n fullFormats,\n} from \"./formats\"\nimport formatLimit from \"./limit\"\nimport type Ajv from \"ajv\"\nimport type {Plugin, Format} from \"ajv\"\nimport {_, Name} from \"ajv/dist/compile/codegen\"\n\nexport {FormatMode, FormatName} from \"./formats\"\nexport {LimitFormatError} from \"./limit\"\nexport interface FormatOptions {\n mode?: FormatMode\n formats?: FormatName[]\n keywords?: boolean\n}\n\nexport type FormatsPluginOptions = FormatName[] | FormatOptions\n\nexport interface FormatsPlugin extends Plugin<FormatsPluginOptions> {\n get: (format: FormatName, mode?: FormatMode) => Format\n}\n\nconst fullName = new Name(\"fullFormats\")\nconst fastName = new Name(\"fastFormats\")\n\nconst formatsPlugin: FormatsPlugin = (\n ajv: Ajv,\n opts: FormatsPluginOptions = {keywords: true}\n): Ajv => {\n if (Array.isArray(opts)) {\n addFormats(ajv, opts, fullFormats, fullName)\n return ajv\n }\n const [formats, exportName] =\n opts.mode === \"fast\" ? [fastFormats, fastName] : [fullFormats, fullName]\n const list = opts.formats || formatNames\n addFormats(ajv, list, formats, exportName)\n if (opts.keywords) formatLimit(ajv)\n return ajv\n}\n\nformatsPlugin.get = (name: FormatName, mode: FormatMode = \"full\"): Format => {\n const formats = mode === \"fast\" ? fastFormats : fullFormats\n const f = formats[name]\n if (!f) throw new Error(`Unknown format \"${name}\"`)\n return f\n}\n\nfunction addFormats(ajv: Ajv, list: FormatName[], fs: DefinedFormats, exportName: Name): void {\n ajv.opts.code.formats ??= _`require(\"ajv-formats/dist/formats\").${exportName}`\n for (const f of list) ajv.addFormat(f, fs[f])\n}\n\nmodule.exports = exports = formatsPlugin\nObject.defineProperty(exports, \"__esModule\", {value: true})\n\nexport default formatsPlugin\n","import { randomBytes } from \"node:crypto\";\n\nimport { startServer } from \"./server.js\";\nimport { loadConfig } from \"./config.js\";\n\ntype ParsedArgs = {\n http: boolean;\n port: number;\n host: string;\n dataDir?: string;\n config?: string;\n help: boolean;\n};\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = {\n http: false,\n port: 3000,\n host: \"127.0.0.1\",\n help: false,\n };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n switch (a) {\n case \"--http\":\n out.http = true;\n break;\n case \"--port\":\n out.port = Number(argv[++i] ?? \"3000\");\n break;\n case \"--host\":\n out.host = String(argv[++i] ?? \"127.0.0.1\");\n break;\n case \"--data-dir\":\n out.dataDir = String(argv[++i] ?? \"\");\n break;\n case \"--config\":\n out.config = String(argv[++i] ?? \"\");\n break;\n case \"-h\":\n case \"--help\":\n out.help = true;\n break;\n default:\n if (a && a.startsWith(\"--\")) {\n // ignore unknown flags rather than crashing — keeps the CLI forgiving\n // when embedded in MCP host configs.\n }\n }\n }\n return out;\n}\n\nfunction printHelp(): void {\n const msg = `hypermail-mcp — unified email MCP server\n\nUsage:\n hypermail-mcp [options]\n\nOptions:\n --http Run as Streamable HTTP server (default: stdio)\n --port <n> HTTP port (default: 3000)\n --host <addr> HTTP bind address (default: 127.0.0.1)\n --data-dir <path> Where to store the encrypted accounts file\n (default: $HYPERMAIL_MCP_DATA_DIR or ~/.hypermail-mcp)\n --config <path> Path to hypermail-config.json\n -h, --help Show this help\n\nConfiguration:\n All settings can be provided via environment variables — no config file\n required. Use hypermail-config.json for advanced scenarios.\n\n Environment variables:\n\n HYPERMAIL_MCP_DATA_DIR Data directory (string)\n HYPERMAIL_HTTP_ENABLED Enable HTTP mode (bool: true/false/1/0)\n HYPERMAIL_HTTP_PORT HTTP port (number)\n HYPERMAIL_HTTP_HOST HTTP bind address (string)\n HYPERMAIL_TOOLS_DISABLED Comma-separated tool names to disable\n HYPERMAIL_TOOLS_ENABLED Comma-separated tool names to enable\n HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID Outlook OAuth client ID (string)\n HYPERMAIL_PROVIDERS_OUTLOOK_TENANT_ID Outlook tenant ID (string)\n HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID Gmail OAuth client ID (string)\n HYPERMAIL_PROVIDERS_GMAIL_CLIENT_SECRET Gmail OAuth client secret (string)\n HYPERMAIL_WATCH_ENABLED Enable inbox polling (bool)\n HYPERMAIL_WATCH_POLL_INTERVAL Poll interval in seconds (number)\n HYPERMAIL_WATCH_WEBHOOK_URL Webhook URL for new-email events (string)\n HYPERMAIL_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS Retry max attempts (number)\n HYPERMAIL_WATCH_WEBHOOK_RETRY_BASE_DELAY_MS Retry base delay ms (number)\n HYPERMAIL_MCP_KEY Encryption master key (hex or base64)\n\n Priority: CLI flags > config file > env vars > defaults.\n\n Example (env-only, no config file):\n HYPERMAIL_HTTP_ENABLED=true \\\\\n HYPERMAIL_HTTP_PORT=8080 \\\\\n HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID=abc123 \\\\\n HYPERMAIL_PROVIDERS_OUTLOOK_TENANT_ID=common \\\\\n HYPERMAIL_MCP_DATA_DIR=/data/hypermail \\\\\n hypermail-mcp --http\n\n Example hypermail-config.json:\n {\n \"dataDir\": \"/path/to/data\",\n \"http\": { \"enabled\": false },\n \"tools\": { \"disabled\": [\"send_email\"] },\n \"providers\": {\n \"outlook\": {\n \"clientId\": \"\\${HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID}\",\n \"tenantId\": \"\\${HYPERMAIL_PROVIDERS_OUTLOOK_TENANT_ID}\"\n },\n \"gmail\": {\n \"clientId\": \"\\${HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID}\",\n \"clientSecret\": \"\\${HYPERMAIL_PROVIDERS_GMAIL_CLIENT_SECRET}\"\n }\n }\n }\n`;\n process.stdout.write(msg);\n}\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n\n // Subcommand: generate-key\n if (rawArgs[0] === \"generate-key\") {\n const key = `hm_sk_${randomBytes(32).toString(\"hex\")}`;\n process.stdout.write(key + \"\\n\");\n return;\n }\n\n const opts = parseArgs(rawArgs);\n if (opts.help) {\n printHelp();\n return;\n }\n\n const config = loadConfig(opts.config, {\n http: opts.http,\n port: opts.port,\n host: opts.host,\n dataDir: opts.dataDir,\n });\n\n await startServer({ config });\n}\n\nmain().catch((err) => {\n // eslint-disable-next-line no-console\n console.error(\"[hypermail-mcp] fatal:\", err);\n process.exit(1);\n});\n",null,null,null,null,"export const ignoreOverride = Symbol(\"Let zodToJsonSchema decide on which parser to use\");\nexport const jsonDescription = (jsonSchema, def) => {\n if (def.description) {\n try {\n return {\n ...jsonSchema,\n ...JSON.parse(def.description),\n };\n }\n catch { }\n }\n return jsonSchema;\n};\nexport const defaultOptions = {\n name: undefined,\n $refStrategy: \"root\",\n basePath: [\"#\"],\n effectStrategy: \"input\",\n pipeStrategy: \"all\",\n dateStrategy: \"format:date-time\",\n mapStrategy: \"entries\",\n removeAdditionalStrategy: \"passthrough\",\n allowedAdditionalProperties: true,\n rejectedAdditionalProperties: false,\n definitionPath: \"definitions\",\n target: \"jsonSchema7\",\n strictUnions: false,\n definitions: {},\n errorMessages: false,\n markdownDescription: false,\n patternStrategy: \"escape\",\n applyRegexFlags: false,\n emailStrategy: \"format:email\",\n base64Strategy: \"contentEncoding:base64\",\n nameStrategy: \"ref\",\n openAiAnyTypeName: \"OpenAiAnyType\"\n};\nexport const getDefaultOptions = (options) => (typeof options === \"string\"\n ? {\n ...defaultOptions,\n name: options,\n }\n : {\n ...defaultOptions,\n ...options,\n });\n","import { getDefaultOptions } from \"./Options.js\";\nexport const getRefs = (options) => {\n const _options = getDefaultOptions(options);\n const currentPath = _options.name !== undefined\n ? [..._options.basePath, _options.definitionPath, _options.name]\n : _options.basePath;\n return {\n ..._options,\n flags: { hasReferencedOpenAiAnyType: false },\n currentPath: currentPath,\n propertyPath: undefined,\n seen: new Map(Object.entries(_options.definitions).map(([name, def]) => [\n def._def,\n {\n def: def._def,\n path: [..._options.basePath, _options.definitionPath, name],\n // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.\n jsonSchema: undefined,\n },\n ])),\n };\n};\n","export function addErrorMessage(res, key, errorMessage, refs) {\n if (!refs?.errorMessages)\n return;\n if (errorMessage) {\n res.errorMessage = {\n ...res.errorMessage,\n [key]: errorMessage,\n };\n }\n}\nexport function setResponseValueAndErrors(res, key, value, errorMessage, refs) {\n res[key] = value;\n addErrorMessage(res, key, errorMessage, refs);\n}\n","export const getRelativePath = (pathA, pathB) => {\n let i = 0;\n for (; i < pathA.length && i < pathB.length; i++) {\n if (pathA[i] !== pathB[i])\n break;\n }\n return [(pathA.length - i).toString(), ...pathB.slice(i)].join(\"/\");\n};\n","import { ZodFirstPartyTypeKind } from \"zod/v3\";\nimport { parseAnyDef } from \"./parsers/any.js\";\nimport { parseArrayDef } from \"./parsers/array.js\";\nimport { parseBigintDef } from \"./parsers/bigint.js\";\nimport { parseBooleanDef } from \"./parsers/boolean.js\";\nimport { parseBrandedDef } from \"./parsers/branded.js\";\nimport { parseCatchDef } from \"./parsers/catch.js\";\nimport { parseDateDef } from \"./parsers/date.js\";\nimport { parseDefaultDef } from \"./parsers/default.js\";\nimport { parseEffectsDef } from \"./parsers/effects.js\";\nimport { parseEnumDef } from \"./parsers/enum.js\";\nimport { parseIntersectionDef } from \"./parsers/intersection.js\";\nimport { parseLiteralDef } from \"./parsers/literal.js\";\nimport { parseMapDef } from \"./parsers/map.js\";\nimport { parseNativeEnumDef } from \"./parsers/nativeEnum.js\";\nimport { parseNeverDef } from \"./parsers/never.js\";\nimport { parseNullDef } from \"./parsers/null.js\";\nimport { parseNullableDef } from \"./parsers/nullable.js\";\nimport { parseNumberDef } from \"./parsers/number.js\";\nimport { parseObjectDef } from \"./parsers/object.js\";\nimport { parseOptionalDef } from \"./parsers/optional.js\";\nimport { parsePipelineDef } from \"./parsers/pipeline.js\";\nimport { parsePromiseDef } from \"./parsers/promise.js\";\nimport { parseRecordDef } from \"./parsers/record.js\";\nimport { parseSetDef } from \"./parsers/set.js\";\nimport { parseStringDef } from \"./parsers/string.js\";\nimport { parseTupleDef } from \"./parsers/tuple.js\";\nimport { parseUndefinedDef } from \"./parsers/undefined.js\";\nimport { parseUnionDef } from \"./parsers/union.js\";\nimport { parseUnknownDef } from \"./parsers/unknown.js\";\nimport { parseReadonlyDef } from \"./parsers/readonly.js\";\nexport const selectParser = (def, typeName, refs) => {\n switch (typeName) {\n case ZodFirstPartyTypeKind.ZodString:\n return parseStringDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNumber:\n return parseNumberDef(def, refs);\n case ZodFirstPartyTypeKind.ZodObject:\n return parseObjectDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBigInt:\n return parseBigintDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBoolean:\n return parseBooleanDef();\n case ZodFirstPartyTypeKind.ZodDate:\n return parseDateDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUndefined:\n return parseUndefinedDef(refs);\n case ZodFirstPartyTypeKind.ZodNull:\n return parseNullDef(refs);\n case ZodFirstPartyTypeKind.ZodArray:\n return parseArrayDef(def, refs);\n case ZodFirstPartyTypeKind.ZodUnion:\n case ZodFirstPartyTypeKind.ZodDiscriminatedUnion:\n return parseUnionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodIntersection:\n return parseIntersectionDef(def, refs);\n case ZodFirstPartyTypeKind.ZodTuple:\n return parseTupleDef(def, refs);\n case ZodFirstPartyTypeKind.ZodRecord:\n return parseRecordDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLiteral:\n return parseLiteralDef(def, refs);\n case ZodFirstPartyTypeKind.ZodEnum:\n return parseEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNativeEnum:\n return parseNativeEnumDef(def);\n case ZodFirstPartyTypeKind.ZodNullable:\n return parseNullableDef(def, refs);\n case ZodFirstPartyTypeKind.ZodOptional:\n return parseOptionalDef(def, refs);\n case ZodFirstPartyTypeKind.ZodMap:\n return parseMapDef(def, refs);\n case ZodFirstPartyTypeKind.ZodSet:\n return parseSetDef(def, refs);\n case ZodFirstPartyTypeKind.ZodLazy:\n return () => def.getter()._def;\n case ZodFirstPartyTypeKind.ZodPromise:\n return parsePromiseDef(def, refs);\n case ZodFirstPartyTypeKind.ZodNaN:\n case ZodFirstPartyTypeKind.ZodNever:\n return parseNeverDef(refs);\n case ZodFirstPartyTypeKind.ZodEffects:\n return parseEffectsDef(def, refs);\n case ZodFirstPartyTypeKind.ZodAny:\n return parseAnyDef(refs);\n case ZodFirstPartyTypeKind.ZodUnknown:\n return parseUnknownDef(refs);\n case ZodFirstPartyTypeKind.ZodDefault:\n return parseDefaultDef(def, refs);\n case ZodFirstPartyTypeKind.ZodBranded:\n return parseBrandedDef(def, refs);\n case ZodFirstPartyTypeKind.ZodReadonly:\n return parseReadonlyDef(def, refs);\n case ZodFirstPartyTypeKind.ZodCatch:\n return parseCatchDef(def, refs);\n case ZodFirstPartyTypeKind.ZodPipeline:\n return parsePipelineDef(def, refs);\n case ZodFirstPartyTypeKind.ZodFunction:\n case ZodFirstPartyTypeKind.ZodVoid:\n case ZodFirstPartyTypeKind.ZodSymbol:\n return undefined;\n default:\n return ((_) => undefined)(typeName);\n }\n};\n","import { getRelativePath } from \"../getRelativePath.js\";\nexport function parseAnyDef(refs) {\n if (refs.target !== \"openAi\") {\n return {};\n }\n const anyDefinitionPath = [\n ...refs.basePath,\n refs.definitionPath,\n refs.openAiAnyTypeName,\n ];\n refs.flags.hasReferencedOpenAiAnyType = true;\n return {\n $ref: refs.$refStrategy === \"relative\"\n ? getRelativePath(anyDefinitionPath, refs.currentPath)\n : anyDefinitionPath.join(\"/\"),\n };\n}\n","import { ZodFirstPartyTypeKind } from \"zod/v3\";\nimport { setResponseValueAndErrors } from \"../errorMessages.js\";\nimport { parseDef } from \"../parseDef.js\";\nexport function parseArrayDef(def, refs) {\n const res = {\n type: \"array\",\n };\n if (def.type?._def &&\n def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny) {\n res.items = parseDef(def.type._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"],\n });\n }\n if (def.minLength) {\n setResponseValueAndErrors(res, \"minItems\", def.minLength.value, def.minLength.message, refs);\n }\n if (def.maxLength) {\n setResponseValueAndErrors(res, \"maxItems\", def.maxLength.value, def.maxLength.message, refs);\n }\n if (def.exactLength) {\n setResponseValueAndErrors(res, \"minItems\", def.exactLength.value, def.exactLength.message, refs);\n setResponseValueAndErrors(res, \"maxItems\", def.exactLength.value, def.exactLength.message, refs);\n }\n return res;\n}\n","import { setResponseValueAndErrors } from \"../errorMessages.js\";\nexport function parseBigintDef(def, refs) {\n const res = {\n type: \"integer\",\n format: \"int64\",\n };\n if (!def.checks)\n return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n if (refs.target === \"jsonSchema7\") {\n if (check.inclusive) {\n setResponseValueAndErrors(res, \"minimum\", check.value, check.message, refs);\n }\n else {\n setResponseValueAndErrors(res, \"exclusiveMinimum\", check.value, check.message, refs);\n }\n }\n else {\n if (!check.inclusive) {\n res.exclusiveMinimum = true;\n }\n setResponseValueAndErrors(res, \"minimum\", check.value, check.message, refs);\n }\n break;\n case \"max\":\n if (refs.target === \"jsonSchema7\") {\n if (check.inclusive) {\n setResponseValueAndErrors(res, \"maximum\", check.value, check.message, refs);\n }\n else {\n setResponseValueAndErrors(res, \"exclusiveMaximum\", check.value, check.message, refs);\n }\n }\n else {\n if (!check.inclusive) {\n res.exclusiveMaximum = true;\n }\n setResponseValueAndErrors(res, \"maximum\", check.value, check.message, refs);\n }\n break;\n case \"multipleOf\":\n setResponseValueAndErrors(res, \"multipleOf\", check.value, check.message, refs);\n break;\n }\n }\n return res;\n}\n","export function parseBooleanDef() {\n return {\n type: \"boolean\",\n };\n}\n","import { parseDef } from \"../parseDef.js\";\nexport function parseBrandedDef(_def, refs) {\n return parseDef(_def.type._def, refs);\n}\n","import { parseDef } from \"../parseDef.js\";\nexport const parseCatchDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n","import { setResponseValueAndErrors } from \"../errorMessages.js\";\nexport function parseDateDef(def, refs, overrideDateStrategy) {\n const strategy = overrideDateStrategy ?? refs.dateStrategy;\n if (Array.isArray(strategy)) {\n return {\n anyOf: strategy.map((item, i) => parseDateDef(def, refs, item)),\n };\n }\n switch (strategy) {\n case \"string\":\n case \"format:date-time\":\n return {\n type: \"string\",\n format: \"date-time\",\n };\n case \"format:date\":\n return {\n type: \"string\",\n format: \"date\",\n };\n case \"integer\":\n return integerDateParser(def, refs);\n }\n}\nconst integerDateParser = (def, refs) => {\n const res = {\n type: \"integer\",\n format: \"unix-time\",\n };\n if (refs.target === \"openApi3\") {\n return res;\n }\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n setResponseValueAndErrors(res, \"minimum\", check.value, // This is in milliseconds\n check.message, refs);\n break;\n case \"max\":\n setResponseValueAndErrors(res, \"maximum\", check.value, // This is in milliseconds\n check.message, refs);\n break;\n }\n }\n return res;\n};\n","import { parseDef } from \"../parseDef.js\";\nexport function parseDefaultDef(_def, refs) {\n return {\n ...parseDef(_def.innerType._def, refs),\n default: _def.defaultValue(),\n };\n}\n","import { parseDef } from \"../parseDef.js\";\nimport { parseAnyDef } from \"./any.js\";\nexport function parseEffectsDef(_def, refs) {\n return refs.effectStrategy === \"input\"\n ? parseDef(_def.schema._def, refs)\n : parseAnyDef(refs);\n}\n","export function parseEnumDef(def) {\n return {\n type: \"string\",\n enum: Array.from(def.values),\n };\n}\n","import { parseDef } from \"../parseDef.js\";\nconst isJsonSchema7AllOfType = (type) => {\n if (\"type\" in type && type.type === \"string\")\n return false;\n return \"allOf\" in type;\n};\nexport function parseIntersectionDef(def, refs) {\n const allOf = [\n parseDef(def.left._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"],\n }),\n parseDef(def.right._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"1\"],\n }),\n ].filter((x) => !!x);\n let unevaluatedProperties = refs.target === \"jsonSchema2019-09\"\n ? { unevaluatedProperties: false }\n : undefined;\n const mergedAllOf = [];\n // If either of the schemas is an allOf, merge them into a single allOf\n allOf.forEach((schema) => {\n if (isJsonSchema7AllOfType(schema)) {\n mergedAllOf.push(...schema.allOf);\n if (schema.unevaluatedProperties === undefined) {\n // If one of the schemas has no unevaluatedProperties set,\n // the merged schema should also have no unevaluatedProperties set\n unevaluatedProperties = undefined;\n }\n }\n else {\n let nestedSchema = schema;\n if (\"additionalProperties\" in schema &&\n schema.additionalProperties === false) {\n const { additionalProperties, ...rest } = schema;\n nestedSchema = rest;\n }\n else {\n // As soon as one of the schemas has additionalProperties set not to false, we allow unevaluatedProperties\n unevaluatedProperties = undefined;\n }\n mergedAllOf.push(nestedSchema);\n }\n });\n return mergedAllOf.length\n ? {\n allOf: mergedAllOf,\n ...unevaluatedProperties,\n }\n : undefined;\n}\n","export function parseLiteralDef(def, refs) {\n const parsedType = typeof def.value;\n if (parsedType !== \"bigint\" &&\n parsedType !== \"number\" &&\n parsedType !== \"boolean\" &&\n parsedType !== \"string\") {\n return {\n type: Array.isArray(def.value) ? \"array\" : \"object\",\n };\n }\n if (refs.target === \"openApi3\") {\n return {\n type: parsedType === \"bigint\" ? \"integer\" : parsedType,\n enum: [def.value],\n };\n }\n return {\n type: parsedType === \"bigint\" ? \"integer\" : parsedType,\n const: def.value,\n };\n}\n","import { ZodFirstPartyTypeKind, } from \"zod/v3\";\nimport { parseDef } from \"../parseDef.js\";\nimport { parseStringDef } from \"./string.js\";\nimport { parseBrandedDef } from \"./branded.js\";\nimport { parseAnyDef } from \"./any.js\";\nexport function parseRecordDef(def, refs) {\n if (refs.target === \"openAi\") {\n console.warn(\"Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.\");\n }\n if (refs.target === \"openApi3\" &&\n def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) {\n return {\n type: \"object\",\n required: def.keyType._def.values,\n properties: def.keyType._def.values.reduce((acc, key) => ({\n ...acc,\n [key]: parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", key],\n }) ?? parseAnyDef(refs),\n }), {}),\n additionalProperties: refs.rejectedAdditionalProperties,\n };\n }\n const schema = {\n type: \"object\",\n additionalProperties: parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"],\n }) ?? refs.allowedAdditionalProperties,\n };\n if (refs.target === \"openApi3\") {\n return schema;\n }\n if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.checks?.length) {\n const { type, ...keyType } = parseStringDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType,\n };\n }\n else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodEnum) {\n return {\n ...schema,\n propertyNames: {\n enum: def.keyType._def.values,\n },\n };\n }\n else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind.ZodBranded &&\n def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind.ZodString &&\n def.keyType._def.type._def.checks?.length) {\n const { type, ...keyType } = parseBrandedDef(def.keyType._def, refs);\n return {\n ...schema,\n propertyNames: keyType,\n };\n }\n return schema;\n}\n","import { setResponseValueAndErrors } from \"../errorMessages.js\";\nlet emojiRegex = undefined;\n/**\n * Generated from the regular expressions found here as of 2024-05-22:\n * https://github.com/colinhacks/zod/blob/master/src/types.ts.\n *\n * Expressions with /i flag have been changed accordingly.\n */\nexport const zodPatterns = {\n /**\n * `c` was changed to `[cC]` to replicate /i flag\n */\n cuid: /^[cC][^\\s-]{8,}$/,\n cuid2: /^[0-9a-z]+$/,\n ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,\n /**\n * `a-z` was added to replicate /i flag\n */\n email: /^(?!\\.)(?!.*\\.\\.)([a-zA-Z0-9_'+\\-\\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+[a-zA-Z]{2,}$/,\n /**\n * Constructed a valid Unicode RegExp\n *\n * Lazily instantiate since this type of regex isn't supported\n * in all envs (e.g. React Native).\n *\n * See:\n * https://github.com/colinhacks/zod/issues/2433\n * Fix in Zod:\n * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b\n */\n emoji: () => {\n if (emojiRegex === undefined) {\n emojiRegex = RegExp(\"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\", \"u\");\n }\n return emojiRegex;\n },\n /**\n * Unused\n */\n uuid: /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/,\n /**\n * Unused\n */\n ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,\n ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/,\n /**\n * Unused\n */\n ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,\n ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,\n base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,\n base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,\n nanoid: /^[a-zA-Z0-9_-]{21}$/,\n jwt: /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/,\n};\nexport function parseStringDef(def, refs) {\n const res = {\n type: \"string\",\n };\n if (def.checks) {\n for (const check of def.checks) {\n switch (check.kind) {\n case \"min\":\n setResponseValueAndErrors(res, \"minLength\", typeof res.minLength === \"number\"\n ? Math.max(res.minLength, check.value)\n : check.value, check.message, refs);\n break;\n case \"max\":\n setResponseValueAndErrors(res, \"maxLength\", typeof res.maxLength === \"number\"\n ? Math.min(res.maxLength, check.value)\n : check.value, check.message, refs);\n break;\n case \"email\":\n switch (refs.emailStrategy) {\n case \"format:email\":\n addFormat(res, \"email\", check.message, refs);\n break;\n case \"format:idn-email\":\n addFormat(res, \"idn-email\", check.message, refs);\n break;\n case \"pattern:zod\":\n addPattern(res, zodPatterns.email, check.message, refs);\n break;\n }\n break;\n case \"url\":\n addFormat(res, \"uri\", check.message, refs);\n break;\n case \"uuid\":\n addFormat(res, \"uuid\", check.message, refs);\n break;\n case \"regex\":\n addPattern(res, check.regex, check.message, refs);\n break;\n case \"cuid\":\n addPattern(res, zodPatterns.cuid, check.message, refs);\n break;\n case \"cuid2\":\n addPattern(res, zodPatterns.cuid2, check.message, refs);\n break;\n case \"startsWith\":\n addPattern(res, RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`), check.message, refs);\n break;\n case \"endsWith\":\n addPattern(res, RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`), check.message, refs);\n break;\n case \"datetime\":\n addFormat(res, \"date-time\", check.message, refs);\n break;\n case \"date\":\n addFormat(res, \"date\", check.message, refs);\n break;\n case \"time\":\n addFormat(res, \"time\", check.message, refs);\n break;\n case \"duration\":\n addFormat(res, \"duration\", check.message, refs);\n break;\n case \"length\":\n setResponseValueAndErrors(res, \"minLength\", typeof res.minLength === \"number\"\n ? Math.max(res.minLength, check.value)\n : check.value, check.message, refs);\n setResponseValueAndErrors(res, \"maxLength\", typeof res.maxLength === \"number\"\n ? Math.min(res.maxLength, check.value)\n : check.value, check.message, refs);\n break;\n case \"includes\": {\n addPattern(res, RegExp(escapeLiteralCheckValue(check.value, refs)), check.message, refs);\n break;\n }\n case \"ip\": {\n if (check.version !== \"v6\") {\n addFormat(res, \"ipv4\", check.message, refs);\n }\n if (check.version !== \"v4\") {\n addFormat(res, \"ipv6\", check.message, refs);\n }\n break;\n }\n case \"base64url\":\n addPattern(res, zodPatterns.base64url, check.message, refs);\n break;\n case \"jwt\":\n addPattern(res, zodPatterns.jwt, check.message, refs);\n break;\n case \"cidr\": {\n if (check.version !== \"v6\") {\n addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);\n }\n if (check.version !== \"v4\") {\n addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);\n }\n break;\n }\n case \"emoji\":\n addPattern(res, zodPatterns.emoji(), check.message, refs);\n break;\n case \"ulid\": {\n addPattern(res, zodPatterns.ulid, check.message, refs);\n break;\n }\n case \"base64\": {\n switch (refs.base64Strategy) {\n case \"format:binary\": {\n addFormat(res, \"binary\", check.message, refs);\n break;\n }\n case \"contentEncoding:base64\": {\n setResponseValueAndErrors(res, \"contentEncoding\", \"base64\", check.message, refs);\n break;\n }\n case \"pattern:zod\": {\n addPattern(res, zodPatterns.base64, check.message, refs);\n break;\n }\n }\n break;\n }\n case \"nanoid\": {\n addPattern(res, zodPatterns.nanoid, check.message, refs);\n }\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"trim\":\n break;\n default:\n ((_) => { })(check);\n }\n }\n }\n return res;\n}\nfunction escapeLiteralCheckValue(literal, refs) {\n return refs.patternStrategy === \"escape\"\n ? escapeNonAlphaNumeric(literal)\n : literal;\n}\nconst ALPHA_NUMERIC = new Set(\"ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789\");\nfunction escapeNonAlphaNumeric(source) {\n let result = \"\";\n for (let i = 0; i < source.length; i++) {\n if (!ALPHA_NUMERIC.has(source[i])) {\n result += \"\\\\\";\n }\n result += source[i];\n }\n return result;\n}\n// Adds a \"format\" keyword to the schema. If a format exists, both formats will be joined in an allOf-node, along with subsequent ones.\nfunction addFormat(schema, value, message, refs) {\n if (schema.format || schema.anyOf?.some((x) => x.format)) {\n if (!schema.anyOf) {\n schema.anyOf = [];\n }\n if (schema.format) {\n schema.anyOf.push({\n format: schema.format,\n ...(schema.errorMessage &&\n refs.errorMessages && {\n errorMessage: { format: schema.errorMessage.format },\n }),\n });\n delete schema.format;\n if (schema.errorMessage) {\n delete schema.errorMessage.format;\n if (Object.keys(schema.errorMessage).length === 0) {\n delete schema.errorMessage;\n }\n }\n }\n schema.anyOf.push({\n format: value,\n ...(message &&\n refs.errorMessages && { errorMessage: { format: message } }),\n });\n }\n else {\n setResponseValueAndErrors(schema, \"format\", value, message, refs);\n }\n}\n// Adds a \"pattern\" keyword to the schema. If a pattern exists, both patterns will be joined in an allOf-node, along with subsequent ones.\nfunction addPattern(schema, regex, message, refs) {\n if (schema.pattern || schema.allOf?.some((x) => x.pattern)) {\n if (!schema.allOf) {\n schema.allOf = [];\n }\n if (schema.pattern) {\n schema.allOf.push({\n pattern: schema.pattern,\n ...(schema.errorMessage &&\n refs.errorMessages && {\n errorMessage: { pattern: schema.errorMessage.pattern },\n }),\n });\n delete schema.pattern;\n if (schema.errorMessage) {\n delete schema.errorMessage.pattern;\n if (Object.keys(schema.errorMessage).length === 0) {\n delete schema.errorMessage;\n }\n }\n }\n schema.allOf.push({\n pattern: stringifyRegExpWithFlags(regex, refs),\n ...(message &&\n refs.errorMessages && { errorMessage: { pattern: message } }),\n });\n }\n else {\n setResponseValueAndErrors(schema, \"pattern\", stringifyRegExpWithFlags(regex, refs), message, refs);\n }\n}\n// Mutate z.string.regex() in a best attempt to accommodate for regex flags when applyRegexFlags is true\nfunction stringifyRegExpWithFlags(regex, refs) {\n if (!refs.applyRegexFlags || !regex.flags) {\n return regex.source;\n }\n // Currently handled flags\n const flags = {\n i: regex.flags.includes(\"i\"),\n m: regex.flags.includes(\"m\"),\n s: regex.flags.includes(\"s\"), // `.` matches newlines\n };\n // The general principle here is to step through each character, one at a time, applying mutations as flags require. We keep track when the current character is escaped, and when it's inside a group /like [this]/ or (also) a range like /[a-z]/. The following is fairly brittle imperative code; edit at your peril!\n const source = flags.i ? regex.source.toLowerCase() : regex.source;\n let pattern = \"\";\n let isEscaped = false;\n let inCharGroup = false;\n let inCharRange = false;\n for (let i = 0; i < source.length; i++) {\n if (isEscaped) {\n pattern += source[i];\n isEscaped = false;\n continue;\n }\n if (flags.i) {\n if (inCharGroup) {\n if (source[i].match(/[a-z]/)) {\n if (inCharRange) {\n pattern += source[i];\n pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();\n inCharRange = false;\n }\n else if (source[i + 1] === \"-\" && source[i + 2]?.match(/[a-z]/)) {\n pattern += source[i];\n inCharRange = true;\n }\n else {\n pattern += `${source[i]}${source[i].toUpperCase()}`;\n }\n continue;\n }\n }\n else if (source[i].match(/[a-z]/)) {\n pattern += `[${source[i]}${source[i].toUpperCase()}]`;\n continue;\n }\n }\n if (flags.m) {\n if (source[i] === \"^\") {\n pattern += `(^|(?<=[\\r\\n]))`;\n continue;\n }\n else if (source[i] === \"$\") {\n pattern += `($|(?=[\\r\\n]))`;\n continue;\n }\n }\n if (flags.s && source[i] === \".\") {\n pattern += inCharGroup ? `${source[i]}\\r\\n` : `[${source[i]}\\r\\n]`;\n continue;\n }\n pattern += source[i];\n if (source[i] === \"\\\\\") {\n isEscaped = true;\n }\n else if (inCharGroup && source[i] === \"]\") {\n inCharGroup = false;\n }\n else if (!inCharGroup && source[i] === \"[\") {\n inCharGroup = true;\n }\n }\n try {\n new RegExp(pattern);\n }\n catch {\n console.warn(`Could not convert regex pattern at ${refs.currentPath.join(\"/\")} to a flag-independent form! Falling back to the flag-ignorant source`);\n return regex.source;\n }\n return pattern;\n}\n","import { parseDef } from \"../parseDef.js\";\nimport { parseRecordDef } from \"./record.js\";\nimport { parseAnyDef } from \"./any.js\";\nexport function parseMapDef(def, refs) {\n if (refs.mapStrategy === \"record\") {\n return parseRecordDef(def, refs);\n }\n const keys = parseDef(def.keyType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"0\"],\n }) || parseAnyDef(refs);\n const values = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", \"items\", \"1\"],\n }) || parseAnyDef(refs);\n return {\n type: \"array\",\n maxItems: 125,\n items: {\n type: \"array\",\n items: [keys, values],\n minItems: 2,\n maxItems: 2,\n },\n };\n}\n","export function parseNativeEnumDef(def) {\n const object = def.values;\n const actualKeys = Object.keys(def.values).filter((key) => {\n return typeof object[object[key]] !== \"number\";\n });\n const actualValues = actualKeys.map((key) => object[key]);\n const parsedTypes = Array.from(new Set(actualValues.map((values) => typeof values)));\n return {\n type: parsedTypes.length === 1\n ? parsedTypes[0] === \"string\"\n ? \"string\"\n : \"number\"\n : [\"string\", \"number\"],\n enum: actualValues,\n };\n}\n","import { parseAnyDef } from \"./any.js\";\nexport function parseNeverDef(refs) {\n return refs.target === \"openAi\"\n ? undefined\n : {\n not: parseAnyDef({\n ...refs,\n currentPath: [...refs.currentPath, \"not\"],\n }),\n };\n}\n","export function parseNullDef(refs) {\n return refs.target === \"openApi3\"\n ? {\n enum: [\"null\"],\n nullable: true,\n }\n : {\n type: \"null\",\n };\n}\n","import { parseDef } from \"../parseDef.js\";\nexport const primitiveMappings = {\n ZodString: \"string\",\n ZodNumber: \"number\",\n ZodBigInt: \"integer\",\n ZodBoolean: \"boolean\",\n ZodNull: \"null\",\n};\nexport function parseUnionDef(def, refs) {\n if (refs.target === \"openApi3\")\n return asAnyOf(def, refs);\n const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;\n // This blocks tries to look ahead a bit to produce nicer looking schemas with type array instead of anyOf.\n if (options.every((x) => x._def.typeName in primitiveMappings &&\n (!x._def.checks || !x._def.checks.length))) {\n // all types in union are primitive and lack checks, so might as well squash into {type: [...]}\n const types = options.reduce((types, x) => {\n const type = primitiveMappings[x._def.typeName]; //Can be safely casted due to row 43\n return type && !types.includes(type) ? [...types, type] : types;\n }, []);\n return {\n type: types.length > 1 ? types : types[0],\n };\n }\n else if (options.every((x) => x._def.typeName === \"ZodLiteral\" && !x.description)) {\n // all options literals\n const types = options.reduce((acc, x) => {\n const type = typeof x._def.value;\n switch (type) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n return [...acc, type];\n case \"bigint\":\n return [...acc, \"integer\"];\n case \"object\":\n if (x._def.value === null)\n return [...acc, \"null\"];\n case \"symbol\":\n case \"undefined\":\n case \"function\":\n default:\n return acc;\n }\n }, []);\n if (types.length === options.length) {\n // all the literals are primitive, as far as null can be considered primitive\n const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);\n return {\n type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],\n enum: options.reduce((acc, x) => {\n return acc.includes(x._def.value) ? acc : [...acc, x._def.value];\n }, []),\n };\n }\n }\n else if (options.every((x) => x._def.typeName === \"ZodEnum\")) {\n return {\n type: \"string\",\n enum: options.reduce((acc, x) => [\n ...acc,\n ...x._def.values.filter((x) => !acc.includes(x)),\n ], []),\n };\n }\n return asAnyOf(def, refs);\n}\nconst asAnyOf = (def, refs) => {\n const anyOf = (def.options instanceof Map\n ? Array.from(def.options.values())\n : def.options)\n .map((x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", `${i}`],\n }))\n .filter((x) => !!x &&\n (!refs.strictUnions ||\n (typeof x === \"object\" && Object.keys(x).length > 0)));\n return anyOf.length ? { anyOf } : undefined;\n};\n","import { parseDef } from \"../parseDef.js\";\nimport { primitiveMappings } from \"./union.js\";\nexport function parseNullableDef(def, refs) {\n if ([\"ZodString\", \"ZodNumber\", \"ZodBigInt\", \"ZodBoolean\", \"ZodNull\"].includes(def.innerType._def.typeName) &&\n (!def.innerType._def.checks || !def.innerType._def.checks.length)) {\n if (refs.target === \"openApi3\") {\n return {\n type: primitiveMappings[def.innerType._def.typeName],\n nullable: true,\n };\n }\n return {\n type: [\n primitiveMappings[def.innerType._def.typeName],\n \"null\",\n ],\n };\n }\n if (refs.target === \"openApi3\") {\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath],\n });\n if (base && \"$ref\" in base)\n return { allOf: [base], nullable: true };\n return base && { ...base, nullable: true };\n }\n const base = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"0\"],\n });\n return base && { anyOf: [base, { type: \"null\" }] };\n}\n","import { addErrorMessage, setResponseValueAndErrors, } from \"../errorMessages.js\";\nexport function parseNumberDef(def, refs) {\n const res = {\n type: \"number\",\n };\n if (!def.checks)\n return res;\n for (const check of def.checks) {\n switch (check.kind) {\n case \"int\":\n res.type = \"integer\";\n addErrorMessage(res, \"type\", check.message, refs);\n break;\n case \"min\":\n if (refs.target === \"jsonSchema7\") {\n if (check.inclusive) {\n setResponseValueAndErrors(res, \"minimum\", check.value, check.message, refs);\n }\n else {\n setResponseValueAndErrors(res, \"exclusiveMinimum\", check.value, check.message, refs);\n }\n }\n else {\n if (!check.inclusive) {\n res.exclusiveMinimum = true;\n }\n setResponseValueAndErrors(res, \"minimum\", check.value, check.message, refs);\n }\n break;\n case \"max\":\n if (refs.target === \"jsonSchema7\") {\n if (check.inclusive) {\n setResponseValueAndErrors(res, \"maximum\", check.value, check.message, refs);\n }\n else {\n setResponseValueAndErrors(res, \"exclusiveMaximum\", check.value, check.message, refs);\n }\n }\n else {\n if (!check.inclusive) {\n res.exclusiveMaximum = true;\n }\n setResponseValueAndErrors(res, \"maximum\", check.value, check.message, refs);\n }\n break;\n case \"multipleOf\":\n setResponseValueAndErrors(res, \"multipleOf\", check.value, check.message, refs);\n break;\n }\n }\n return res;\n}\n","import { parseDef } from \"../parseDef.js\";\nexport function parseObjectDef(def, refs) {\n const forceOptionalIntoNullable = refs.target === \"openAi\";\n const result = {\n type: \"object\",\n properties: {},\n };\n const required = [];\n const shape = def.shape();\n for (const propName in shape) {\n let propDef = shape[propName];\n if (propDef === undefined || propDef._def === undefined) {\n continue;\n }\n let propOptional = safeIsOptional(propDef);\n if (propOptional && forceOptionalIntoNullable) {\n if (propDef._def.typeName === \"ZodOptional\") {\n propDef = propDef._def.innerType;\n }\n if (!propDef.isNullable()) {\n propDef = propDef.nullable();\n }\n propOptional = false;\n }\n const parsedDef = parseDef(propDef._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"properties\", propName],\n propertyPath: [...refs.currentPath, \"properties\", propName],\n });\n if (parsedDef === undefined) {\n continue;\n }\n result.properties[propName] = parsedDef;\n if (!propOptional) {\n required.push(propName);\n }\n }\n if (required.length) {\n result.required = required;\n }\n const additionalProperties = decideAdditionalProperties(def, refs);\n if (additionalProperties !== undefined) {\n result.additionalProperties = additionalProperties;\n }\n return result;\n}\nfunction decideAdditionalProperties(def, refs) {\n if (def.catchall._def.typeName !== \"ZodNever\") {\n return parseDef(def.catchall._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalProperties\"],\n });\n }\n switch (def.unknownKeys) {\n case \"passthrough\":\n return refs.allowedAdditionalProperties;\n case \"strict\":\n return refs.rejectedAdditionalProperties;\n case \"strip\":\n return refs.removeAdditionalStrategy === \"strict\"\n ? refs.allowedAdditionalProperties\n : refs.rejectedAdditionalProperties;\n }\n}\nfunction safeIsOptional(schema) {\n try {\n return schema.isOptional();\n }\n catch {\n return true;\n }\n}\n","import { parseDef } from \"../parseDef.js\";\nimport { parseAnyDef } from \"./any.js\";\nexport const parseOptionalDef = (def, refs) => {\n if (refs.currentPath.toString() === refs.propertyPath?.toString()) {\n return parseDef(def.innerType._def, refs);\n }\n const innerSchema = parseDef(def.innerType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"anyOf\", \"1\"],\n });\n return innerSchema\n ? {\n anyOf: [\n {\n not: parseAnyDef(refs),\n },\n innerSchema,\n ],\n }\n : parseAnyDef(refs);\n};\n","import { parseDef } from \"../parseDef.js\";\nexport const parsePipelineDef = (def, refs) => {\n if (refs.pipeStrategy === \"input\") {\n return parseDef(def.in._def, refs);\n }\n else if (refs.pipeStrategy === \"output\") {\n return parseDef(def.out._def, refs);\n }\n const a = parseDef(def.in._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", \"0\"],\n });\n const b = parseDef(def.out._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"allOf\", a ? \"1\" : \"0\"],\n });\n return {\n allOf: [a, b].filter((x) => x !== undefined),\n };\n};\n","import { parseDef } from \"../parseDef.js\";\nexport function parsePromiseDef(def, refs) {\n return parseDef(def.type._def, refs);\n}\n","import { setResponseValueAndErrors } from \"../errorMessages.js\";\nimport { parseDef } from \"../parseDef.js\";\nexport function parseSetDef(def, refs) {\n const items = parseDef(def.valueType._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\"],\n });\n const schema = {\n type: \"array\",\n uniqueItems: true,\n items,\n };\n if (def.minSize) {\n setResponseValueAndErrors(schema, \"minItems\", def.minSize.value, def.minSize.message, refs);\n }\n if (def.maxSize) {\n setResponseValueAndErrors(schema, \"maxItems\", def.maxSize.value, def.maxSize.message, refs);\n }\n return schema;\n}\n","import { parseDef } from \"../parseDef.js\";\nexport function parseTupleDef(def, refs) {\n if (def.rest) {\n return {\n type: \"array\",\n minItems: def.items.length,\n items: def.items\n .map((x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`],\n }))\n .reduce((acc, x) => (x === undefined ? acc : [...acc, x]), []),\n additionalItems: parseDef(def.rest._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"additionalItems\"],\n }),\n };\n }\n else {\n return {\n type: \"array\",\n minItems: def.items.length,\n maxItems: def.items.length,\n items: def.items\n .map((x, i) => parseDef(x._def, {\n ...refs,\n currentPath: [...refs.currentPath, \"items\", `${i}`],\n }))\n .reduce((acc, x) => (x === undefined ? acc : [...acc, x]), []),\n };\n }\n}\n","import { parseAnyDef } from \"./any.js\";\nexport function parseUndefinedDef(refs) {\n return {\n not: parseAnyDef(refs),\n };\n}\n","import { parseAnyDef } from \"./any.js\";\nexport function parseUnknownDef(refs) {\n return parseAnyDef(refs);\n}\n","import { parseDef } from \"../parseDef.js\";\nexport const parseReadonlyDef = (def, refs) => {\n return parseDef(def.innerType._def, refs);\n};\n","import { ignoreOverride } from \"./Options.js\";\nimport { selectParser } from \"./selectParser.js\";\nimport { getRelativePath } from \"./getRelativePath.js\";\nimport { parseAnyDef } from \"./parsers/any.js\";\nexport function parseDef(def, refs, forceResolution = false) {\n const seenItem = refs.seen.get(def);\n if (refs.override) {\n const overrideResult = refs.override?.(def, refs, seenItem, forceResolution);\n if (overrideResult !== ignoreOverride) {\n return overrideResult;\n }\n }\n if (seenItem && !forceResolution) {\n const seenSchema = get$ref(seenItem, refs);\n if (seenSchema !== undefined) {\n return seenSchema;\n }\n }\n const newItem = { def, path: refs.currentPath, jsonSchema: undefined };\n refs.seen.set(def, newItem);\n const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);\n // If the return was a function, then the inner definition needs to be extracted before a call to parseDef (recursive)\n const jsonSchema = typeof jsonSchemaOrGetter === \"function\"\n ? parseDef(jsonSchemaOrGetter(), refs)\n : jsonSchemaOrGetter;\n if (jsonSchema) {\n addMeta(def, refs, jsonSchema);\n }\n if (refs.postProcess) {\n const postProcessResult = refs.postProcess(jsonSchema, def, refs);\n newItem.jsonSchema = jsonSchema;\n return postProcessResult;\n }\n newItem.jsonSchema = jsonSchema;\n return jsonSchema;\n}\nconst get$ref = (item, refs) => {\n switch (refs.$refStrategy) {\n case \"root\":\n return { $ref: item.path.join(\"/\") };\n case \"relative\":\n return { $ref: getRelativePath(refs.currentPath, item.path) };\n case \"none\":\n case \"seen\": {\n if (item.path.length < refs.currentPath.length &&\n item.path.every((value, index) => refs.currentPath[index] === value)) {\n console.warn(`Recursive reference detected at ${refs.currentPath.join(\"/\")}! Defaulting to any`);\n return parseAnyDef(refs);\n }\n return refs.$refStrategy === \"seen\" ? parseAnyDef(refs) : undefined;\n }\n }\n};\nconst addMeta = (def, refs, jsonSchema) => {\n if (def.description) {\n jsonSchema.description = def.description;\n if (refs.markdownDescription) {\n jsonSchema.markdownDescription = def.description;\n }\n }\n return jsonSchema;\n};\n","import { parseDef } from \"./parseDef.js\";\nimport { getRefs } from \"./Refs.js\";\nimport { parseAnyDef } from \"./parsers/any.js\";\nconst zodToJsonSchema = (schema, options) => {\n const refs = getRefs(options);\n let definitions = typeof options === \"object\" && options.definitions\n ? Object.entries(options.definitions).reduce((acc, [name, schema]) => ({\n ...acc,\n [name]: parseDef(schema._def, {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name],\n }, true) ?? parseAnyDef(refs),\n }), {})\n : undefined;\n const name = typeof options === \"string\"\n ? options\n : options?.nameStrategy === \"title\"\n ? undefined\n : options?.name;\n const main = parseDef(schema._def, name === undefined\n ? refs\n : {\n ...refs,\n currentPath: [...refs.basePath, refs.definitionPath, name],\n }, false) ?? parseAnyDef(refs);\n const title = typeof options === \"object\" &&\n options.name !== undefined &&\n options.nameStrategy === \"title\"\n ? options.name\n : undefined;\n if (title !== undefined) {\n main.title = title;\n }\n if (refs.flags.hasReferencedOpenAiAnyType) {\n if (!definitions) {\n definitions = {};\n }\n if (!definitions[refs.openAiAnyTypeName]) {\n definitions[refs.openAiAnyTypeName] = {\n // Skipping \"object\" as no properties can be defined and additionalProperties must be \"false\"\n type: [\"string\", \"number\", \"integer\", \"boolean\", \"array\", \"null\"],\n items: {\n $ref: refs.$refStrategy === \"relative\"\n ? \"1\"\n : [\n ...refs.basePath,\n refs.definitionPath,\n refs.openAiAnyTypeName,\n ].join(\"/\"),\n },\n };\n }\n }\n const combined = name === undefined\n ? definitions\n ? {\n ...main,\n [refs.definitionPath]: definitions,\n }\n : main\n : {\n $ref: [\n ...(refs.$refStrategy === \"relative\" ? [] : refs.basePath),\n refs.definitionPath,\n name,\n ].join(\"/\"),\n [refs.definitionPath]: {\n ...definitions,\n [name]: main,\n },\n };\n if (refs.target === \"jsonSchema7\") {\n combined.$schema = \"http://json-schema.org/draft-07/schema#\";\n }\n else if (refs.target === \"jsonSchema2019-09\" || refs.target === \"openAi\") {\n combined.$schema = \"https://json-schema.org/draft/2019-09/schema#\";\n }\n if (refs.target === \"openAi\" &&\n (\"anyOf\" in combined ||\n \"oneOf\" in combined ||\n \"allOf\" in combined ||\n (\"type\" in combined && Array.isArray(combined.type)))) {\n console.warn(\"Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.\");\n }\n return combined;\n};\nexport { zodToJsonSchema };\n",null,null,null,null,null,null,null,null,null,null,null,"// src/server.ts\nimport { createServer as createServerHTTP } from \"http\";\n\n// src/listener.ts\nimport { Http2ServerRequest as Http2ServerRequest2, constants as h2constants } from \"http2\";\n\n// src/request.ts\nimport { Http2ServerRequest } from \"http2\";\nimport { Readable } from \"stream\";\nvar RequestError = class extends Error {\n constructor(message, options) {\n super(message, options);\n this.name = \"RequestError\";\n }\n};\nvar toRequestError = (e) => {\n if (e instanceof RequestError) {\n return e;\n }\n return new RequestError(e.message, { cause: e });\n};\nvar GlobalRequest = global.Request;\nvar Request = class extends GlobalRequest {\n constructor(input, options) {\n if (typeof input === \"object\" && getRequestCache in input) {\n input = input[getRequestCache]();\n }\n if (typeof options?.body?.getReader !== \"undefined\") {\n ;\n options.duplex ??= \"half\";\n }\n super(input, options);\n }\n};\nvar newHeadersFromIncoming = (incoming) => {\n const headerRecord = [];\n const rawHeaders = incoming.rawHeaders;\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const { [i]: key, [i + 1]: value } = rawHeaders;\n if (key.charCodeAt(0) !== /*:*/\n 58) {\n headerRecord.push([key, value]);\n }\n }\n return new Headers(headerRecord);\n};\nvar wrapBodyStream = Symbol(\"wrapBodyStream\");\nvar newRequestFromIncoming = (method, url, headers, incoming, abortController) => {\n const init = {\n method,\n headers,\n signal: abortController.signal\n };\n if (method === \"TRACE\") {\n init.method = \"GET\";\n const req = new Request(url, init);\n Object.defineProperty(req, \"method\", {\n get() {\n return \"TRACE\";\n }\n });\n return req;\n }\n if (!(method === \"GET\" || method === \"HEAD\")) {\n if (\"rawBody\" in incoming && incoming.rawBody instanceof Buffer) {\n init.body = new ReadableStream({\n start(controller) {\n controller.enqueue(incoming.rawBody);\n controller.close();\n }\n });\n } else if (incoming[wrapBodyStream]) {\n let reader;\n init.body = new ReadableStream({\n async pull(controller) {\n try {\n reader ||= Readable.toWeb(incoming).getReader();\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n }\n });\n } else {\n init.body = Readable.toWeb(incoming);\n }\n }\n return new Request(url, init);\n};\nvar getRequestCache = Symbol(\"getRequestCache\");\nvar requestCache = Symbol(\"requestCache\");\nvar incomingKey = Symbol(\"incomingKey\");\nvar urlKey = Symbol(\"urlKey\");\nvar headersKey = Symbol(\"headersKey\");\nvar abortControllerKey = Symbol(\"abortControllerKey\");\nvar getAbortController = Symbol(\"getAbortController\");\nvar requestPrototype = {\n get method() {\n return this[incomingKey].method || \"GET\";\n },\n get url() {\n return this[urlKey];\n },\n get headers() {\n return this[headersKey] ||= newHeadersFromIncoming(this[incomingKey]);\n },\n [getAbortController]() {\n this[getRequestCache]();\n return this[abortControllerKey];\n },\n [getRequestCache]() {\n this[abortControllerKey] ||= new AbortController();\n return this[requestCache] ||= newRequestFromIncoming(\n this.method,\n this[urlKey],\n this.headers,\n this[incomingKey],\n this[abortControllerKey]\n );\n }\n};\n[\n \"body\",\n \"bodyUsed\",\n \"cache\",\n \"credentials\",\n \"destination\",\n \"integrity\",\n \"mode\",\n \"redirect\",\n \"referrer\",\n \"referrerPolicy\",\n \"signal\",\n \"keepalive\"\n].forEach((k) => {\n Object.defineProperty(requestPrototype, k, {\n get() {\n return this[getRequestCache]()[k];\n }\n });\n});\n[\"arrayBuffer\", \"blob\", \"clone\", \"formData\", \"json\", \"text\"].forEach((k) => {\n Object.defineProperty(requestPrototype, k, {\n value: function() {\n return this[getRequestCache]()[k]();\n }\n });\n});\nObject.defineProperty(requestPrototype, Symbol.for(\"nodejs.util.inspect.custom\"), {\n value: function(depth, options, inspectFn) {\n const props = {\n method: this.method,\n url: this.url,\n headers: this.headers,\n nativeRequest: this[requestCache]\n };\n return `Request (lightweight) ${inspectFn(props, { ...options, depth: depth == null ? null : depth - 1 })}`;\n }\n});\nObject.setPrototypeOf(requestPrototype, Request.prototype);\nvar newRequest = (incoming, defaultHostname) => {\n const req = Object.create(requestPrototype);\n req[incomingKey] = incoming;\n const incomingUrl = incoming.url || \"\";\n if (incomingUrl[0] !== \"/\" && // short-circuit for performance. most requests are relative URL.\n (incomingUrl.startsWith(\"http://\") || incomingUrl.startsWith(\"https://\"))) {\n if (incoming instanceof Http2ServerRequest) {\n throw new RequestError(\"Absolute URL for :path is not allowed in HTTP/2\");\n }\n try {\n const url2 = new URL(incomingUrl);\n req[urlKey] = url2.href;\n } catch (e) {\n throw new RequestError(\"Invalid absolute URL\", { cause: e });\n }\n return req;\n }\n const host = (incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host) || defaultHostname;\n if (!host) {\n throw new RequestError(\"Missing host header\");\n }\n let scheme;\n if (incoming instanceof Http2ServerRequest) {\n scheme = incoming.scheme;\n if (!(scheme === \"http\" || scheme === \"https\")) {\n throw new RequestError(\"Unsupported scheme\");\n }\n } else {\n scheme = incoming.socket && incoming.socket.encrypted ? \"https\" : \"http\";\n }\n const url = new URL(`${scheme}://${host}${incomingUrl}`);\n if (url.hostname.length !== host.length && url.hostname !== host.replace(/:\\d+$/, \"\")) {\n throw new RequestError(\"Invalid host header\");\n }\n req[urlKey] = url.href;\n return req;\n};\n\n// src/response.ts\nvar responseCache = Symbol(\"responseCache\");\nvar getResponseCache = Symbol(\"getResponseCache\");\nvar cacheKey = Symbol(\"cache\");\nvar GlobalResponse = global.Response;\nvar Response2 = class _Response {\n #body;\n #init;\n [getResponseCache]() {\n delete this[cacheKey];\n return this[responseCache] ||= new GlobalResponse(this.#body, this.#init);\n }\n constructor(body, init) {\n let headers;\n this.#body = body;\n if (init instanceof _Response) {\n const cachedGlobalResponse = init[responseCache];\n if (cachedGlobalResponse) {\n this.#init = cachedGlobalResponse;\n this[getResponseCache]();\n return;\n } else {\n this.#init = init.#init;\n headers = new Headers(init.#init.headers);\n }\n } else {\n this.#init = init;\n }\n if (typeof body === \"string\" || typeof body?.getReader !== \"undefined\" || body instanceof Blob || body instanceof Uint8Array) {\n ;\n this[cacheKey] = [init?.status || 200, body, headers || init?.headers];\n }\n }\n get headers() {\n const cache = this[cacheKey];\n if (cache) {\n if (!(cache[2] instanceof Headers)) {\n cache[2] = new Headers(\n cache[2] || { \"content-type\": \"text/plain; charset=UTF-8\" }\n );\n }\n return cache[2];\n }\n return this[getResponseCache]().headers;\n }\n get status() {\n return this[cacheKey]?.[0] ?? this[getResponseCache]().status;\n }\n get ok() {\n const status = this.status;\n return status >= 200 && status < 300;\n }\n};\n[\"body\", \"bodyUsed\", \"redirected\", \"statusText\", \"trailers\", \"type\", \"url\"].forEach((k) => {\n Object.defineProperty(Response2.prototype, k, {\n get() {\n return this[getResponseCache]()[k];\n }\n });\n});\n[\"arrayBuffer\", \"blob\", \"clone\", \"formData\", \"json\", \"text\"].forEach((k) => {\n Object.defineProperty(Response2.prototype, k, {\n value: function() {\n return this[getResponseCache]()[k]();\n }\n });\n});\nObject.defineProperty(Response2.prototype, Symbol.for(\"nodejs.util.inspect.custom\"), {\n value: function(depth, options, inspectFn) {\n const props = {\n status: this.status,\n headers: this.headers,\n ok: this.ok,\n nativeResponse: this[responseCache]\n };\n return `Response (lightweight) ${inspectFn(props, { ...options, depth: depth == null ? null : depth - 1 })}`;\n }\n});\nObject.setPrototypeOf(Response2, GlobalResponse);\nObject.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);\n\n// src/utils.ts\nasync function readWithoutBlocking(readPromise) {\n return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);\n}\nfunction writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {\n const cancel = (error) => {\n reader.cancel(error).catch(() => {\n });\n };\n writable.on(\"close\", cancel);\n writable.on(\"error\", cancel);\n (currentReadPromise ?? reader.read()).then(flow, handleStreamError);\n return reader.closed.finally(() => {\n writable.off(\"close\", cancel);\n writable.off(\"error\", cancel);\n });\n function handleStreamError(error) {\n if (error) {\n writable.destroy(error);\n }\n }\n function onDrain() {\n reader.read().then(flow, handleStreamError);\n }\n function flow({ done, value }) {\n try {\n if (done) {\n writable.end();\n } else if (!writable.write(value)) {\n writable.once(\"drain\", onDrain);\n } else {\n return reader.read().then(flow, handleStreamError);\n }\n } catch (e) {\n handleStreamError(e);\n }\n }\n}\nfunction writeFromReadableStream(stream, writable) {\n if (stream.locked) {\n throw new TypeError(\"ReadableStream is locked.\");\n } else if (writable.destroyed) {\n return;\n }\n return writeFromReadableStreamDefaultReader(stream.getReader(), writable);\n}\nvar buildOutgoingHttpHeaders = (headers) => {\n const res = {};\n if (!(headers instanceof Headers)) {\n headers = new Headers(headers ?? void 0);\n }\n const cookies = [];\n for (const [k, v] of headers) {\n if (k === \"set-cookie\") {\n cookies.push(v);\n } else {\n res[k] = v;\n }\n }\n if (cookies.length > 0) {\n res[\"set-cookie\"] = cookies;\n }\n res[\"content-type\"] ??= \"text/plain; charset=UTF-8\";\n return res;\n};\n\n// src/utils/response/constants.ts\nvar X_ALREADY_SENT = \"x-hono-already-sent\";\n\n// src/globals.ts\nimport crypto from \"crypto\";\nif (typeof global.crypto === \"undefined\") {\n global.crypto = crypto;\n}\n\n// src/listener.ts\nvar outgoingEnded = Symbol(\"outgoingEnded\");\nvar incomingDraining = Symbol(\"incomingDraining\");\nvar DRAIN_TIMEOUT_MS = 500;\nvar MAX_DRAIN_BYTES = 64 * 1024 * 1024;\nvar drainIncoming = (incoming) => {\n const incomingWithDrainState = incoming;\n if (incoming.destroyed || incomingWithDrainState[incomingDraining]) {\n return;\n }\n incomingWithDrainState[incomingDraining] = true;\n if (incoming instanceof Http2ServerRequest2) {\n try {\n ;\n incoming.stream?.close?.(h2constants.NGHTTP2_NO_ERROR);\n } catch {\n }\n return;\n }\n let bytesRead = 0;\n const cleanup = () => {\n clearTimeout(timer);\n incoming.off(\"data\", onData);\n incoming.off(\"end\", cleanup);\n incoming.off(\"error\", cleanup);\n };\n const forceClose = () => {\n cleanup();\n const socket = incoming.socket;\n if (socket && !socket.destroyed) {\n socket.destroySoon();\n }\n };\n const timer = setTimeout(forceClose, DRAIN_TIMEOUT_MS);\n timer.unref?.();\n const onData = (chunk) => {\n bytesRead += chunk.length;\n if (bytesRead > MAX_DRAIN_BYTES) {\n forceClose();\n }\n };\n incoming.on(\"data\", onData);\n incoming.on(\"end\", cleanup);\n incoming.on(\"error\", cleanup);\n incoming.resume();\n};\nvar handleRequestError = () => new Response(null, {\n status: 400\n});\nvar handleFetchError = (e) => new Response(null, {\n status: e instanceof Error && (e.name === \"TimeoutError\" || e.constructor.name === \"TimeoutError\") ? 504 : 500\n});\nvar handleResponseError = (e, outgoing) => {\n const err = e instanceof Error ? e : new Error(\"unknown error\", { cause: e });\n if (err.code === \"ERR_STREAM_PREMATURE_CLOSE\") {\n console.info(\"The user aborted a request.\");\n } else {\n console.error(e);\n if (!outgoing.headersSent) {\n outgoing.writeHead(500, { \"Content-Type\": \"text/plain\" });\n }\n outgoing.end(`Error: ${err.message}`);\n outgoing.destroy(err);\n }\n};\nvar flushHeaders = (outgoing) => {\n if (\"flushHeaders\" in outgoing && outgoing.writable) {\n outgoing.flushHeaders();\n }\n};\nvar responseViaCache = async (res, outgoing) => {\n let [status, body, header] = res[cacheKey];\n let hasContentLength = false;\n if (!header) {\n header = { \"content-type\": \"text/plain; charset=UTF-8\" };\n } else if (header instanceof Headers) {\n hasContentLength = header.has(\"content-length\");\n header = buildOutgoingHttpHeaders(header);\n } else if (Array.isArray(header)) {\n const headerObj = new Headers(header);\n hasContentLength = headerObj.has(\"content-length\");\n header = buildOutgoingHttpHeaders(headerObj);\n } else {\n for (const key in header) {\n if (key.length === 14 && key.toLowerCase() === \"content-length\") {\n hasContentLength = true;\n break;\n }\n }\n }\n if (!hasContentLength) {\n if (typeof body === \"string\") {\n header[\"Content-Length\"] = Buffer.byteLength(body);\n } else if (body instanceof Uint8Array) {\n header[\"Content-Length\"] = body.byteLength;\n } else if (body instanceof Blob) {\n header[\"Content-Length\"] = body.size;\n }\n }\n outgoing.writeHead(status, header);\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n outgoing.end(body);\n } else if (body instanceof Blob) {\n outgoing.end(new Uint8Array(await body.arrayBuffer()));\n } else {\n flushHeaders(outgoing);\n await writeFromReadableStream(body, outgoing)?.catch(\n (e) => handleResponseError(e, outgoing)\n );\n }\n ;\n outgoing[outgoingEnded]?.();\n};\nvar isPromise = (res) => typeof res.then === \"function\";\nvar responseViaResponseObject = async (res, outgoing, options = {}) => {\n if (isPromise(res)) {\n if (options.errorHandler) {\n try {\n res = await res;\n } catch (err) {\n const errRes = await options.errorHandler(err);\n if (!errRes) {\n return;\n }\n res = errRes;\n }\n } else {\n res = await res.catch(handleFetchError);\n }\n }\n if (cacheKey in res) {\n return responseViaCache(res, outgoing);\n }\n const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);\n if (res.body) {\n const reader = res.body.getReader();\n const values = [];\n let done = false;\n let currentReadPromise = void 0;\n if (resHeaderRecord[\"transfer-encoding\"] !== \"chunked\") {\n let maxReadCount = 2;\n for (let i = 0; i < maxReadCount; i++) {\n currentReadPromise ||= reader.read();\n const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {\n console.error(e);\n done = true;\n });\n if (!chunk) {\n if (i === 1) {\n await new Promise((resolve) => setTimeout(resolve));\n maxReadCount = 3;\n continue;\n }\n break;\n }\n currentReadPromise = void 0;\n if (chunk.value) {\n values.push(chunk.value);\n }\n if (chunk.done) {\n done = true;\n break;\n }\n }\n if (done && !(\"content-length\" in resHeaderRecord)) {\n resHeaderRecord[\"content-length\"] = values.reduce((acc, value) => acc + value.length, 0);\n }\n }\n outgoing.writeHead(res.status, resHeaderRecord);\n values.forEach((value) => {\n ;\n outgoing.write(value);\n });\n if (done) {\n outgoing.end();\n } else {\n if (values.length === 0) {\n flushHeaders(outgoing);\n }\n await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);\n }\n } else if (resHeaderRecord[X_ALREADY_SENT]) {\n } else {\n outgoing.writeHead(res.status, resHeaderRecord);\n outgoing.end();\n }\n ;\n outgoing[outgoingEnded]?.();\n};\nvar getRequestListener = (fetchCallback, options = {}) => {\n const autoCleanupIncoming = options.autoCleanupIncoming ?? true;\n if (options.overrideGlobalObjects !== false && global.Request !== Request) {\n Object.defineProperty(global, \"Request\", {\n value: Request\n });\n Object.defineProperty(global, \"Response\", {\n value: Response2\n });\n }\n return async (incoming, outgoing) => {\n let res, req;\n try {\n req = newRequest(incoming, options.hostname);\n let incomingEnded = !autoCleanupIncoming || incoming.method === \"GET\" || incoming.method === \"HEAD\";\n if (!incomingEnded) {\n ;\n incoming[wrapBodyStream] = true;\n incoming.on(\"end\", () => {\n incomingEnded = true;\n });\n if (incoming instanceof Http2ServerRequest2) {\n ;\n outgoing[outgoingEnded] = () => {\n if (!incomingEnded) {\n setTimeout(() => {\n if (!incomingEnded) {\n setTimeout(() => {\n drainIncoming(incoming);\n });\n }\n });\n }\n };\n }\n outgoing.on(\"finish\", () => {\n if (!incomingEnded) {\n drainIncoming(incoming);\n }\n });\n }\n outgoing.on(\"close\", () => {\n const abortController = req[abortControllerKey];\n if (abortController) {\n if (incoming.errored) {\n req[abortControllerKey].abort(incoming.errored.toString());\n } else if (!outgoing.writableFinished) {\n req[abortControllerKey].abort(\"Client connection prematurely closed.\");\n }\n }\n if (!incomingEnded) {\n setTimeout(() => {\n if (!incomingEnded) {\n setTimeout(() => {\n drainIncoming(incoming);\n });\n }\n });\n }\n });\n res = fetchCallback(req, { incoming, outgoing });\n if (cacheKey in res) {\n return responseViaCache(res, outgoing);\n }\n } catch (e) {\n if (!res) {\n if (options.errorHandler) {\n res = await options.errorHandler(req ? e : toRequestError(e));\n if (!res) {\n return;\n }\n } else if (!req) {\n res = handleRequestError();\n } else {\n res = handleFetchError(e);\n }\n } else {\n return handleResponseError(e, outgoing);\n }\n }\n try {\n return await responseViaResponseObject(res, outgoing, options);\n } catch (e) {\n return handleResponseError(e, outgoing);\n }\n };\n};\n\n// src/server.ts\nvar createAdaptorServer = (options) => {\n const fetchCallback = options.fetch;\n const requestListener = getRequestListener(fetchCallback, {\n hostname: options.hostname,\n overrideGlobalObjects: options.overrideGlobalObjects,\n autoCleanupIncoming: options.autoCleanupIncoming\n });\n const createServer = options.createServer || createServerHTTP;\n const server = createServer(options.serverOptions || {}, requestListener);\n return server;\n};\nvar serve = (options, listeningListener) => {\n const server = createAdaptorServer(options);\n server.listen(options?.port ?? 3e3, options.hostname, () => {\n const serverInfo = server.address();\n listeningListener && listeningListener(serverInfo);\n });\n return server;\n};\nexport {\n RequestError,\n createAdaptorServer,\n getRequestListener,\n serve\n};\n",null,null,"import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\n\nimport { AccountStore } from \"./store/account-store.js\";\nimport { buildRegistry } from \"./providers/registry.js\";\nimport { registerTools } from \"./tools/index.js\";\nimport { VERSION } from \"./version.js\";\nimport { WatcherManager } from \"./watcher/index.js\";\nimport type { AppConfig, ResolvedTools } from \"./config.js\";\nimport { resolveTools } from \"./config.js\";\n\nexport interface ServerOptions {\n /** Fully resolved application config from hypermail-config.json. */\n config: AppConfig;\n}\n\nexport async function startServer(opts: ServerOptions): Promise<void> {\n const { config } = opts;\n const store = await AccountStore.open({ dataDir: config.dataDir });\n const registry = buildRegistry({ store, providers: config.providers });\n const tools: ResolvedTools = resolveTools(config);\n\n // Start email watch loop if explicitly enabled (opt-in).\n // Works in both stdio and HTTP modes — setInterval fires normally\n // alongside the stdio transport's stdin listener.\n let watcher: WatcherManager | undefined;\n if (config.watch?.enabled) {\n watcher = new WatcherManager(store, registry, config.watch);\n watcher.start();\n const stop = () => watcher?.stop();\n process.on(\"SIGTERM\", stop);\n process.on(\"SIGINT\", stop);\n }\n\n // Factory: creates a fresh McpServer with all tools registered.\n // HTTP mode creates one per session; stdio mode uses a single instance.\n const createServer = (): McpServer => {\n const s = new McpServer(\n { name: \"hypermail-mcp\", version: VERSION },\n { capabilities: { tools: {}, logging: {} } },\n );\n registerTools(s, { store, registry, tools });\n return s;\n };\n\n if (config.http.enabled) {\n await startHttp(createServer, config.http.host, config.http.port);\n } else {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n }\n}\n\ninterface HttpSession {\n transport: StreamableHTTPServerTransport;\n server: McpServer;\n}\n\nasync function startHttp(\n createServer: () => McpServer,\n host: string,\n port: number,\n): Promise<void> {\n // One McpServer + transport per session, keyed by Mcp-Session-Id header.\n const sessions = new Map<string, HttpSession>();\n\n const http = createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {\n try {\n if (!req.url || !req.url.startsWith(\"/mcp\")) {\n res.statusCode = 404;\n res.end(\"not found\");\n return;\n }\n const sessionId = (req.headers[\"mcp-session-id\"] as string | undefined) ?? undefined;\n let session = sessionId ? sessions.get(sessionId) : undefined;\n\n if (!session) {\n const server = createServer();\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (sid: string) => {\n sessions.set(sid, { transport, server });\n transport.onclose = () => {\n if (transport.sessionId) sessions.delete(transport.sessionId);\n };\n },\n });\n await server.connect(transport);\n session = { transport, server };\n }\n\n // Buffer body for POST / DELETE\n let body: unknown = undefined;\n if (req.method === \"POST\" || req.method === \"DELETE\") {\n const chunks: Buffer[] = [];\n for await (const chunk of req) chunks.push(chunk as Buffer);\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n body = raw ? JSON.parse(raw) : undefined;\n }\n await session.transport.handleRequest(req, res, body);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\"[hypermail-mcp] http error:\", err);\n if (!res.headersSent) {\n res.statusCode = 500;\n res.end(\"internal error\");\n }\n }\n });\n\n await new Promise<void>((resolve) => http.listen(port, host, resolve));\n // eslint-disable-next-line no-console\n console.error(`[hypermail-mcp] listening on http://${host}:${port}/mcp`);\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n encrypt,\n decrypt,\n resolveDataDir,\n resolveKey,\n writeAtomic,\n} from \"./crypto.js\";\n\n/**\n * One stored account. `tokens` is provider-specific (e.g. serialized MSAL cache\n * for Outlook, host/port/password blob for IMAP) — the store is opaque to it.\n */\nexport interface AccountRecord {\n email: string;\n provider: \"outlook\" | \"imap\" | \"gmail\";\n displayName?: string;\n tokens: Record<string, unknown>;\n addedAt: string;\n /** HTML snippet — may contain formatting, images, links. Injected at end of outgoing emails. */\n signature?: string;\n /** Font/style preferences applied to outgoing HTML emails. */\n style?: { fontFamily?: string; fontSize?: string; fontColor?: string };\n /** ISO timestamp of the newest email the watcher has already seen.\n * Used by the email-watcher to detect new mail since last poll. */\n lastSeenAt?: string;\n /** Email IDs the watcher has already seen (most recent first, capped at 200).\n * Used for ID-based dedup — emails whose ID is in this list are skipped\n * during polling, preventing duplicate/lost notifications from timestamp\n * collisions. */\n lastSeenIds?: string[];\n}\n\ninterface StoreFile {\n version: 1;\n accounts: AccountRecord[];\n}\n\nexport interface OpenOptions {\n dataDir?: string;\n /** Inject the encryption key directly (mostly for tests). Otherwise resolved\n * from `HYPERMAIL_MCP_KEY` env, then OS keychain, then auto-generated. */\n key?: Buffer;\n}\n\nconst FILE_NAME = \"accounts.json.enc\";\n\nexport class AccountStore {\n private constructor(\n private readonly filePath: string,\n private readonly key: Buffer,\n private data: StoreFile,\n ) {}\n\n static async open(opts: OpenOptions = {}): Promise<AccountStore> {\n const dataDir = resolveDataDir(opts.dataDir);\n await fs.mkdir(dataDir, { recursive: true, mode: 0o700 });\n const filePath = path.join(dataDir, FILE_NAME);\n const key = opts.key ?? (await resolveKey(dataDir));\n\n let data: StoreFile;\n try {\n const buf = await fs.readFile(filePath);\n data = decrypt(buf, key);\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n data = { version: 1, accounts: [] };\n } else {\n throw err;\n }\n }\n return new AccountStore(filePath, key, data);\n }\n\n listAccounts(): AccountRecord[] {\n // Return shallow clones without tokens leaking out unintentionally is the\n // caller's job; here we expose the full record for provider use.\n return this.data.accounts.map((a) => ({ ...a }));\n }\n\n getAccount(email: string): AccountRecord | undefined {\n const norm = email.trim().toLowerCase();\n const rec = this.data.accounts.find((a) => a.email.toLowerCase() === norm);\n return rec ? { ...rec } : undefined;\n }\n\n async upsertAccount(rec: AccountRecord): Promise<AccountRecord> {\n const norm = rec.email.trim().toLowerCase();\n const next: AccountRecord = { ...rec, email: norm };\n const idx = this.data.accounts.findIndex((a) => a.email.toLowerCase() === norm);\n if (idx >= 0) this.data.accounts[idx] = next;\n else this.data.accounts.push(next);\n await this.flush();\n return { ...next };\n }\n\n async removeAccount(email: string): Promise<boolean> {\n const norm = email.trim().toLowerCase();\n const before = this.data.accounts.length;\n this.data.accounts = this.data.accounts.filter((a) => a.email.toLowerCase() !== norm);\n if (this.data.accounts.length === before) return false;\n await this.flush();\n return true;\n }\n\n private async flush(): Promise<void> {\n const buf = encrypt(this.data, this.key);\n await writeAtomic(this.filePath, buf);\n }\n}\n","import {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n createHash,\n scryptSync,\n timingSafeEqual,\n} from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nexport const ALGO = \"aes-256-gcm\";\nexport const KEY_LEN = 32;\n\n// ── AES-256-GCM encrypt / decrypt ──\n\n/** Encrypt JSON-serializable data with AES-256-GCM. Returns [1-byte version=1][12 iv][16 tag][ct...]. */\nexport function encrypt(data: unknown, key: Buffer): Buffer {\n if (key.length !== KEY_LEN) throw new Error(`key must be ${KEY_LEN} bytes`);\n const iv = randomBytes(12);\n const cipher = createCipheriv(ALGO, key, iv);\n const plaintext = Buffer.from(JSON.stringify(data), \"utf8\");\n const ct = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return Buffer.concat([Buffer.from([1]), iv, tag, ct]);\n}\n\n/** Decrypt a buffer produced by {@link encrypt}. Returns the parsed JSON value. */\nexport function decrypt<T = unknown>(buf: Buffer, key: Buffer): T {\n if (key.length !== KEY_LEN) throw new Error(`key must be ${KEY_LEN} bytes`);\n if (buf.length < 1 + 12 + 16 + 1) throw new Error(\"encrypted data truncated\");\n const v = buf[0];\n if (v !== 1) throw new Error(`unsupported data version: ${v}`);\n const iv = buf.subarray(1, 13);\n const tag = buf.subarray(13, 29);\n const ct = buf.subarray(29);\n const decipher = createDecipheriv(ALGO, key, iv);\n decipher.setAuthTag(tag);\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\n return JSON.parse(pt.toString(\"utf8\")) as T;\n}\n\n// ── key + path resolution ──\n\nexport function resolveDataDir(explicit?: string): string {\n if (explicit && explicit.length > 0) return path.resolve(explicit);\n return path.join(homedir(), \".hypermail-mcp\");\n}\n\nexport function parseEnvKey(raw: string): Buffer | undefined {\n const s = raw.trim();\n // hex (64 chars)\n if (/^[0-9a-fA-F]{64}$/.test(s)) return Buffer.from(s, \"hex\");\n // base64 — accept any length, then check\n try {\n const buf = Buffer.from(s, \"base64\");\n if (buf.length === KEY_LEN) return buf;\n } catch {\n /* ignore */\n }\n // last-resort: derive 32 bytes via SHA-256 over the raw string\n return createHash(\"sha256\").update(s, \"utf8\").digest();\n}\n\nexport async function resolveKey(dataDir: string): Promise<Buffer> {\n const env = process.env.HYPERMAIL_MCP_KEY;\n if (env && env.length > 0) {\n const k = parseEnvKey(env);\n if (k) return k;\n }\n\n // Try OS keychain via keytar (optional dep).\n const fromKeytar = await tryKeytarGet();\n if (fromKeytar) return fromKeytar;\n\n // Local-dev fallback: persist a generated key to a 0600 file.\n const keyFile = path.join(dataDir, \"master.key\");\n try {\n const existing = await fs.readFile(keyFile);\n if (existing.length === KEY_LEN) return existing;\n } catch {\n /* fall through to generate */\n }\n const gen = randomBytes(KEY_LEN);\n await fs.writeFile(keyFile, gen, { mode: 0o600 });\n await tryKeytarSet(gen);\n return gen;\n}\n\n// ── API key hashing (scrypt — built into Node, no native deps) ──\n\n/**\n * Hash an API key with scrypt. Returns \"salt:hash\" (both hex-encoded) for\n * storage. Suitable for <10 agents — scrypt is purpose-built for password\n * hashing and runs in-process with no native compilation.\n */\nexport function hashApiKey(apiKey: string): string {\n const salt = randomBytes(16).toString(\"hex\");\n const hash = scryptSync(apiKey, salt, 32).toString(\"hex\");\n return `${salt}:${hash}`;\n}\n\n/**\n * Verify a plaintext API key against a stored \"salt:hash\" string produced by\n * {@link hashApiKey}. Uses constant-time comparison.\n */\nexport function verifyApiKey(apiKey: string, stored: string): boolean {\n const [salt, hash] = stored.split(\":\");\n if (!salt || !hash) return false;\n try {\n const computed = scryptSync(apiKey, salt, 32);\n const expected = Buffer.from(hash, \"hex\");\n if (computed.length !== expected.length) return false;\n return timingSafeEqual(computed, expected);\n } catch {\n return false;\n }\n}\n\n// ── atomic file write ──\n\n/** Write `data` to `filePath` atomically (tmp + rename). */\nexport async function writeAtomic(filePath: string, data: Buffer): Promise<void> {\n const tmp = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n await fs.writeFile(tmp, data, { mode: 0o600 });\n await fs.rename(tmp, filePath);\n}\n\n// ── keytar helpers (private) ──\n\nasync function tryKeytarGet(): Promise<Buffer | undefined> {\n try {\n const mod = (await import(\"keytar\")) as typeof import(\"keytar\");\n const val = await mod.getPassword(\"hypermail-mcp\", \"master\");\n if (val) {\n const buf = Buffer.from(val, \"base64\");\n if (buf.length === KEY_LEN) return buf;\n }\n } catch {\n /* keytar not installed or unsupported platform */\n }\n return undefined;\n}\n\nasync function tryKeytarSet(key: Buffer): Promise<void> {\n try {\n const mod = (await import(\"keytar\")) as typeof import(\"keytar\");\n await mod.setPassword(\"hypermail-mcp\", \"master\", key.toString(\"base64\"));\n } catch {\n /* ignore */\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { AccountRecord, AccountStore } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n AttachmentContent,\n CompleteAddAccountResult,\n CreateFolderInput,\n DraftUpdateInput,\n EmailFull,\n EmailProvider,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n SendInput,\n} from \"../types.js\";\nimport { OutlookClientFactory } from \"./client.js\";\nimport {\n awaitDeviceCodeReady,\n beginDeviceCode,\n type DeviceCodeBegin,\n} from \"./auth.js\";\nimport { convertInlineImages } from \"./helpers.js\";\nimport {\n addAttachmentToDraft,\n markRead,\n moveEmail,\n removeAttachmentFromDraft,\n sendDraft,\n sendOrSave,\n updateDraft,\n} from \"./write-ops.js\";\nimport {\n listEmails,\n readAttachment,\n readEmail,\n searchEmails,\n} from \"./read-ops.js\";\nimport {\n createFolder,\n deleteFolder,\n listFolders,\n renameFolder,\n} from \"./folders.js\";\n\nexport { convertInlineImages };\n\ninterface PendingFlow {\n begin: DeviceCodeBegin;\n emailHint?: string;\n startedAt: number;\n settled: \"pending\" | \"ready\" | \"error\" | \"expired\";\n account?: AccountRecord;\n error?: string;\n}\n\nexport interface OutlookProviderOptions {\n store: AccountStore;\n clientId?: string;\n tenantId?: string;\n}\n\nexport class OutlookProvider implements EmailProvider {\n readonly id = \"outlook\" as const;\n private readonly clients: OutlookClientFactory;\n private readonly pending = new Map<string, PendingFlow>();\n private readonly clientId?: string;\n private readonly tenantId?: string;\n\n constructor(private readonly opts: OutlookProviderOptions) {\n this.clientId = opts.clientId;\n this.tenantId = opts.tenantId;\n this.clients = new OutlookClientFactory(opts.store, opts.clientId, opts.tenantId);\n }\n\n // ---------- account lifecycle ----------\n\n async addAccount(input: AddAccountInput): Promise<AddAccountResult> {\n const begin = beginDeviceCode(undefined, this.clientId, this.tenantId);\n await awaitDeviceCodeReady(begin);\n\n const handle = randomUUID();\n const flow: PendingFlow = {\n begin,\n emailHint: input.email,\n startedAt: Date.now(),\n settled: \"pending\",\n };\n this.pending.set(handle, flow);\n\n // Fire-and-forget: when the user finishes, persist and update flow.\n begin.result\n .then(async ({ tokens, account }) => {\n const email = (account.username || input.email || \"\").toLowerCase();\n if (!email) {\n flow.settled = \"error\";\n flow.error = \"no email returned from Microsoft account\";\n return;\n }\n const rec: AccountRecord = {\n email,\n provider: \"outlook\",\n displayName: account.name ?? undefined,\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n };\n const saved = await this.opts.store.upsertAccount(rec);\n flow.account = saved;\n flow.settled = \"ready\";\n })\n .catch((err: unknown) => {\n flow.settled = \"error\";\n flow.error = err instanceof Error ? err.message : String(err);\n });\n\n return {\n status: \"pending\",\n handle,\n verification: {\n userCode: begin.userCode,\n verificationUri: begin.verificationUri,\n expiresAt: begin.expiresAt,\n message: begin.message,\n },\n };\n }\n\n async completeAddAccount(handle: string): Promise<CompleteAddAccountResult> {\n const flow = this.pending.get(handle);\n if (!flow) return { status: \"error\", error: \"unknown handle\" };\n // expire after 20 minutes regardless\n if (Date.now() - flow.startedAt > 20 * 60_000 && flow.settled === \"pending\") {\n flow.settled = \"expired\";\n flow.begin.cancel();\n }\n if (flow.settled === \"ready\" && flow.account) {\n this.pending.delete(handle);\n return { status: \"ready\", account: flow.account };\n }\n if (flow.settled === \"error\") {\n this.pending.delete(handle);\n return { status: \"error\", error: flow.error ?? \"unknown error\" };\n }\n if (flow.settled === \"expired\") {\n this.pending.delete(handle);\n return { status: \"expired\" };\n }\n return { status: \"pending\" };\n }\n\n // ---------- email ops (delegated) ----------\n\n async listEmails(account: AccountRecord, opts: ListEmailsOptions): Promise<ListEmailsResult> {\n return listEmails(this.clients.get(account), account, opts);\n }\n\n async searchEmails(\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n ): Promise<EmailSummary[]> {\n return searchEmails(this.clients.get(account), account, query, opts);\n }\n\n async readEmail(account: AccountRecord, id: string): Promise<EmailFull> {\n return readEmail(this.clients.get(account), account, id);\n }\n\n async readAttachment(\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n ): Promise<AttachmentContent> {\n return readAttachment(this.clients.get(account), account, messageId, attachmentId);\n }\n\n async sendEmail(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return sendOrSave(this.clients.get(account), account, msg, \"send\");\n }\n\n async saveDraft(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return sendOrSave(this.clients.get(account), account, msg, \"draft\");\n }\n\n async updateDraft(\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n ): Promise<{ id: string }> {\n return updateDraft(this.clients.get(account), account, id, update);\n }\n\n async moveEmail(account: AccountRecord, id: string, destinationId: string): Promise<void> {\n return moveEmail(this.clients.get(account), account, id, destinationId);\n }\n\n async sendDraft(account: AccountRecord, id: string): Promise<{ id: string }> {\n return sendDraft(this.clients.get(account), account, id);\n }\n\n async addAttachmentToDraft(\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n ): Promise<{ id: string; attachment: { id: string; name: string; contentType?: string } }> {\n return addAttachmentToDraft(\n this.clients.get(account),\n account,\n draftId,\n name,\n contentBytes,\n contentType,\n );\n }\n\n async removeAttachmentFromDraft(\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n ): Promise<void> {\n return removeAttachmentFromDraft(this.clients.get(account), account, draftId, attachmentId);\n }\n\n async markRead(account: AccountRecord, id: string, isRead: boolean): Promise<void> {\n return markRead(this.clients.get(account), account, id, isRead);\n }\n\n // ---------- folder ops (delegated) ----------\n\n async listFolders(account: AccountRecord, opts: ListFoldersOptions): Promise<FolderInfo[]> {\n return listFolders(this.clients.get(account), account, opts);\n }\n\n async createFolder(account: AccountRecord, input: CreateFolderInput): Promise<FolderInfo> {\n return createFolder(this.clients.get(account), account, input);\n }\n\n async renameFolder(\n account: AccountRecord,\n folderId: string,\n newName: string,\n ): Promise<FolderInfo> {\n return renameFolder(this.clients.get(account), account, folderId, newName);\n }\n\n async deleteFolder(account: AccountRecord, folderId: string): Promise<void> {\n return deleteFolder(this.clients.get(account), account, folderId);\n }\n}\n","import \"isomorphic-fetch\";\nimport {\n Client,\n type AuthenticationProvider,\n} from \"@microsoft/microsoft-graph-client\";\n\nimport type { AccountStore, AccountRecord } from \"../../store/account-store.js\";\nimport { acquireAccessToken, isSerializedTokens, type SerializedTokens } from \"./auth.js\";\n\n/**\n * Builds a Graph `Client` bound to a stored account. The client uses an\n * `AuthenticationProvider` that calls msal silently on every request, and\n * writes the (possibly-refreshed) cache back into the AccountStore.\n *\n * Clients are cached per email since the underlying SDK reuses connections.\n */\nexport class OutlookClientFactory {\n private readonly cache = new Map<string, Client>();\n /** Serialize token refreshes per email to prevent concurrent-refresh races. */\n private readonly refreshLocks = new Map<string, Promise<string>>();\n\n constructor(\n private readonly store: AccountStore,\n private readonly clientId?: string,\n private readonly tenantId?: string,\n ) {}\n\n get(account: AccountRecord): Client {\n const key = account.email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) return existing;\n\n const store = this.store;\n const refreshLocks = this.refreshLocks;\n const provider: AuthenticationProvider = {\n getAccessToken: async () => {\n const existing = refreshLocks.get(key);\n if (existing) {\n try {\n return await existing;\n } catch {\n // previous refresh failed — fall through to retry\n }\n }\n const promise = (async (): Promise<string> => {\n const fresh = store.getAccount(account.email) ?? account;\n if (!isSerializedTokens(fresh.tokens)) {\n throw new Error(\n \"Outlook account tokens are missing or corrupted — re-run add_account\",\n );\n }\n const tokens: SerializedTokens = fresh.tokens;\n const { accessToken, tokens: nextTokens } = await acquireAccessToken(\n tokens,\n undefined,\n this.clientId,\n this.tenantId,\n );\n if (nextTokens.msalCache !== tokens.msalCache) {\n store\n .upsertAccount({\n ...fresh,\n tokens: nextTokens as unknown as Record<string, unknown>,\n })\n .catch(() => {\n /* swallow — next call will refresh again */\n });\n }\n return accessToken;\n })();\n refreshLocks.set(key, promise);\n try {\n return await promise;\n } finally {\n refreshLocks.delete(key);\n }\n },\n };\n\n const client = Client.initWithMiddleware({ authProvider: provider });\n this.cache.set(key, client);\n return client;\n }\n\n /** Drop a cached client (e.g. after removeAccount). */\n invalidate(email: string): void {\n this.cache.delete(email.toLowerCase());\n }\n}\n","import {\n PublicClientApplication,\n type Configuration,\n type AuthenticationResult,\n type AccountInfo,\n} from \"@azure/msal-node\";\n\n/**\n * Public client app id. Default is the well-known `ms-365` client id used by\n * the softeria/ms-365-mcp-server project — it's a public client registered\n * for personal MSA + multi-tenant work/school. Users can override via\n * HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID for their own Entra app registrations.\n */\nconst DEFAULT_CLIENT_ID = \"084a3e9f-a9f4-43f7-89f9-d229cf97853e\";\n// ^ Pre-registered public client app (same one used by softeria/ms-365-mcp-server).\n// Supports personal MSA + multi-tenant work/school via device-code flow.\n// Operators should set HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID to a client they control for production.\n\nconst DEFAULT_SCOPES = [\n \"offline_access\",\n \"User.Read\",\n \"Mail.ReadWrite\",\n \"Mail.Send\",\n];\n\nexport interface DeviceCodeBegin {\n userCode: string;\n verificationUri: string;\n message: string;\n expiresAt: string; // ISO\n /** Resolves with the auth result once the user completes the flow. */\n result: Promise<{ tokens: SerializedTokens; account: AccountInfo }>;\n /** Aborts the in-flight polling promise. */\n cancel(): void;\n}\n\nexport interface SerializedTokens {\n /** MSAL cache JSON, encrypted at rest by the account store. */\n msalCache: string;\n /** Home account id used to look up the account in the rehydrated cache. */\n homeAccountId: string;\n /** Tenant id captured at sign-in. */\n tenantId: string;\n /** Username captured at sign-in (typically the primary email). */\n username: string;\n scopes: string[];\n}\n\n/** Type guard — validates that an unknown value has the shape of SerializedTokens. */\nexport function isSerializedTokens(obj: unknown): obj is SerializedTokens {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return (\n typeof o.msalCache === \"string\" &&\n typeof o.homeAccountId === \"string\" &&\n typeof o.tenantId === \"string\" &&\n typeof o.username === \"string\" &&\n Array.isArray(o.scopes)\n );\n}\n\nfunction makeConfig(prevCacheJson?: string, clientIdOverride?: string, tenantOverride?: string): Configuration {\n const clientId = clientIdOverride || DEFAULT_CLIENT_ID;\n const tenant = tenantOverride || \"common\";\n return {\n auth: {\n clientId,\n authority: `https://login.microsoftonline.com/${tenant}`,\n },\n cache: prevCacheJson\n ? {\n // msal-node supports an in-memory cache plugin; we hydrate manually\n // below via deserialize after construction.\n }\n : undefined,\n };\n}\n\nexport function buildPca(prevCacheJson?: string, clientIdOverride?: string, tenantOverride?: string): PublicClientApplication {\n const pca = new PublicClientApplication(makeConfig(prevCacheJson, clientIdOverride, tenantOverride));\n if (prevCacheJson) {\n pca.getTokenCache().deserialize(prevCacheJson);\n }\n return pca;\n}\n\n/**\n * Start a device-code flow. The returned `result` promise resolves once the\n * user has entered the code and consented; callers should poll it (or await it)\n * via `complete_add_account`.\n */\nexport function beginDeviceCode(\n scopes: string[] = DEFAULT_SCOPES,\n clientIdOverride?: string,\n tenantOverride?: string,\n): DeviceCodeBegin {\n const pca = buildPca(undefined, clientIdOverride, tenantOverride);\n let resolve!: (v: { tokens: SerializedTokens; account: AccountInfo }) => void;\n let reject!: (err: unknown) => void;\n const result = new Promise<{ tokens: SerializedTokens; account: AccountInfo }>(\n (res, rej) => {\n resolve = res;\n reject = rej;\n },\n );\n\n // We capture the deviceCodeCallback synchronously to surface the user-facing\n // info back out via this object before awaiting the long-running poll.\n let userCode = \"\";\n let verificationUri = \"\";\n let message = \"\";\n let expiresAt = new Date(Date.now() + 15 * 60_000).toISOString();\n let aborted = false;\n\n const ready = new Promise<void>((r) => {\n pca\n .acquireTokenByDeviceCode({\n scopes,\n deviceCodeCallback: (info) => {\n if (!info.userCode || !info.verificationUri) {\n // MSAL may fire the callback with an empty object if the\n // downstream HTTP request fails — reject so the caller\n // gets a clear error instead of silent empty strings.\n reject(\n new Error(\n \"Microsoft device-code endpoint returned no code. \" +\n \"Check HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID is a valid Azure Entra public-client application.\",\n ),\n );\n return;\n }\n userCode = info.userCode;\n verificationUri = info.verificationUri;\n message = info.message;\n if (info.expiresIn) {\n expiresAt = new Date(Date.now() + info.expiresIn * 1000).toISOString();\n }\n r();\n },\n })\n .then((authResult: AuthenticationResult | null) => {\n if (aborted) return;\n if (!authResult || !authResult.account) {\n reject(new Error(\"device-code flow returned no account\"));\n return;\n }\n const cache = pca.getTokenCache().serialize();\n const tokens: SerializedTokens = {\n msalCache: cache,\n homeAccountId: authResult.account.homeAccountId,\n tenantId: authResult.account.tenantId,\n username: authResult.account.username,\n scopes,\n };\n resolve({ tokens, account: authResult.account });\n })\n .catch((err) => {\n if (!aborted) reject(err);\n });\n });\n\n // Surface device-code info synchronously via a wrapper Promise:\n // we return the object but its strings are populated once `ready` settles.\n // To keep the API simple, we attach a getter that callers must `await` on.\n // Instead of getters, we wait for `ready` inside the begin helper:\n return {\n // these are placeholders until ready resolves\n get userCode() {\n return userCode;\n },\n get verificationUri() {\n return verificationUri;\n },\n get message() {\n return message;\n },\n get expiresAt() {\n return expiresAt;\n },\n result,\n cancel() {\n aborted = true;\n },\n // hidden helper for the caller to await initial code\n // (typed via a cast below where used)\n ...({ _ready: ready } as Record<string, unknown>),\n } as DeviceCodeBegin;\n}\n\n/** Await `_ready` so the user-code fields are populated. */\nexport async function awaitDeviceCodeReady(b: DeviceCodeBegin): Promise<void> {\n const r = (b as unknown as { _ready: Promise<void> })._ready;\n await r;\n}\n\n/**\n * Acquire a fresh access token for a stored account, refreshing silently from\n * the persisted MSAL cache. Returns the (possibly-updated) cache so the caller\n * can write it back to the store.\n */\nexport async function acquireAccessToken(\n tokens: SerializedTokens,\n scopes: string[] = DEFAULT_SCOPES,\n clientIdOverride?: string,\n tenantOverride?: string,\n): Promise<{ accessToken: string; tokens: SerializedTokens }> {\n const pca = buildPca(tokens.msalCache, clientIdOverride, tenantOverride);\n const cache = pca.getTokenCache();\n const account =\n (await cache.getAccountByHomeId(tokens.homeAccountId)) ??\n (await cache.getAllAccounts()).find((a) => a.username === tokens.username);\n if (!account) {\n throw new Error(\"no MSAL account in cache — re-run add_account\");\n }\n const res = await pca.acquireTokenSilent({ account, scopes });\n if (!res?.accessToken) {\n throw new Error(\"acquireTokenSilent returned no access token\");\n }\n const next: SerializedTokens = {\n ...tokens,\n msalCache: cache.serialize(),\n scopes,\n };\n return { accessToken: res.accessToken, tokens: next };\n}\n","import { randomUUID } from \"node:crypto\";\n\n/** A generic inline image extracted from an HTML body. */\nexport interface InlineImage {\n /** The generated Content-ID (without \"cid:\" prefix). */\n cid: string;\n /** Raw base64 content bytes (without the data:image/...;base64, prefix). */\n contentBytes: string;\n /** Full MIME type, e.g. \"image/png\". */\n contentType: string;\n /** Suggested filename, e.g. \"signature-image.png\". */\n filename: string;\n}\n\n/**\n * Parse an HTML body for `data:image/<subtype>;base64,<payload>` URIs inside\n * `src=\"...\"` attributes. Each match is replaced with a `cid:<uuid>` reference,\n * and the extracted base64 data is collected into a flat image array.\n *\n * This is provider-agnostic — each provider wraps the result into its own\n * attachment format (e.g. Outlook `@odata.type` objects or nodemailer\n * `cid` attachments).\n */\nexport function parseInlineImages(html: string): {\n body: string;\n images: InlineImage[];\n} {\n const images: InlineImage[] = [];\n // Match src=\"data:image/<subtype>;base64,<payload>\"\n // Supports png, jpg, jpeg, gif, svg+xml, webp, bmp, etc.\n const re = /src=\"data:image\\/([\\w+]+);base64,([^\"]+)\"/gi;\n\n const transformed = html.replace(re, (_fullMatch, mimeSubtype, b64) => {\n const contentId = `sig-img-${randomUUID()}`;\n const ext =\n mimeSubtype.toLowerCase().replace(/\\+/g, \"-\") === \"svg-xml\"\n ? \"svg\"\n : mimeSubtype.toLowerCase().replace(/\\+/g, \"-\");\n images.push({\n cid: contentId,\n contentBytes: b64,\n contentType: `image/${mimeSubtype}`,\n filename: `signature-image.${ext}`,\n });\n return `src=\"cid:${contentId}\"`;\n });\n\n return { body: transformed, images };\n}\n","import { parseInlineImages } from \"../shared/inline-images.js\";\nimport type { EmailAddress, EmailSummary, FolderInfo } from \"../types.js\";\n\nexport interface InlineAttachment {\n \"@odata.type\": string;\n name: string;\n contentType: string;\n contentId: string;\n contentBytes: string;\n isInline: boolean;\n}\n\n/**\n * Scans HTML for data:image/...;base64,... URIs, extracts the raw base64\n * data, assigns unique contentIds, and returns the transformed body\n * (with src=\"cid:...\" references) plus an array of inline fileAttachment\n * objects ready for the Graph API.\n *\n * Delegates the HTML parsing to the shared {@link parseInlineImages} and\n * then wraps each image in an Outlook-specific `@odata.type` attachment.\n *\n * Pass-through when there are no matches — returns the original body with\n * an empty attachments array.\n */\nexport function convertInlineImages(body: string): {\n body: string;\n attachments: InlineAttachment[];\n} {\n const { body: transformed, images } = parseInlineImages(body);\n const attachments: InlineAttachment[] = images.map((img) => ({\n \"@odata.type\": \"#microsoft.graph.fileAttachment\",\n name: img.filename,\n contentType: img.contentType,\n contentId: img.cid,\n contentBytes: img.contentBytes,\n isInline: true,\n }));\n return { body: transformed, attachments };\n}\n\nexport interface GraphRecipient {\n emailAddress?: { name?: string; address?: string };\n}\n\nexport interface GraphMessage {\n id: string;\n subject?: string;\n from?: GraphRecipient;\n toRecipients?: GraphRecipient[];\n ccRecipients?: GraphRecipient[];\n bccRecipients?: GraphRecipient[];\n receivedDateTime?: string;\n bodyPreview?: string;\n isRead?: boolean;\n hasAttachments?: boolean;\n body?: { contentType?: \"text\" | \"html\"; content?: string };\n}\n\nexport interface GraphAttachment {\n id: string;\n name: string;\n contentType?: string;\n size?: number;\n}\n\nexport interface GraphFolder {\n id: string;\n displayName: string;\n parentFolderId?: string;\n childFolderCount: number;\n totalItemCount: number;\n unreadItemCount: number;\n}\n\nexport function mapFolder(f: GraphFolder): FolderInfo {\n return {\n id: f.id,\n displayName: f.displayName,\n parentFolderId: f.parentFolderId,\n childFolderCount: f.childFolderCount,\n totalItemCount: f.totalItemCount,\n unreadItemCount: f.unreadItemCount,\n };\n}\n\nexport function mapRecipient(r: GraphRecipient): EmailAddress {\n return {\n name: r.emailAddress?.name,\n address: r.emailAddress?.address ?? \"\",\n };\n}\n\nexport function mapSummary(m: GraphMessage, folder?: string): EmailSummary {\n return {\n id: m.id,\n subject: m.subject ?? \"\",\n from: m.from ? mapRecipient(m.from) : undefined,\n to: (m.toRecipients ?? []).map(mapRecipient),\n receivedAt: m.receivedDateTime,\n preview: m.bodyPreview,\n isRead: m.isRead,\n hasAttachments: m.hasAttachments,\n folder,\n };\n}\n\nexport function toRecipient(a: EmailAddress): GraphRecipient {\n return { emailAddress: { name: a.name, address: a.address } };\n}\n\nexport function clampLimit(v: number | undefined, dflt: number, max: number): number {\n if (!v || v <= 0) return dflt;\n return Math.min(v, max);\n}\n","import type { Client } from \"@microsoft/microsoft-graph-client\";\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type { DraftUpdateInput, SendInput } from \"../types.js\";\nimport { convertInlineImages, type InlineAttachment, toRecipient } from \"./helpers.js\";\n\n/** Hidden HTML comment placed at the thread boundary to survive Graph HTML normalization. */\nexport const THREAD_MARKER = \"<!-- hypermail-thread-boundary -->\";\n\n/**\n * Creates a draft from a reference message (forward or reply), prepends our\n * composed body before the existing content, and attaches inline images.\n * Returns the draft message ID.\n */\nexport async function buildDraftFromReference(\n client: Client,\n createEndpoint: string,\n createPayload: Record<string, unknown>,\n converted: { body: string; attachments: InlineAttachment[] },\n): Promise<string> {\n const draft: { id: string } = await client\n .api(createEndpoint)\n .post(createPayload);\n\n const draftMsg: { body?: { content?: string; contentType?: string } } =\n await client.api(`/me/messages/${draft.id}`).select(\"body\").get();\n\n const draftBody = draftMsg.body?.content ?? \"\";\n const draftContentType = draftMsg.body?.contentType ?? \"HTML\";\n const spacer = '<div style=\"line-height:12px\"><br></div>';\n const prepend = converted.body + spacer + THREAD_MARKER;\n const finalBody = draftBody.includes(\"<body\")\n ? draftBody.replace(/(<body[^>]*>)/i, `$1${prepend}`)\n : prepend + draftBody;\n\n await client.api(`/me/messages/${draft.id}`).patch({\n body: { contentType: draftContentType, content: finalBody },\n });\n\n for (const att of converted.attachments) {\n await client.api(`/me/messages/${draft.id}/attachments`).post(att);\n }\n\n return draft.id;\n}\n\n/**\n * Shared backend for sendEmail and saveDraft — handles forward, reply, and\n * new-message paths. The `mode` controls whether the message is sent\n * immediately or saved as a draft.\n */\nexport async function sendOrSave(\n client: Client,\n account: AccountRecord,\n msg: SendInput,\n mode: \"send\" | \"draft\",\n): Promise<{ id: string }> {\n const converted = convertInlineImages(msg.body);\n\n const toRecipients = msg.to.map(toRecipient);\n const ccRecipients = (msg.cc ?? []).map(toRecipient);\n const bccRecipients = (msg.bcc ?? []).map(toRecipient);\n\n // Forward — build a forward draft, then send if mode is \"send\".\n if (msg.forwardMessageId) {\n const draftId = await buildDraftFromReference(\n client,\n `/me/messages/${encodeURIComponent(msg.forwardMessageId)}/createForward`,\n { message: { toRecipients, ccRecipients, bccRecipients }, comment: \"\" },\n converted,\n );\n if (mode === \"send\") {\n await client.api(`/me/messages/${draftId}/send`).post({});\n }\n return { id: draftId };\n }\n\n // Reply — build a reply draft, then send if mode is \"send\".\n if (msg.inReplyTo) {\n const createEndpoint = msg.replyAll\n ? `/me/messages/${encodeURIComponent(msg.inReplyTo)}/createReplyAll`\n : `/me/messages/${encodeURIComponent(msg.inReplyTo)}/createReply`;\n const draftId = await buildDraftFromReference(\n client, createEndpoint, {}, converted,\n );\n if (mode === \"send\") {\n await client.api(`/me/messages/${draftId}/send`).post({});\n }\n return { id: draftId };\n }\n\n // New email — sendMail (mode=send) or POST /me/messages (mode=draft).\n const messagePayload: Record<string, unknown> = {\n subject: msg.subject,\n body: {\n contentType: msg.isHtml ? \"HTML\" : \"Text\",\n content: converted.body,\n },\n toRecipients,\n ccRecipients,\n bccRecipients,\n };\n\n // Merge inline attachments (from HTML body) with file attachments\n const allAttachments: unknown[] = [...converted.attachments];\n if (msg.attachments && msg.attachments.length > 0) {\n for (const att of msg.attachments) {\n allAttachments.push({\n \"@odata.type\": \"#microsoft.graph.fileAttachment\",\n name: att.name,\n contentBytes: att.contentBytes,\n contentType: att.contentType ?? \"application/octet-stream\",\n });\n }\n }\n if (allAttachments.length > 0) {\n messagePayload.attachments = allAttachments;\n }\n\n if (mode === \"send\") {\n await client.api(\"/me/sendMail\").post({\n message: messagePayload,\n saveToSentItems: true,\n });\n // Graph's sendMail returns 202 with no body; we don't have an id back.\n return { id: \"\" };\n }\n\n const draft: { id: string } = await client\n .api(\"/me/messages\")\n .post(messagePayload);\n return { id: draft.id };\n}\n\nexport async function updateDraft(\n client: Client,\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n): Promise<{ id: string }> {\n const payload: Record<string, unknown> = {};\n\n if (update.subject !== undefined) {\n payload.subject = update.subject;\n }\n if (update.to !== undefined) {\n payload.toRecipients = update.to.map(toRecipient);\n }\n if (update.cc !== undefined) {\n payload.ccRecipients = update.cc.map(toRecipient);\n }\n if (update.bcc !== undefined) {\n payload.bccRecipients = update.bcc.map(toRecipient);\n }\n if (update.body !== undefined) {\n const converted = convertInlineImages(update.body);\n payload.body = {\n contentType: update.isHtml ? \"HTML\" : \"Text\",\n content: converted.body,\n };\n if (converted.attachments.length > 0) {\n // Patch existing inline attachments: Graph will replace all\n // attachments on the message. We send only the new ones.\n payload.attachments = converted.attachments;\n }\n }\n\n await client\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .patch(payload);\n\n return { id };\n}\n\nexport async function addAttachmentToDraft(\n client: Client,\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n): Promise<{ id: string; attachment: { id: string; name: string; contentType?: string } }> {\n const att = (await client\n .api(`/me/messages/${encodeURIComponent(draftId)}/attachments`)\n .post({\n \"@odata.type\": \"#microsoft.graph.fileAttachment\",\n name,\n contentType: contentType ?? \"application/octet-stream\",\n contentBytes,\n })) as { id: string; name: string; contentType?: string };\n return {\n id: draftId,\n attachment: { id: att.id, name: att.name, contentType: att.contentType },\n };\n}\n\nexport async function removeAttachmentFromDraft(\n client: Client,\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n): Promise<void> {\n await client\n .api(`/me/messages/${encodeURIComponent(draftId)}/attachments/${encodeURIComponent(attachmentId)}`)\n .delete();\n}\n\nexport async function moveEmail(\n client: Client,\n account: AccountRecord,\n id: string,\n destinationId: string,\n): Promise<void> {\n await client\n .api(`/me/messages/${encodeURIComponent(id)}/move`)\n .post({ destinationId });\n}\n\nexport async function sendDraft(\n client: Client,\n account: AccountRecord,\n id: string,\n): Promise<{ id: string }> {\n await client.api(`/me/messages/${encodeURIComponent(id)}/send`).post({});\n return { id };\n}\n\nexport async function markRead(\n client: Client,\n account: AccountRecord,\n id: string,\n isRead: boolean,\n): Promise<void> {\n await client\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .patch({ isRead });\n}\n","import { ResponseType } from \"@microsoft/microsoft-graph-client\";\nimport { writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join as pathJoin } from \"node:path\";\nimport type { Client } from \"@microsoft/microsoft-graph-client\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailFull,\n EmailSummary,\n ListEmailsOptions,\n ListEmailsResult,\n SearchEmailsOptions,\n} from \"../types.js\";\nimport {\n clampLimit,\n type GraphAttachment,\n type GraphMessage,\n mapRecipient,\n mapSummary,\n} from \"./helpers.js\";\n\nexport async function listEmails(\n client: Client,\n account: AccountRecord,\n opts: ListEmailsOptions,\n): Promise<ListEmailsResult> {\n const limit = clampLimit(opts.limit, 25, 100);\n const folder = opts.folder ?? \"inbox\";\n const filterParts: string[] = [];\n if (opts.unreadOnly) filterParts.push(\"isRead eq false\");\n\n let req = client\n .api(`/me/mailFolders/${encodeURIComponent(folder)}/messages`)\n .top(limit)\n .skip(opts.skip ?? 0)\n .select([\n \"id\",\n \"subject\",\n \"from\",\n \"toRecipients\",\n \"receivedDateTime\",\n \"bodyPreview\",\n \"isRead\",\n \"hasAttachments\",\n ].join(\",\"))\n .orderby(\"receivedDateTime DESC\");\n\n if (filterParts.length > 0) req = req.filter(filterParts.join(\" and \"));\n\n const res = (await req.get()) as { value: GraphMessage[]; \"@odata.nextLink\"?: string };\n return {\n items: res.value.map((m) => mapSummary(m, folder)),\n hasMore: !!res[\"@odata.nextLink\"],\n };\n}\n\nexport async function searchEmails(\n client: Client,\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n): Promise<EmailSummary[]> {\n const limit = clampLimit(opts.limit, 25, 100);\n // $search requires the ConsistencyLevel: eventual header\n const res = (await client\n .api(\"/me/messages\")\n .header(\"ConsistencyLevel\", \"eventual\")\n .top(limit)\n .search(`\"${query.replace(/\"/g, '\\\\\"')}\"`)\n .select(\n [\n \"id\",\n \"subject\",\n \"from\",\n \"toRecipients\",\n \"receivedDateTime\",\n \"bodyPreview\",\n \"isRead\",\n \"hasAttachments\",\n ].join(\",\"),\n )\n .get()) as { value: GraphMessage[] };\n return res.value.map((m) => mapSummary(m));\n}\n\nexport async function readEmail(\n client: Client,\n account: AccountRecord,\n id: string,\n): Promise<EmailFull> {\n const m = (await client\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .select(\n [\n \"id\",\n \"subject\",\n \"from\",\n \"toRecipients\",\n \"ccRecipients\",\n \"bccRecipients\",\n \"receivedDateTime\",\n \"bodyPreview\",\n \"isRead\",\n \"hasAttachments\",\n \"body\",\n ].join(\",\"),\n )\n .get()) as GraphMessage;\n\n let attachments: EmailFull[\"attachments\"] = undefined;\n if (m.hasAttachments) {\n try {\n const attRes = (await client\n .api(`/me/messages/${encodeURIComponent(id)}/attachments`)\n .select(\"id,name,contentType,size\")\n .get()) as { value: GraphAttachment[] };\n attachments = attRes.value.map((a) => ({\n id: a.id,\n name: a.name,\n contentType: a.contentType,\n size: a.size,\n }));\n } catch {\n /* ignore attachment listing failure */\n }\n }\n\n const summary = mapSummary(m);\n const body = m.body;\n return {\n ...summary,\n cc: (m.ccRecipients ?? []).map(mapRecipient),\n bcc: (m.bccRecipients ?? []).map(mapRecipient),\n bodyText: body?.contentType === \"text\" ? body.content : undefined,\n bodyHtml: body?.contentType === \"html\" ? body.content : undefined,\n attachments,\n };\n}\n\nexport async function readAttachment(\n client: Client,\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n): Promise<AttachmentContent> {\n // First, get the attachment metadata to know the filename\n const att = (await client\n .api(`/me/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`)\n .select(\"name,contentType\")\n .get()) as { name: string; contentType?: string };\n\n // Download the raw content as ArrayBuffer\n const data = (await client\n .api(`/me/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}/$value`)\n .responseType(ResponseType.ARRAYBUFFER)\n .get()) as ArrayBuffer;\n\n // Write to temp file with original name\n const outPath = pathJoin(tmpdir(), att.name);\n writeFileSync(outPath, Buffer.from(data));\n\n return {\n name: att.name,\n contentType: att.contentType,\n path: outPath,\n };\n}\n","import type { Client } from \"@microsoft/microsoft-graph-client\";\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n CreateFolderInput,\n FolderInfo,\n ListFoldersOptions,\n} from \"../types.js\";\nimport { type GraphFolder, mapFolder } from \"./helpers.js\";\n\nexport async function listFolders(\n client: Client,\n account: AccountRecord,\n opts: ListFoldersOptions,\n): Promise<FolderInfo[]> {\n const endpoint = opts.parentFolderId\n ? `/me/mailFolders/${encodeURIComponent(opts.parentFolderId)}/childFolders`\n : \"/me/mailFolders\";\n const res = (await client\n .api(endpoint)\n .select([\n \"id\",\n \"displayName\",\n \"parentFolderId\",\n \"childFolderCount\",\n \"totalItemCount\",\n \"unreadItemCount\",\n ].join(\",\"))\n .get()) as { value: GraphFolder[] };\n return (res.value ?? []).map(mapFolder);\n}\n\nexport async function createFolder(\n client: Client,\n account: AccountRecord,\n input: CreateFolderInput,\n): Promise<FolderInfo> {\n const parentId = input.parentFolderId ?? \"msgfolderroot\";\n const created = (await client\n .api(`/me/mailFolders/${encodeURIComponent(parentId)}/childFolders`)\n .post({ displayName: input.displayName })) as GraphFolder;\n return mapFolder(created);\n}\n\nexport async function renameFolder(\n client: Client,\n account: AccountRecord,\n folderId: string,\n newName: string,\n): Promise<FolderInfo> {\n const updated = (await client\n .api(`/me/mailFolders/${encodeURIComponent(folderId)}`)\n .patch({ displayName: newName })) as GraphFolder;\n return mapFolder(updated);\n}\n\nexport async function deleteFolder(\n client: Client,\n account: AccountRecord,\n folderId: string,\n): Promise<void> {\n await client\n .api(`/me/mailFolders/${encodeURIComponent(folderId)}`)\n .delete();\n}\n","import { ImapFlow } from \"imapflow\";\nimport type { Readable } from \"node:stream\";\nimport nodemailer from \"nodemailer\";\nimport type { Transporter } from \"nodemailer\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\n\n// ---------- token shape ----------\n\nexport interface ImapTokens {\n host: string;\n port: number;\n secure: boolean;\n user: string;\n password: string;\n smtpHost: string;\n smtpPort: number;\n smtpSecure: boolean;\n}\n\n/** Type guard — validates that an unknown value has the shape of ImapTokens. */\nexport function isImapTokens(obj: unknown): obj is ImapTokens {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return (\n typeof o.host === \"string\" &&\n typeof o.port === \"number\" &&\n typeof o.user === \"string\" &&\n typeof o.password === \"string\" &&\n typeof o.smtpHost === \"string\" &&\n typeof o.smtpPort === \"number\"\n );\n}\n\n/** Extract IMAP tokens from an account record, throwing if malformed. */\nexport function extractTokens(account: AccountRecord): ImapTokens {\n if (!isImapTokens(account.tokens)) {\n throw new Error(\n \"IMAP account tokens are missing or corrupted — re-run add_account\",\n );\n }\n return account.tokens as ImapTokens;\n}\n\n// ---------- client ----------\n\n/**\n * Per-account IMAP+SMTP client. Wraps an {@link ImapFlow} connection and a\n * {@link Transporter} from nodemailer. The factory caches instances so a\n * single account reuses its connection across calls.\n */\nexport class ImapClient {\n private imap: ImapFlow | null = null;\n private transporter: Transporter | null = null;\n private connecting: Promise<void> | null = null;\n\n constructor(private readonly tokens: ImapTokens) {}\n\n /** Get (or create) the ImapFlow instance. */\n async getImap(): Promise<ImapFlow> {\n if (this.imap) return this.imap;\n\n this.imap = new ImapFlow({\n host: this.tokens.host,\n port: this.tokens.port,\n secure: this.tokens.secure,\n auth: {\n user: this.tokens.user,\n pass: this.tokens.password,\n },\n logger: false,\n });\n\n // Connect on first use and serialise concurrent callers.\n if (!this.connecting) {\n this.connecting = this.imap\n .connect()\n .catch((err) => {\n // Clear state so next caller retries\n this.imap = null;\n this.connecting = null;\n throw err;\n });\n }\n await this.connecting;\n return this.imap;\n }\n\n /** Get (or create) a nodemailer SMTP transporter. */\n getTransporter(): Transporter {\n if (this.transporter) return this.transporter;\n this.transporter = nodemailer.createTransport({\n host: this.tokens.smtpHost,\n port: this.tokens.smtpPort,\n secure: this.tokens.smtpSecure,\n auth: {\n user: this.tokens.user,\n pass: this.tokens.password,\n },\n });\n return this.transporter;\n }\n\n /**\n * Acquire a mailbox lock and run `fn` with the mailbox selected.\n * Releases the lock automatically after `fn` completes.\n */\n async withMailbox<T>(mailbox: string, fn: (imap: ImapFlow) => Promise<T>): Promise<T> {\n const imap = await this.getImap();\n const lock = await imap.getMailboxLock(mailbox);\n try {\n return await fn(imap);\n } finally {\n lock.release();\n }\n }\n\n /** Disconnect IMAP and close the SMTP pool. */\n async disconnect(): Promise<void> {\n if (this.imap) {\n try {\n await this.imap.logout();\n } catch {\n /* ignore */\n }\n this.imap = null;\n this.connecting = null;\n }\n if (this.transporter) {\n this.transporter.close();\n this.transporter = null;\n }\n }\n}\n\n// ---------- factory ----------\n\n/**\n * Caches {@link ImapClient} instances per account email so connections are\n * reused across calls. Analogous to {@link OutlookClientFactory}.\n */\nexport class ImapClientFactory {\n private readonly cache = new Map<string, ImapClient>();\n\n get(account: AccountRecord): ImapClient {\n const key = account.email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) return existing;\n\n const tokens = extractTokens(account);\n const client = new ImapClient(tokens);\n this.cache.set(key, client);\n return client;\n }\n\n /** Drop a cached client (e.g. after removeAccount). */\n invalidate(email: string): void {\n const key = email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) {\n existing.disconnect().catch(() => {});\n this.cache.delete(key);\n }\n }\n}\n","import { createWriteStream } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join as pathJoin } from \"node:path\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { Readable } from \"node:stream\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailFull,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\nimport {\n BodyNode,\n clampLimit,\n decodeId,\n findAttachments,\n findPartByType,\n ImapEnvelope,\n mapSummary,\n mapEnvelopeAddr,\n mapMailboxToListEntry,\n ImapMailboxEntry,\n resolveFolder,\n} from \"./helpers.js\";\n\n/**\n * Browse operations for IMAP — list, search, read emails, attachments,\n * and folders. All functions are pure and take the client factory as\n * the first argument so the ImapProvider class can delegate to them.\n */\n\nexport async function listEmails(\n clients: ImapClientFactory,\n account: AccountRecord,\n opts: ListEmailsOptions,\n): Promise<ListEmailsResult> {\n const client = clients.get(account);\n const folder = resolveFolder(opts.folder ?? \"INBOX\");\n const limit = clampLimit(opts.limit, 25, 100);\n const skip = opts.skip ?? 0;\n\n return client.withMailbox(folder, async (imap) => {\n const searchCriteria: Record<string, unknown> = {};\n if (opts.unreadOnly) searchCriteria.seen = false;\n\n const allUids = (\n Object.keys(searchCriteria).length > 0\n ? await imap.search(searchCriteria, { uid: true })\n : await imap.search({ all: true }, { uid: true })\n ) as number[];\n\n allUids.sort((a, b) => b - a);\n const pageUids = allUids.slice(skip, skip + limit);\n const hasMore = skip + limit < allUids.length;\n\n if (pageUids.length === 0) {\n return { items: [], hasMore };\n }\n\n const messages = await imap.fetchAll(\n pageUids,\n { envelope: true, flags: true },\n { uid: true },\n );\n\n const items: EmailSummary[] = [];\n for (const msg of messages) {\n items.push(\n mapSummary(\n msg.uid as number,\n folder,\n msg.envelope as ImapEnvelope,\n msg.flags as Set<string>,\n ),\n );\n }\n return { items, hasMore };\n });\n}\n\nexport async function searchEmails(\n clients: ImapClientFactory,\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n): Promise<EmailSummary[]> {\n const client = clients.get(account);\n const limit = clampLimit(opts.limit, 25, 100);\n\n return client.withMailbox(\"INBOX\", async (imap) => {\n const uids = (await imap.search({ text: query }, { uid: true })) as number[];\n uids.sort((a, b) => b - a);\n const pageUids = uids.slice(0, limit);\n\n if (pageUids.length === 0) return [];\n\n const messages = await imap.fetchAll(\n pageUids,\n { envelope: true, flags: true },\n { uid: true },\n );\n\n return messages.map((msg) =>\n mapSummary(\n msg.uid as number,\n \"INBOX\",\n msg.envelope as ImapEnvelope,\n msg.flags as Set<string>,\n ),\n );\n });\n}\n\nexport async function readEmail(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<EmailFull> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n const msg = await imap.fetchOne(\n uid,\n { bodyStructure: true, envelope: true, flags: true },\n { uid: true },\n );\n\n if (!msg || !msg.envelope) {\n throw new Error(`message not found: ${id}`);\n }\n\n const envelope = msg.envelope as ImapEnvelope;\n const structure = msg.bodyStructure as BodyNode;\n const flags = (msg.flags as Set<string>) ?? new Set<string>();\n\n let bodyText: string | undefined;\n let bodyHtml: string | undefined;\n\n const textPart = findPartByType(structure, \"text/plain\");\n const htmlPart = findPartByType(structure, \"text/html\");\n\n if (textPart) {\n const { content } = await imap.download(uid, textPart, { uid: true });\n const chunks: Buffer[] = [];\n for await (const chunk of content as Readable) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n bodyText = Buffer.concat(chunks).toString(\"utf-8\");\n }\n\n if (htmlPart) {\n const { content } = await imap.download(uid, htmlPart, { uid: true });\n const chunks: Buffer[] = [];\n for await (const chunk of content as Readable) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n bodyHtml = Buffer.concat(chunks).toString(\"utf-8\");\n }\n\n const attachments: EmailFull[\"attachments\"] = findAttachments(\n structure,\n ).map((a) => ({\n id: a.part,\n name: a.name,\n contentType: a.contentType,\n size: a.size,\n }));\n\n const summary = mapSummary(uid, folder, envelope, flags);\n\n return {\n ...summary,\n cc: (envelope.cc ?? []).map(mapEnvelopeAddr),\n bcc: (envelope.bcc ?? []).map(mapEnvelopeAddr),\n bodyText,\n bodyHtml,\n attachments: attachments.length > 0 ? attachments : undefined,\n hasAttachments: attachments.length > 0,\n };\n });\n}\n\nexport async function readAttachment(\n clients: ImapClientFactory,\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n): Promise<AttachmentContent> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(messageId);\n\n return client.withMailbox(folder, async (imap) => {\n const msg = (await imap.fetchOne(\n uid,\n { bodyStructure: true },\n { uid: true },\n )) as { bodyStructure?: BodyNode } | false;\n\n let name = \"attachment\";\n let contentType: string | undefined;\n if (msg && msg.bodyStructure) {\n const attachments = findAttachments(msg.bodyStructure);\n const match = attachments.find((a) => a.part === attachmentId);\n if (match) {\n name = match.name;\n contentType = match.contentType;\n }\n }\n\n const { meta, content } = await imap.download(uid, attachmentId, {\n uid: true,\n });\n\n const outPath = pathJoin(tmpdir(), name);\n await pipeline(\n content as unknown as Readable,\n createWriteStream(outPath),\n );\n\n return {\n name,\n contentType: contentType ?? (meta as { contentType?: string }).contentType,\n path: outPath,\n };\n });\n}\n\nexport async function listFolders(\n clients: ImapClientFactory,\n account: AccountRecord,\n opts: ListFoldersOptions,\n): Promise<FolderInfo[]> {\n const client = clients.get(account);\n const imap = await client.getImap();\n\n const mailboxes = await imap.list({\n statusQuery: { messages: true, unseen: true, uidNext: true },\n } as never);\n\n let results: FolderInfo[] = (\n mailboxes as unknown as ImapMailboxEntry[]\n ).map(mapMailboxToListEntry);\n\n if (opts.parentFolderId) {\n const parentPath = opts.parentFolderId;\n results = results.filter(\n (f) =>\n f.parentFolderId === parentPath ||\n (parentPath === \"INBOX\" && f.displayName === \"INBOX\"),\n );\n } else {\n // Top-level: filter out children of other folders\n const allPaths = new Set(results.map((f) => f.displayName));\n results = results.filter((f) => {\n const lastSep = f.displayName.lastIndexOf(\"/\");\n if (lastSep === -1) return true;\n const parent = f.displayName.slice(0, lastSep);\n return !allPaths.has(parent);\n });\n }\n\n return results;\n}\n","import type { EmailAddress, EmailSummary, FolderInfo } from \"../types.js\";\nimport type { AccountRecord } from \"../../store/account-store.js\";\n\n// ---------- well-known folder mapping ----------\n\nconst WELL_KNOWN_TO_IMAP: Record<string, string> = {\n archive: \"Archive\",\n deleteditems: \"Trash\",\n inbox: \"INBOX\",\n drafts: \"Drafts\",\n sentitems: \"Sent\",\n junkemail: \"Junk\",\n outbox: \"Outbox\",\n};\n\nexport function resolveFolder(wellKnownOrPath: string): string {\n return WELL_KNOWN_TO_IMAP[wellKnownOrPath.toLowerCase()] ?? wellKnownOrPath;\n}\n\n// ---------- generic ----------\n\nexport function clampLimit(v: number | undefined, dflt: number, max: number): number {\n if (!v || v <= 0) return dflt;\n return Math.min(v, max);\n}\n\n// ---------- ID encoding ----------\n\n/** Encode a folder path + numeric UID into a composite message ID. */\nexport function encodeId(folder: string, uid: number): string {\n return `${folder}/${uid}`;\n}\n\n/** Decode a composite message ID back into folder + numeric UID. */\nexport function decodeId(id: string): { folder: string; uid: number } {\n const idx = id.lastIndexOf(\"/\");\n if (idx === -1) throw new Error(`invalid message ID: ${id}`);\n const folder = id.slice(0, idx);\n const uid = Number(id.slice(idx + 1));\n if (!Number.isFinite(uid) || uid <= 0) {\n throw new Error(`invalid message UID in ID: ${id}`);\n }\n return { folder, uid };\n}\n\n// ---------- body structure helpers ----------\n\nexport interface BodyNode {\n type?: string;\n part?: string;\n encoding?: string;\n size?: number;\n disposition?: string;\n dispositionParameters?: Record<string, string>;\n parameters?: Record<string, string>;\n childNodes?: BodyNode[];\n}\n\nexport interface ImapAttachmentMeta {\n part: string;\n name: string;\n contentType?: string;\n size?: number;\n}\n\n/** Recursively collect attachment metadata from a bodyStructure node. */\nexport function findAttachments(node: BodyNode): ImapAttachmentMeta[] {\n const attachments: ImapAttachmentMeta[] = [];\n const topType = (node.type ?? \"\").split(\"/\")[0];\n\n const isAttachment =\n node.disposition === \"attachment\" ||\n (!!node.type &&\n topType !== \"text\" &&\n topType !== \"multipart\" &&\n !node.disposition);\n\n if (isAttachment) {\n attachments.push({\n part: node.part ?? \"1\",\n name:\n node.dispositionParameters?.filename ??\n node.parameters?.name ??\n \"attachment\",\n contentType: node.type,\n size: node.size,\n });\n }\n\n if (node.childNodes) {\n for (const child of node.childNodes) {\n attachments.push(...findAttachments(child));\n }\n }\n\n return attachments;\n}\n\n/**\n * Find the part number for a specific content type (e.g. \"text/plain\",\n * \"text/html\") in the body structure tree.\n */\nexport function findPartByType(\n node: BodyNode,\n contentType: string,\n): string | undefined {\n if (node.type === contentType) return node.part ?? \"1\";\n if (node.childNodes) {\n for (const child of node.childNodes) {\n const found = findPartByType(child, contentType);\n if (found) return found;\n }\n }\n return undefined;\n}\n\n// ---------- envelope mapping ----------\n\nexport interface ImapEnvelopeAddr {\n name?: string;\n address?: string;\n}\n\nexport interface ImapEnvelope {\n subject?: string;\n date?: Date;\n messageId?: string;\n inReplyTo?: string;\n from?: ImapEnvelopeAddr[];\n to?: ImapEnvelopeAddr[];\n cc?: ImapEnvelopeAddr[];\n bcc?: ImapEnvelopeAddr[];\n}\n\nexport function mapEnvelopeAddr(a: ImapEnvelopeAddr): EmailAddress {\n return { name: a.name, address: a.address ?? \"\" };\n}\n\nexport function mapSummary(\n uid: number,\n folder: string,\n envelope: ImapEnvelope,\n flags: Set<string> = new Set(),\n): EmailSummary {\n const fromAddr =\n envelope.from && envelope.from.length > 0 && envelope.from[0]\n ? mapEnvelopeAddr(envelope.from[0])\n : undefined;\n return {\n id: encodeId(folder, uid),\n subject: envelope.subject ?? \"\",\n from: fromAddr,\n to: (envelope.to ?? []).map(mapEnvelopeAddr),\n receivedAt: envelope.date ? envelope.date.toISOString() : undefined,\n isRead: flags.has(\"\\\\Seen\"),\n folder,\n };\n}\n\n// ---------- mailbox mapping ----------\n\nexport interface ImapMailboxEntry {\n path: string;\n name?: string;\n specialUse?: string;\n delimiter?: string;\n listed?: boolean;\n subscribed?: boolean;\n status?: {\n messages?: number;\n unseen?: number;\n };\n}\n\nexport function mapMailboxToListEntry(m: ImapMailboxEntry): FolderInfo {\n const lastSep = m.path.lastIndexOf(\"/\");\n const parentFolderId =\n lastSep === -1 ? undefined : m.path.slice(0, lastSep);\n return {\n id: m.path,\n displayName: m.path,\n parentFolderId,\n childFolderCount: 0,\n totalItemCount: m.status?.messages ?? 0,\n unreadItemCount: m.status?.unseen ?? 0,\n };\n}\n","import type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n CompleteAddAccountResult,\n} from \"../types.js\";\nimport { ImapClientFactory, ImapTokens, isImapTokens } from \"./client.js\";\n\nexport async function addAccount(\n clients: ImapClientFactory,\n store: { upsertAccount(rec: AccountRecord): Promise<AccountRecord> },\n input: AddAccountInput,\n): Promise<AddAccountResult> {\n const cfg = input.config ?? {};\n const host = String(cfg.host ?? \"\");\n const port = Number(cfg.port ?? 993);\n const secure = cfg.secure !== false;\n const user = String(cfg.user ?? input.email ?? \"\");\n const password = String(cfg.password ?? \"\");\n const smtpHost = String(cfg.smtpHost ?? host);\n const smtpPort = Number(cfg.smtpPort ?? 587);\n const smtpSecure = cfg.smtpSecure === true;\n\n if (!host || !user || !password) {\n throw new Error(\n \"IMAP requires config: { host, port?, secure?, user, password, smtpHost?, smtpPort?, smtpSecure? }\",\n );\n }\n\n const tokens: ImapTokens = {\n host,\n port,\n secure,\n user,\n password,\n smtpHost: smtpHost || host,\n smtpPort: smtpPort || 587,\n smtpSecure,\n };\n\n // Validate by connecting briefly.\n const client = clients.get({\n email: user.toLowerCase(),\n provider: \"imap\",\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n } as AccountRecord);\n\n try {\n await client.getImap();\n } finally {\n clients.invalidate(user.toLowerCase());\n }\n\n // Optionally validate SMTP — best-effort.\n try {\n const t = client.getTransporter();\n await t.verify();\n } catch {\n /* SMTP verification is optional */\n }\n\n const email = user.toLowerCase();\n const rec: AccountRecord = {\n email,\n provider: \"imap\",\n displayName: input.email ?? user,\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n };\n const saved = await store.upsertAccount(rec);\n return { status: \"ready\", account: saved };\n}\n\nexport function completeAddAccount(): CompleteAddAccountResult {\n return {\n status: \"error\",\n error:\n \"IMAP accounts are set up synchronously — no polling needed. \" +\n \"Call add_account with IMAP config to create the account directly.\",\n };\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport MailComposer from \"nodemailer/lib/mail-composer/index.js\";\n\nimport type {\n DraftUpdateInput,\n SendInput,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\nimport {\n decodeId,\n encodeId,\n ImapEnvelope,\n resolveFolder,\n} from \"./helpers.js\";\nimport type { BodyNode } from \"./helpers.js\";\nimport {\n findAttachmentInMime,\n removeMimePart,\n} from \"./mime-utils.js\";\n\n/** Write operations for IMAP — send, draft, move, mark, folders. */\n\nexport async function sendEmail(\n clients: ImapClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const transporter = client.getTransporter();\n\n const mailOptions: import(\"nodemailer\").SendMailOptions = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n to: msg.to\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \"),\n subject: msg.subject,\n };\n\n if (msg.isHtml) {\n mailOptions.html = msg.body;\n } else {\n mailOptions.text = msg.body;\n }\n (mailOptions as Record<string, unknown>).attachDataUrls = true;\n\n if (msg.cc && msg.cc.length > 0) {\n mailOptions.cc = msg.cc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n if (msg.bcc && msg.bcc.length > 0) {\n mailOptions.bcc = msg.bcc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n\n // Handle reply and forward threading\n if (msg.inReplyTo || msg.forwardMessageId) {\n const refId = msg.inReplyTo ?? msg.forwardMessageId;\n if (refId) {\n try {\n const { folder: refFolder, uid: refUid } = decodeId(refId);\n const refMsg = (await client.withMailbox(refFolder, async (imap) => {\n return imap.fetchOne(\n refUid,\n { envelope: true, source: true },\n { uid: true },\n );\n })) as { envelope?: ImapEnvelope; source?: string | ArrayBuffer };\n\n if (refMsg?.envelope) {\n const env = refMsg.envelope as ImapEnvelope;\n if (msg.inReplyTo && env.messageId && !msg.forwardMessageId) {\n mailOptions.inReplyTo = env.messageId;\n (mailOptions as Record<string, unknown>).references =\n env.messageId;\n }\n }\n\n // Embed forwarded message\n if (msg.forwardMessageId && refMsg?.source) {\n const sourceStr =\n typeof refMsg.source === \"string\"\n ? refMsg.source\n : Buffer.from(refMsg.source as ArrayBuffer).toString(\"utf-8\");\n const divider =\n '\\n\\n<div style=\"line-height:12px\"><br></div>\\n\\n' +\n '<div style=\"border-left:2px solid #ccc; padding-left:8px; ' +\n 'margin-left:0; color:#666\">\\n' +\n \"---------- Forwarded message ---------<br>\" +\n sourceStr +\n \"\\n</div>\";\n if (mailOptions.html) {\n mailOptions.html += divider;\n } else if (mailOptions.text) {\n mailOptions.text +=\n \"\\n\\n---------- Forwarded message ---------\\n\" + sourceStr;\n }\n }\n } catch {\n /* If we can't fetch the referenced message, proceed without threading. */\n }\n }\n }\n\n const info = await transporter.sendMail(mailOptions);\n\n // Save a copy to Sent folder\n try {\n const rawMsg = await buildRawMessage(account, msg, info.messageId);\n await client.withMailbox(\"Sent\", async (imap) => {\n await imap.append(\"Sent\", rawMsg, [\"\\\\Seen\"]);\n });\n } catch {\n /* best-effort */\n }\n\n return { id: info.messageId };\n}\n\nexport async function saveDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const rawMsg = await buildRawMessage(account, msg);\n return client.withMailbox(\"Drafts\", async (imap) => {\n const result = (await imap.append(\"Drafts\", rawMsg, [\"\\\\Draft\"])) as { uid: number };\n return { id: encodeId(\"Drafts\", result.uid) };\n });\n}\n\nexport async function updateDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n const existing = (await imap.fetchOne(\n uid,\n { source: true, envelope: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer; envelope?: ImapEnvelope };\n if (!existing?.source) {\n throw new Error(`draft not found: ${id}`);\n }\n\n const origSubject = existing.envelope\n ? (existing.envelope as ImapEnvelope).subject ?? \"\"\n : \"\";\n\n const updatedMsg: Record<string, unknown> = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n subject: update.subject ?? origSubject,\n attachDataUrls: true,\n };\n\n if (update.body !== undefined) {\n if (update.isHtml) {\n updatedMsg.html = update.body;\n } else {\n updatedMsg.text = update.body;\n }\n }\n\n const raw = await new Promise<Buffer>((resolve, reject) => {\n const mc = new MailComposer(updatedMsg);\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf);\n });\n });\n\n await imap.messageDelete(uid, { uid: true });\n const result = (await imap.append(folder, raw, [\"\\\\Draft\"])) as { uid: number };\n return { id: encodeId(folder, result.uid) };\n });\n}\n\nexport async function moveEmail(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n destinationId: string,\n): Promise<void> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n const dest = resolveFolder(destinationId);\n\n return client.withMailbox(folder, async (imap) => {\n await imap.messageMove(uid, dest, { uid: true });\n });\n}\n\nexport async function sendDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<{ id: string }> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n const draft = (await imap.fetchOne(\n uid,\n { source: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer };\n if (!draft?.source) {\n throw new Error(`draft not found: ${id}`);\n }\n\n const sourceStr =\n typeof draft.source === \"string\"\n ? draft.source\n : Buffer.from(draft.source as ArrayBuffer).toString(\"utf-8\");\n\n const transporter = client.getTransporter();\n const info = await transporter.sendMail({ raw: sourceStr });\n\n try {\n await imap.messageMove(uid, \"Sent\", { uid: true });\n } catch {\n /* best-effort */\n }\n\n return { id: info.messageId };\n });\n}\n\nexport async function addAttachmentToDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n): Promise<{\n id: string;\n attachment: { id: string; name: string; contentType?: string };\n}> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(draftId);\n\n return client.withMailbox(folder, async (imap) => {\n const existing = (await imap.fetchOne(\n uid,\n { source: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer };\n if (!existing?.source) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n const sourceStr =\n typeof existing.source === \"string\"\n ? existing.source\n : Buffer.from(existing.source as ArrayBuffer).toString(\"utf-8\");\n\n const built = await new Promise<Buffer>((resolve, reject) => {\n const mc = new MailComposer({\n raw: sourceStr,\n attachments: [\n {\n filename: name,\n content: Buffer.from(contentBytes, \"base64\"),\n contentType: contentType ?? \"application/octet-stream\",\n },\n ],\n });\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf);\n });\n });\n\n await imap.messageDelete(uid, { uid: true });\n const result = (await imap.append(folder, built, [\"\\\\Draft\"])) as { uid: number };\n\n return {\n id: encodeId(folder, result.uid),\n attachment: {\n id: randomUUID(),\n name,\n contentType: contentType ?? \"application/octet-stream\",\n },\n };\n });\n}\n\nexport async function removeAttachmentFromDraft(\n clients: ImapClientFactory,\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n): Promise<void> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(draftId);\n\n return client.withMailbox(folder, async (imap) => {\n const existing = (await imap.fetchOne(\n uid,\n { source: true, bodyStructure: true },\n { uid: true },\n )) as { source?: string | ArrayBuffer; bodyStructure?: BodyNode };\n if (!existing?.source) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n const sourceStr =\n typeof existing.source === \"string\"\n ? existing.source\n : Buffer.from(existing.source as ArrayBuffer).toString(\"utf-8\");\n\n // Parse MIME to find the attachment to remove\n const targetInfo = findAttachmentInMime(existing.bodyStructure, attachmentId);\n if (!targetInfo) {\n throw new Error(`attachment not found: ${attachmentId}`);\n }\n\n // Remove the attachment from the MIME source\n const modifiedSource = removeMimePart(sourceStr, targetInfo.filename, targetInfo.contentType);\n\n // Delete old draft and append modified one\n await imap.messageDelete(uid, { uid: true });\n await imap.append(folder, modifiedSource, [\"\\\\Draft\"]);\n });\n}\n\nexport async function markRead(\n clients: ImapClientFactory,\n account: AccountRecord,\n id: string,\n isRead: boolean,\n): Promise<void> {\n const client = clients.get(account);\n const { folder, uid } = decodeId(id);\n\n return client.withMailbox(folder, async (imap) => {\n if (isRead) {\n await imap.messageFlagsAdd(uid, [\"\\\\Seen\"], { uid: true });\n } else {\n await imap.messageFlagsRemove(uid, [\"\\\\Seen\"], { uid: true });\n }\n });\n}\n\nasync function buildRawMessage(\n account: AccountRecord,\n msg: SendInput,\n messageId?: string,\n): Promise<string> {\n const mailOptions: Record<string, unknown> = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n to: msg.to\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \"),\n subject: msg.subject,\n attachDataUrls: true,\n };\n\n if (msg.isHtml) {\n mailOptions.html = msg.body;\n } else {\n mailOptions.text = msg.body;\n }\n\n if (msg.cc && msg.cc.length > 0) {\n mailOptions.cc = msg.cc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n if (msg.bcc && msg.bcc.length > 0) {\n mailOptions.bcc = msg.bcc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n\n // Add file attachments from msg.attachments\n if (msg.attachments && msg.attachments.length > 0) {\n const fileAttachments = msg.attachments.map((att) => ({\n filename: att.name,\n content: Buffer.from(att.contentBytes, \"base64\"),\n contentType: att.contentType,\n }));\n mailOptions.attachments = fileAttachments;\n }\n\n if (messageId) {\n mailOptions.messageId = messageId;\n }\n\n return new Promise<string>((resolve, reject) => {\n const mc = new MailComposer(mailOptions);\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf.toString(\"utf-8\"));\n });\n });\n}\n","import type { BodyNode } from \"./helpers.js\";\n\n/**\n * MIME parsing utilities for attachment manipulation.\n */\n\nexport interface AttachmentInfo {\n filename: string;\n contentType: string;\n}\n\n/**\n * Recursively search MIME structure to find an attachment by ID.\n */\nexport function findAttachmentInMime(\n structure: BodyNode | BodyNode[] | undefined,\n attachmentId: string,\n): AttachmentInfo | null {\n if (!structure) return null;\n\n // Handle multipart\n if (Array.isArray(structure)) {\n for (const part of structure) {\n const result = findAttachmentInMime(part, attachmentId);\n if (result) return result;\n }\n return null;\n }\n\n // Check if this part is the target attachment\n if (structure.part === attachmentId) {\n return {\n filename:\n structure.dispositionParameters?.filename ??\n structure.parameters?.name ??\n \"attachment\",\n contentType: structure.type ?? \"application/octet-stream\",\n };\n }\n\n // Recurse into nested parts\n if (structure.childNodes) {\n return findAttachmentInMime(structure.childNodes, attachmentId);\n }\n\n return null;\n}\n\n/**\n * Remove a MIME part from a message source based on filename and content type.\n */\nexport function removeMimePart(\n source: string,\n targetFilename: string,\n targetContentType: string,\n): string {\n const lines = source.split(\"\\r\\n\");\n const result: string[] = [];\n let skip = false;\n let inTargetPart = false;\n\n for (const line of lines) {\n const lowerLine = line.toLowerCase();\n\n // Check for boundary\n if (line.startsWith(\"--\")) {\n if (inTargetPart) {\n // End of target part, stop skipping\n skip = false;\n inTargetPart = false;\n }\n result.push(line);\n continue;\n }\n\n // Check if this is the start of the target attachment part\n if (\n lowerLine.includes(\"content-disposition:\") &&\n lowerLine.includes(`filename=\"${targetFilename.toLowerCase()}\"`)\n ) {\n inTargetPart = true;\n skip = true;\n continue;\n }\n\n // Also check content-type match\n if (\n inTargetPart &&\n lowerLine.includes(\"content-type:\") &&\n lowerLine.includes(targetContentType.toLowerCase())\n ) {\n skip = true;\n continue;\n }\n\n if (!skip) {\n result.push(line);\n }\n }\n\n return result.join(\"\\r\\n\");\n}\n","import type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n CreateFolderInput,\n FolderInfo,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\n\nexport async function createFolder(\n clients: ImapClientFactory,\n account: AccountRecord,\n input: CreateFolderInput,\n): Promise<FolderInfo> {\n const client = clients.get(account);\n const imap = await client.getImap();\n\n const path = input.parentFolderId\n ? `${input.parentFolderId}/${input.displayName}`\n : input.displayName;\n\n const result = await imap.mailboxCreate(path);\n\n return {\n id: result.path,\n displayName: result.path,\n parentFolderId: input.parentFolderId,\n childFolderCount: 0,\n totalItemCount: 0,\n unreadItemCount: 0,\n };\n}\n\nexport async function renameFolder(\n clients: ImapClientFactory,\n account: AccountRecord,\n folderId: string,\n newName: string,\n): Promise<FolderInfo> {\n const client = clients.get(account);\n const imap = await client.getImap();\n\n const lastSep = folderId.lastIndexOf(\"/\");\n const newPath =\n lastSep === -1 ? newName : folderId.slice(0, lastSep + 1) + newName;\n\n const result = await imap.mailboxRename(folderId, newPath);\n\n return {\n id: result.path,\n displayName: result.path,\n parentFolderId: lastSep === -1 ? undefined : folderId.slice(0, lastSep),\n childFolderCount: 0,\n totalItemCount: 0,\n unreadItemCount: 0,\n };\n}\n\nexport async function deleteFolder(\n clients: ImapClientFactory,\n account: AccountRecord,\n folderId: string,\n): Promise<void> {\n const client = clients.get(account);\n const imap = await client.getImap();\n await imap.mailboxDelete(folderId);\n}\n","import type { AccountRecord, AccountStore } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n AttachmentContent,\n CompleteAddAccountResult,\n CreateFolderInput,\n DraftUpdateInput,\n EmailFull,\n EmailProvider,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n SendInput,\n} from \"../types.js\";\nimport { ImapClientFactory } from \"./client.js\";\nimport {\n listEmails,\n searchEmails,\n readEmail,\n readAttachment,\n listFolders,\n} from \"./read-ops.js\";\nimport {\n addAccount,\n completeAddAccount,\n} from \"./account-ops.js\";\nimport {\n sendEmail,\n saveDraft,\n updateDraft,\n moveEmail,\n sendDraft,\n addAttachmentToDraft,\n removeAttachmentFromDraft,\n markRead,\n} from \"./write-ops.js\";\nimport {\n createFolder,\n renameFolder,\n deleteFolder,\n} from \"./folders.js\";\n\nexport class ImapProvider implements EmailProvider {\n readonly id = \"imap\" as const;\n private readonly clients = new ImapClientFactory();\n\n constructor(private readonly store?: AccountStore) {}\n\n // ---------- account lifecycle ----------\n\n async addAccount(input: AddAccountInput): Promise<AddAccountResult> {\n if (!this.store) throw new Error(\"IMAP provider requires an AccountStore\");\n return addAccount(this.clients, this.store, input);\n }\n\n async completeAddAccount(_handle: string): Promise<CompleteAddAccountResult> {\n return completeAddAccount();\n }\n\n // ---------- browse ----------\n\n async listEmails(account: AccountRecord, opts: ListEmailsOptions): Promise<ListEmailsResult> {\n return listEmails(this.clients, account, opts);\n }\n\n async searchEmails(account: AccountRecord, query: string, opts: SearchEmailsOptions): Promise<EmailSummary[]> {\n return searchEmails(this.clients, account, query, opts);\n }\n\n async readEmail(account: AccountRecord, id: string): Promise<EmailFull> {\n return readEmail(this.clients, account, id);\n }\n\n async readAttachment(account: AccountRecord, messageId: string, attachmentId: string): Promise<AttachmentContent> {\n return readAttachment(this.clients, account, messageId, attachmentId);\n }\n\n // ---------- compose ----------\n\n async sendEmail(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return sendEmail(this.clients, account, msg);\n }\n\n async saveDraft(account: AccountRecord, msg: SendInput): Promise<{ id: string }> {\n return saveDraft(this.clients, account, msg);\n }\n\n async updateDraft(account: AccountRecord, id: string, update: DraftUpdateInput): Promise<{ id: string }> {\n return updateDraft(this.clients, account, id, update);\n }\n\n async moveEmail(account: AccountRecord, id: string, destinationId: string): Promise<void> {\n return moveEmail(this.clients, account, id, destinationId);\n }\n\n async sendDraft(account: AccountRecord, id: string): Promise<{ id: string }> {\n return sendDraft(this.clients, account, id);\n }\n\n async addAttachmentToDraft(\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n ): Promise<{ id: string; attachment: { id: string; name: string; contentType?: string } }> {\n return addAttachmentToDraft(this.clients, account, draftId, name, contentBytes, contentType);\n }\n\n async removeAttachmentFromDraft(\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n ): Promise<void> {\n return removeAttachmentFromDraft(this.clients, account, draftId, attachmentId);\n }\n\n // ---------- organize ----------\n\n async markRead(account: AccountRecord, id: string, isRead: boolean): Promise<void> {\n return markRead(this.clients, account, id, isRead);\n }\n\n // ---------- folders ----------\n\n async listFolders(account: AccountRecord, opts: ListFoldersOptions): Promise<FolderInfo[]> {\n return listFolders(this.clients, account, opts);\n }\n\n async createFolder(account: AccountRecord, input: CreateFolderInput): Promise<FolderInfo> {\n return createFolder(this.clients, account, input);\n }\n\n async renameFolder(account: AccountRecord, folderId: string, newName: string): Promise<FolderInfo> {\n return renameFolder(this.clients, account, folderId, newName);\n }\n\n async deleteFolder(account: AccountRecord, folderId: string): Promise<void> {\n return deleteFolder(this.clients, account, folderId);\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nimport type { AccountStore, AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AddAccountInput,\n AddAccountResult,\n AttachmentContent,\n CompleteAddAccountResult,\n CreateFolderInput,\n DraftUpdateInput,\n EmailFull,\n EmailProvider,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n SendInput,\n} from \"../types.js\";\nimport {\n awaitDeviceCodeReady,\n beginDeviceCode,\n type SerializedGmailTokens,\n} from \"./auth.js\";\nimport { GmailClientFactory } from \"./client.js\";\nimport {\n listEmails,\n searchEmails,\n readEmail,\n readAttachment,\n listFolders,\n} from \"./read-ops.js\";\nimport {\n sendEmail,\n saveDraft,\n updateDraft,\n moveEmail,\n sendDraft,\n addAttachmentToDraft,\n removeAttachmentFromDraft,\n markRead,\n createFolder,\n renameFolder,\n deleteFolder,\n} from \"./write-ops.js\";\n\n// ── pending flow (mirrors Outlook's PendingFlow pattern) ──\n\ninterface PendingFlow {\n begin: ReturnType<typeof beginDeviceCode>;\n emailHint?: string;\n startedAt: number;\n settled: \"pending\" | \"ready\" | \"error\" | \"expired\";\n account?: AccountRecord;\n error?: string;\n}\n\n// ── provider ──\n\nexport interface GmailProviderOptions {\n store: AccountStore;\n clientId?: string;\n clientSecret?: string;\n}\n\nexport class GmailProvider implements EmailProvider {\n readonly id = \"gmail\" as const;\n private readonly clients: GmailClientFactory;\n private readonly pending = new Map<string, PendingFlow>();\n private readonly clientId?: string;\n private readonly clientSecret?: string;\n\n constructor(private readonly opts: GmailProviderOptions) {\n this.clientId = opts.clientId;\n this.clientSecret = opts.clientSecret;\n this.clients = new GmailClientFactory(\n opts.store,\n opts.clientId,\n opts.clientSecret,\n );\n }\n\n // ── account lifecycle ──\n\n async addAccount(input: AddAccountInput): Promise<AddAccountResult> {\n const begin = beginDeviceCode(\n undefined,\n this.clientId,\n this.clientSecret,\n );\n await awaitDeviceCodeReady(begin);\n\n const handle = randomUUID();\n const flow: PendingFlow = {\n begin,\n emailHint: input.email,\n startedAt: Date.now(),\n settled: \"pending\",\n };\n this.pending.set(handle, flow);\n\n begin.result\n .then(async ({ tokens, email }) => {\n const resolvedEmail = (email || input.email || \"\").toLowerCase();\n if (!resolvedEmail) {\n flow.settled = \"error\";\n flow.error = \"no email returned from Google account\";\n return;\n }\n const rec: AccountRecord = {\n email: resolvedEmail,\n provider: \"gmail\",\n displayName: resolvedEmail,\n tokens: tokens as unknown as Record<string, unknown>,\n addedAt: new Date().toISOString(),\n };\n const saved = await this.opts.store.upsertAccount(rec);\n flow.account = saved;\n flow.settled = \"ready\";\n })\n .catch((err: unknown) => {\n flow.settled = \"error\";\n flow.error = err instanceof Error ? err.message : String(err);\n });\n\n return {\n status: \"pending\",\n handle,\n verification: {\n userCode: begin.userCode,\n verificationUri: begin.verificationUri,\n expiresAt: begin.expiresAt,\n message: begin.message,\n },\n };\n }\n\n async completeAddAccount(\n handle: string,\n ): Promise<CompleteAddAccountResult> {\n const flow = this.pending.get(handle);\n if (!flow) return { status: \"error\", error: \"unknown handle\" };\n if (\n Date.now() - flow.startedAt > 20 * 60_000 &&\n flow.settled === \"pending\"\n ) {\n flow.settled = \"expired\";\n flow.begin.cancel();\n }\n if (flow.settled === \"ready\" && flow.account) {\n this.pending.delete(handle);\n return { status: \"ready\", account: flow.account };\n }\n if (flow.settled === \"error\") {\n this.pending.delete(handle);\n return { status: \"error\", error: flow.error ?? \"unknown error\" };\n }\n if (flow.settled === \"expired\") {\n this.pending.delete(handle);\n return { status: \"expired\" };\n }\n return { status: \"pending\" };\n }\n\n // ── browse ──\n\n async listEmails(\n account: AccountRecord,\n opts: ListEmailsOptions,\n ): Promise<ListEmailsResult> {\n return listEmails(this.clients, account, opts);\n }\n\n async searchEmails(\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n ): Promise<EmailSummary[]> {\n return searchEmails(this.clients, account, query, opts);\n }\n\n async readEmail(account: AccountRecord, id: string): Promise<EmailFull> {\n return readEmail(this.clients, account, id);\n }\n\n async readAttachment(\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n ): Promise<AttachmentContent> {\n return readAttachment(this.clients, account, messageId, attachmentId);\n }\n\n // ── compose ──\n\n async sendEmail(\n account: AccountRecord,\n msg: SendInput,\n ): Promise<{ id: string }> {\n return sendEmail(this.clients, account, msg);\n }\n\n async saveDraft(\n account: AccountRecord,\n msg: SendInput,\n ): Promise<{ id: string }> {\n return saveDraft(this.clients, account, msg);\n }\n\n async updateDraft(\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n ): Promise<{ id: string }> {\n return updateDraft(this.clients, account, id, update);\n }\n\n async moveEmail(\n account: AccountRecord,\n id: string,\n destinationId: string,\n ): Promise<void> {\n return moveEmail(this.clients, account, id, destinationId);\n }\n\n async sendDraft(\n account: AccountRecord,\n id: string,\n ): Promise<{ id: string }> {\n return sendDraft(this.clients, account, id);\n }\n\n async addAttachmentToDraft(\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n ): Promise<{\n id: string;\n attachment: { id: string; name: string; contentType?: string };\n }> {\n return addAttachmentToDraft(\n this.clients,\n account,\n draftId,\n name,\n contentBytes,\n contentType,\n );\n }\n\n async removeAttachmentFromDraft(\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n ): Promise<void> {\n return removeAttachmentFromDraft(this.clients, account, draftId, attachmentId);\n }\n\n // ── organize ──\n\n async markRead(\n account: AccountRecord,\n id: string,\n isRead: boolean,\n ): Promise<void> {\n return markRead(this.clients, account, id, isRead);\n }\n\n // ── folders ──\n\n async listFolders(\n account: AccountRecord,\n opts: ListFoldersOptions,\n ): Promise<FolderInfo[]> {\n return listFolders(this.clients, account, opts);\n }\n\n async createFolder(\n account: AccountRecord,\n input: CreateFolderInput,\n ): Promise<FolderInfo> {\n return createFolder(this.clients, account, input);\n }\n\n async renameFolder(\n account: AccountRecord,\n folderId: string,\n newName: string,\n ): Promise<FolderInfo> {\n return renameFolder(this.clients, account, folderId, newName);\n }\n\n async deleteFolder(\n account: AccountRecord,\n folderId: string,\n ): Promise<void> {\n return deleteFolder(this.clients, account, folderId);\n }\n}\n","import { OAuth2Client } from \"google-auth-library\";\n\nconst GOOGLE_DEVICE_CODE_URL = \"https://oauth2.googleapis.com/device/code\";\nconst GOOGLE_TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nconst GOOGLE_OAUTH2_REVOKE_URL = \"https://oauth2.googleapis.com/revoke\";\n\nconst DEFAULT_SCOPES = [\n \"https://www.googleapis.com/auth/gmail.modify\",\n];\n\nexport interface DeviceCodeBegin {\n userCode: string;\n verificationUri: string;\n message: string;\n expiresAt: string; // ISO\n /** Resolves with the tokens and email once the user completes the flow. */\n result: Promise<{ tokens: SerializedGmailTokens; email: string }>;\n /** Aborts the in-flight polling promise. */\n cancel(): void;\n}\n\nexport interface SerializedGmailTokens {\n /** Client ID used to authenticate this account. */\n clientId: string;\n /** Client secret, if any (optional for installed/TV apps). */\n clientSecret?: string;\n /** Current access token. */\n accessToken: string;\n /** Long-lived refresh token. */\n refreshToken: string;\n /** Expiry timestamp in milliseconds since epoch. */\n expiryDate: number;\n /** Scopes granted. */\n scopes: string[];\n /** Email address associated with this account. */\n email: string;\n}\n\n/** Type guard — validates that an unknown value has the shape of SerializedGmailTokens. */\nexport function isSerializedGmailTokens(\n obj: unknown,\n): obj is SerializedGmailTokens {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return (\n typeof o.clientId === \"string\" &&\n (o.clientSecret === undefined || typeof o.clientSecret === \"string\") &&\n typeof o.accessToken === \"string\" &&\n typeof o.refreshToken === \"string\" &&\n typeof o.expiryDate === \"number\" &&\n Array.isArray(o.scopes) &&\n typeof o.email === \"string\"\n );\n}\n\n/**\n * Build an {@link OAuth2Client} hydrated with stored tokens.\n * Returns a fresh client that can be used for silent refresh.\n */\nexport function buildOAuth2Client(\n tokens?: SerializedGmailTokens,\n): OAuth2Client {\n const client = new OAuth2Client({\n clientId: tokens?.clientId,\n clientSecret: tokens?.clientSecret,\n });\n if (tokens) {\n client.setCredentials({\n access_token: tokens.accessToken,\n refresh_token: tokens.refreshToken,\n expiry_date: tokens.expiryDate,\n scope: tokens.scopes.join(\" \"),\n });\n }\n return client;\n}\n\n/** Fetch the email address associated with an access token via the Gmail profile endpoint. */\nasync function getEmailFromToken(accessToken: string): Promise<string> {\n const res = await fetch(\n \"https://gmail.googleapis.com/gmail/v1/users/me/profile\",\n {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n },\n );\n if (!res.ok) {\n const body = await res.text().catch(() => \"\");\n throw new Error(\n `Failed to get Gmail profile (${res.status}): ${body}`,\n );\n }\n const data = (await res.json()) as { emailAddress: string };\n return data.emailAddress;\n}\n\n/**\n * Start a Google OAuth 2.0 device-authorisation flow.\n *\n * The returned `result` promise resolves once the user has entered the code\n * and consented; callers should poll it (or await it) via `complete_add_account`.\n */\nexport function beginDeviceCode(\n scopes: string[] = DEFAULT_SCOPES,\n clientIdOverride?: string,\n clientSecretOverride?: string,\n): DeviceCodeBegin {\n const clientId = clientIdOverride;\n if (!clientId) {\n throw new Error(\n \"HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID is required for Gmail OAuth — set it via HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID or provider config\",\n );\n }\n const clientSecret = clientSecretOverride || undefined;\n\n let resolve!: (v: { tokens: SerializedGmailTokens; email: string }) => void;\n let reject!: (err: unknown) => void;\n const result = new Promise<{ tokens: SerializedGmailTokens; email: string }>(\n (res, rej) => {\n resolve = res;\n reject = rej;\n },\n );\n\n // Placeholders populated once the device-code HTTP call completes.\n let userCode = \"\";\n let verificationUri = \"\";\n let message = \"\";\n let expiresAt = new Date(Date.now() + 15 * 60_000).toISOString();\n let aborted = false;\n\n const ready = (async () => {\n try {\n // ── Step 1: request device code ──\n const dcParams = new URLSearchParams();\n dcParams.set(\"client_id\", clientId);\n if (clientSecret) dcParams.set(\"client_secret\", clientSecret);\n dcParams.set(\"scope\", scopes.join(\" \"));\n\n const dcRes = await fetch(GOOGLE_DEVICE_CODE_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: dcParams.toString(),\n });\n\n if (!dcRes.ok) {\n const errBody = (await dcRes.json().catch(() => ({}))) as {\n error?: string;\n error_description?: string;\n };\n throw new Error(\n `Google device-code request failed: ` +\n `${errBody.error_description ?? errBody.error ?? dcRes.statusText}`,\n );\n }\n\n const dcData = (await dcRes.json()) as {\n device_code: string;\n user_code: string;\n verification_url: string;\n expires_in: number;\n interval?: number;\n };\n\n userCode = dcData.user_code;\n verificationUri = dcData.verification_url;\n const deviceCode = dcData.device_code;\n let interval = dcData.interval ?? 5;\n if (dcData.expires_in) {\n expiresAt = new Date(\n Date.now() + dcData.expires_in * 1000,\n ).toISOString();\n }\n message = `Go to ${verificationUri} and enter code: ${userCode}`;\n\n // ── Step 2: poll for tokens ──\n const tokenParams = new URLSearchParams();\n tokenParams.set(\"client_id\", clientId);\n if (clientSecret) tokenParams.set(\"client_secret\", clientSecret);\n tokenParams.set(\"device_code\", deviceCode);\n tokenParams.set(\n \"grant_type\",\n \"urn:ietf:params:oauth:grant-type:device_code\",\n );\n\n const deadline = Date.now() + (dcData.expires_in * 1000);\n while (Date.now() < deadline && !aborted) {\n await new Promise((r) => setTimeout(r, interval * 1000));\n if (aborted) return;\n\n const tokenRes = await fetch(GOOGLE_TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: tokenParams.toString(),\n });\n\n const tokenData = (await tokenRes.json()) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n scope?: string;\n error?: string;\n };\n\n if (tokenData.access_token) {\n const email = await getEmailFromToken(tokenData.access_token);\n const tokens: SerializedGmailTokens = {\n clientId,\n clientSecret,\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token ?? \"\",\n expiryDate: tokenData.expires_in\n ? Date.now() + tokenData.expires_in * 1000\n : Date.now() + 3600_000,\n scopes: tokenData.scope\n ? tokenData.scope.split(\" \")\n : scopes,\n email,\n };\n resolve({ tokens, email });\n return;\n }\n\n switch (tokenData.error) {\n case \"authorization_pending\":\n break; // keep polling\n case \"slow_down\":\n interval += 1; // Google says to back off\n break;\n case \"expired_token\":\n throw new Error(\"Device code expired — please try again\");\n case \"access_denied\":\n throw new Error(\"User denied access\");\n default:\n throw new Error(\n `Token request failed: ${tokenData.error ?? \"unknown error\"}`,\n );\n }\n }\n\n if (!aborted) {\n throw new Error(\"Device code expired — please try again\");\n }\n } catch (err) {\n if (!aborted) reject(err);\n }\n })();\n\n return {\n get userCode() {\n return userCode;\n },\n get verificationUri() {\n return verificationUri;\n },\n get message() {\n return message;\n },\n get expiresAt() {\n return expiresAt;\n },\n result,\n cancel() {\n aborted = true;\n },\n ...({ _ready: ready } as Record<string, unknown>),\n } as DeviceCodeBegin;\n}\n\n/** Await `_ready` so the user-code fields are populated. */\nexport async function awaitDeviceCodeReady(b: DeviceCodeBegin): Promise<void> {\n const r = (b as unknown as { _ready: Promise<void> })._ready;\n await r;\n}\n\n/**\n * Acquire a fresh access token for a stored account, refreshing silently from\n * the persisted refresh token. Returns the (possibly-updated) tokens so the\n * caller can write them back to the store.\n */\nexport async function acquireAccessToken(\n tokens: SerializedGmailTokens,\n scopes: string[] = DEFAULT_SCOPES,\n): Promise<{ accessToken: string; tokens: SerializedGmailTokens }> {\n const client = buildOAuth2Client(tokens);\n const res = await client.getAccessToken();\n if (!res.token) {\n throw new Error(\n \"Failed to acquire access token — refresh token may be revoked; re-run add_account\",\n );\n }\n\n const creds = client.credentials;\n const next: SerializedGmailTokens = {\n ...tokens,\n accessToken: res.token,\n refreshToken: creds.refresh_token ?? tokens.refreshToken,\n expiryDate: creds.expiry_date ?? Date.now() + 3600_000,\n scopes,\n };\n return { accessToken: res.token, tokens: next };\n}\n\n/**\n * Revoke a refresh token so the stored account is fully de-authorized.\n * Best-effort — failures are swallowed since we'll delete the stored tokens\n * regardless.\n */\nexport async function revokeRefreshToken(\n tokens: SerializedGmailTokens,\n): Promise<void> {\n try {\n await fetch(GOOGLE_OAUTH2_REVOKE_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ token: tokens.refreshToken }).toString(),\n });\n } catch {\n /* best-effort */\n }\n}\n","import { gmail_v1, google } from \"googleapis\";\n\nimport type { AccountStore, AccountRecord } from \"../../store/account-store.js\";\nimport {\n acquireAccessToken,\n buildOAuth2Client,\n isSerializedGmailTokens,\n type SerializedGmailTokens,\n} from \"./auth.js\";\n\n/**\n * Cached per-account entry: an OAuth2Client + a Gmail API instance.\n * The OAuth2Client handles token refresh automatically; we listen for token\n * events to persist refreshed credentials back to the AccountStore.\n */\ninterface GmailClientEntry {\n auth: ReturnType<typeof buildOAuth2Client>;\n gmail: gmail_v1.Gmail;\n}\n\n/**\n * Builds a Google `gmail_v1.Gmail` client bound to a stored account.\n * The client auto-refreshes access tokens via `google-auth-library` and\n * persists refreshed tokens back into the AccountStore.\n *\n * Clients are cached per email since the underlying library reuses connections.\n */\nexport class GmailClientFactory {\n private readonly cache = new Map<string, GmailClientEntry>();\n /** Serialize token-persist per email to prevent concurrent upsert races. */\n private readonly persistLocks = new Map<string, Promise<void>>();\n\n constructor(\n private readonly store: AccountStore,\n private readonly clientId?: string,\n private readonly clientSecret?: string,\n ) {}\n\n get(account: AccountRecord): GmailClientEntry {\n const key = account.email.toLowerCase();\n const existing = this.cache.get(key);\n if (existing) return existing;\n\n if (!isSerializedGmailTokens(account.tokens)) {\n throw new Error(\n \"Gmail account tokens are missing or corrupted — re-run add_account\",\n );\n }\n const tokens: SerializedGmailTokens = account.tokens;\n\n // Use stored clientId/clientSecret, falling back to constructor args\n const resolvedClientId = tokens.clientId || this.clientId;\n const resolvedSecret = tokens.clientSecret || this.clientSecret;\n\n const auth = buildOAuth2Client({\n ...tokens,\n clientId: resolvedClientId ?? tokens.clientId,\n clientSecret: resolvedSecret,\n });\n\n const store = this.store;\n const persistLocks = this.persistLocks;\n auth.on(\"tokens\", (updated) => {\n if (!updated.refresh_token && !updated.access_token) return;\n\n // Serialize persistence per email — two rapid token events can race\n // on the store read-modify-write cycle.\n const existing = persistLocks.get(key);\n const chain = (existing ?? Promise.resolve()).then(async () => {\n const fresh = store.getAccount(account.email) ?? account;\n const currentTokens = isSerializedGmailTokens(fresh.tokens)\n ? (fresh.tokens as unknown as SerializedGmailTokens)\n : tokens;\n\n const nextTokens: SerializedGmailTokens = {\n ...currentTokens,\n accessToken: updated.access_token ?? currentTokens.accessToken,\n refreshToken:\n updated.refresh_token ?? currentTokens.refreshToken,\n expiryDate:\n updated.expiry_date ?? currentTokens.expiryDate,\n scopes: updated.scope\n ? updated.scope.split(\" \")\n : currentTokens.scopes,\n };\n\n await store\n .upsertAccount({\n ...fresh,\n tokens: nextTokens as unknown as Record<string, unknown>,\n })\n .catch(() => {\n /* swallow — next call will refresh again */\n });\n });\n persistLocks.set(key, chain);\n chain.finally(() => {\n if (persistLocks.get(key) === chain) persistLocks.delete(key);\n });\n });\n\n const gmail = google.gmail({ version: \"v1\", auth });\n const entry: GmailClientEntry = { auth, gmail };\n this.cache.set(key, entry);\n return entry;\n }\n\n /** Drop a cached client (e.g. after removeAccount). */\n invalidate(email: string): void {\n this.cache.delete(email.toLowerCase());\n }\n}\n","import { writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join as pathJoin } from \"node:path\";\n\nimport type { gmail_v1 } from \"googleapis\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailFull,\n EmailSummary,\n FolderInfo,\n ListEmailsOptions,\n ListEmailsResult,\n ListFoldersOptions,\n SearchEmailsOptions,\n EmailAddress,\n} from \"../types.js\";\nimport { GmailClientFactory } from \"./client.js\";\nimport {\n clampLimit,\n findHeader,\n mapHeaderAddr,\n mapSummary,\n mapFolder,\n parsePayload,\n pool,\n resolveLabel,\n type GmailMessageListEntry,\n} from \"./helpers.js\";\n\n/**\n * Browse operations for Gmail — list, search, read emails, attachments,\n * and folders.\n */\n\nexport async function listEmails(\n clients: GmailClientFactory,\n account: AccountRecord,\n opts: ListEmailsOptions,\n): Promise<ListEmailsResult> {\n const { gmail } = clients.get(account);\n const limit = clampLimit(opts.limit, 25, 100);\n const label = resolveLabel(opts.folder ?? \"inbox\");\n\n const params: gmail_v1.Params$Resource$Users$Messages$List = {\n userId: \"me\",\n labelIds: [label],\n maxResults: limit,\n };\n\n if (opts.unreadOnly) {\n params.q = \"is:unread\";\n }\n\n const allIds: GmailMessageListEntry[] = [];\n let pageToken: string | undefined;\n\n do {\n const res = await gmail.users.messages.list({ ...params, pageToken });\n if (res.data.messages) allIds.push(...res.data.messages);\n pageToken = res.data.nextPageToken ?? undefined;\n } while (pageToken && allIds.length < (opts.skip ?? 0) + limit);\n\n const skip = opts.skip ?? 0;\n const pageIds = allIds.slice(skip, skip + limit);\n const hasMore = skip + limit < allIds.length;\n\n if (pageIds.length === 0) {\n return { items: [], hasMore };\n }\n\n const items = await pool(pageIds, 10, async (entry) => {\n const msgId = entry.id ?? \"\";\n const msgRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msgId,\n format: \"metadata\",\n metadataHeaders: [\"From\", \"Subject\", \"To\", \"Date\"],\n });\n const msg = msgRes.data;\n return mapSummary(msgId, msg.payload?.headers ?? [], {\n labelIds: msg.labelIds,\n internalDate: msg.internalDate,\n });\n });\n\n return { items, hasMore };\n}\n\nexport async function searchEmails(\n clients: GmailClientFactory,\n account: AccountRecord,\n query: string,\n opts: SearchEmailsOptions,\n): Promise<EmailSummary[]> {\n const { gmail } = clients.get(account);\n const limit = clampLimit(opts.limit, 25, 100);\n\n const res = await gmail.users.messages.list({\n userId: \"me\",\n q: query,\n maxResults: limit,\n });\n\n const ids = res.data.messages ?? [];\n if (ids.length === 0) return [];\n\n const items = await pool(ids, 10, async (entry) => {\n const msgId = entry.id ?? \"\";\n const msgRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msgId,\n format: \"metadata\",\n metadataHeaders: [\"From\", \"Subject\", \"To\", \"Date\"],\n });\n const msg = msgRes.data;\n return mapSummary(msgId, msg.payload?.headers ?? [], {\n labelIds: msg.labelIds,\n internalDate: msg.internalDate,\n });\n });\n\n return items;\n}\n\nexport async function readEmail(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<EmailFull> {\n const { gmail } = clients.get(account);\n\n const res = await gmail.users.messages.get({\n userId: \"me\",\n id,\n format: \"full\",\n });\n\n const msg = res.data;\n if (!msg) throw new Error(`message not found: ${id}`);\n\n const headers = msg.payload?.headers ?? [];\n const { bodyText, bodyHtml, attachments } = parsePayload(msg.payload ?? {});\n\n const summary = mapSummary(id, headers, {\n labelIds: msg.labelIds,\n internalDate: msg.internalDate,\n });\n\n return {\n ...summary,\n cc: mapHeaderAddr(findHeader(headers, \"Cc\")),\n bcc: mapHeaderAddr(findHeader(headers, \"Bcc\")),\n bodyText,\n bodyHtml,\n attachments: attachments.length > 0 ? attachments : undefined,\n hasAttachments: attachments.length > 0,\n };\n}\n\nexport async function readAttachment(\n clients: GmailClientFactory,\n account: AccountRecord,\n messageId: string,\n attachmentId: string,\n): Promise<AttachmentContent> {\n const { gmail } = clients.get(account);\n\n const msgRes = await gmail.users.messages.get({\n userId: \"me\",\n id: messageId,\n format: \"full\",\n });\n const { attachments } = parsePayload(msgRes.data.payload ?? {});\n const match = attachments.find((a) => a.id === attachmentId);\n\n const name = match?.name ?? \"attachment\";\n const contentType = match?.contentType;\n\n const attRes = await gmail.users.messages.attachments.get({\n userId: \"me\",\n messageId,\n id: attachmentId,\n });\n\n const data = attRes.data.data;\n if (!data) throw new Error(\"attachment data is empty\");\n\n const buf = Buffer.from(\n data.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n );\n\n const outPath = pathJoin(tmpdir(), name);\n writeFileSync(outPath, buf);\n\n return { name, contentType, path: outPath };\n}\n\nexport async function listFolders(\n clients: GmailClientFactory,\n account: AccountRecord,\n _opts: ListFoldersOptions,\n): Promise<FolderInfo[]> {\n const { gmail } = clients.get(account);\n const res = await gmail.users.labels.list({ userId: \"me\" });\n const labels = res.data.labels ?? [];\n return labels.map(mapFolder);\n}\n","import type { gmail_v1 } from \"googleapis\";\nimport MailComposer from \"nodemailer/lib/mail-composer/index.js\";\n\nimport { parseInlineImages } from \"../shared/inline-images.js\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n AttachmentContent,\n EmailAddress,\n EmailFull,\n EmailSummary,\n FolderInfo,\n SendInput,\n} from \"../types.js\";\n\n// ── well-known folder ↔ Gmail label mapping ──\n\n/** Map a well-known folder name to its Gmail system-label id. */\nconst WELL_KNOWN_TO_LABEL: Record<string, string> = {\n inbox: \"INBOX\",\n sentitems: \"SENT\",\n drafts: \"DRAFT\",\n deleteditems: \"TRASH\",\n junkemail: \"SPAM\",\n outbox: \"\", // Gmail has no outbox; sendEmail handles this.\n};\n\nexport function resolveLabel(wellKnownOrId: string): string {\n const lower = wellKnownOrId.toLowerCase();\n return WELL_KNOWN_TO_LABEL[lower] ?? wellKnownOrId;\n}\n\n/**\n * For \"archive\" we must *remove* the INBOX label rather than add a\n * destination. Other well-known names map normally.\n */\nexport function resolveLabelsForMove(\n destinationId: string,\n): { addLabelIds: string[]; removeLabelIds: string[] } {\n if (destinationId.toLowerCase() === \"archive\") {\n return { addLabelIds: [], removeLabelIds: [\"INBOX\"] };\n }\n return { addLabelIds: [resolveLabel(destinationId)], removeLabelIds: [] };\n}\n\n// ── map Gmail API responses to shared types ──\n\nexport interface GmailMessageListEntry {\n id?: string | null;\n threadId?: string | null;\n}\n\nexport function mapHeaderAddr(\n raw: string | null | undefined,\n): EmailAddress[] {\n if (!raw) return [];\n const addrs = raw.split(\",\");\n return addrs.map((a) => {\n const trimmed = a.trim();\n const match = trimmed.match(/^(.+?)\\s*<(.+@.+)>$/);\n if (match) return { name: match[1]!.trim(), address: match[2]! };\n return { address: trimmed };\n });\n}\n\ntype GmailMessage = gmail_v1.Schema$Message;\ntype GmailMessagePart = gmail_v1.Schema$MessagePart;\n\ninterface ComposerAttachment {\n filename: string;\n content: Buffer;\n contentType?: string;\n cid?: string;\n}\n\ninterface ComposerOptions extends Record<string, unknown> {\n attachments?: ComposerAttachment[];\n}\n\nexport function findHeader(\n headers: GmailMessagePart[\"headers\"],\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n const h = headers.find(\n (h) => h.name?.toLowerCase() === name.toLowerCase(),\n );\n return h?.value ?? undefined;\n}\n\n/** Decode Gmail's base64url-encoded body part into a UTF-8 string. */\nexport function decodeBody(body: gmail_v1.Schema$MessagePartBody): string {\n if (!body?.data) return \"\";\n return Buffer.from(\n body.data.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n}\n\ninterface ParsedPayload {\n bodyText?: string;\n bodyHtml?: string;\n attachments: NonNullable<EmailFull[\"attachments\"]>;\n}\n\n/** Walk the MIME part tree to extract text, HTML, and attachments. */\nexport function parsePayload(\n payload: GmailMessagePart,\n prefix = \"\",\n): ParsedPayload {\n let bodyText: string | undefined;\n let bodyHtml: string | undefined;\n const attachments: NonNullable<EmailFull[\"attachments\"]> = [];\n\n function walk(part: GmailMessagePart, partPrefix: string): void {\n const mime = part.mimeType ?? \"\";\n\n if (mime === \"text/plain\" && bodyText === undefined) {\n bodyText = decodeBody(part.body ?? {});\n return;\n }\n if (mime === \"text/html\" && bodyHtml === undefined) {\n bodyHtml = decodeBody(part.body ?? {});\n return;\n }\n\n if (part.parts) {\n for (let i = 0; i < part.parts.length; i++) {\n walk(part.parts[i]!, (partPrefix ? `${partPrefix}.` : \"\") + String(i));\n }\n return;\n }\n\n const topType = mime.split(\"/\")[0] ?? \"\";\n const hasFilename = !!part.filename || !!part.body?.attachmentId;\n const isAttachment =\n hasFilename ||\n (!!mime && topType !== \"text\" && topType !== \"multipart\");\n\n if (isAttachment && part.body?.attachmentId) {\n attachments.push({\n id: part.body.attachmentId,\n name: part.filename ?? part.partId ?? \"attachment\",\n contentType: mime || undefined,\n size: part.body.size != null ? Number(part.body.size) : undefined,\n });\n }\n }\n\n walk(payload, prefix);\n return { bodyText, bodyHtml, attachments };\n}\n\nexport function mapSummary(\n id: string,\n headers: GmailMessagePart[\"headers\"],\n flags: { labelIds?: (string | null)[] | null; internalDate?: string | null },\n): EmailSummary {\n return {\n id,\n subject: findHeader(headers, \"Subject\") ?? \"\",\n from: mapHeaderAddr(findHeader(headers, \"From\"))[0],\n to: mapHeaderAddr(findHeader(headers, \"To\")),\n receivedAt: flags.internalDate\n ? new Date(Number(flags.internalDate)).toISOString()\n : undefined,\n preview: undefined,\n isRead: !(flags.labelIds?.includes(\"UNREAD\") ?? false),\n hasAttachments: false,\n };\n}\n\nexport function mapFolder(label: gmail_v1.Schema$Label): FolderInfo {\n return {\n id: label.id ?? \"\",\n displayName: label.name ?? \"\",\n parentFolderId: undefined,\n childFolderCount: 0,\n totalItemCount: label.messagesTotal ?? 0,\n unreadItemCount: label.messagesUnread ?? 0,\n };\n}\n\n// ── limit clamping ──\n\nexport function clampLimit(\n v: number | undefined,\n dflt: number,\n max: number,\n): number {\n if (!v || v <= 0) return dflt;\n return Math.min(v, max);\n}\n\n/** Run an async function over items with limited concurrency. */\nexport async function pool<T, R>(\n items: T[],\n concurrency: number,\n fn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const results: R[] = new Array(items.length);\n let idx = 0;\n async function worker(): Promise<void> {\n while (idx < items.length) {\n const i = idx++;\n results[i] = await fn(items[i]!);\n }\n }\n const workers = Array.from(\n { length: Math.min(concurrency, items.length) },\n () => worker(),\n );\n await Promise.all(workers);\n return results;\n}\n\n// ── RFC 2822 message building (reuses nodemailer) ──\n\nexport function base64urlEncode(buf: Buffer): string {\n return buf\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n}\n\n/**\n * Build a raw RFC 2822 message string from send/draft input.\n * Uses nodemailer's MailComposer for MIME construction, then\n * base64url-encodes the result for the Gmail API `raw` field.\n */\nexport async function buildRawMessage(\n account: AccountRecord,\n msg: SendInput,\n messageId?: string,\n): Promise<{ raw: string; threadId?: string }> {\n const { body: transformed, images } = parseInlineImages(msg.body);\n\n const mailOptions: ComposerOptions = {\n from: `${account.displayName ?? \"\"} <${account.email}>`,\n to: msg.to\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \"),\n subject: msg.subject,\n attachDataUrls: true,\n };\n\n if (msg.isHtml) {\n mailOptions.html = transformed;\n } else {\n mailOptions.text = transformed;\n }\n\n if (msg.cc && msg.cc.length > 0) {\n mailOptions.cc = msg.cc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n if (msg.bcc && msg.bcc.length > 0) {\n mailOptions.bcc = msg.bcc\n .map((a) => (a.name ? `\"${a.name}\" <${a.address}>` : a.address))\n .join(\", \");\n }\n\n if (images.length > 0) {\n mailOptions.attachments = images.map((img) => ({\n filename: img.filename,\n content: Buffer.from(img.contentBytes, \"base64\"),\n contentType: img.contentType,\n cid: img.cid,\n }));\n }\n\n // Add file attachments from msg.attachments\n if (msg.attachments && msg.attachments.length > 0) {\n const fileAttachments = msg.attachments.map((att) => ({\n filename: att.name,\n content: Buffer.from(att.contentBytes, \"base64\"),\n contentType: att.contentType,\n }));\n mailOptions.attachments = [\n ...(mailOptions.attachments ?? []),\n ...fileAttachments,\n ];\n }\n\n if (messageId) {\n mailOptions.messageId = messageId;\n }\n\n const rawStr = await new Promise<string>((resolve, reject) => {\n const mc = new MailComposer(mailOptions);\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf.toString(\"utf-8\"));\n });\n });\n\n return { raw: base64urlEncode(Buffer.from(rawStr, \"utf-8\")) };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { Buffer } from \"node:buffer\";\n\nimport MailComposer from \"nodemailer/lib/mail-composer/index.js\";\n\nimport type { AccountRecord } from \"../../store/account-store.js\";\nimport type {\n CreateFolderInput,\n DraftUpdateInput,\n EmailAddress,\n FolderInfo,\n SendInput,\n} from \"../types.js\";\nimport {\n GmailClientFactory,\n} from \"./client.js\";\nimport {\n base64urlEncode,\n buildRawMessage,\n mapFolder,\n mapHeaderAddr,\n findHeader,\n resolveLabel,\n resolveLabelsForMove,\n} from \"./helpers.js\";\n\n/**\n * Write operations for Gmail — send, draft, move, mark, folders.\n */\n\nexport async function sendEmail(\n clients: GmailClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n\n let threadId: string | undefined;\n let rawBody: { raw: string };\n\n if (msg.forwardMessageId) {\n const fwdRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.forwardMessageId,\n format: \"raw\",\n });\n threadId = fwdRes.data.threadId ?? undefined;\n const fwdRaw = fwdRes.data.raw;\n if (fwdRaw) {\n const fwdStr = Buffer.from(\n fwdRaw.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n const divider =\n '\\n\\n<div style=\"line-height:12px\"><br></div>\\n\\n' +\n '<div style=\"border-left:2px solid #ccc; padding-left:8px; ' +\n 'margin-left:0; color:#666\">\\n' +\n \"---------- Forwarded message ---------<br>\" +\n fwdStr +\n \"\\n</div>\";\n\n const combinedMsg = { ...msg, body: msg.body + divider };\n rawBody = await buildRawMessage(account, combinedMsg);\n } else {\n rawBody = await buildRawMessage(account, msg);\n }\n } else {\n rawBody = await buildRawMessage(account, msg);\n\n if (msg.inReplyTo) {\n try {\n const refRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.inReplyTo,\n format: \"minimal\",\n });\n threadId = refRes.data.threadId ?? undefined;\n } catch {\n /* proceed without threading */\n }\n }\n }\n\n const sendRes = await gmail.users.messages.send({\n userId: \"me\",\n requestBody: {\n raw: rawBody.raw,\n threadId,\n },\n });\n\n return { id: sendRes.data.id ?? \"\" };\n}\n\nexport async function saveDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n msg: SendInput,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n const { raw } = await buildRawMessage(account, msg);\n\n let threadId: string | undefined;\n if (msg.inReplyTo) {\n try {\n const refRes = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.inReplyTo,\n format: \"minimal\",\n });\n threadId = refRes.data.threadId ?? undefined;\n } catch {\n /* proceed without threading */\n }\n }\n\n const draftRes = await gmail.users.drafts.create({\n userId: \"me\",\n requestBody: {\n message: { raw, threadId },\n },\n });\n\n return { id: draftRes.data.message?.id ?? draftRes.data.id ?? \"\" };\n}\n\nexport async function updateDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n update: DraftUpdateInput,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n\n const draftRes = await gmail.users.drafts.get({\n userId: \"me\",\n id,\n format: \"raw\",\n });\n\n const existingMessage = draftRes.data.message;\n if (!existingMessage?.raw) {\n throw new Error(`draft not found: ${id}`);\n }\n\n const existingHeaders = existingMessage.payload?.headers ?? [];\n const origSubject = findHeader(existingHeaders, \"Subject\") ?? \"\";\n\n const rawStr = Buffer.from(\n existingMessage.raw.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n // Extract existing To/CC recipients from headers\n const existingTo = update.to ?? mapHeaderAddr(findHeader(existingHeaders, \"To\"));\n const existingCc = update.cc ?? mapHeaderAddr(findHeader(existingHeaders, \"Cc\"));\n const existingBcc = update.bcc ?? mapHeaderAddr(findHeader(existingHeaders, \"Bcc\"));\n\n const { raw } = await buildRawMessage(account, {\n to: existingTo,\n subject: update.subject ?? origSubject,\n body: update.body ?? \"\",\n isHtml: update.isHtml,\n inReplyTo: false,\n cc: existingCc.length > 0 ? existingCc : undefined,\n bcc: existingBcc.length > 0 ? existingBcc : undefined,\n });\n\n const updated = await gmail.users.drafts.update({\n userId: \"me\",\n id,\n requestBody: {\n message: {\n raw,\n threadId: existingMessage.threadId ?? undefined,\n },\n },\n });\n\n return { id: updated.data.message?.id ?? updated.data.id ?? id };\n}\n\nexport async function moveEmail(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n destinationId: string,\n): Promise<void> {\n const { gmail } = clients.get(account);\n const { addLabelIds, removeLabelIds } =\n resolveLabelsForMove(destinationId);\n\n await gmail.users.messages.modify({\n userId: \"me\",\n id,\n requestBody: { addLabelIds, removeLabelIds },\n });\n}\n\nexport async function sendDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n): Promise<{ id: string }> {\n const { gmail } = clients.get(account);\n const res = await gmail.users.drafts.send({\n userId: \"me\",\n requestBody: { id },\n });\n return { id: res.data.id ?? id };\n}\n\nexport async function addAttachmentToDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n draftId: string,\n name: string,\n contentBytes: string,\n contentType?: string,\n): Promise<{\n id: string;\n attachment: { id: string; name: string; contentType?: string };\n}> {\n const { gmail } = clients.get(account);\n\n const draftRes = await gmail.users.drafts.get({\n userId: \"me\",\n id: draftId,\n format: \"raw\",\n });\n\n const existingMessage = draftRes.data.message;\n if (!existingMessage?.raw) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n const rawStr = Buffer.from(\n existingMessage.raw.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n const newRawStr = await new Promise<string>((resolve, reject) => {\n const mc = new MailComposer({\n raw: rawStr,\n attachments: [\n {\n filename: name,\n content: Buffer.from(contentBytes, \"base64\"),\n contentType: contentType ?? \"application/octet-stream\",\n },\n ],\n });\n mc.compile().build((err: Error | null, buf: Buffer) => {\n if (err) reject(err);\n else resolve(buf.toString(\"utf-8\"));\n });\n });\n\n const updated = await gmail.users.drafts.update({\n userId: \"me\",\n id: draftId,\n requestBody: {\n message: {\n raw: base64urlEncode(Buffer.from(newRawStr, \"utf-8\")),\n threadId: existingMessage.threadId ?? undefined,\n },\n },\n });\n\n return {\n id: updated.data.message?.id ?? updated.data.id ?? draftId,\n attachment: {\n id: randomUUID(),\n name,\n contentType: contentType ?? \"application/octet-stream\",\n },\n };\n}\n\nexport async function removeAttachmentFromDraft(\n clients: GmailClientFactory,\n account: AccountRecord,\n draftId: string,\n attachmentId: string,\n): Promise<void> {\n const { gmail } = clients.get(account);\n\n // Get the draft with full payload to find the attachment part\n const fullDraft = await gmail.users.drafts.get({\n userId: \"me\",\n id: draftId,\n format: \"full\",\n });\n\n const message = fullDraft.data.message;\n if (!message?.payload) {\n throw new Error(`draft not found: ${draftId}`);\n }\n\n // Walk the payload parts to find the attachment with matching attachmentId\n let targetFilename: string | undefined;\n let targetMimeType: string | undefined;\n\n function findAttachment(parts: any[] | undefined): boolean {\n if (!parts) return false;\n for (const part of parts) {\n if (part.body?.attachmentId === attachmentId) {\n targetFilename = part.filename ?? undefined;\n targetMimeType = part.mimeType ?? undefined;\n return true;\n }\n if (part.parts && findAttachment(part.parts)) {\n return true;\n }\n }\n return false;\n }\n\n if (!findAttachment(message.payload.parts)) {\n throw new Error(`attachment not found: ${attachmentId}`);\n }\n\n // Get the raw message\n const rawDraft = await gmail.users.drafts.get({\n userId: \"me\",\n id: draftId,\n format: \"raw\",\n });\n\n const rawStr = Buffer.from(\n rawDraft.data.message!.raw!.replace(/-/g, \"+\").replace(/_/g, \"/\"),\n \"base64\",\n ).toString(\"utf-8\");\n\n // Parse and remove the attachment from the MIME message\n const newRawStr = removeMimeAttachment(rawStr, targetFilename, targetMimeType);\n\n // Update the draft with the modified message\n await gmail.users.drafts.update({\n userId: \"me\",\n id: draftId,\n requestBody: {\n message: {\n raw: base64urlEncode(Buffer.from(newRawStr, \"utf-8\")),\n threadId: message.threadId ?? undefined,\n },\n },\n });\n}\n\n/**\n * Remove a specific attachment from a raw MIME message.\n * Uses boundary-based parsing to identify and remove the matching part.\n */\nfunction removeMimeAttachment(\n rawMime: string,\n targetFilename: string | undefined,\n targetMimeType: string | undefined,\n): string {\n // Extract boundary from Content-Type header\n const boundaryMatch = rawMime.match(/boundary=\"?([^\";]+)\"?/i);\n if (!boundaryMatch) {\n // Not a multipart message, can't remove attachment\n return rawMime;\n }\n\n const boundary = boundaryMatch[1];\n const delimiter = `--${boundary}`;\n\n // Split by boundary\n const parts = rawMime.split(delimiter);\n\n // Filter out the part matching the target attachment\n const filtered = parts.filter((part) => {\n if (!part.trim() || part.trim() === \"--\") {\n return true; // Keep preamble and closing delimiter\n }\n\n // Check if this part is the target attachment\n const contentDispMatch = targetFilename &&\n part.match(new RegExp(`Content-Disposition:.*?filename=\"?${escapeRegex(targetFilename)}\"?`, \"i\"));\n\n const contentTypeMatch = targetMimeType &&\n part.match(new RegExp(`Content-Type:\\s*${escapeRegex(targetMimeType)}`, \"i\"));\n\n // If both filename and mime type are specified, both must match\n // If only one is specified, that one must match\n if (targetFilename && targetMimeType) {\n return !(contentDispMatch && contentTypeMatch);\n } else if (targetFilename) {\n return !contentDispMatch;\n } else if (targetMimeType) {\n return !contentTypeMatch;\n }\n\n return true; // No target specified, keep all parts\n });\n\n return filtered.join(delimiter);\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport async function markRead(\n clients: GmailClientFactory,\n account: AccountRecord,\n id: string,\n isRead: boolean,\n): Promise<void> {\n const { gmail } = clients.get(account);\n await gmail.users.messages.modify({\n userId: \"me\",\n id,\n requestBody: {\n removeLabelIds: isRead ? [\"UNREAD\"] : undefined,\n addLabelIds: isRead ? undefined : [\"UNREAD\"],\n },\n });\n}\n\nexport async function createFolder(\n clients: GmailClientFactory,\n account: AccountRecord,\n input: CreateFolderInput,\n): Promise<FolderInfo> {\n const { gmail } = clients.get(account);\n const created = await gmail.users.labels.create({\n userId: \"me\",\n requestBody: {\n name: input.displayName,\n messageListVisibility: \"show\",\n labelListVisibility: \"labelShow\",\n },\n });\n return mapFolder(created.data);\n}\n\nexport async function renameFolder(\n clients: GmailClientFactory,\n account: AccountRecord,\n folderId: string,\n newName: string,\n): Promise<FolderInfo> {\n const { gmail } = clients.get(account);\n const updated = await gmail.users.labels.patch({\n userId: \"me\",\n id: folderId,\n requestBody: { name: newName },\n });\n return mapFolder(updated.data);\n}\n\nexport async function deleteFolder(\n clients: GmailClientFactory,\n account: AccountRecord,\n folderId: string,\n): Promise<void> {\n const { gmail } = clients.get(account);\n await gmail.users.labels.delete({\n userId: \"me\",\n id: folderId,\n });\n}\n","import type { AccountStore, AccountRecord } from \"../store/account-store.js\";\nimport type { EmailProvider, ProviderId } from \"./types.js\";\nimport type { ProvidersConfig } from \"../config.js\";\nimport { OutlookProvider } from \"./outlook/index.js\";\nimport { ImapProvider } from \"./imap/index.js\";\nimport { GmailProvider } from \"./gmail/index.js\";\n\nexport interface Registry {\n get(id: ProviderId): EmailProvider;\n resolveByEmail(email: string): { provider: EmailProvider; account: AccountRecord };\n list(): EmailProvider[];\n}\n\nexport interface BuildRegistryOptions {\n store: AccountStore;\n providers?: ProvidersConfig;\n}\n\nexport function buildRegistry(opts: BuildRegistryOptions): Registry {\n const outlookCfg = opts.providers?.outlook;\n const providers = new Map<ProviderId, EmailProvider>();\n providers.set(\"outlook\", new OutlookProvider({\n store: opts.store,\n clientId: outlookCfg?.clientId,\n tenantId: outlookCfg?.tenantId,\n }));\n providers.set(\"imap\", new ImapProvider(opts.store));\n const gmailCfg = opts.providers?.gmail;\n providers.set(\"gmail\", new GmailProvider({\n store: opts.store,\n clientId: gmailCfg?.clientId,\n clientSecret: gmailCfg?.clientSecret,\n }));\n\n function get(id: ProviderId): EmailProvider {\n const p = providers.get(id);\n if (!p) throw new Error(`unknown provider: ${id}`);\n return p;\n }\n\n function resolveByEmail(email: string): {\n provider: EmailProvider;\n account: AccountRecord;\n } {\n const account = opts.store.getAccount(email);\n if (!account) {\n throw new Error(\n `no account registered for \"${email}\". Call add_account first.`,\n );\n }\n return { provider: get(account.provider), account };\n }\n\n return {\n get,\n resolveByEmail,\n list: () => Array.from(providers.values()),\n };\n}\n","import { z } from \"zod\";\nimport type { ResolvedTools } from \"../config.js\";\nimport { markdownToHtml } from \"../markdown-to-html.js\";\nimport { THREAD_MARKER } from \"../providers/outlook/write-ops.js\";\n\n/** JSON-stringify a value into a single MCP text content block. */\nexport function ok(\n data: unknown,\n structuredContent?: Record<string, unknown>,\n) {\n const result: {\n content: Array<{ type: \"text\"; text: string }>;\n structuredContent?: Record<string, unknown>;\n } = {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n };\n if (structuredContent !== undefined) {\n result.structuredContent = structuredContent;\n }\n return result;\n}\n\nexport function fail(message: string) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: message }],\n };\n}\n\nexport function errMsg(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\n// ── shared schemas ──\n\n/** Enum matching {@link import(\"../providers/types.js\").ProviderId}. */\nexport const providerIdEnum = z.enum([\"outlook\", \"imap\", \"gmail\"]);\n\nexport const emailAddrSchema = z.object({\n address: z.string().email(),\n name: z.string().optional(),\n});\n\nexport const emailAddrOutputSchema = z.object({\n name: z.string().optional(),\n address: z.string(),\n});\n\nexport const accountSummaryOutputSchema = z.object({\n email: z.string(),\n provider: providerIdEnum,\n displayName: z.string().optional(),\n addedAt: z.string(),\n hasSignature: z.boolean(),\n hasStyle: z.boolean(),\n});\n\nexport const styleOutputSchema = z.object({\n fontFamily: z.string().optional(),\n fontSize: z.string().optional(),\n fontColor: z.string().optional(),\n});\n\n/** Full account record including tokens, signature, and style. */\nexport const accountFullOutputSchema = z.object({\n email: z.string(),\n provider: providerIdEnum,\n displayName: z.string().optional(),\n tokens: z.record(z.string(), z.unknown()),\n addedAt: z.string(),\n signature: z.string().optional(),\n style: styleOutputSchema.optional(),\n});\n\nexport const emailSummaryOutputSchema = z.object({\n id: z.string(),\n subject: z.string(),\n from: emailAddrOutputSchema.optional(),\n to: z.array(emailAddrOutputSchema).optional(),\n receivedAt: z.string().optional(),\n preview: z.string().optional(),\n isRead: z.boolean().optional(),\n hasAttachments: z.boolean().optional(),\n folder: z.string().optional(),\n});\n\nexport const attachmentMetaOutputSchema = z.object({\n id: z.string(),\n name: z.string(),\n contentType: z.string().optional(),\n size: z.number().optional(),\n});\n\nexport const folderInfoOutputSchema = z.object({\n id: z.string(),\n displayName: z.string(),\n parentFolderId: z.string().optional(),\n childFolderCount: z.number(),\n totalItemCount: z.number(),\n unreadItemCount: z.number(),\n});\n\n// ── body composition helpers ──\n\nexport interface ComposeBodyInput {\n body: string;\n format: \"html\" | \"markdown\";\n signature?: string;\n style?: { fontFamily?: string; fontSize?: string; fontColor?: string };\n includeSignature: boolean;\n}\n\nexport function composeBody(\n input: ComposeBodyInput,\n): { body: string; isHtml: boolean } {\n const { body, format, signature, style, includeSignature } = input;\n\n // Convert markdown to HTML first, then proceed as HTML\n const htmlBody = format === \"markdown\" ? markdownToHtml(body) : body;\n\n const hasSignature = includeSignature && !!signature;\n const hasStyle = !!(\n style &&\n (style.fontFamily || style.fontSize || style.fontColor)\n );\n\n if (!hasSignature && !hasStyle) {\n return { body: htmlBody, isHtml: true };\n }\n\n const styleAttr = hasStyle ? buildStyleAttr(style!) : \"\";\n let result = hasStyle\n ? `<div style=\"${styleAttr}\">${htmlBody}</div>`\n : htmlBody;\n if (hasSignature) result += `\\n<div class=\"signature\">${signature}</div>`;\n return { body: result, isHtml: true };\n}\n\nexport function buildStyleAttr(style: {\n fontFamily?: string;\n fontSize?: string;\n fontColor?: string;\n}): string {\n const parts: string[] = [];\n if (style.fontFamily) parts.push(`font-family: ${style.fontFamily}`);\n if (style.fontSize) parts.push(`font-size: ${style.fontSize}`);\n if (style.fontColor) parts.push(`color: ${style.fontColor}`);\n return parts.join(\"; \");\n}\n\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/\\n/g, \"<br>\");\n}\n\n// ── thread boundary detection ──\n\n/**\n * Find the boundary between the user's answer and the quoted thread in a\n * reply/forward draft. Uses three strategies in order:\n * 1. THREAD_MARKER comment (reliable, survives Graph normalization)\n * 2. Regex spacer match (flexible whitespace/tag variations)\n * 3. Pattern fallback (blockquote, Outlook signature)\n * Returns the boundary indices, or null if no thread content found.\n */\nexport function findThreadBoundary(\n html: string,\n): { threadStart: number; answerEnd: number } | null {\n // ── Tier 1: exact THREAD_MARKER comment ──\n const markerIdx = html.indexOf(THREAD_MARKER);\n if (markerIdx !== -1) {\n // The spacer div sits just before the marker — find it so we replace\n // everything up to the spacer (keeping spacer + marker + thread).\n const before = html.slice(0, markerIdx);\n let answerEnd = before.lastIndexOf(\n '<div style=\"line-height:12px\"><br></div>',\n );\n if (answerEnd === -1) {\n const re = /<div\\s+style=[\"'][^\"']*line-height\\s*:\\s*12px[^\"']*[\"']\\s*>\\s*<br\\s*\\/?>\\s*<\\/div>/gi;\n let m: RegExpExecArray | null;\n while ((m = re.exec(before)) !== null) answerEnd = m.index;\n }\n return { threadStart: markerIdx, answerEnd: Math.max(answerEnd, 0) };\n }\n\n // ── Tier 2: regex spacer with flexible whitespace/attribute variations ──\n const spacerRe = /<div\\s+style=[\"'][^\"']*line-height\\s*:\\s*12px[^\"']*[\"']\\s*>\\s*<br\\s*\\/?>\\s*<\\/div>/i;\n const spacerMatch = spacerRe.exec(html);\n if (spacerMatch) {\n return { threadStart: spacerMatch.index, answerEnd: spacerMatch.index };\n }\n\n // ── Tier 3: common Outlook thread patterns ──\n for (const re of [/id=[\"']?Signature[\"']?/i, /<blockquote/i]) {\n const idx = html.search(re);\n if (idx !== -1) return { threadStart: idx, answerEnd: idx };\n }\n\n return null;\n}\n\n// ── tool filtering ──\n\n/** Returns true when `name` should be registered given the tool filtering config. */\nexport function shouldRegister(\n name: string,\n tools: ResolvedTools,\n): boolean {\n if (tools.enabledTools) {\n return tools.enabledTools.has(name);\n }\n if (tools.disabledTools) {\n return !tools.disabledTools.has(name);\n }\n return true;\n}\n","import { marked } from \"marked\";\n\n/** Convert Markdown string to HTML. */\nexport function markdownToHtml(md: string): string {\n return marked.parse(md, { async: false }) as string;\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { promises as fs } from \"node:fs\";\nimport { z } from \"zod\";\n\nimport type { AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ProviderId } from \"../providers/types.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport {\n ok,\n fail,\n errMsg,\n providerIdEnum,\n accountSummaryOutputSchema,\n accountFullOutputSchema,\n styleOutputSchema,\n shouldRegister,\n} from \"./shared.js\";\n\nexport function registerAccountTools(\n server: McpServer,\n ctx: {\n store: AccountStore;\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { store, registry, tools } = ctx;\n\n // ---------- list_accounts ----------\n\n const listAccountsOutputSchema = z.object({\n accounts: z.array(accountSummaryOutputSchema),\n });\n\n if (shouldRegister(\"list_accounts\", tools)) {\n server.registerTool(\n \"list_accounts\",\n {\n description:\n \"List all email accounts known to this server (no secrets). \" +\n \"Use the returned `email` value as the `account` argument to other tools.\",\n inputSchema: z.object({}),\n outputSchema: listAccountsOutputSchema,\n },\n async () => {\n const rows = store.listAccounts().map((a) => ({\n email: a.email,\n provider: a.provider,\n displayName: a.displayName,\n addedAt: a.addedAt,\n hasSignature: !!a.signature,\n hasStyle: !!(\n a.style &&\n (a.style.fontFamily || a.style.fontSize || a.style.fontColor)\n ),\n }));\n const data = { accounts: rows };\n return ok(data, data);\n },\n );\n }\n\n // ---------- add_account ----------\n\n const addAccountOutputSchema = z.object({\n status: z.enum([\"pending\", \"ready\"]),\n handle: z.string().optional(),\n verification: z\n .object({\n userCode: z.string(),\n verificationUri: z.string(),\n expiresAt: z.string(),\n message: z.string(),\n })\n .optional(),\n account: accountFullOutputSchema.optional(),\n });\n\n if (shouldRegister(\"add_account\", tools)) {\n server.registerTool(\n \"add_account\",\n {\n description:\n \"Start adding an email account. For Outlook this returns a device code \" +\n \"the user must enter at the verification URL; then call `complete_add_account` \" +\n \"with the returned `handle` to finalize. Disabled in --read-only mode.\",\n inputSchema: z.object({\n provider: providerIdEnum.describe(\"Email backend. 'outlook' (Microsoft Graph) and 'imap' are fully implemented.\"),\n email: z\n .string()\n .email()\n .optional()\n .describe(\n \"Optional hint — the provider will verify it against the auth result.\",\n ),\n config: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\n \"Provider-specific config (e.g. IMAP host/port). Unused for Outlook.\",\n ),\n }),\n outputSchema: addAccountOutputSchema,\n },\n async (args) => {\n const provider = registry.get(args.provider as ProviderId);\n try {\n const res = await provider.addAccount({\n email: args.email,\n config: args.config,\n });\n return ok(res, res as unknown as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- complete_add_account ----------\n\n const completeAddAccountOutputSchema = z.object({\n status: z.enum([\"pending\", \"ready\", \"expired\", \"error\"]),\n account: accountFullOutputSchema.optional(),\n error: z.string().optional(),\n });\n\n if (shouldRegister(\"complete_add_account\", tools)) {\n server.registerTool(\n \"complete_add_account\",\n {\n description:\n \"Poll/finalize a pending add_account flow. Returns `pending` until the user \" +\n \"completes the device-code step, then `ready` with the persisted account.\",\n inputSchema: z.object({\n provider: providerIdEnum,\n handle: z.string().min(1),\n }),\n outputSchema: completeAddAccountOutputSchema,\n },\n async (args) => {\n const provider = registry.get(args.provider as ProviderId);\n if (!provider.completeAddAccount) {\n return fail(\n `provider ${args.provider} has no async add-account flow`,\n );\n }\n try {\n const res = await provider.completeAddAccount(args.handle);\n return ok(res, res as unknown as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- account settings ----------\n\n const accountSettingsOutputSchema = z.object({\n signature: z.string().nullable(),\n style: styleOutputSchema.nullable(),\n });\n\n if (shouldRegister(\"get_account_settings\", tools)) {\n server.registerTool(\n \"get_account_settings\",\n {\n description:\n \"Get signature (HTML) and style preferences for an account.\",\n inputSchema: z.object({ account: z.string().email() }),\n outputSchema: accountSettingsOutputSchema,\n },\n async (args) => {\n try {\n const acct = store.getAccount(args.account);\n if (!acct)\n return fail(`no account registered for \"${args.account}\"`);\n const data = {\n signature: acct.signature ?? null,\n style: acct.style ?? null,\n };\n return ok(data, data as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n if (shouldRegister(\"set_account_settings\", tools)) {\n server.registerTool(\n \"set_account_settings\",\n {\n description:\n \"Set signature (HTML snippet) and/or style preferences for an account. \" +\n \"Use `signaturePath` to load a signature from a file (useful for signatures with base64 images). \" +\n \"`signature` and `signaturePath` are mutually exclusive. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: z\n .object({\n account: z.string().email(),\n signature: z\n .string()\n .optional()\n .describe(\n \"HTML snippet — may contain formatting, images, links. \" +\n \"Pass an empty string to clear. \" +\n \"Mutually exclusive with `signaturePath`.\",\n ),\n signaturePath: z\n .string()\n .optional()\n .describe(\n \"Path to a file containing the signature HTML. \" +\n \"The file content is read and stored as the signature. \" +\n \"Useful when the signature contains large base64 images. \" +\n \"Mutually exclusive with `signature`.\",\n ),\n style: z\n .object({\n fontFamily: z.string().optional(),\n fontSize: z.string().optional(),\n fontColor: z.string().optional(),\n })\n .optional()\n .describe(\n \"Font preferences applied to outgoing HTML emails. Pass null to clear.\",\n ),\n })\n .refine(\n (data) => !(data.signature !== undefined && data.signaturePath),\n {\n message:\n \"signature and signaturePath are mutually exclusive — use one or the other\",\n },\n ),\n outputSchema: accountSettingsOutputSchema,\n },\n async (args) => {\n try {\n const acct = store.getAccount(args.account);\n if (!acct)\n return fail(`no account registered for \"${args.account}\"`);\n let resolvedSignature: string | undefined = acct.signature;\n if (args.signaturePath) {\n resolvedSignature = await fs.readFile(args.signaturePath, \"utf-8\");\n } else if (args.signature !== undefined) {\n resolvedSignature = args.signature || undefined;\n }\n const updated = await store.upsertAccount({\n ...acct,\n signature: resolvedSignature,\n style: args.style ?? acct.style,\n });\n const data = {\n signature: updated.signature ?? null,\n style: updated.style ?? null,\n };\n return ok(data, data as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- remove_account ----------\n\n const removeAccountOutputSchema = z.object({\n removed: z.boolean(),\n email: z.string(),\n });\n\n if (shouldRegister(\"remove_account\", tools)) {\n server.registerTool(\n \"remove_account\",\n {\n description:\n \"Forget an account and delete its stored tokens. Disabled in --read-only mode.\",\n inputSchema: z.object({ email: z.string().email() }),\n outputSchema: removeAccountOutputSchema,\n },\n async (args) => {\n const removed = await store.removeAccount(args.email);\n const data = { removed, email: args.email };\n return ok(data, data);\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport { selectBody } from \"../html-to-markdown.js\";\nimport {\n ok,\n fail,\n errMsg,\n emailAddrOutputSchema,\n emailSummaryOutputSchema,\n attachmentMetaOutputSchema,\n shouldRegister,\n} from \"./shared.js\";\n\nexport function registerBrowseTools(\n server: McpServer,\n ctx: {\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { registry, tools } = ctx;\n\n // ---------- email ops ----------\n\n const emailListOutputSchema = z.object({\n account: z.string(),\n count: z.number(),\n items: z.array(emailSummaryOutputSchema),\n skip: z.number(),\n hasMore: z.boolean(),\n });\n\n const searchEmailsOutputSchema = z.object({\n account: z.string(),\n count: z.number(),\n items: z.array(emailSummaryOutputSchema),\n });\n\n if (shouldRegister(\"list_emails\", tools)) {\n server.registerTool(\n \"list_emails\",\n {\n description:\n \"List recent emails in a folder of the given account. Pass the user's email \" +\n \"address as `account`; the server routes to the correct backend automatically.\",\n inputSchema: z.object({\n account: z.string().email(),\n folder: z.string().default(\"inbox\").optional(),\n limit: z.number().int().positive().max(100).optional(),\n unreadOnly: z.boolean().optional(),\n skip: z.number().int().min(0).optional(),\n }),\n outputSchema: emailListOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const { items, hasMore } = await provider.listEmails(account, {\n folder: args.folder,\n limit: args.limit,\n unreadOnly: args.unreadOnly,\n skip: args.skip,\n });\n const data = {\n account: account.email,\n count: items.length,\n items,\n skip: args.skip ?? 0,\n hasMore,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n if (shouldRegister(\"search_emails\", tools)) {\n server.registerTool(\n \"search_emails\",\n {\n description:\n \"Search emails by free-text query (KQL on Outlook). Returns lightweight summaries.\",\n inputSchema: z.object({\n account: z.string().email(),\n query: z.string().min(1),\n limit: z.number().int().positive().max(100).optional(),\n }),\n outputSchema: searchEmailsOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const items = await provider.searchEmails(account, args.query, {\n limit: args.limit,\n });\n const data = {\n account: account.email,\n count: items.length,\n items,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n const readEmailOutputSchema = z.object({\n id: z.string(),\n subject: z.string(),\n from: emailAddrOutputSchema.optional(),\n to: z.array(emailAddrOutputSchema).optional(),\n cc: z.array(emailAddrOutputSchema).optional(),\n bcc: z.array(emailAddrOutputSchema).optional(),\n receivedAt: z.string().optional(),\n preview: z.string().optional(),\n isRead: z.boolean().optional(),\n hasAttachments: z.boolean().optional(),\n folder: z.string().optional(),\n attachments: z.array(attachmentMetaOutputSchema).optional(),\n body: z.string(),\n bodyFormat: z.enum([\"markdown\", \"html\", \"text\"]),\n });\n\n if (shouldRegister(\"read_email\", tools)) {\n server.registerTool(\n \"read_email\",\n {\n description:\n \"Fetch a single email with full body and recipients by id. \" +\n \"Body is returned as `body` with `bodyFormat` indicating the format. \" +\n \"Default format is 'markdown' — HTML is automatically converted to save context tokens.\",\n inputSchema: z.object({\n account: z.string().email(),\n id: z.string().min(1),\n format: z\n .enum([\"markdown\", \"html\", \"text\"])\n .default(\"markdown\")\n .optional()\n .describe(\n \"Output body format. 'markdown' converts HTML to Markdown (default), \" +\n \"'html' returns the raw HTML, 'text' returns plain text.\",\n ),\n }),\n outputSchema: readEmailOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const msg = await provider.readEmail(account, args.id);\n const format = args.format ?? \"markdown\";\n const body = selectBody(msg, format);\n const data = {\n id: msg.id,\n subject: msg.subject,\n from: msg.from,\n to: msg.to,\n cc: msg.cc,\n bcc: msg.bcc,\n receivedAt: msg.receivedAt,\n preview: msg.preview,\n isRead: msg.isRead,\n hasAttachments: msg.hasAttachments,\n folder: msg.folder,\n attachments: msg.attachments,\n body,\n bodyFormat: format,\n };\n return ok(data, data as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n const readAttachmentOutputSchema = z.object({\n name: z.string(),\n contentType: z.string().optional(),\n path: z.string(),\n });\n\n if (shouldRegister(\"read_attachment\", tools)) {\n server.registerTool(\n \"read_attachment\",\n {\n description:\n \"Download an email attachment to a temporary file and return its path. \" +\n \"Use messageId and attachmentId from a prior read_email call.\",\n inputSchema: z.object({\n account: z.string().email(),\n messageId: z.string().min(1),\n attachmentId: z.string().min(1),\n }),\n outputSchema: readAttachmentOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const res = await provider.readAttachment(\n account,\n args.messageId,\n args.attachmentId,\n );\n return ok(res, res as unknown as Record<string, unknown>);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import TurndownService from \"turndown\";\n\nconst turndown = new TurndownService();\n\n/** Light wrapper — callers just pass HTML, get markdown back. */\nexport function htmlToMarkdown(html: string): string {\n return turndown.turndown(html);\n}\n\n/** Pick the right body for the requested format. */\nexport function selectBody(\n msg: { bodyHtml?: string; bodyText?: string },\n format: \"markdown\" | \"html\" | \"text\",\n): string {\n switch (format) {\n case \"markdown\": {\n if (msg.bodyHtml) return htmlToMarkdown(msg.bodyHtml);\n if (msg.bodyText) return msg.bodyText;\n return \"\";\n }\n case \"html\": {\n if (msg.bodyHtml) return msg.bodyHtml;\n if (msg.bodyText) return msg.bodyText;\n return \"\";\n }\n case \"text\": {\n if (msg.bodyText) return msg.bodyText;\n if (msg.bodyHtml) return msg.bodyHtml.replace(/<[^>]*>/g, \"\");\n return \"\";\n }\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport {\n ok,\n fail,\n errMsg,\n folderInfoOutputSchema,\n shouldRegister,\n} from \"./shared.js\";\n\nexport function registerFolderTools(\n server: McpServer,\n ctx: {\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { registry, tools } = ctx;\n\n // ---------- list_folders ----------\n\n const listFoldersOutputSchema = z.object({\n account: z.string(),\n count: z.number(),\n items: z.array(folderInfoOutputSchema),\n });\n\n if (shouldRegister(\"list_folders\", tools)) {\n server.registerTool(\n \"list_folders\",\n {\n description:\n \"List available mail folders. Returns top-level folders by default, \" +\n \"or child folders of the given parent when `parentFolderId` is provided.\",\n inputSchema: z.object({\n account: z.string().email(),\n parentFolderId: z\n .string()\n .optional()\n .describe(\n \"When provided, lists child folders of this folder. \" +\n \"When omitted, lists top-level folders (children of the root).\",\n ),\n }),\n outputSchema: listFoldersOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const items = await provider.listFolders(account, {\n parentFolderId: args.parentFolderId,\n });\n const data = {\n account: account.email,\n count: items.length,\n items,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- create_folder ----------\n\n const createFolderOutputSchema = z.object({\n created: z.literal(true),\n folder: folderInfoOutputSchema,\n });\n\n if (shouldRegister(\"create_folder\", tools)) {\n server.registerTool(\n \"create_folder\",\n {\n description:\n \"Create a new mail folder. Creates under the root folder by default, \" +\n \"or under the specified parent when `parentFolderId` is provided. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n displayName: z\n .string()\n .min(1)\n .describe(\"Name of the new folder\"),\n parentFolderId: z\n .string()\n .optional()\n .describe(\n \"When provided, creates the folder as a child of this folder. \" +\n \"When omitted, creates under the root folder.\",\n ),\n }),\n outputSchema: createFolderOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const folder = await provider.createFolder(account, {\n displayName: args.displayName,\n parentFolderId: args.parentFolderId,\n });\n const data = { created: true as const, folder };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- delete_folder ----------\n\n const deleteFolderOutputSchema = z.object({\n deleted: z.literal(true),\n id: z.string(),\n });\n\n if (shouldRegister(\"delete_folder\", tools)) {\n server.registerTool(\n \"delete_folder\",\n {\n description:\n \"Delete a mail folder by ID. Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n folderId: z\n .string()\n .min(1)\n .describe(\"ID of the folder to delete\"),\n }),\n outputSchema: deleteFolderOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.deleteFolder(account, args.folderId);\n const data = { deleted: true as const, id: args.folderId };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- rename_folder ----------\n\n const renameFolderOutputSchema = z.object({\n renamed: z.literal(true),\n folder: folderInfoOutputSchema,\n });\n\n if (shouldRegister(\"rename_folder\", tools)) {\n server.registerTool(\n \"rename_folder\",\n {\n description:\n \"Rename an existing mail folder. Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n folderId: z\n .string()\n .min(1)\n .describe(\"ID of the folder to rename\"),\n newName: z\n .string()\n .min(1)\n .describe(\"New display name for the folder\"),\n }),\n outputSchema: renameFolderOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const folder = await provider.renameFolder(\n account,\n args.folderId,\n args.newName,\n );\n const data = { renamed: true as const, folder };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport { ok, fail, errMsg, shouldRegister } from \"./shared.js\";\n\nexport function registerOrganizeTools(\n server: McpServer,\n ctx: {\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { registry, tools } = ctx;\n\n // Shared helpers — extract the resolved-account lookup and error handling\n // so archive/trash/mark_read/mark_unread handlers stay minimal.\n\n async function moveToWellKnown(\n args: { account: string; id: string },\n destination: string,\n resultKey: string,\n ) {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.moveEmail(account, args.id, destination);\n const data: Record<string, unknown> = { id: args.id };\n data[resultKey] = true;\n return ok(data, data);\n }\n\n async function markReadState(\n args: { account: string; id: string },\n isRead: boolean,\n ) {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.markRead(account, args.id, isRead);\n const data = { marked: true as const, id: args.id, isRead };\n return ok(data, data);\n }\n\n // ---------- archive ----------\n\n const archiveMoveSchema = z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Message ID to move\"),\n });\n\n const archiveOutputSchema = z.object({\n archived: z.literal(true),\n id: z.string(),\n });\n\n if (shouldRegister(\"archive_email\", tools)) {\n server.registerTool(\n \"archive_email\",\n {\n description:\n \"Move a message to the Archive folder. Disabled in --read-only mode.\",\n inputSchema: archiveMoveSchema,\n outputSchema: archiveOutputSchema,\n },\n async (args) => {\n try {\n return await moveToWellKnown(args, \"archive\", \"archived\");\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- trash ----------\n\n const trashOutputSchema = z.object({\n trashed: z.literal(true),\n id: z.string(),\n });\n\n if (shouldRegister(\"trash_email\", tools)) {\n server.registerTool(\n \"trash_email\",\n {\n description:\n \"Move a message to the Deleted Items (trash) folder. Disabled in --read-only mode.\",\n inputSchema: archiveMoveSchema,\n outputSchema: trashOutputSchema,\n },\n async (args) => {\n try {\n return await moveToWellKnown(args, \"deleteditems\", \"trashed\");\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- move ----------\n\n const moveEmailOutputSchema = z.object({\n moved: z.literal(true),\n id: z.string(),\n destination: z.string(),\n });\n\n if (shouldRegister(\"move_email\", tools)) {\n server.registerTool(\n \"move_email\",\n {\n description:\n \"Move a message to any folder by well-known name (e.g. 'inbox', 'drafts', \" +\n \"'junkemail', 'sentitems', 'outbox') or custom folder ID. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Message ID to move\"),\n destination: z\n .string()\n .min(1)\n .describe(\n \"Destination folder — a well-known folder name \" +\n \"('archive', 'deleteditems', 'inbox', 'drafts', 'junkemail', \" +\n \"'sentitems', 'outbox') or a raw folder ID.\",\n ),\n }),\n outputSchema: moveEmailOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n await provider.moveEmail(account, args.id, args.destination);\n const data = {\n moved: true as const,\n id: args.id,\n destination: args.destination,\n };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- mark_read / mark_unread ----------\n\n const markReadInputSchema = z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Message ID to mark as read\"),\n });\n\n const markReadOutputSchema = z.object({\n marked: z.literal(true),\n id: z.string(),\n isRead: z.boolean(),\n });\n\n if (shouldRegister(\"mark_read\", tools)) {\n server.registerTool(\n \"mark_read\",\n {\n description:\n \"Mark a message as read. Disabled in --read-only mode.\",\n inputSchema: markReadInputSchema,\n outputSchema: markReadOutputSchema,\n },\n async (args) => {\n try {\n return await markReadState(args, true);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n if (shouldRegister(\"mark_unread\", tools)) {\n server.registerTool(\n \"mark_unread\",\n {\n description:\n \"Mark a message as unread. Disabled in --read-only mode.\",\n inputSchema: markReadInputSchema,\n outputSchema: markReadOutputSchema,\n },\n async (args) => {\n try {\n return await markReadState(args, false);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { readFileSync } from \"node:fs\";\nimport { basename, extname } from \"node:path\";\n\nimport type { AccountRecord, AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { EmailProvider, SendInput } from \"../providers/types.js\";\nimport type { ResolvedTools } from \"../config.js\";\nimport {\n ok,\n fail,\n errMsg,\n emailAddrSchema,\n composeBody,\n shouldRegister,\n findThreadBoundary,\n} from \"./shared.js\";\n\nexport function registerComposeTools(\n server: McpServer,\n ctx: {\n store: AccountStore;\n registry: Registry;\n tools: ResolvedTools;\n },\n): void {\n const { store, registry, tools } = ctx;\n\n const MIME_TYPES: Record<string, string> = {\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".webp\": \"image/webp\",\n \".txt\": \"text/plain\",\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".csv\": \"text/csv\",\n \".json\": \"application/json\",\n \".xml\": \"application/xml\",\n \".zip\": \"application/zip\",\n \".gz\": \"application/gzip\",\n \".tar\": \"application/x-tar\",\n \".doc\": \"application/msword\",\n \".docx\": \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".pptx\": \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \".mp3\": \"audio/mpeg\",\n \".mp4\": \"video/mp4\",\n };\n\n const sendEmailSchema = z.object({\n account: z.string().email(),\n to: z.array(emailAddrSchema).min(1),\n cc: z.array(emailAddrSchema).optional(),\n bcc: z.array(emailAddrSchema).optional(),\n subject: z.string(),\n body: z.string(),\n format: z\n .enum([\"html\", \"markdown\"])\n .describe(\n \"Body format. 'html' sends the body as-is (must be valid HTML). \" +\n \"'markdown' converts the body from Markdown to HTML for clean rendering on the recipient side.\",\n ),\n include_signature: z\n .boolean()\n .describe(\n \"Whether to append the account's saved HTML signature to the email. \" +\n \"If true, don't include a signature in the body param to avoid double signature. \" +\n \"Returns an error if true but no signature is configured for this account.\",\n ),\n inReplyTo: z\n .union([z.string(), z.literal(false)])\n .describe(\n \"Message ID to reply to. When set, sends as a threaded reply \" +\n \"which includes the quoted thread history automatically. \" +\n \"Set to `false` for a new email (not a reply).\",\n ),\n replyAll: z\n .boolean()\n .default(false)\n .optional()\n .describe(\n \"When true and `inReplyTo` is set, reply to all recipients \" +\n \"instead of just the sender.\",\n ),\n forwardMessageId: z\n .string()\n .optional()\n .describe(\n \"Message ID to forward. When set, sends as a forward of the \" +\n \"specified message, preserving the original content. \" +\n \"Mutually exclusive with `inReplyTo`.\",\n ),\n attachments: z\n .array(\n z.object({\n filePath: z\n .string()\n .min(1)\n .describe(\"Absolute path to a local file\"),\n name: z\n .string()\n .optional()\n .describe(\n \"Attachment filename. Defaults to the file's basename.\",\n ),\n }),\n )\n .optional()\n .describe(\n \"File attachments to include. The server reads the files from \" +\n \"disk and base64-encodes them automatically.\",\n ),\n });\n\n type SendEmailArgs = z.infer<typeof sendEmailSchema>;\n\n async function handleSendOrDraft(\n args: SendEmailArgs,\n action: (\n provider: EmailProvider,\n account: AccountRecord,\n msg: SendInput,\n ) => Promise<{ id: string }>,\n resultKey: string,\n toolName: string,\n ) {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n if (args.include_signature && !account.signature) {\n return fail(\n \"include_signature is true but no signature is configured for this account. \" +\n \"Set up a signature first with set_account_settings.\",\n );\n }\n const composed = composeBody({\n body: args.body,\n format: args.format,\n signature: account.signature,\n style: account.style,\n includeSignature: args.include_signature,\n });\n if (args.inReplyTo && args.forwardMessageId) {\n return fail(\n \"inReplyTo and forwardMessageId are mutually exclusive — use one or the other\",\n );\n }\n\n // Process file attachments: read + encode each file\n let processedAttachments: SendInput[\"attachments\"] = undefined;\n if (args.attachments && args.attachments.length > 0) {\n processedAttachments = args.attachments.map((att) => {\n const fileData = readFileSync(att.filePath);\n const ext = extname(att.filePath).toLowerCase();\n return {\n name: att.name ?? basename(att.filePath),\n contentBytes: fileData.toString(\"base64\"),\n contentType: MIME_TYPES[ext] ?? \"application/octet-stream\",\n };\n });\n }\n\n const res = await action(provider, account, {\n to: args.to,\n cc: args.cc,\n bcc: args.bcc,\n subject: args.subject,\n body: composed.body,\n isHtml: composed.isHtml,\n inReplyTo: args.inReplyTo,\n replyAll: args.replyAll,\n forwardMessageId: args.forwardMessageId,\n attachments: processedAttachments,\n });\n const result: Record<string, unknown> = { [resultKey]: true, ...res };\n if (toolName === \"draft_email\" && res.id) {\n const draft = await provider.readEmail(account, res.id);\n result.draftHtml = draft.bodyHtml;\n }\n return ok(result, result);\n } catch (err) {\n return fail(errMsg(err));\n }\n }\n\n // ---------- send_email ----------\n\n const sendEmailOutputSchema = {\n sent: z.literal(true),\n id: z.string(),\n };\n\n if (shouldRegister(\"send_email\", tools)) {\n server.registerTool(\n \"send_email\",\n {\n description:\n \"Send an email from the given account. Appends the \" +\n \"account's signature (HTML) and applies style preferences when \" +\n \"`include_signature` is true. Returns an error if \" +\n \"`include_signature` is true but no signature is configured. \" +\n \"When `inReplyTo` is set, sends as a reply (or reply-all) which \" +\n \"preserves thread history and conversation threading. \" +\n \"When `forwardMessageId` is set, sends as a forward of the \" +\n \"specified message, preserving the original content. \" +\n \"`inReplyTo` and `forwardMessageId` are mutually exclusive. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: sendEmailSchema,\n outputSchema: sendEmailOutputSchema,\n },\n async (args) =>\n handleSendOrDraft(\n args as SendEmailArgs,\n (p, a, m) => p.sendEmail(a, m),\n \"sent\",\n \"send_email\",\n ),\n );\n }\n\n // ---------- draft_email ----------\n\n const draftEmailOutputSchema = {\n draft: z.literal(true),\n id: z.string(),\n draftHtml: z.string().optional(),\n };\n\n if (shouldRegister(\"draft_email\", tools)) {\n server.registerTool(\n \"draft_email\",\n {\n description:\n \"Create a draft email from the given account without sending it. \" +\n \"Works identically to send_email — appends signature when \" +\n \"`include_signature` is true, applies style, and supports replies \" +\n \"and forwards — but saves the message to the Drafts folder \" +\n \"instead of sending. Returns the draft message ID and the draft's \" +\n \"HTML body content (`draftHtml`). Before sending the draft, \" +\n \"inspect `draftHtml` to verify the draft looks correct: no \" +\n \"duplicate signature blocks, no broken or missing inline images, \" +\n \"no malformed HTML, and no other formatting issues. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: sendEmailSchema,\n outputSchema: draftEmailOutputSchema,\n },\n async (args) =>\n handleSendOrDraft(\n args as SendEmailArgs,\n (p, a, m) => p.saveDraft(a, m),\n \"draft\",\n \"draft_email\",\n ),\n );\n }\n\n // ---------- edit_draft ----------\n\n const editDraftSchema = z.object({\n account: z.string().email(),\n id: z.string().min(1).describe(\"Draft message ID to edit\"),\n to: z.array(emailAddrSchema).optional(),\n cc: z.array(emailAddrSchema).optional(),\n bcc: z.array(emailAddrSchema).optional(),\n subject: z.string().optional(),\n body: z.string().optional(),\n format: z\n .enum([\"html\", \"markdown\"])\n .optional()\n .describe(\n \"Body format. Only meaningful when `body` is also provided. \" +\n \"'html' sends the body as-is (must be valid HTML). \" +\n \"'markdown' converts the body from Markdown to HTML for clean rendering on the recipient side.\",\n ),\n include_signature: z\n .boolean()\n .optional()\n .describe(\n \"Whether to re-apply the account's saved HTML signature to the body. \" +\n \"If true, don't include a signature in the body param. \" +\n \"Only meaningful when `body` is also provided. \" +\n \"Returns an error if true but no signature is configured for this account.\",\n ),\n new_attachments: z\n .array(\n z.object({\n filePath: z\n .string()\n .min(1)\n .describe(\"Absolute path to a local file\"),\n name: z\n .string()\n .optional()\n .describe(\n \"Attachment filename. Defaults to the file's basename.\",\n ),\n }),\n )\n .optional()\n .describe(\n \"New file attachments to add to the draft. The server reads \" +\n \"the files from disk and base64-encodes them automatically.\",\n ),\n remove_attachments: z\n .array(z.string().min(1))\n .optional()\n .describe(\n \"Attachment IDs to remove from the draft. Get attachment IDs \" +\n \"from read_email.\",\n ),\n });\n\n type EditDraftArgs = z.infer<typeof editDraftSchema>;\n\n const editDraftOutputSchema = {\n edited: z.literal(true),\n id: z.string(),\n draftHtml: z.string().optional(),\n };\n\n if (shouldRegister(\"edit_draft\", tools)) {\n server.registerTool(\n \"edit_draft\",\n {\n description:\n \"Edit an existing draft email by ID. Only the fields you provide \" +\n \"are updated — unmentioned fields stay unchanged. When `body` is \" +\n \"provided and `include_signature` is true, the account's signature \" +\n \"is re-applied. Returns the draft ID and the draft's updated HTML \" +\n \"body content (`draftHtml`). Before sending, inspect `draftHtml` \" +\n \"to verify the draft looks correct. \" +\n \"Does not support changing `inReplyTo` or `forwardMessageId` — \" +\n \"those are set at creation time via `draft_email`. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: editDraftSchema,\n outputSchema: editDraftOutputSchema,\n },\n async (args) => {\n const a = args as EditDraftArgs;\n try {\n const { provider, account } = registry.resolveByEmail(a.account);\n if (a.include_signature && !account.signature) {\n return fail(\n \"include_signature is true but no signature is configured for this account. \" +\n \"Set up a signature first with set_account_settings.\",\n );\n }\n let bodyPayload: string | undefined;\n let isHtmlPayload: boolean | undefined;\n if (a.body !== undefined) {\n const composed = composeBody({\n body: a.body,\n format: a.format ?? \"html\",\n signature: account.signature,\n style: account.style,\n includeSignature: !!a.include_signature,\n });\n bodyPayload = composed.body;\n isHtmlPayload = composed.isHtml;\n }\n\n // Preserve quoted thread when editing reply/forward drafts.\n // Uses multi-strategy detection: marker → regex spacer → pattern fallback.\n if (bodyPayload !== undefined) {\n try {\n const existing = await provider.readEmail(account, a.id);\n const existingHtml = existing.bodyHtml ?? \"\";\n const boundary = findThreadBoundary(existingHtml);\n if (boundary !== null) {\n // Replace only the old answer; keep the spacer + marker + thread.\n bodyPayload = bodyPayload + existingHtml.slice(boundary.answerEnd);\n }\n } catch {\n // If we can't read the existing draft, proceed with the new\n // body as-is (no thread to preserve).\n }\n }\n\n const res = await provider.updateDraft(account, a.id, {\n to: a.to,\n cc: a.cc,\n bcc: a.bcc,\n subject: a.subject,\n body: bodyPayload,\n isHtml: isHtmlPayload,\n });\n\n // Handle new attachments\n const newAttachmentIds: string[] = [];\n if (a.new_attachments && a.new_attachments.length > 0) {\n for (const att of a.new_attachments) {\n const fileData = readFileSync(att.filePath);\n const ext = extname(att.filePath).toLowerCase();\n const contentType =\n MIME_TYPES[ext] ?? \"application/octet-stream\";\n const attRes = await provider.addAttachmentToDraft(\n account,\n res.id,\n att.name ?? basename(att.filePath),\n fileData.toString(\"base64\"),\n contentType,\n );\n newAttachmentIds.push(attRes.attachment.id);\n }\n }\n\n // Handle attachment removal\n const removedIds: string[] = [];\n if (a.remove_attachments && a.remove_attachments.length > 0) {\n for (const attId of a.remove_attachments) {\n await provider.removeAttachmentFromDraft(\n account,\n res.id,\n attId,\n );\n removedIds.push(attId);\n }\n }\n\n const draft = await provider.readEmail(account, res.id);\n const result = {\n edited: true as const,\n id: res.id,\n draftHtml: draft.bodyHtml ?? \"\",\n };\n return ok(result, result);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n\n // ---------- send_draft ----------\n\n const sendDraftOutputSchema = {\n sent: z.literal(true),\n id: z.string(),\n };\n\n if (shouldRegister(\"send_draft\", tools)) {\n server.registerTool(\n \"send_draft\",\n {\n description:\n \"Send an existing draft email by ID. \" +\n \"Use this with draft IDs returned by `draft_email` or `edit_draft`. \" +\n \"Disabled in --read-only mode.\",\n inputSchema: {\n account: z.string().email(),\n id: z.string().min(1).describe(\"Draft message ID to send\"),\n },\n outputSchema: sendDraftOutputSchema,\n },\n async (args) => {\n try {\n const { provider, account } = registry.resolveByEmail(args.account);\n const res = await provider.sendDraft(account, args.id);\n const data = { sent: true as const, id: res.id };\n return ok(data, data);\n } catch (err) {\n return fail(errMsg(err));\n }\n },\n );\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\nimport type { AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { ResolvedTools } from \"../config.js\";\n\n// Re-export compose helpers for tests\nexport { composeBody, escapeHtml, buildStyleAttr } from \"./shared.js\";\nexport { markdownToHtml } from \"../markdown-to-html.js\";\n\n// Submodule registration functions\nimport { registerAccountTools } from \"./accounts.js\";\nimport { registerBrowseTools } from \"./browse.js\";\nimport { registerFolderTools } from \"./folders.js\";\nimport { registerOrganizeTools } from \"./organize.js\";\nimport { registerComposeTools } from \"./compose.js\";\n\n\nexport interface RegisterToolsOptions {\n store: AccountStore;\n registry: Registry;\n tools: ResolvedTools;\n}\n\nexport function registerTools(\n server: McpServer,\n opts: RegisterToolsOptions,\n): void {\n const { store, registry, tools } = opts;\n\n registerAccountTools(server, { store, registry, tools });\n registerBrowseTools(server, { registry, tools });\n registerFolderTools(server, { registry, tools });\n registerOrganizeTools(server, { registry, tools });\n registerComposeTools(server, { store, registry, tools });\n}\n","{\n \"name\": \"hypermail-mcp\",\n \"version\": \"0.7.6\",\n \"description\": \"Unified email MCP server — operate any inbox (Outlook now, IMAP/Gmail later) by passing an email address.\",\n \"type\": \"module\",\n \"bin\": {\n \"hypermail-mcp\": \"dist/cli.js\"\n },\n \"main\": \"dist/cli.js\",\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"dev:http\": \"tsup && node dist/cli.js --http --config hypermail-config.http.json\",\n \"start\": \"node dist/cli.js\",\n \"typecheck\": \"tsc --noEmit\",\n \"check\": \"pnpm test && pnpm typecheck && pnpm build\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"prepublishOnly\": \"pnpm check\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"email\",\n \"outlook\",\n \"microsoft-graph\",\n \"imap\"\n ],\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/mateotiedra/hypermail-mcp.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/mateotiedra/hypermail-mcp/issues\"\n },\n \"dependencies\": {\n \"@azure/msal-node\": \"^2.16.2\",\n \"@microsoft/microsoft-graph-client\": \"^3.0.7\",\n \"@modelcontextprotocol/sdk\": \"^1.0.4\",\n \"google-auth-library\": \"^9.15.1\",\n \"googleapis\": \"^144.0.0\",\n \"imapflow\": \"^1.3.3\",\n \"isomorphic-fetch\": \"^3.0.0\",\n \"marked\": \"^18.0.4\",\n \"nodemailer\": \"^8.0.8\",\n \"turndown\": \"^7.2.4\",\n \"zod\": \"^4.4.3\"\n },\n \"optionalDependencies\": {\n \"keytar\": \"^7.9.0\"\n },\n \"devDependencies\": {\n \"@types/isomorphic-fetch\": \"^0.0.39\",\n \"@types/node\": \"^22.10.2\",\n \"@types/nodemailer\": \"^8.0.0\",\n \"@types/turndown\": \"^5.0.6\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.7.2\",\n \"vitest\": \"^2.1.8\"\n }\n}\n","import pkg from \"../package.json\" with { type: \"json\" };\nexport const VERSION: string = pkg.version;\n","import type { EmailFull } from \"../providers/types.js\";\nimport type { WatchConfig } from \"../config.js\";\n\n/** Post a new-email event to the configured webhook URL with exponential\n * backoff retry. Returns `true` if delivery succeeded, `false` if all\n * retries were exhausted. */\nexport async function postWebhook(\n email: EmailFull,\n config: WatchConfig,\n): Promise<boolean> {\n if (!config.webhook) return false;\n\n const { url, retry } = config.webhook;\n const maxAttempts = retry.maxAttempts;\n const baseDelayMs = retry.baseDelayMs;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delay = baseDelayMs * (2 ** (attempt - 1));\n await sleep(delay);\n }\n\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(email),\n });\n\n if (res.ok) return true;\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] webhook POST ${email.id} attempt ${attempt + 1}/${maxAttempts}: HTTP ${res.status}`,\n );\n } catch (err: unknown) {\n const code = (err as { code?: string }).code ?? \"\";\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] webhook POST ${email.id} attempt ${attempt + 1}/${maxAttempts}: ${code || String(err)}`,\n );\n }\n }\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] webhook delivery failed after ${maxAttempts} retries for ${email.id}`,\n );\n return false;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { spawn } from \"node:child_process\";\nimport type { EmailFull } from \"../providers/types.js\";\nimport type { WatchConfig } from \"../config.js\";\n\n/**\n * Execute the configured script with a new-email JSON payload on stdin.\n * Supports exponential backoff retry — mirrors {@link postWebhook}.\n *\n * Returns `true` if the script exited with code 0, `false` if all retries\n * were exhausted or the script timed out.\n */\nexport async function runScript(\n email: EmailFull,\n config: WatchConfig,\n): Promise<boolean> {\n if (!config.script) return false;\n\n const { path: scriptPath, timeoutMs, retry } = config.script;\n const maxAttempts = retry?.maxAttempts ?? 5;\n const baseDelayMs = retry?.baseDelayMs ?? 1000;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (attempt > 0) {\n const delay = baseDelayMs * (2 ** (attempt - 1));\n await sleep(delay);\n }\n\n try {\n const ok = await spawnWithTimeout(\n scriptPath,\n JSON.stringify(email),\n timeoutMs,\n );\n\n if (ok) return true;\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script ${email.id} attempt ${attempt + 1}/${maxAttempts}: non-zero exit code`,\n );\n } catch (err: unknown) {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script ${email.id} attempt ${attempt + 1}/${maxAttempts}: ${String(err)}`,\n );\n }\n }\n\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script delivery failed after ${maxAttempts} retries for ${email.id}`,\n );\n return false;\n}\n\n// ── helpers ──\n\n/**\n * Spawn `node <scriptPath>`, pipe `stdinData` to stdin, and resolve when the\n * child exits or the timeout fires.\n *\n * Timeout kills the child with SIGTERM and resolves `false`. A non-zero exit\n * code also resolves `false` (retry is handled by the caller).\n */\nfunction spawnWithTimeout(\n scriptPath: string,\n stdinData: string,\n timeoutMs: number,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(\"node\", [scriptPath], {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n\n let stderr = \"\";\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString(\"utf-8\");\n });\n\n // Timeout guard — SIGTERM the child and move on.\n const timer = setTimeout(() => {\n child.kill(\"SIGTERM\");\n if (stderr) {\n // eslint-disable-next-line no-console\n console.error(`[hypermail-watch] script timed out after ${timeoutMs}ms. stderr:\\n${stderr}`);\n }\n resolve(false);\n }, timeoutMs);\n\n child.on(\"close\", (code: number | null) => {\n clearTimeout(timer);\n if (stderr && code !== 0) {\n // eslint-disable-next-line no-console\n console.error(`[hypermail-watch] script stderr:\\n${stderr}`);\n }\n resolve(code === 0);\n });\n\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n clearTimeout(timer);\n // eslint-disable-next-line no-console\n console.error(`[hypermail-watch] script spawn error: ${err.message}`);\n resolve(false);\n });\n\n // Pipe the full Email JSON to stdin and close the stream.\n child.stdin?.end(stdinData);\n });\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import type { AccountStore } from \"../store/account-store.js\";\nimport type { Registry } from \"../providers/registry.js\";\nimport type { WatchConfig } from \"../config.js\";\nimport type { EmailFull } from \"../providers/types.js\";\nimport { postWebhook } from \"./webhook.js\";\nimport { runScript } from \"./script.js\";\n\n/**\n * Polls all accounts' inboxes on an interval, detects new emails via\n * {@link AccountRecord.lastSeenIds}, and emits them via the webhook HTTP\n * client.\n *\n * Instantiated once at server startup when `config.watch.enabled` is true.\n * Gated behind `HYPERMAIL_WATCH_ENABLED` or explicit config opt-in — both\n * default to off.\n */\nexport class WatcherManager {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly store: AccountStore,\n private readonly registry: Registry,\n private readonly config: WatchConfig,\n ) {}\n\n /** Start the poll loop. Fires immediately on the first tick, then every\n * `pollIntervalSeconds`. Safe to call multiple times — subsequent calls\n * are no-ops. */\n start(): void {\n if (this.intervalId !== null) return;\n this.poll(); // immediate first poll\n this.intervalId = setInterval(\n () => this.poll(),\n this.config.pollIntervalSeconds * 1000,\n );\n }\n\n /** Stop the poll loop and release the interval. Safe to call when already\n * stopped. */\n stop(): void {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n }\n\n // ── private ──\n\n private async poll(): Promise<void> {\n const accounts = this.store.listAccounts();\n for (const acct of accounts) {\n try {\n await this.pollAccount(acct.email);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] poll failed for ${acct.email}:`,\n err,\n );\n }\n }\n }\n\n private async pollAccount(email: string): Promise<void> {\n const { provider, account } = this.registry.resolveByEmail(email);\n const result = await provider.listEmails(account, {\n folder: \"inbox\",\n limit: 50,\n });\n\n const knownIds = [...(account.lastSeenIds ?? [])];\n const newEmails = result.items.filter((e) => !knownIds.includes(e.id));\n\n if (newEmails.length === 0) return;\n\n for (const summary of newEmails) {\n try {\n const full: EmailFull = await provider.readEmail(account, summary.id);\n await this.emit(full);\n knownIds.unshift(summary.id);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] emission failed for ${email}/${summary.id}:`,\n err,\n );\n }\n }\n\n // Cap at 200 and persist through the encrypted store.\n const capped = knownIds.slice(0, 200);\n await this.store.upsertAccount({ ...account, lastSeenIds: capped });\n }\n\n private async emit(full: EmailFull): Promise<void> {\n await postWebhook(full, this.config);\n // Fire-and-forget — script execution must not block the poll loop.\n runScript(full, this.config).catch((err: unknown) => {\n // eslint-disable-next-line no-console\n console.error(\n `[hypermail-watch] script unhandled error for ${full.id}:`,\n err,\n );\n });\n }\n}\n","import { z } from \"zod\";\n\n// ── Schema ──\n\nconst httpConfigSchema = z.object({\n enabled: z.boolean().default(false),\n port: z.number().int().min(1).max(65535).default(3000),\n host: z.string().default(\"127.0.0.1\"),\n});\n\nconst toolsConfigSchema = z.object({\n disabled: z.array(z.string()).optional(),\n enabled: z.array(z.string()).optional(),\n});\n\nconst outlookProviderSchema = z.object({\n clientId: z.string().optional(),\n tenantId: z.string().optional(),\n});\n\nconst gmailProviderSchema = z.object({\n clientId: z.string().optional(),\n clientSecret: z.string().optional(),\n});\n\nconst providersConfigSchema = z.object({\n outlook: outlookProviderSchema.optional(),\n gmail: gmailProviderSchema.optional(),\n});\n\nconst watchRetrySchema = z.object({\n maxAttempts: z.number().int().min(1).max(10).default(5),\n baseDelayMs: z.number().int().min(100).default(1000),\n});\n\nconst watchWebhookSchema = z.object({\n url: z.string(),\n retry: watchRetrySchema.optional(),\n});\n\nconst watchScriptSchema = z.object({\n path: z.string(),\n timeoutMs: z.number().int().min(1000).default(30000),\n retry: watchRetrySchema.optional(),\n});\n\nconst watchConfigSchema = z.object({\n enabled: z.boolean().default(false),\n pollIntervalSeconds: z.number().int().min(10).max(3600).default(10),\n webhook: watchWebhookSchema.optional(),\n script: watchScriptSchema.optional(),\n});\n\nexport const rawConfigSchema = z.object({\n dataDir: z.string().optional(),\n http: httpConfigSchema.optional(),\n tools: toolsConfigSchema.optional(),\n providers: providersConfigSchema.optional(),\n watch: watchConfigSchema.optional(),\n});\n\n// ── Types ──\n\nexport interface HttpConfig {\n enabled: boolean;\n port: number;\n host: string;\n}\n\nexport interface ToolsConfig {\n disabled?: string[];\n enabled?: string[];\n}\n\nexport interface OutlookProviderConfig {\n clientId?: string;\n tenantId?: string;\n}\n\nexport interface GmailProviderConfig {\n clientId?: string;\n clientSecret?: string;\n}\n\nexport interface ProvidersConfig {\n outlook?: OutlookProviderConfig;\n gmail?: GmailProviderConfig;\n}\n\nexport interface WatchRetryConfig {\n /** Maximum number of webhook delivery attempts (default: 5). */\n maxAttempts: number;\n /** Base delay in milliseconds for exponential backoff (default: 1000). */\n baseDelayMs: number;\n}\n\nexport interface WatchWebhookConfig {\n /** URL to POST new-email events to. */\n url: string;\n /** Retry configuration for failed deliveries. */\n retry: WatchRetryConfig;\n}\n\nexport interface WatchScriptConfig {\n /** Absolute path to a script that receives new-email JSON on stdin. */\n path: string;\n /** Maximum time in ms before the child process is killed (default: 30000). */\n timeoutMs: number;\n /** Retry configuration for failed script executions. */\n retry?: WatchRetryConfig;\n}\n\nexport interface WatchConfig {\n /** Whether the email poll loop is enabled (default: false). */\n enabled: boolean;\n /** Seconds between inbox polls (min 10, default 10). */\n pollIntervalSeconds: number;\n /** Webhook delivery configuration. */\n webhook?: WatchWebhookConfig;\n /** Script-based delivery configuration — spawns a child process per new email. */\n script?: WatchScriptConfig;\n}\n\n/** Fully resolved application configuration (after ${VAR} expansion and CLI merge). */\nexport interface AppConfig {\n dataDir?: string;\n http: HttpConfig;\n tools?: ToolsConfig;\n providers?: ProvidersConfig;\n watch?: WatchConfig;\n}\n\n/** CLI flags that can override config file values. */\nexport interface CliOverrides {\n http?: boolean;\n port?: number;\n host?: string;\n dataDir?: string;\n}\n\n// ── Known tool names ──\n\n/**\n * Every tool that {@link registerTools} may register.\n * Used for validation — typos in tools.disabled / tools.enabled are caught at startup.\n */\n// Legacy: `check_notifications` was removed in v0.7.0 but is kept here\n// so existing configs that reference it don't break validation.\nexport const KNOWN_TOOLS = [\n \"list_accounts\",\n \"add_account\",\n \"complete_add_account\",\n \"get_account_settings\",\n \"set_account_settings\",\n \"remove_account\",\n \"list_emails\",\n \"search_emails\",\n \"read_email\",\n \"read_attachment\",\n \"archive_email\",\n \"trash_email\",\n \"move_email\",\n \"mark_read\",\n \"mark_unread\",\n \"list_folders\",\n \"create_folder\",\n \"delete_folder\",\n \"rename_folder\",\n \"send_email\",\n \"draft_email\",\n \"edit_draft\",\n \"send_draft\",\n \"check_notifications\",\n] as const;\n\n// ── Helpers ──\n\n/** Extracted tool filtering state for {@link registerTools}. */\nexport interface ResolvedTools {\n /** If set, only these tools are registered (allowlist mode). */\n enabledTools: Set<string> | null;\n /** If set, these tools are NOT registered (blocklist mode). */\n disabledTools: Set<string> | null;\n}\n\n/** Convert {@link AppConfig.tools} into the sets that {@link registerTools} consumes. */\nexport function resolveTools(config: AppConfig): ResolvedTools {\n if (!config.tools) {\n return { enabledTools: null, disabledTools: null };\n }\n return {\n enabledTools: config.tools.enabled\n ? new Set(config.tools.enabled)\n : null,\n disabledTools: config.tools.disabled\n ? new Set(config.tools.disabled)\n : null,\n };\n}\n\n// ── Re-exports ──\n\nexport { loadConfig } from \"./config/load.js\";\n","import { readFileSync } from \"node:fs\";\n\nimport type {\n AppConfig,\n CliOverrides,\n HttpConfig,\n ProvidersConfig,\n ToolsConfig,\n WatchConfig,\n WatchScriptConfig,\n WatchWebhookConfig,\n} from \"../config.js\";\nimport { KNOWN_TOOLS, rawConfigSchema } from \"../config.js\";\n\n// ── Env var names ──\n\n// Dedicated HYPERMAIL_* env vars — one per config field.\n\nconst ENV_HTTP_ENABLED = \"HYPERMAIL_HTTP_ENABLED\";\nconst ENV_HTTP_PORT = \"HYPERMAIL_HTTP_PORT\";\nconst ENV_HTTP_HOST = \"HYPERMAIL_HTTP_HOST\";\nconst ENV_TOOLS_DISABLED = \"HYPERMAIL_TOOLS_DISABLED\";\nconst ENV_TOOLS_ENABLED = \"HYPERMAIL_TOOLS_ENABLED\";\nconst ENV_OUTLOOK_CLIENT_ID = \"HYPERMAIL_PROVIDERS_OUTLOOK_CLIENT_ID\";\nconst ENV_OUTLOOK_TENANT_ID = \"HYPERMAIL_PROVIDERS_OUTLOOK_TENANT_ID\";\nconst ENV_GMAIL_CLIENT_ID = \"HYPERMAIL_PROVIDERS_GMAIL_CLIENT_ID\";\nconst ENV_GMAIL_CLIENT_SECRET = \"HYPERMAIL_PROVIDERS_GMAIL_CLIENT_SECRET\";\nconst ENV_WATCH_ENABLED = \"HYPERMAIL_WATCH_ENABLED\";\nconst ENV_WATCH_POLL_INTERVAL = \"HYPERMAIL_WATCH_POLL_INTERVAL\";\nconst ENV_WATCH_WEBHOOK_URL = \"HYPERMAIL_WATCH_WEBHOOK_URL\";\nconst ENV_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS = \"HYPERMAIL_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS\";\nconst ENV_WATCH_WEBHOOK_RETRY_BASE_DELAY = \"HYPERMAIL_WATCH_WEBHOOK_RETRY_BASE_DELAY_MS\";\nconst ENV_WATCH_SCRIPT_PATH = \"HYPERMAIL_WATCH_SCRIPT_PATH\";\nconst ENV_WATCH_SCRIPT_TIMEOUT_MS = \"HYPERMAIL_WATCH_SCRIPT_TIMEOUT_MS\";\nconst ENV_WATCH_SCRIPT_RETRY_MAX_ATTEMPTS = \"HYPERMAIL_WATCH_SCRIPT_RETRY_MAX_ATTEMPTS\";\nconst ENV_WATCH_SCRIPT_RETRY_BASE_DELAY = \"HYPERMAIL_WATCH_SCRIPT_RETRY_BASE_DELAY_MS\";\n\n// ── ${VAR} resolution ──\n\nconst ENV_VAR_RE = /\\$\\{([A-Z_][A-Z0-9_]*)\\}/g;\n\nfunction resolveEnvVars(value: string): string {\n return value.replace(ENV_VAR_RE, (_match, name: string) => {\n return process.env[name] ?? \"\";\n });\n}\n\n/** Recursively resolve `${VAR}` placeholders in all string values. */\nfunction deepResolve(obj: unknown): unknown {\n if (typeof obj === \"string\") return resolveEnvVars(obj);\n if (Array.isArray(obj)) return obj.map(deepResolve);\n if (obj && typeof obj === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj as Record<string, unknown>)) {\n out[key] = deepResolve(val);\n }\n return out;\n }\n return obj;\n}\n\n// ── Type coercion helpers ──\n\n/** Parse a boolean from an env-var string. Returns undefined if unrecognised. */\nfunction parseBool(value: string | undefined): boolean | undefined {\n if (value === undefined) return undefined;\n const lower = value.trim().toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") return true;\n if (lower === \"false\" || lower === \"0\" || lower === \"no\" || lower === \"\") return false;\n return undefined;\n}\n\n/** Parse a positive integer from an env-var string. Returns undefined on parse failure. */\nfunction parseIntSafe(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n if (trimmed === \"\") return undefined;\n const n = Number.parseInt(trimmed, 10);\n return Number.isNaN(n) ? undefined : n;\n}\n\n/** Parse a comma-separated string into a trimmed, filtered array.\n * Returns an empty array for empty/whitespace-only strings so callers\n * can distinguish \"set to empty\" from \"not set at all\". */\nfunction parseStringArray(value: string | undefined): string[] | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n if (trimmed === \"\") return [];\n return trimmed\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\n// ── Validation ──\n\nfunction validateToolNames(\n toolNames: string[] | undefined,\n listName: string,\n): void {\n if (!toolNames || toolNames.length === 0) return;\n const known = new Set<string>(KNOWN_TOOLS as readonly string[]);\n for (const name of toolNames) {\n if (!known.has(name)) {\n throw new Error(\n `Unknown tool \"${name}\" in ${listName}. Known tools: ${KNOWN_TOOLS.join(\", \")}`,\n );\n }\n }\n}\n\n// ── Loading ──\n\n/**\n * Load and validate `hypermail-config.json`.\n *\n * @param configPath File path, or `undefined` to use defaults.\n * @param cliOverrides CLI flags that take precedence over config file values.\n * @returns A fully resolved {@link AppConfig}.\n */\nexport function loadConfig(\n configPath: string | undefined,\n cliOverrides: CliOverrides = {},\n): AppConfig {\n let raw: Record<string, unknown> = {};\n\n if (configPath) {\n try {\n raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n } catch (err) {\n const detail =\n err instanceof SyntaxError\n ? \"Invalid JSON\"\n : err instanceof Error\n ? err.message\n : String(err);\n throw new Error(`Failed to read config file \"${configPath}\": ${detail}`);\n }\n }\n\n // Resolve ${VAR} before zod validation so env-var references become real values.\n raw = deepResolve(raw) as Record<string, unknown>;\n\n // Validate structure\n const parsed = rawConfigSchema.parse(raw);\n\n // ── Env var resolution (fallback layer) ──\n // Fields unset in the config file are filled from HYPERMAIL_* env vars.\n // Priority: CLI > config file > env var > hardcoded default.\n\n // -- HTTP --\n const http: HttpConfig = {\n enabled:\n cliOverrides.http ??\n parsed.http?.enabled ??\n parseBool(process.env[ENV_HTTP_ENABLED]) ??\n false,\n port:\n cliOverrides.port ??\n parsed.http?.port ??\n parseIntSafe(process.env[ENV_HTTP_PORT]) ??\n 3000,\n host:\n cliOverrides.host ??\n parsed.http?.host ??\n process.env[ENV_HTTP_HOST] ??\n \"127.0.0.1\",\n };\n\n // -- Tools --\n const toolsDisabled =\n parsed.tools?.disabled ??\n parseStringArray(process.env[ENV_TOOLS_DISABLED]);\n const toolsEnabled =\n parsed.tools?.enabled ??\n parseStringArray(process.env[ENV_TOOLS_ENABLED]);\n\n if (toolsDisabled && toolsEnabled) {\n throw new Error(\n \"tools.disabled and tools.enabled are mutually exclusive — use one or the other\",\n );\n }\n if (toolsEnabled !== undefined && toolsEnabled.length === 0) {\n throw new Error(\n \"tools.enabled is empty — at least one tool must be listed. \" +\n \"To enable all tools, omit the tools section entirely.\",\n );\n }\n validateToolNames(toolsDisabled, \"tools.disabled\");\n validateToolNames(toolsEnabled, \"tools.enabled\");\n\n const tools: ToolsConfig | undefined =\n toolsDisabled || toolsEnabled\n ? { disabled: toolsDisabled, enabled: toolsEnabled }\n : undefined;\n\n // -- Providers --\n\n // Outlook: only dedicated HYPERMAIL_* env vars are accepted.\n const outlookClientId =\n parsed.providers?.outlook?.clientId ??\n process.env[ENV_OUTLOOK_CLIENT_ID];\n const outlookTenantId =\n parsed.providers?.outlook?.tenantId ??\n process.env[ENV_OUTLOOK_TENANT_ID];\n\n // Gmail: only dedicated HYPERMAIL_* env vars are accepted.\n const gmailClientId =\n parsed.providers?.gmail?.clientId ??\n process.env[ENV_GMAIL_CLIENT_ID];\n const gmailClientSecret =\n parsed.providers?.gmail?.clientSecret ??\n process.env[ENV_GMAIL_CLIENT_SECRET];\n\n let providers: ProvidersConfig | undefined;\n if (outlookClientId || outlookTenantId || gmailClientId || gmailClientSecret) {\n providers = {};\n if (outlookClientId || outlookTenantId) {\n providers.outlook = {};\n if (outlookClientId) providers.outlook.clientId = outlookClientId;\n if (outlookTenantId) providers.outlook.tenantId = outlookTenantId;\n }\n if (gmailClientId || gmailClientSecret) {\n providers.gmail = {};\n if (gmailClientId) providers.gmail.clientId = gmailClientId;\n if (gmailClientSecret) providers.gmail.clientSecret = gmailClientSecret;\n }\n }\n\n // -- Watch --\n\n const watchEnabledEnv = parseBool(process.env[ENV_WATCH_ENABLED]);\n let watch: WatchConfig | undefined;\n if (parsed.watch || watchEnabledEnv !== undefined) {\n // Build webhook if URL is set (from config or env)\n const webhookUrl =\n parsed.watch?.webhook?.url ?? process.env[ENV_WATCH_WEBHOOK_URL];\n let webhook: WatchWebhookConfig | undefined;\n if (webhookUrl) {\n const retryMaxAttempts =\n parsed.watch?.webhook?.retry?.maxAttempts ??\n parseIntSafe(process.env[ENV_WATCH_WEBHOOK_RETRY_MAX_ATTEMPTS]) ??\n 5;\n const retryBaseDelayMs =\n parsed.watch?.webhook?.retry?.baseDelayMs ??\n parseIntSafe(process.env[ENV_WATCH_WEBHOOK_RETRY_BASE_DELAY]) ??\n 1000;\n webhook = {\n url: webhookUrl,\n retry: { maxAttempts: retryMaxAttempts, baseDelayMs: retryBaseDelayMs },\n };\n }\n\n // Build script if path is set (from config or env)\n const scriptPath =\n parsed.watch?.script?.path ?? process.env[ENV_WATCH_SCRIPT_PATH];\n let script: WatchScriptConfig | undefined;\n if (scriptPath) {\n const scriptTimeoutMs =\n parsed.watch?.script?.timeoutMs ??\n parseIntSafe(process.env[ENV_WATCH_SCRIPT_TIMEOUT_MS]) ??\n 30000;\n const scriptRetryMaxAttempts =\n parsed.watch?.script?.retry?.maxAttempts ??\n parseIntSafe(process.env[ENV_WATCH_SCRIPT_RETRY_MAX_ATTEMPTS]) ??\n 5;\n const scriptRetryBaseDelayMs =\n parsed.watch?.script?.retry?.baseDelayMs ??\n parseIntSafe(process.env[ENV_WATCH_SCRIPT_RETRY_BASE_DELAY]) ??\n 1000;\n script = {\n path: scriptPath,\n timeoutMs: scriptTimeoutMs,\n retry: {\n maxAttempts: scriptRetryMaxAttempts,\n baseDelayMs: scriptRetryBaseDelayMs,\n },\n };\n }\n\n watch = {\n enabled:\n watchEnabledEnv ??\n parsed.watch?.enabled ??\n false,\n pollIntervalSeconds:\n parsed.watch?.pollIntervalSeconds ??\n parseIntSafe(process.env[ENV_WATCH_POLL_INTERVAL]) ??\n 10,\n webhook,\n script,\n };\n }\n\n return {\n dataDir:\n cliOverrides.dataDir ??\n parsed.dataDir ??\n process.env.HYPERMAIL_MCP_DATA_DIR,\n http,\n tools,\n providers,\n watch,\n };\n}\n"],"mappings":"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","names":["UsedValueState","Type","DataType","_a","path","path","Ajv","cacheKey","DiscrError","Ajv","fs","randomBytes","safeParse","result","safeParseAsync","def","ErrorCode","z4mini","ZodFirstPartyTypeKind","ZodFirstPartyTypeKind","literal","ZodFirstPartyTypeKind","object","types","x","base","ZodFirstPartyTypeKind","name","schema","main","safeParse","task","error","safeParse","jsonrpcNotification","Ajv","_addFormats","safeParse","McpZodTypeKind","safeParseAsync","process","process","crypto","randomUUID","fs","path","fs","path","randomUUID","existing","randomUUID","tmpdir","pathJoin","clampLimit","mapSummary","listEmails","clampLimit","mapSummary","searchEmails","readEmail","readAttachment","pathJoin","tmpdir","listFolders","randomUUID","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","randomUUID","removeAttachmentFromDraft","markRead","createFolder","path","renameFolder","deleteFolder","listEmails","searchEmails","readEmail","readAttachment","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","removeAttachmentFromDraft","markRead","listFolders","createFolder","renameFolder","deleteFolder","randomUUID","DEFAULT_SCOPES","beginDeviceCode","awaitDeviceCodeReady","existing","writeFileSync","tmpdir","pathJoin","MailComposer","h","mapSummary","mapFolder","clampLimit","buildRawMessage","MailComposer","listEmails","clampLimit","mapSummary","searchEmails","readEmail","readAttachment","pathJoin","tmpdir","writeFileSync","listFolders","mapFolder","randomUUID","Buffer","MailComposer","sendEmail","Buffer","buildRawMessage","saveDraft","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","MailComposer","randomUUID","removeAttachmentFromDraft","markRead","createFolder","mapFolder","renameFolder","deleteFolder","beginDeviceCode","awaitDeviceCodeReady","randomUUID","listEmails","searchEmails","readEmail","readAttachment","sendEmail","saveDraft","updateDraft","moveEmail","sendDraft","addAttachmentToDraft","removeAttachmentFromDraft","markRead","listFolders","createFolder","renameFolder","deleteFolder","z","z","fs","z","z","fs","z","z","z","z","z","z","z","z","sleep","ok","z","readFileSync","readFileSync","z","randomUUID","randomBytes"]}
|