imsg-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/analytics.ts","../src/analytics-cache.ts","../src/contact-resolver.ts","../src/fuzzy.ts","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Options.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Refs.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/errorMessages.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js","../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/any.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/array.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/date.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/default.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/string.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/record.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/map.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/never.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/null.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/union.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/number.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/object.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/set.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/selectParser.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parseDef.js","../node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js","../src/mcp-tools.ts","../src/prompt-injection.ts","../src/sanitize.ts","../src/index.ts"],"sourcesContent":["/**\n * Chat analytics — pure functions over Message[] arrays.\n *\n * The handler in src/index.ts pulls a bounded message window via\n * IMessageDB.getMessagesInWindow() and dispatches to one of these computeXxx\n * functions based on the analytic `type`. Each returns a structured object\n * the LLM can render or chart.\n *\n * Six priority types are implemented here (P2.5). The remaining 20 from the\n * full enum are listed in mcp-tools.ts as ANALYTICS_TYPES but throw\n * `not_yet_implemented` if requested.\n */\n\nimport type { Message } from \"./types.js\";\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nconst MS_PER_DAY = 86_400_000;\n\n/** Local-date YYYY-MM-DD for grouping. */\nfunction localDateKey(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${day}`;\n}\n\n/** Identifier for \"the other side\" of a message — the chatId so DMs and groups both bucket correctly. */\nfunction contactKey(m: Message): string {\n return m.chatId;\n}\n\n/** Sort helper. */\nfunction byDate(a: Message, b: Message): number {\n return a.date.getTime() - b.date.getTime();\n}\n\n// ── 1. messaging_streaks ─────────────────────────────────────────────────\n\nexport interface StreakResult {\n contact: string;\n longestStreakDays: number;\n longestStreakStart: string | null;\n longestStreakEnd: string | null;\n currentStreakDays: number;\n}\n\nexport function computeStreaks(messages: Message[]): StreakResult[] {\n const byContact = new Map<string, Set<string>>();\n for (const m of messages) {\n if (m.isReaction) continue;\n const c = contactKey(m);\n if (!byContact.has(c)) byContact.set(c, new Set());\n byContact.get(c)!.add(localDateKey(m.date));\n }\n\n const today = localDateKey(new Date());\n const results: StreakResult[] = [];\n\n for (const [contact, dayset] of byContact) {\n const days = Array.from(dayset).sort();\n let longest = 0;\n let longestStart: string | null = null;\n let longestEnd: string | null = null;\n let runLen = 0;\n let runStart: string | null = null;\n\n for (let i = 0; i < days.length; i++) {\n if (\n i === 0 ||\n new Date(days[i]!).getTime() - new Date(days[i - 1]!).getTime() !== MS_PER_DAY\n ) {\n runLen = 1;\n runStart = days[i]!;\n } else {\n runLen++;\n }\n if (runLen > longest) {\n longest = runLen;\n longestStart = runStart;\n longestEnd = days[i]!;\n }\n }\n\n // Current streak — count back from today.\n let curLen = 0;\n const cursor = new Date();\n while (dayset.has(localDateKey(cursor))) {\n curLen++;\n cursor.setDate(cursor.getDate() - 1);\n }\n\n results.push({\n contact,\n longestStreakDays: longest,\n longestStreakStart: longestStart,\n longestStreakEnd: longestEnd,\n currentStreakDays: curLen,\n });\n void today;\n }\n\n results.sort((a, b) => b.longestStreakDays - a.longestStreakDays);\n return results;\n}\n\n// ── 2. double_texts ──────────────────────────────────────────────────────\n\nexport interface DoubleTextResult {\n contact: string;\n doubleTextsFromMe: number;\n doubleTextsFromThem: number;\n}\n\nexport function computeDoubleTexts(messages: Message[]): DoubleTextResult[] {\n const byContact = new Map<string, Message[]>();\n for (const m of messages) {\n if (m.isReaction) continue;\n const c = contactKey(m);\n if (!byContact.has(c)) byContact.set(c, []);\n byContact.get(c)!.push(m);\n }\n\n const results: DoubleTextResult[] = [];\n for (const [contact, msgs] of byContact) {\n msgs.sort(byDate);\n let mineRun = 0;\n let theirsRun = 0;\n let mineDoubles = 0;\n let theirsDoubles = 0;\n for (const m of msgs) {\n if (m.isFromMe) {\n mineRun++;\n theirsRun = 0;\n if (mineRun >= 2) mineDoubles++;\n } else {\n theirsRun++;\n mineRun = 0;\n if (theirsRun >= 2) theirsDoubles++;\n }\n }\n results.push({\n contact,\n doubleTextsFromMe: mineDoubles,\n doubleTextsFromThem: theirsDoubles,\n });\n }\n results.sort(\n (a, b) =>\n b.doubleTextsFromMe + b.doubleTextsFromThem - (a.doubleTextsFromMe + a.doubleTextsFromThem),\n );\n return results;\n}\n\n// ── 3. response_time_stats ───────────────────────────────────────────────\n\nexport interface ResponseTimeStats {\n contact: string;\n count: number;\n medianMs: number;\n p95Ms: number;\n meanMs: number;\n}\n\nfunction percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(sorted.length - 1, Math.floor((p / 100) * sorted.length));\n return sorted[idx] ?? 0;\n}\n\nexport function computeResponseTimes(messages: Message[]): ResponseTimeStats[] {\n const byContact = new Map<string, Message[]>();\n for (const m of messages) {\n if (m.isReaction) continue;\n const c = contactKey(m);\n if (!byContact.has(c)) byContact.set(c, []);\n byContact.get(c)!.push(m);\n }\n const results: ResponseTimeStats[] = [];\n for (const [contact, msgs] of byContact) {\n msgs.sort(byDate);\n const deltas: number[] = [];\n for (let i = 1; i < msgs.length; i++) {\n const prev = msgs[i - 1]!;\n const curr = msgs[i]!;\n // Only count \"me → them\" reply: prev is from them, curr is from me.\n if (!prev.isFromMe && curr.isFromMe) {\n deltas.push(curr.date.getTime() - prev.date.getTime());\n }\n }\n if (deltas.length === 0) continue;\n deltas.sort((a, b) => a - b);\n const mean = deltas.reduce((s, n) => s + n, 0) / deltas.length;\n results.push({\n contact,\n count: deltas.length,\n medianMs: percentile(deltas, 50),\n p95Ms: percentile(deltas, 95),\n meanMs: Math.round(mean),\n });\n }\n results.sort((a, b) => a.medianMs - b.medianMs);\n return results;\n}\n\n// ── 4. daily_heatmap ─────────────────────────────────────────────────────\n\nexport interface HeatmapResult {\n /** 7×24 grid, [dow][hour] = count. dow is 0=Sun..6=Sat. */\n grid: number[][];\n total: number;\n}\n\nexport function computeHeatmap(messages: Message[]): HeatmapResult {\n const grid: number[][] = Array.from({ length: 7 }, () => Array.from({ length: 24 }, () => 0));\n let total = 0;\n for (const m of messages) {\n if (m.isReaction) continue;\n const dow = m.date.getDay();\n const hr = m.date.getHours();\n const dowRow = grid[dow];\n if (dowRow && hr >= 0 && hr < 24) {\n dowRow[hr] = (dowRow[hr] ?? 0) + 1;\n total++;\n }\n }\n return { grid, total };\n}\n\n// ── 5. tapback_summary ───────────────────────────────────────────────────\n\nexport interface TapbackResult {\n contact: string;\n heart: number;\n thumbsUp: number;\n thumbsDown: number;\n haha: number;\n exclaim: number;\n question: number;\n emoji: number; // freeform sticker reactions\n total: number;\n}\n\nconst TAPBACK_TYPE = {\n HEART: 2000,\n THUMBS_UP: 2001,\n THUMBS_DOWN: 2002,\n HAHA: 2003,\n EXCLAIM: 2004,\n QUESTION: 2005,\n EMOJI: 2006,\n} as const;\n\nexport function computeTapbacks(messages: Message[]): TapbackResult[] {\n const byContact = new Map<string, TapbackResult>();\n for (const m of messages) {\n if (!m.isReaction || !m.reaction) continue;\n const c = contactKey(m);\n if (!byContact.has(c)) {\n byContact.set(c, {\n contact: c,\n heart: 0,\n thumbsUp: 0,\n thumbsDown: 0,\n haha: 0,\n exclaim: 0,\n question: 0,\n emoji: 0,\n total: 0,\n });\n }\n const r = byContact.get(c)!;\n // m.reaction.type is the textual tag like \"heart\" / \"thumbs_up\" — string\n // mapping rather than the numeric associated_message_type to keep this\n // resilient to type changes.\n const t = (m.reaction.type || \"\").toLowerCase();\n if (t.includes(\"heart\") || t === \"love\") r.heart++;\n else if ((t.includes(\"thumb\") && t.includes(\"up\")) || t === \"like\") r.thumbsUp++;\n else if ((t.includes(\"thumb\") && t.includes(\"down\")) || t === \"dislike\") r.thumbsDown++;\n else if (t.includes(\"haha\") || t === \"laugh\") r.haha++;\n else if (t.includes(\"exclaim\") || t === \"emphasis\") r.exclaim++;\n else if (t.includes(\"question\")) r.question++;\n else r.emoji++;\n r.total++;\n void TAPBACK_TYPE;\n }\n const out = Array.from(byContact.values());\n out.sort((a, b) => b.total - a.total);\n return out;\n}\n\n// ── 6. year_in_review_wrapped ────────────────────────────────────────────\n\nexport interface WrappedResult {\n windowStart: string;\n windowEnd: string;\n totalSent: number;\n totalReceived: number;\n totalReactions: number;\n topContacts: Array<{ contact: string; sent: number; received: number; total: number }>;\n peakDay: { date: string; count: number } | null;\n longestStreakDays: number;\n longestStreakContact: string | null;\n}\n\nexport function computeWrapped(messages: Message[]): WrappedResult {\n if (messages.length === 0) {\n return {\n windowStart: \"\",\n windowEnd: \"\",\n totalSent: 0,\n totalReceived: 0,\n totalReactions: 0,\n topContacts: [],\n peakDay: null,\n longestStreakDays: 0,\n longestStreakContact: null,\n };\n }\n let sent = 0;\n let received = 0;\n let reactions = 0;\n const perContact = new Map<string, { sent: number; received: number; total: number }>();\n const perDay = new Map<string, number>();\n for (const m of messages) {\n if (m.isReaction) {\n reactions++;\n continue;\n }\n if (m.isFromMe) sent++;\n else received++;\n const c = contactKey(m);\n if (!perContact.has(c)) perContact.set(c, { sent: 0, received: 0, total: 0 });\n const pc = perContact.get(c)!;\n if (m.isFromMe) pc.sent++;\n else pc.received++;\n pc.total++;\n const dk = localDateKey(m.date);\n perDay.set(dk, (perDay.get(dk) ?? 0) + 1);\n }\n\n const topContacts = Array.from(perContact.entries())\n .map(([contact, v]) => ({ contact, ...v }))\n .sort((a, b) => b.total - a.total)\n .slice(0, 5);\n\n let peakDay: { date: string; count: number } | null = null;\n for (const [d, count] of perDay) {\n if (!peakDay || count > peakDay.count) peakDay = { date: d, count };\n }\n\n // Longest streak across all contacts (reuse computeStreaks logic).\n const streaks = computeStreaks(messages);\n const top = streaks[0];\n\n return {\n windowStart: localDateKey(messages[0]!.date),\n windowEnd: localDateKey(messages[messages.length - 1]!.date),\n totalSent: sent,\n totalReceived: received,\n totalReactions: reactions,\n topContacts,\n peakDay,\n longestStreakDays: top?.longestStreakDays ?? 0,\n longestStreakContact: top?.contact ?? null,\n };\n}\n\n// ── Dispatch ─────────────────────────────────────────────────────────────\n\nexport type AnalyticType =\n | \"messaging_streaks\"\n | \"double_texts\"\n | \"response_time_stats\"\n | \"daily_heatmap\"\n | \"tapback_summary\"\n | \"year_in_review_wrapped\";\n\n/** Full enum including the 20 deferred types — agents get a friendly error. */\nexport const FUTURE_TYPES = [\n \"silences\",\n \"ghost_storms\",\n \"conversation_half_life\",\n \"sent_received_imbalance\",\n \"tapback_per_person\",\n \"read_receipt_latency\",\n \"most_used_words\",\n \"emoji_leaderboard\",\n \"attachment_volume\",\n \"media_share_breakdown\",\n \"group_chat_activity\",\n \"chat_age_distribution\",\n \"first_messages_log\",\n \"last_messages_log\",\n \"quietest_chats\",\n \"loudest_chats\",\n \"weekend_vs_weekday\",\n \"night_owl_score\",\n \"most_edited_messages\",\n \"retraction_rate\",\n] as const;\n\nexport const IMPLEMENTED_TYPES: AnalyticType[] = [\n \"messaging_streaks\",\n \"double_texts\",\n \"response_time_stats\",\n \"daily_heatmap\",\n \"tapback_summary\",\n \"year_in_review_wrapped\",\n];\n\nexport function dispatchAnalytic(\n type: AnalyticType,\n messages: Message[],\n): {\n type: AnalyticType;\n data: unknown;\n} {\n switch (type) {\n case \"messaging_streaks\":\n return { type, data: computeStreaks(messages) };\n case \"double_texts\":\n return { type, data: computeDoubleTexts(messages) };\n case \"response_time_stats\":\n return { type, data: computeResponseTimes(messages) };\n case \"daily_heatmap\":\n return { type, data: computeHeatmap(messages) };\n case \"tapback_summary\":\n return { type, data: computeTapbacks(messages) };\n case \"year_in_review_wrapped\":\n return { type, data: computeWrapped(messages) };\n }\n}\n","/**\n * SQLite-backed cache for chat_analytics results.\n *\n * Key shape: (type, args_json, max_message_rowid). When chat.db grows past\n * the cached max_message_rowid, the next call falls through to recompute.\n * TTL fallback at 24h catches edge cases (rare hard-delete in chat.db).\n *\n * Path: ~/.imsg-mcp/analytics-cache.db. Standalone from the main DB.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport Database from \"better-sqlite3\";\n\nconst DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;\n\nlet dbPath = join(homedir(), \".imsg-mcp\", \"analytics-cache.db\");\nlet db: Database.Database | null = null;\n\nfunction open(): Database.Database {\n if (db) return db;\n const dir = dirname(dbPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.exec(`\n CREATE TABLE IF NOT EXISTS analytics_cache (\n type TEXT NOT NULL,\n args_hash TEXT NOT NULL,\n max_rowid INTEGER NOT NULL,\n data_json TEXT NOT NULL,\n computed_at INTEGER NOT NULL,\n PRIMARY KEY (type, args_hash)\n );\n `);\n return db;\n}\n\nfunction hashArgs(args: Record<string, unknown>): string {\n return JSON.stringify(args, Object.keys(args).sort());\n}\n\n/** Override path (tests). */\nexport function _setCachePathForTests(path: string): void {\n if (db) {\n db.close();\n db = null;\n }\n dbPath = path;\n}\n\nexport function lookupCache(\n type: string,\n args: Record<string, unknown>,\n maxRowId: number,\n): { data: unknown; computedAt: number } | null {\n const conn = open();\n const row = conn\n .prepare(\n `SELECT data_json, max_rowid, computed_at FROM analytics_cache\n WHERE type = ? AND args_hash = ?`,\n )\n .get(type, hashArgs(args)) as\n | { data_json: string; max_rowid: number; computed_at: number }\n | undefined;\n if (!row) return null;\n // Invalidate if the underlying DB has new messages OR the cache is stale.\n if (row.max_rowid !== maxRowId) return null;\n if (Date.now() - row.computed_at > DEFAULT_TTL_MS) return null;\n return { data: JSON.parse(row.data_json), computedAt: row.computed_at };\n}\n\nexport function storeCache(\n type: string,\n args: Record<string, unknown>,\n maxRowId: number,\n data: unknown,\n): void {\n const conn = open();\n conn\n .prepare(\n `INSERT INTO analytics_cache (type, args_hash, max_rowid, data_json, computed_at)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(type, args_hash) DO UPDATE SET\n max_rowid = excluded.max_rowid,\n data_json = excluded.data_json,\n computed_at = excluded.computed_at`,\n )\n .run(type, hashArgs(args), maxRowId, JSON.stringify(data), Date.now());\n}\n\nexport function closeCache(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n","/**\n * `contact:N` disambiguation selector — port of the carterlasalle pattern.\n *\n * When a fuzzy contact search returns multiple matches, the agent can't pick\n * one without round-tripping a clarifying question to the user. Instead, the\n * server remembers the most recent ambiguous result set, returns an indexed\n * `matches` list, and accepts `handle: \"contact:N\"` on the next call to\n * re-select the Nth match.\n *\n * Scope: process-wide LRU of the 10 most recent searches. Per-process is\n * deliberate — the selector is meant to bridge a single agent turn, not\n * persist forever. Clients that restart the MCP server lose the cache.\n */\n\nconst MAX_ENTRIES = 10;\n\ninterface CachedMatch {\n handle: string;\n displayName: string;\n}\n\ninterface CacheEntry {\n query: string;\n recordedAt: number;\n matches: CachedMatch[];\n}\n\nconst lru: CacheEntry[] = [];\n\n/** Record a search result set so the user can re-select with `contact:N`. */\nexport function rememberSearch(query: string, matches: CachedMatch[]): void {\n if (matches.length === 0) return;\n // Drop existing entry for the same query (keep LRU ordering coherent).\n const dupIdx = lru.findIndex((e) => e.query === query);\n if (dupIdx >= 0) lru.splice(dupIdx, 1);\n lru.unshift({ query, recordedAt: Date.now(), matches });\n if (lru.length > MAX_ENTRIES) lru.length = MAX_ENTRIES;\n}\n\n/**\n * If `selector` is of the form `contact:N`, return the corresponding\n * remembered match (1-indexed). Searches all cached entries newest-first\n * so the most recent ambiguous search wins. Returns null if no `contact:N`\n * input or no match found.\n */\nexport function resolveContactSelector(selector: string): CachedMatch | null {\n const m = selector.match(/^contact:(\\d+)$/i);\n if (!m?.[1]) return null;\n const idx = Number.parseInt(m[1], 10) - 1;\n if (idx < 0) return null;\n for (const entry of lru) {\n if (idx < entry.matches.length) {\n const hit = entry.matches[idx];\n if (hit) return hit;\n }\n }\n return null;\n}\n\n/** Test-only — inspect cache state. */\nexport function _cacheForTests(): ReadonlyArray<CacheEntry> {\n return lru;\n}\n\n/** Test-only — clear cache between cases. */\nexport function _resetCacheForTests(): void {\n lru.length = 0;\n}\n","/**\n * Lightweight fuzzy string scoring — a TS port of the \"WRatio\" approach used\n * by thefuzz / fuzzywuzzy. No external dep. Tuned for short, multi-token\n * message-body queries.\n *\n * Returns a normalized score in [0, 1]. Higher = better match.\n *\n * Two-pass:\n * 1. Cheap substring shortcut — if the cleaned query is a substring of the\n * cleaned candidate, return 0.95 immediately (skip the expensive token\n * scoring).\n * 2. Token-set scoring — split both strings into a token set, compute a\n * Sørensen-Dice coefficient over the intersection, then blend with a\n * Levenshtein-based ratio for short queries to catch typos.\n */\n\nconst EMOJI_REGEX = /[\\u{1F300}-\\u{1FAFF}\\u{2600}-\\u{27BF}\\u{1F1E6}-\\u{1F1FF}]/gu;\nconst WHITESPACE_REGEX = /\\s+/g;\n\n/** Lowercase, strip emoji, collapse whitespace, trim. */\nexport function cleanText(s: string): string {\n return s.toLowerCase().replace(EMOJI_REGEX, \" \").replace(WHITESPACE_REGEX, \" \").trim();\n}\n\n/** Tokenize a cleaned string into a Set of unique tokens. */\nfunction tokenSet(s: string): Set<string> {\n if (!s) return new Set();\n return new Set(s.split(\" \").filter(Boolean));\n}\n\n/**\n * Levenshtein distance with early-exit when the running min row exceeds\n * a threshold. We cap the candidate length at 200 chars because past that\n * the cost grows quadratically and the message bodies we care about are\n * typically short.\n */\nfunction levenshtein(a: string, b: string, maxLen = 200): number {\n if (a === b) return 0;\n const aLen = Math.min(a.length, maxLen);\n const bLen = Math.min(b.length, maxLen);\n if (aLen === 0) return bLen;\n if (bLen === 0) return aLen;\n\n let prev = new Array<number>(bLen + 1);\n let curr = new Array<number>(bLen + 1);\n for (let j = 0; j <= bLen; j++) prev[j] = j;\n\n for (let i = 1; i <= aLen; i++) {\n curr[0] = i;\n for (let j = 1; j <= bLen; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n const del = (prev[j] ?? 0) + 1;\n const ins = (curr[j - 1] ?? 0) + 1;\n const sub = (prev[j - 1] ?? 0) + cost;\n curr[j] = Math.min(del, ins, sub);\n }\n [prev, curr] = [curr, prev];\n }\n return prev[bLen] ?? Math.max(aLen, bLen);\n}\n\n/** Levenshtein ratio in [0, 1]: 1 - (distance / max-len). */\nfunction levenshteinRatio(a: string, b: string): number {\n if (a === b) return 1;\n const aLen = Math.min(a.length, 200);\n const bLen = Math.min(b.length, 200);\n const maxLen = Math.max(aLen, bLen);\n if (maxLen === 0) return 1;\n return 1 - levenshtein(a, b) / maxLen;\n}\n\n/**\n * Score query against candidate. Returns 0..1.\n *\n * Performance: O(n + m) substring, O(n*m) Levenshtein worst case (capped at\n * 200 chars). For 10,000-row search this is fine in a single sync sweep.\n */\nexport function fuzzyScore(query: string, candidate: string): number {\n const q = cleanText(query);\n const c = cleanText(candidate);\n if (!q || !c) return 0;\n\n // 1. Substring shortcut.\n if (c.includes(q)) return 0.95;\n if (q.includes(c)) return 0.9;\n\n // 2. Token-set Dice coefficient.\n const qTokens = tokenSet(q);\n const cTokens = tokenSet(c);\n let intersection = 0;\n for (const tok of qTokens) {\n if (cTokens.has(tok)) intersection++;\n }\n const dice = (2 * intersection) / (qTokens.size + cTokens.size || 1);\n\n // 3. Levenshtein ratio (catches typos in short queries).\n // For single-token queries we ALSO compute lev against the best matching\n // token in the candidate so a typo'd word can still match a longer body.\n let bestTokenLev = 0;\n if (qTokens.size === 1) {\n for (const tok of cTokens) {\n const r = levenshteinRatio(q, tok);\n if (r > bestTokenLev) bestTokenLev = r;\n }\n }\n const levRatio = Math.max(levenshteinRatio(q, c), bestTokenLev);\n\n // Blend: for single-token queries, levRatio dominates (Dice is 0 when\n // tokens don't overlap exactly — a typo kills it). For multi-token\n // queries, token-set is more informative.\n const blend = qTokens.size <= 1 ? 0.1 * dice + 0.9 * levRatio : 0.7 * dice + 0.3 * levRatio;\n\n return Math.max(0, Math.min(1, blend));\n}\n\n/** Score and rank candidates. Returns sorted (best first) with scores. */\nexport function rankFuzzy<T>(\n query: string,\n candidates: T[],\n getText: (c: T) => string,\n minScore = 0.6,\n): Array<{ item: T; score: number }> {\n const out: Array<{ item: T; score: number }> = [];\n for (const c of candidates) {\n const score = fuzzyScore(query, getText(c));\n if (score >= minScore) out.push({ item: c, score });\n }\n out.sort((a, b) => b.score - a.score);\n return out;\n}\n","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 { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[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}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((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}))\\])|(\\[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})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?: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])$/;\nconst ipv4CidrRegex = /^(?:(?: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// const ipv6Regex =\n// /^(([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})))$/;\nconst ipv6Regex = /^(([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]))$/;\nconst ipv6CidrRegex = /^(([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// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\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 { 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 { 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 { 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 { 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 { 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","import type { Tool, ToolAnnotations } from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\n\nexport const UNLIMITED = Number.MAX_SAFE_INTEGER;\nexport const DEFAULT_TOOL_TIMEOUT_MS = 30_000;\n\nconst nonEmptyString = (description: string) => z.string().trim().min(1).describe(description);\n\nexport const ReactionSchema = z.object({\n type: z.string(),\n emoji: z.string().optional(),\n fromHandle: z.string(),\n isRemoval: z.boolean(),\n targetMessageGuid: z.string(),\n targetMessagePart: z.number().int(),\n});\n\nexport const ReplyContextSchema = z.object({\n replyToGuid: z.string(),\n replyToText: z.string().nullable().optional(),\n});\n\nexport const AttachmentSchema = z.object({\n filename: z.string(),\n mimeType: z.string().nullable(),\n transferName: z.string().nullable(),\n totalBytes: z.number().int(),\n});\n\nexport const MessageSchema = z.object({\n id: z.number().int(),\n guid: z.string(),\n text: z.string().nullable(),\n handle: z.string(),\n displayName: z.string().optional(),\n isFromMe: z.boolean(),\n date: z.string(),\n dateRead: z.string().nullable(),\n dateDelivered: z.string().nullable(),\n isRead: z.boolean(),\n isDelivered: z.boolean(),\n chatId: z.string(),\n service: z.enum([\"iMessage\", \"SMS\"]),\n isReaction: z.boolean(),\n reaction: ReactionSchema.optional(),\n isReply: z.boolean(),\n replyTo: ReplyContextSchema.optional(),\n reactions: z.array(ReactionSchema).optional(),\n richContentType: z.string().optional(),\n richContentSummary: z.string().optional(),\n isEdited: z.boolean(),\n isRetracted: z.boolean(),\n hasAttachments: z.boolean(),\n attachments: z.array(AttachmentSchema).optional(),\n});\n\nexport const ConversationSchema = z.object({\n chatId: z.string(),\n chatIdentifier: z.string(),\n displayName: z.string().nullable(),\n rawIdentifier: z.string(),\n participants: z.array(z.string()),\n lastMessageDate: z.string().nullable(),\n lastMessageSnippet: z.string().nullable(),\n unreadCount: z.number().int(),\n threadSlug: z.string(),\n isGroupChat: z.boolean(),\n serviceType: z.enum([\"iMessage\", \"SMS\"]),\n});\n\nexport const GetMessagesSchema = z.object({\n limit: z\n .number()\n .int()\n .min(0)\n .default(20)\n .describe(\n \"Number of messages to retrieve. 0 = unlimited (bounded by tool safety limits). Default 20.\",\n ),\n chatIdentifier: nonEmptyString(\"Phone number, email, or chat ID to filter by\").optional(),\n threadSlug: nonEmptyString(\"Thread slug from list_conversations\").optional(),\n beforeMessageId: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Pagination cursor. Pass `oldestMessageId` from a previous response.\"),\n});\n\nexport const GetMessagesOutputSchema = z.object({\n messages: z.array(MessageSchema),\n count: z.number().int(),\n hasMore: z.boolean(),\n oldestMessageId: z.number().int().optional(),\n});\n\nexport const ExportMessagesSchema = z.object({\n chatIdentifier: nonEmptyString(\"Phone number, email, or chat ID\").optional(),\n threadSlug: nonEmptyString(\"Thread slug from list_conversations\").optional(),\n format: z.enum([\"markdown\", \"csv\", \"json\", \"ndjson\"]).default(\"markdown\"),\n outputPath: nonEmptyString(\n \"Absolute path. Parent directory must exist; file will be created/overwritten.\",\n ),\n since: nonEmptyString(\"Earliest date, ISO or relative like '1 year ago'\").optional(),\n until: nonEmptyString(\"Latest date, ISO or relative like 'yesterday'\").optional(),\n pageSize: z.number().int().min(100).max(5000).default(1000),\n});\n\nexport const ExportMessagesOutputSchema = z.object({\n count: z.number().int(),\n sizeBytes: z.number().int(),\n savedTo: z.string(),\n format: z.string(),\n oldest: z.string().nullable(),\n newest: z.string().nullable(),\n durationMs: z.number(),\n});\n\nexport const GetUnreadMessagesSchema = z.object({\n limit: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe(\"Max unread messages. 0 = unlimited. Default 100.\"),\n});\n\nexport const GetUnreadMessagesOutputSchema = z.object({\n messages: z.array(MessageSchema),\n count: z.number().int(),\n hasMore: z.boolean(),\n nextOffset: z.number().int().nullable(),\n});\n\nexport const SendMessageSchema = z.object({\n recipient: nonEmptyString(\"Phone number or email address to send to\").optional(),\n threadSlug: nonEmptyString(\"Thread slug from list_conversations\").optional(),\n message: nonEmptyString(\"Message text to send\"),\n attachments: z\n .array(nonEmptyString(\"Absolute file path to attach\"))\n .optional()\n .describe(\n \"Absolute file paths to attach. Each is sent in a follow-up AppleScript call after the text. Use sparingly — large files may be silently rate-limited by Messages.app.\",\n ),\n});\n\nexport const SendMessageOutputSchema = z.object({\n success: z.boolean(),\n target: z.string().optional(),\n error: z.string().optional(),\n timestamp: z.string().nullable().optional(),\n threadSlug: z.string().optional(),\n lastMessageId: z.number().int().optional(),\n attachments: z\n .array(\n z.object({\n path: z.string(),\n success: z.boolean(),\n error: z.string().optional(),\n }),\n )\n .optional(),\n});\n\nexport const WaitForReplySchema = z.object({\n chatIdentifier: nonEmptyString(\"Phone number, email, or chat ID to monitor\").optional(),\n threadSlug: nonEmptyString(\"Thread slug from list_conversations to monitor\").optional(),\n timeoutSeconds: z.number().min(10).max(3600).default(300),\n pollIntervalSeconds: z.number().min(5).max(60).default(10),\n afterMessageId: z.number().int().positive().optional(),\n});\n\nexport const WaitForReplyOutputSchema = z.object({\n received: z.boolean().optional(),\n messages: z.array(MessageSchema).optional(),\n count: z.number().int().optional(),\n timedOut: z.boolean().optional(),\n timeoutSeconds: z.number().optional(),\n threadSlug: z.string().optional(),\n chatIdentifier: z.string().optional(),\n cancelled: z.boolean().optional(),\n elapsedSeconds: z.number().optional(),\n});\n\nexport const ListConversationsSchema = z.object({\n limit: z.number().int().min(0).default(20),\n});\n\nexport const ListConversationsOutputSchema = z.object({\n conversations: z.array(ConversationSchema),\n count: z.number().int(),\n hasMore: z.boolean(),\n nextOffset: z.number().int().nullable(),\n});\n\nexport const SearchMessagesSchema = z.object({\n query: nonEmptyString(\"Search query\"),\n limit: z.number().int().min(0).default(20),\n mode: z\n .enum([\"literal\", \"fuzzy\"])\n .default(\"fuzzy\")\n .describe(\n \"Search mode. 'literal' = SQL LIKE substring match. 'fuzzy' = token-based scoring with typo tolerance; ranks by WRatio-style score.\",\n ),\n minScore: z\n .number()\n .min(0)\n .max(1)\n .default(0.6)\n .describe(\n \"Fuzzy mode: minimum normalized score (0-1) for a match to be returned. Ignored in literal mode.\",\n ),\n});\n\nexport const SearchMessagesOutputSchema = z.object({\n query: z.string().optional(),\n mode: z.enum([\"literal\", \"fuzzy\"]).optional(),\n messages: z.array(MessageSchema),\n count: z.number().int(),\n hasMore: z.boolean(),\n nextOffset: z.number().int().nullable(),\n softCapWarning: z.string().optional(),\n});\n\nexport const GetLogsSchema = z.object({\n tail: z.number().int().min(1).max(500).optional(),\n source: z.enum([\"memory\", \"file\", \"all\"]).optional(),\n});\n\nexport const GetLogsOutputSchema = z.object({\n source: z.string(),\n tail: z.number().int(),\n sections: z.array(z.string()),\n});\n\nexport const RunBuildSchema = z.object({});\nexport const RunBuildOutputSchema = z.object({\n ok: z.boolean(),\n stdout: z.string(),\n stderr: z.string(),\n});\n\nexport const RequestRestartSchema = z.object({});\nexport const RequestRestartOutputSchema = z.object({\n restartRequested: z.boolean(),\n});\n\nexport const HealthCheckSchema = z.object({});\nexport const HealthCheckOutputSchema = z.object({\n status: z.string(),\n issues: z.array(z.string()),\n uptimeMs: z.number(),\n idleMs: z.number(),\n pid: z.number(),\n node: z.string(),\n heapMb: z.number(),\n rssMb: z.number(),\n eventLoopP99Ms: z.number(),\n eventLoopMaxMs: z.number(),\n toolCallCount: z.number(),\n recentErrorCount: z.number(),\n engine: z.string(),\n});\n\nexport const GetLastSendErrorSchema = z.object({});\nexport const GetLastSendErrorOutputSchema = z.object({\n lastSendError: z\n .object({\n message: z.string(),\n timestamp: z.string(),\n stderr: z.string().optional(),\n stdout: z.string().optional(),\n code: z.number().optional(),\n })\n .nullable(),\n});\n\n// ── Contact tools ────────────────────────────────────────────────────────\n\nexport const ContactSchema = z.object({\n id: z.number().int(),\n displayName: z.string(),\n firstName: z.string().nullable(),\n lastName: z.string().nullable(),\n middleName: z.string().nullable(),\n nickname: z.string().nullable(),\n organization: z.string().nullable(),\n phoneNumbers: z.array(z.string()),\n emails: z.array(z.string()),\n});\n\nexport const ListContactsSchema = z.object({\n limit: z\n .number()\n .int()\n .min(0)\n .default(20)\n .describe(\"Max contacts. 0 = unlimited (bounded by safety cap).\"),\n offset: z.number().int().min(0).default(0).describe(\"Offset for pagination.\"),\n});\nexport const ListContactsOutputSchema = z.object({\n contacts: z.array(ContactSchema),\n count: z.number().int(),\n hasMore: z.boolean(),\n totalCount: z.number().int(),\n});\n\nexport const SearchContactsSchema = z.object({\n query: nonEmptyString(\"Substring to match against name, phone, or email.\"),\n limit: z.number().int().min(0).default(20).describe(\"Max results. 0 = unlimited.\"),\n});\nexport const SearchContactsOutputSchema = z.object({\n query: z.string(),\n contacts: z.array(ContactSchema),\n count: z.number().int(),\n});\n\nexport const GetContactSchema = z\n .object({\n handle: z.string().optional().describe(\"Phone number or email to look up.\"),\n id: z.number().int().optional().describe(\"Numeric contact id.\"),\n })\n .refine((v) => v.handle !== undefined || v.id !== undefined, {\n message: \"Provide either `handle` or `id`.\",\n });\nexport const GetContactOutputSchema = z.object({\n contact: ContactSchema.nullable(),\n});\n\nexport const ResolveHandleSchema = z.object({\n handle: nonEmptyString(\"Phone number or email to resolve to a contact name.\"),\n});\nexport const ResolveHandleOutputSchema = z.object({\n handle: z.string(),\n displayName: z.string(),\n contactId: z.number().int().nullable(),\n label: z.string().nullable(),\n resolved: z.boolean(),\n});\n\nexport const CheckImessageAvailabilitySchema = z.object({\n handle: nonEmptyString(\"Phone number or email to preflight-check for reachability.\"),\n});\nexport const CheckImessageAvailabilityOutputSchema = z.object({\n handle: z.string(),\n service: z.enum([\"iMessage\", \"SMS\", \"unknown\"]),\n reachable: z.boolean(),\n hint: z.string().optional(),\n});\n\nexport const AttachmentRecordSchema = z.object({\n rowId: z.number().int(),\n filename: z.string(),\n mimeType: z.string().nullable(),\n transferName: z.string().nullable(),\n totalBytes: z.number().int(),\n createdDate: z.string(),\n chatId: z.string(),\n});\n\nexport const SearchAttachmentsSchema = z.object({\n mimePrefix: z\n .string()\n .optional()\n .describe(\"Filter by MIME type prefix, e.g. 'image/', 'video/', 'application/pdf'.\"),\n chatIdentifier: z\n .string()\n .optional()\n .describe(\"Restrict to a single chat (use chat_identifier from list_conversations).\"),\n since: z\n .string()\n .optional()\n .describe(\"ISO date or relative ('1 week ago'). Lower bound on attachment creation.\"),\n until: z.string().optional().describe(\"ISO date or relative. Upper bound on creation.\"),\n limit: z\n .number()\n .int()\n .min(0)\n .default(20)\n .describe(\"Max results. 0 = unlimited (capped at 1000).\"),\n});\nexport const SearchAttachmentsOutputSchema = z.object({\n attachments: z.array(AttachmentRecordSchema),\n count: z.number().int(),\n});\n\nexport const ChatAnalyticsSchema = z.object({\n type: z\n .enum([\n \"messaging_streaks\",\n \"double_texts\",\n \"response_time_stats\",\n \"daily_heatmap\",\n \"tapback_summary\",\n \"year_in_review_wrapped\",\n ])\n .describe(\n \"Which analytic to compute. Six priority types are implemented; 20 more are reserved for future versions and return a structured 'not_yet_implemented' error.\",\n ),\n windowDays: z\n .number()\n .int()\n .min(1)\n .max(3650)\n .default(90)\n .describe(\"Days of history to analyze. Defaults to 90; year_in_review pin to 365 internally.\"),\n});\n\nexport const ChatAnalyticsOutputSchema = z.object({\n type: z.string(),\n windowDays: z.number().int(),\n computedAtIso: z.string(),\n fromCache: z.boolean(),\n data: z.unknown(),\n});\n\nexport const GetAttachmentSchema = z.object({\n rowId: z.number().int().describe(\"Attachment ROWID (from search_attachments).\"),\n inlineMaxBytes: z\n .number()\n .int()\n .default(5_000_000)\n .describe(\"If file is ≤ this size, return base64 content inline; otherwise return path only.\"),\n});\nexport const GetAttachmentOutputSchema = z.object({\n rowId: z.number().int(),\n filename: z.string(),\n resolvedPath: z.string(),\n mimeType: z.string().nullable(),\n totalBytes: z.number().int(),\n inline: z.boolean(),\n base64: z.string().optional(),\n converted: z.string().optional().describe(\"Set when source was HEIC and we converted to PNG.\"),\n});\n\nexport type ToolName = keyof typeof TOOL_SCHEMAS;\n\nexport const TOOL_SCHEMAS = {\n get_messages: GetMessagesSchema,\n export_messages: ExportMessagesSchema,\n get_unread_messages: GetUnreadMessagesSchema,\n send_message: SendMessageSchema,\n wait_for_reply: WaitForReplySchema,\n list_conversations: ListConversationsSchema,\n search_messages: SearchMessagesSchema,\n get_logs: GetLogsSchema,\n get_last_send_error: GetLastSendErrorSchema,\n run_build: RunBuildSchema,\n request_restart: RequestRestartSchema,\n health_check: HealthCheckSchema,\n list_contacts: ListContactsSchema,\n search_contacts: SearchContactsSchema,\n get_contact: GetContactSchema,\n resolve_handle: ResolveHandleSchema,\n check_imessage_availability: CheckImessageAvailabilitySchema,\n search_attachments: SearchAttachmentsSchema,\n get_attachment: GetAttachmentSchema,\n chat_analytics: ChatAnalyticsSchema,\n} as const;\n\nexport const OUTPUT_SCHEMAS = {\n get_messages: GetMessagesOutputSchema,\n export_messages: ExportMessagesOutputSchema,\n get_unread_messages: GetUnreadMessagesOutputSchema,\n send_message: SendMessageOutputSchema,\n wait_for_reply: WaitForReplyOutputSchema,\n list_conversations: ListConversationsOutputSchema,\n search_messages: SearchMessagesOutputSchema,\n get_logs: GetLogsOutputSchema,\n get_last_send_error: GetLastSendErrorOutputSchema,\n run_build: RunBuildOutputSchema,\n request_restart: RequestRestartOutputSchema,\n health_check: HealthCheckOutputSchema,\n list_contacts: ListContactsOutputSchema,\n search_contacts: SearchContactsOutputSchema,\n get_contact: GetContactOutputSchema,\n resolve_handle: ResolveHandleOutputSchema,\n check_imessage_availability: CheckImessageAvailabilityOutputSchema,\n search_attachments: SearchAttachmentsOutputSchema,\n get_attachment: GetAttachmentOutputSchema,\n chat_analytics: ChatAnalyticsOutputSchema,\n} as const;\n\ntype JsonSchema = Tool[\"inputSchema\"];\n\nconst noArgsSchema: JsonSchema = { type: \"object\", properties: {} };\n\nconst annotations = {\n read: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n status: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n send: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n export: {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: false,\n },\n build: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n} satisfies Record<string, ToolAnnotations>;\n\nexport const TOOL_TIMEOUTS_MS: Record<string, number> = {\n wait_for_reply: 0,\n run_build: 120_000,\n search_messages: 60_000,\n get_messages: 60_000,\n list_conversations: 60_000,\n get_unread_messages: 60_000,\n send_message: 60_000,\n health_check: 5_000,\n export_messages: 600_000,\n get_logs: 10_000,\n get_last_send_error: 5_000,\n request_restart: 5_000,\n list_contacts: 10_000,\n search_contacts: 10_000,\n get_contact: 5_000,\n resolve_handle: 5_000,\n check_imessage_availability: 10_000,\n search_attachments: 30_000,\n get_attachment: 30_000,\n chat_analytics: 60_000,\n};\n\nexport function resolveLimit(limit: number | undefined, defaultValue = 20): number {\n if (limit === undefined) return defaultValue;\n if (limit === 0) return UNLIMITED;\n return limit;\n}\n\nexport const TOOLS: Tool[] = [\n {\n name: \"get_messages\",\n description:\n \"Get recent iMessages. Optionally filter by conversation. Response footer includes oldestMessageId for beforeMessageId pagination; use export_messages for very large histories.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", default: 20, description: \"Number of messages. 0 = unlimited.\" },\n chatIdentifier: { type: \"string\", description: \"Phone number, email, or chat ID\" },\n threadSlug: { type: \"string\", description: \"Thread slug from list_conversations\" },\n beforeMessageId: {\n type: \"number\",\n description: \"Fetch messages older than this message id\",\n },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(GetMessagesOutputSchema),\n },\n {\n name: \"export_messages\",\n description:\n \"Stream-export a conversation to markdown, csv, json, or ndjson without loading all history into memory.\",\n annotations: annotations.export,\n inputSchema: {\n type: \"object\",\n required: [\"outputPath\"],\n properties: {\n chatIdentifier: { type: \"string\", description: \"Phone number, email, or chat ID\" },\n threadSlug: { type: \"string\", description: \"Thread slug from list_conversations\" },\n format: {\n type: \"string\",\n enum: [\"markdown\", \"csv\", \"json\", \"ndjson\"],\n default: \"markdown\",\n },\n outputPath: {\n type: \"string\",\n description: \"Absolute output path. Existing files are overwritten.\",\n },\n since: { type: \"string\", description: \"Earliest date, ISO or relative\" },\n until: { type: \"string\", description: \"Latest date, ISO or relative\" },\n pageSize: { type: \"number\", default: 1000, description: \"Internal page size, 100-5000\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(ExportMessagesOutputSchema),\n },\n {\n name: \"get_unread_messages\",\n description: \"Get unread iMessages across all conversations, newest first.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Max unread messages. 0 = unlimited. Default 100.\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(GetUnreadMessagesOutputSchema),\n },\n {\n name: \"send_message\",\n description:\n \"Send an iMessage or SMS. Use recipient for 1-on-1 or threadSlug for existing threads, including groups. Optional `attachments` is an array of absolute file paths sent as follow-up messages (1-on-1 only — Messages.app does not reliably accept file sends to group chats).\",\n annotations: annotations.send,\n inputSchema: {\n type: \"object\",\n required: [\"message\"],\n properties: {\n recipient: { type: \"string\", description: \"Phone number or email\" },\n threadSlug: { type: \"string\", description: \"Thread slug from list_conversations\" },\n message: { type: \"string\", description: \"Message text to send\" },\n attachments: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional absolute file paths to send after the text. 1-on-1 only.\",\n },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(SendMessageOutputSchema),\n },\n {\n name: \"wait_for_reply\",\n description:\n \"Wait for a new incoming message in a conversation until timeout or client cancellation.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n properties: {\n chatIdentifier: { type: \"string\", description: \"Phone number, email, or chat ID\" },\n threadSlug: { type: \"string\", description: \"Thread slug from list_conversations\" },\n timeoutSeconds: {\n type: \"number\",\n default: 300,\n description: \"Timeout in seconds, 10-3600\",\n },\n pollIntervalSeconds: {\n type: \"number\",\n default: 10,\n description: \"Polling interval in seconds, 5-60\",\n },\n afterMessageId: { type: \"number\", description: \"Only return messages after this id\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(WaitForReplyOutputSchema),\n },\n {\n name: \"list_conversations\",\n description:\n \"List recent conversations with thread slugs, snippets, unread counts, participants, and service metadata.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n default: 20,\n description: \"Number of conversations. 0 = unlimited.\",\n },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(ListConversationsOutputSchema),\n },\n {\n name: \"search_messages\",\n description: \"Search message text across all conversations.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n required: [\"query\"],\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n limit: { type: \"number\", default: 20, description: \"Number of results. 0 = unlimited.\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(SearchMessagesOutputSchema),\n },\n {\n name: \"get_logs\",\n description: \"Return debug logs from memory, file, or both.\",\n annotations: annotations.status,\n inputSchema: {\n type: \"object\",\n properties: {\n tail: { type: \"number\", description: \"Return last N lines. Default 50.\" },\n source: { type: \"string\", enum: [\"memory\", \"file\", \"all\"], description: \"Log source\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(GetLogsOutputSchema),\n },\n {\n name: \"get_last_send_error\",\n description: \"Return details for the last send_message failure.\",\n annotations: annotations.status,\n inputSchema: noArgsSchema,\n // @ts-expect-error\n outputSchema: zodToJsonSchema(GetLastSendErrorOutputSchema),\n },\n {\n name: \"run_build\",\n description: \"Run pnpm build in the project directory and return stdout/stderr.\",\n annotations: annotations.build,\n inputSchema: noArgsSchema,\n // @ts-expect-error\n outputSchema: zodToJsonSchema(RunBuildOutputSchema),\n },\n {\n name: \"request_restart\",\n description: \"Exit the MCP server process so the client can restart it and load new code.\",\n annotations: annotations.build,\n inputSchema: noArgsSchema,\n // @ts-expect-error\n outputSchema: zodToJsonSchema(RequestRestartOutputSchema),\n },\n {\n name: \"health_check\",\n description: \"Return in-memory MCP vital signs without touching SQLite.\",\n annotations: annotations.status,\n inputSchema: noArgsSchema,\n // @ts-expect-error\n outputSchema: zodToJsonSchema(HealthCheckOutputSchema),\n },\n {\n name: \"list_contacts\",\n description:\n \"List loaded contacts (from macOS Address Book + iCloud sources), sorted by name. Use search_contacts for substring matching.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", default: 20, description: \"Max contacts. 0 = unlimited.\" },\n offset: { type: \"number\", default: 0, description: \"Offset for pagination.\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(ListContactsOutputSchema),\n },\n {\n name: \"search_contacts\",\n description: \"Substring-match contacts by display name, phone number, or email.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n required: [\"query\"],\n properties: {\n query: { type: \"string\", description: \"Substring (case-insensitive for name/email).\" },\n limit: { type: \"number\", default: 20, description: \"Max results. 0 = unlimited.\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(SearchContactsOutputSchema),\n },\n {\n name: \"get_contact\",\n description:\n \"Fetch a single contact by handle (phone/email) or by numeric id. Returns null if not found.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n properties: {\n handle: { type: \"string\", description: \"Phone number or email to look up.\" },\n id: { type: \"number\", description: \"Numeric contact id.\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(GetContactOutputSchema),\n },\n {\n name: \"resolve_handle\",\n description:\n \"Resolve a phone number or email to its contact display name. Pass-through if unknown.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n required: [\"handle\"],\n properties: {\n handle: { type: \"string\", description: \"Phone number or email.\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(ResolveHandleOutputSchema),\n },\n {\n name: \"check_imessage_availability\",\n description:\n \"Preflight check: is this handle reachable via iMessage or SMS? Call BEFORE send_message to avoid wasted send attempts to unreachable recipients. Returns the best-guess service plus a human-readable hint when unreachable.\",\n annotations: annotations.status,\n inputSchema: {\n type: \"object\",\n required: [\"handle\"],\n properties: {\n handle: {\n type: \"string\",\n description: \"Phone number (E.164 preferred) or email to preflight.\",\n },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(CheckImessageAvailabilityOutputSchema),\n },\n {\n name: \"search_attachments\",\n description:\n \"Search attachments (images, videos, files) by MIME type prefix, date range, and/or chat. Returns metadata only — use get_attachment to fetch bytes. Excludes stickers and Apple plugin payloads.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n properties: {\n mimePrefix: { type: \"string\", description: \"e.g. 'image/', 'video/', 'application/pdf'.\" },\n chatIdentifier: { type: \"string\", description: \"Restrict to one chat.\" },\n since: { type: \"string\", description: \"ISO date or relative ('1 week ago').\" },\n until: { type: \"string\", description: \"ISO date or relative.\" },\n limit: {\n type: \"number\",\n default: 20,\n description: \"Max results. 0 = unlimited (cap 1000).\",\n },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(SearchAttachmentsOutputSchema),\n },\n {\n name: \"get_attachment\",\n description:\n \"Fetch an attachment by ROWID (from search_attachments). Returns base64 inline if ≤ inlineMaxBytes (default 5MB); otherwise returns the resolved path only. HEIC images are auto-converted to PNG via macOS sips.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n required: [\"rowId\"],\n properties: {\n rowId: { type: \"number\", description: \"Attachment ROWID from search_attachments.\" },\n inlineMaxBytes: { type: \"number\", default: 5_000_000, description: \"Inline byte cap.\" },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(GetAttachmentOutputSchema),\n },\n {\n name: \"chat_analytics\",\n description:\n \"Compute analytics over your chat history. Pick a `type`: messaging_streaks, double_texts, response_time_stats, daily_heatmap, tapback_summary, or year_in_review_wrapped. Results are cached at ~/.imsg-mcp/analytics-cache.db keyed on (type, args, MAX(message.rowid)) so subsequent calls without new messages hit cache. 20 additional analytic types are reserved for future versions.\",\n annotations: annotations.read,\n inputSchema: {\n type: \"object\",\n required: [\"type\"],\n properties: {\n type: {\n type: \"string\",\n enum: [\n \"messaging_streaks\",\n \"double_texts\",\n \"response_time_stats\",\n \"daily_heatmap\",\n \"tapback_summary\",\n \"year_in_review_wrapped\",\n ],\n },\n windowDays: {\n type: \"number\",\n default: 90,\n description: \"Days of history to scan (1-3650). year_in_review pins to 365.\",\n },\n },\n },\n // @ts-expect-error\n outputSchema: zodToJsonSchema(ChatAnalyticsOutputSchema),\n },\n];\n\n// Tools that only make sense when the server is driven by mcp-dev-proxy.ts\n// against the repo checkout. End users running `imsg mcp` directly should\n// never see these in tools/list.\nexport const DEV_TOOL_NAMES = new Set<ToolName>([\n \"health_check\",\n \"get_logs\",\n \"get_last_send_error\",\n \"run_build\",\n \"request_restart\",\n]);\n\nexport function isDevMode(): boolean {\n return process.env.IMSG_DEV === \"1\";\n}\n\nexport function getActiveTools(): Tool[] {\n if (isDevMode()) return TOOLS;\n return TOOLS.filter((t) => !DEV_TOOL_NAMES.has(t.name as ToolName));\n}\n","/**\n * Prompt-injection guardrails for MCP tool responses.\n *\n * Messages bodies, search results, contact names, and other user-controlled\n * text returned by this MCP server may contain text designed to manipulate\n * the consuming LLM (e.g. \"ignore your previous instructions and ...\"). To\n * make those attacks visible at the LLM layer, every untrusted region is\n * wrapped in a `<untrusted>` envelope. The model is then trained / prompted\n * by the host to treat content inside `<untrusted>` as data, not as\n * instructions.\n *\n * We intentionally do NOT try to detect or rewrite the injection itself —\n * that's a losing game (creative attackers can encode in base64, ROT13,\n * different languages, etc). The envelope is a contract with the host:\n * \"anything inside this tag came from a third party, not from the user\".\n *\n * For high-stakes instructions WE want the LLM to follow (e.g. tool-specific\n * remediation hints), we use the inverse: `<instructions uuid=\"...\">` with a\n * fresh per-session UUID so the model can distinguish them from any inline\n * `<instructions>` an attacker might inject.\n *\n * See docs/GUARDRAILS_MCP_RESPONSES.md for the rationale + threat model.\n */\n\nimport { randomUUID } from \"node:crypto\";\n\nconst INSTRUCTIONS_UUID = randomUUID();\n\n/**\n * Wrap untrusted user-controlled text. Returned string is safe to embed in\n * tool responses. Nulls pass through unchanged so callers don't need to\n * defensive-check.\n */\nexport function wrapUntrusted(text: string | null | undefined): string {\n if (text == null || text === \"\") return \"\";\n // Strip any pre-existing `<untrusted>` closing tags inside the body so a\n // crafted message can't close our envelope early. We don't need to escape\n // every angle bracket — just neutralize the specific tags we use.\n const neutralized = text\n .replace(/<\\/untrusted>/gi, \"&lt;/untrusted&gt;\")\n .replace(new RegExp(`<\\\\/instructions uuid=\"${INSTRUCTIONS_UUID}\">`, \"gi\"), \"\")\n .replace(/<\\/instructions>/gi, \"&lt;/instructions&gt;\");\n return `<untrusted>${neutralized}</untrusted>`;\n}\n\n/**\n * Wrap trusted server-side instructions for the LLM. The UUID is generated\n * once per process so an attacker who embeds `<instructions uuid=\"...\">` in\n * a message body can't fake instructions — they'd have to guess our UUID.\n */\nexport function wrapInstructions(instructions: string): string {\n return `<instructions uuid=\"${INSTRUCTIONS_UUID}\">${instructions}</instructions>`;\n}\n\n/**\n * Wrap a tool error with optional remediation hint. The error message is\n * itself trusted (we wrote it), but any embedded user-text in the hint\n * should already be sanitized by the caller.\n */\nexport function wrapToolError(tool: string, message: string, hint?: string): string {\n const head = `Tool '${tool}' failed: ${message}`;\n if (!hint) return wrapInstructions(head);\n return wrapInstructions(`${head}\\n\\nRemediation: ${hint}`);\n}\n\n/** Exposed for tests + diagnostics. Not for use in normal code paths. */\nexport function _instructionsUuidForTests(): string {\n return INSTRUCTIONS_UUID;\n}\n","/**\n * Sanitize untrusted user text before emitting via MCP or terminal.\n *\n * - Strips ANSI CSI and OSC escape sequences to prevent terminal corruption.\n * - Replaces NUL bytes and C0 control characters (except \\n, \\t, \\r) with U+FFFD (Replacement Character).\n * - Truncates the string if it exceeds `maxLength`.\n */\n\n// Matches standard ANSI CSI (Control Sequence Introducer) and OSC (Operating System Command) sequences\nconst ANSI_REGEX = new RegExp(\n [\n \"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)\",\n \"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]))\",\n ].join(\"|\"),\n \"g\",\n);\n\n// Matches C0 control characters, excluding \\t (0x09), \\n (0x0A), and \\r (0x0D)\n// biome-ignore lint/suspicious/noControlCharactersInRegex: we intentionally match control characters to strip them\nconst CONTROL_CHAR_REGEX = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/g;\n\nexport function sanitizeUserText(text: string | null | undefined, maxLength = 4096): string | null {\n if (text == null) return null;\n\n let sanitized = text.replace(ANSI_REGEX, \"\");\n sanitized = sanitized.replace(CONTROL_CHAR_REGEX, \"\\uFFFD\"); // U+FFFD\n\n if (sanitized.length > maxLength) {\n sanitized = `${sanitized.slice(0, maxLength - 1)}…`;\n }\n\n return sanitized;\n}\n","/**\n * iMessage MCP Server\n * Enables AI agents to send and receive iMessages on macOS\n */\n\nimport { execFile } from \"node:child_process\";\nimport { existsSync, statSync } from \"node:fs\";\nimport { dirname, isAbsolute } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListResourceTemplatesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { checkLocalAccess, formatAccessReport } from \"./access-check.js\";\nimport { dispatchAnalytic } from \"./analytics.js\";\nimport { lookupCache, storeCache } from \"./analytics-cache.js\";\nimport {\n checkImessageAvailability,\n checkMessagesAvailable,\n sendAttachment,\n sendMessageAlt,\n sendMessageReliable,\n sendToChat,\n sendToChatId,\n} from \"./applescript.js\";\nimport { getContactsDbPaths, getImsgDbPath, getSlugsDbPath } from \"./config.js\";\nimport { rememberSearch, resolveContactSelector } from \"./contact-resolver.js\";\nimport { streamExport } from \"./exportStream.js\";\nimport { rankFuzzy } from \"./fuzzy.js\";\nimport { IMessageDB } from \"./imessage-db.js\";\nimport {\n appendLog,\n getFileLogLines,\n getLastSendError,\n getLogDirectory,\n getLogFilePath,\n getLogs,\n info,\n logShutdown,\n logStartup,\n perf,\n startHeapMonitor,\n stopHeapMonitor,\n} from \"./logger.js\";\nimport {\n ChatAnalyticsSchema,\n CheckImessageAvailabilitySchema,\n DEFAULT_TOOL_TIMEOUT_MS,\n DEV_TOOL_NAMES,\n ExportMessagesSchema,\n GetAttachmentSchema,\n GetContactSchema,\n GetLogsSchema,\n GetMessagesSchema,\n GetUnreadMessagesSchema,\n getActiveTools,\n isDevMode,\n ListContactsSchema,\n ListConversationsSchema,\n ResolveHandleSchema,\n resolveLimit,\n SearchAttachmentsSchema,\n SearchContactsSchema,\n SearchMessagesSchema,\n SendMessageSchema,\n TOOL_TIMEOUTS_MS,\n type ToolName,\n WaitForReplySchema,\n} from \"./mcp-tools.js\";\nimport { APP_NAME, APP_VERSION } from \"./meta.js\";\nimport { hasNativeModule } from \"./native-bridge.js\";\nimport { wrapUntrusted } from \"./prompt-injection.js\";\nimport { sanitizeUserText } from \"./sanitize.js\";\nimport {\n enableOrphanWatchdog,\n enableStdinEofDetection,\n installShutdownHandlers,\n registerCleanup,\n shutdown,\n} from \"./shutdown.js\";\nimport { parseUserDate } from \"./tui/dateParse.js\";\nimport type { Message } from \"./types.js\";\nimport { installWatchdog, noteActivity, readWatchdogState } from \"./watchdog.js\";\n\nconst execFileAsync = promisify(execFile);\n\nclass ToolTimeoutError extends Error {\n constructor(\n public readonly toolName: string,\n public readonly timeoutMs: number,\n ) {\n super(\n `Tool '${toolName}' timed out after ${timeoutMs}ms. The MCP server has unblocked; the underlying query may still be running in the background.`,\n );\n this.name = \"ToolTimeoutError\";\n }\n}\n\nfunction withTimeout<T>(toolName: string, fn: () => Promise<T>): Promise<T> {\n const ms = TOOL_TIMEOUTS_MS[toolName] ?? DEFAULT_TOOL_TIMEOUT_MS;\n if (ms <= 0) return fn();\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new ToolTimeoutError(toolName, ms)), ms);\n timer.unref();\n fn().then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n },\n );\n });\n}\n\nfunction round1(n: number): number {\n return Math.round(n * 10) / 10;\n}\n\n/** Format a millisecond duration as e.g. \"1h 23m\" or \"5s\". */\nfunction formatDuration(ms: number): string {\n if (ms < 1_000) return `${Math.round(ms)}ms`;\n const sec = Math.floor(ms / 1_000);\n if (sec < 60) return `${sec}s`;\n const min = Math.floor(sec / 60);\n if (min < 60) return `${min}m ${sec % 60}s`;\n const hr = Math.floor(min / 60);\n return `${hr}h ${min % 60}m`;\n}\n\n/**\n * Format a date as a relative short string (\"Today 12:05 AM\", \"Yesterday 3:14 PM\", or \"2/14 9:00 AM\").\n */\nfunction relativeDate(d: Date): string {\n const now = new Date();\n const time = d.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\", hour12: true });\n const sameDay =\n d.getFullYear() === now.getFullYear() &&\n d.getMonth() === now.getMonth() &&\n d.getDate() === now.getDate();\n if (sameDay) return `Today ${time}`;\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n if (\n d.getFullYear() === yesterday.getFullYear() &&\n d.getMonth() === yesterday.getMonth() &&\n d.getDate() === yesterday.getDate()\n ) {\n return `Yesterday ${time}`;\n }\n return `${d.getMonth() + 1}/${d.getDate()} ${time}`;\n}\n\n/**\n * Format a message for output with display name, service, relative date, and delivery status.\n * Optional conversationLabel adds context for cross-conversation views (unread, search).\n */\nfunction formatMessage(msg: Message, conversationLabel?: string): string {\n const direction = msg.isFromMe ? \"→\" : \"←\";\n const dateStr = relativeDate(msg.date);\n const svcTag = msg.service === \"SMS\" ? \" [SMS]\" : \"\";\n\n let sender: string;\n if (msg.isFromMe) {\n sender = \"me\";\n } else if (msg.displayName && msg.displayName !== msg.handle) {\n sender = `${msg.displayName} (${msg.handle})`;\n } else {\n sender = msg.handle;\n }\n\n let status = \"\";\n if (!msg.isFromMe && !msg.isRead) {\n status = \" [UNREAD]\";\n } else if (msg.isFromMe) {\n if (msg.dateRead) {\n status = ` [Read ${msg.dateRead.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\", hour12: true })}]`;\n } else if (msg.isDelivered) {\n status = \" [Delivered]\";\n }\n }\n\n const convCtx = conversationLabel ? ` {${conversationLabel}}` : \"\";\n const rawText = sanitizeUserText(msg.text);\n // Wrap user-controlled message bodies in <untrusted> so a downstream LLM\n // treats prompt-injection attempts in the body as data, not instructions.\n // The empty-message placeholder is server-generated and trusted.\n const text = rawText ? wrapUntrusted(rawText) : \"(no text)\";\n return `[${dateStr}] ${direction} ${sender}${svcTag}: ${text}${status}${convCtx}`;\n}\n\nfunction messageToStructured(msg: Message) {\n return {\n ...msg,\n text: sanitizeUserText(msg.text),\n date: msg.date.toISOString(),\n dateRead: msg.dateRead?.toISOString() ?? null,\n dateDelivered: msg.dateDelivered?.toISOString() ?? null,\n };\n}\n\n/**\n * Sleep utility\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction toolText(text: string, structuredContent?: Record<string, unknown>) {\n return {\n content: [{ type: \"text\" as const, text }],\n ...(structuredContent ? { structuredContent } : {}),\n };\n}\n\nfunction toolError(text: string, _structuredContent?: Record<string, unknown>) {\n return {\n ...toolText(text),\n isError: true,\n };\n}\n\nfunction validateExportOutputPath(outputPath: string): string | null {\n if (!isAbsolute(outputPath)) {\n return \"outputPath must be an absolute path.\";\n }\n\n const parent = dirname(outputPath);\n if (!existsSync(parent)) {\n return `Parent directory does not exist: ${parent}`;\n }\n\n const parentStat = statSync(parent);\n if (!parentStat.isDirectory()) {\n return `Parent path is not a directory: ${parent}`;\n }\n\n if (existsSync(outputPath) && statSync(outputPath).isDirectory()) {\n return `outputPath points to a directory, not a file: ${outputPath}`;\n }\n\n return null;\n}\n\nfunction engineLabel(): string {\n return hasNativeModule() ? \"Rust parser + TS DB\" : \"TS\";\n}\n\n/**\n * Main MCP server class\n */\nexport class IMessageMCPServer {\n private server: Server;\n private db: IMessageDB;\n\n // Activity tracking — surfaced via health_check and watchdog\n private toolCallCount = 0;\n private recentErrorCount = 0;\n private lastActivityTs = Date.now();\n\n constructor() {\n this.server = new Server(\n {\n name: APP_NAME,\n version: APP_VERSION,\n },\n {\n capabilities: {\n tools: {},\n resources: { subscribe: false, listChanged: false },\n },\n },\n );\n\n this.db = new IMessageDB(getImsgDbPath(), getContactsDbPaths(), getSlugsDbPath());\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: getActiveTools(),\n }));\n\n // Handle tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {\n const { name, arguments: args } = request.params;\n this.lastActivityTs = Date.now();\n this.toolCallCount++;\n noteActivity();\n\n // The SDK gives us an AbortSignal per request that fires when the host\n // sends notifications/cancelled with this request's id. We pass it down\n // to long-running handlers so they can bail out early.\n const signal = extra?.signal;\n\n const startedAt = performance.now();\n const stampMeta = <T extends Record<string, unknown>>(result: T): T => {\n const duration_ms = Math.round((performance.now() - startedAt) * 10) / 10;\n return { ...result, _meta: { engine: engineLabel(), duration_ms } } as T;\n };\n\n try {\n return stampMeta(await withTimeout(name, () => this.dispatchTool(name, args, signal)));\n } catch (error: any) {\n const isTimeout = error instanceof ToolTimeoutError;\n appendLog(isTimeout ? \"warn\" : \"error\", isTimeout ? \"Tool timed out\" : \"Tool error\", {\n tool: name,\n error: error.message || String(error),\n });\n if (!isTimeout) this.recentErrorCount++;\n return stampMeta(\n toolError(`Error: ${error.message || String(error)}`, {\n tool: name,\n error: error.message || String(error),\n timedOut: isTimeout,\n }),\n );\n } finally {\n this.db.scheduleBackgroundRefresh();\n }\n });\n\n // MCP Resources — let hosts browse/subscribe without an explicit tool call.\n // We advertise templates (parameterized URIs) rather than concrete\n // resources because the user's data is open-ended.\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [],\n }));\n\n this.server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates: [\n {\n uriTemplate: \"messages://recent/{hours}\",\n name: \"Recent messages (last N hours)\",\n description: \"Read all messages across every chat from the last {hours} hours.\",\n mimeType: \"application/json\",\n },\n {\n uriTemplate: \"messages://contact/{handle}/{hours}\",\n name: \"Messages with a contact (last N hours)\",\n description:\n \"Read messages from the chat containing {handle} (phone/email) in the last {hours} hours.\",\n mimeType: \"application/json\",\n },\n {\n uriTemplate: \"contacts://\",\n name: \"All loaded contacts\",\n description: \"Read all contacts from the macOS Address Book sources.\",\n mimeType: \"application/json\",\n },\n ],\n }));\n\n this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n try {\n const result = await this.readResource(uri);\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(result),\n },\n ],\n };\n } catch (e: any) {\n throw new Error(`Resource ${uri} failed: ${e.message ?? e}`);\n }\n });\n }\n\n private async readResource(uri: string): Promise<unknown> {\n // messages://recent/{hours}\n let m = uri.match(/^messages:\\/\\/recent\\/(\\d+)$/);\n if (m?.[1]) {\n const hours = Number(m[1]);\n const cutoffMs = Date.now() - hours * 3600 * 1000;\n // Use existing getRecentMessages then filter by date (cheap; recent is\n // already bounded). For hours > 24 callers should use get_messages\n // tool instead.\n const msgs = await this.db.getRecentMessages(500);\n return {\n windowHours: hours,\n messages: msgs\n .filter((mm: Message) => mm.date.getTime() >= cutoffMs)\n .map(messageToStructured),\n };\n }\n // messages://contact/{handle}/{hours}\n m = uri.match(/^messages:\\/\\/contact\\/([^/]+)\\/(\\d+)$/);\n if (m?.[1] && m?.[2]) {\n const handle = decodeURIComponent(m[1]);\n const hours = Number(m[2]);\n const cutoffMs = Date.now() - hours * 3600 * 1000;\n const chat = await this.db.findChatByHandle(handle);\n if (!chat) return { handle, windowHours: hours, messages: [] };\n const msgs = await this.db.getMessagesForChat(chat.chatIdentifier, 500);\n return {\n handle,\n chatId: chat.chatIdentifier,\n windowHours: hours,\n messages: msgs\n .filter((mm: Message) => mm.date.getTime() >= cutoffMs)\n .map(messageToStructured),\n };\n }\n // contacts://\n if (uri === \"contacts://\") {\n const all = this.db.contacts.listContacts(0, 10000);\n return { count: all.contacts.length, contacts: all.contacts };\n }\n throw new Error(`Unknown resource URI: ${uri}`);\n }\n\n private async dispatchTool(name: string, args: unknown, signal?: AbortSignal) {\n if (DEV_TOOL_NAMES.has(name as ToolName) && !isDevMode()) {\n throw new Error(`Unknown tool: ${name}`);\n }\n switch (name) {\n case \"get_messages\":\n return await this.handleGetMessages(args);\n case \"get_unread_messages\":\n return await this.handleGetUnreadMessages(args);\n case \"send_message\":\n return await this.handleSendMessage(args);\n case \"wait_for_reply\":\n return await this.handleWaitForReply(args, signal);\n case \"list_conversations\":\n return await this.handleListConversations(args);\n case \"search_messages\":\n return await this.handleSearchMessages(args);\n case \"get_logs\":\n return await this.handleGetLogs(args);\n case \"get_last_send_error\":\n return await this.handleGetLastSendError();\n case \"run_build\":\n return await this.handleRunBuild();\n case \"request_restart\":\n return await this.handleRequestRestart();\n case \"health_check\":\n return await this.handleHealthCheck();\n case \"export_messages\":\n return await this.handleExportMessages(args, signal);\n case \"list_contacts\":\n return await this.handleListContacts(args);\n case \"search_contacts\":\n return await this.handleSearchContacts(args);\n case \"get_contact\":\n return await this.handleGetContact(args);\n case \"resolve_handle\":\n return await this.handleResolveHandle(args);\n case \"check_imessage_availability\":\n return await this.handleCheckImessageAvailability(args);\n case \"search_attachments\":\n return await this.handleSearchAttachments(args);\n case \"get_attachment\":\n return await this.handleGetAttachment(args);\n case \"chat_analytics\":\n return await this.handleChatAnalytics(args);\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n }\n\n private async handleGetLogs(args: unknown) {\n const { tail, source } = GetLogsSchema.parse(args ?? {});\n const n = tail ?? 50;\n const sections: string[] = [];\n\n if (source !== \"file\") {\n const memLines = getLogs(n);\n sections.push(\n `## In-Memory Logs (${memLines.length} lines)\\n${memLines.length === 0 ? \"No log lines yet.\" : memLines.join(\"\\n\")}`,\n );\n }\n\n if (source === \"file\" || source === \"all\") {\n const fileLines = getFileLogLines(n);\n const logPath = getLogFilePath() ?? getLogDirectory();\n sections.push(\n `## File Logs (${logPath})\\n${fileLines.length === 0 ? \"No file log entries.\" : fileLines.join(\"\\n\")}`,\n );\n }\n\n if (source !== \"file\" && source !== \"all\") {\n // Also show log file location for reference\n const logPath = getLogFilePath() ?? getLogDirectory();\n sections.push(`\\n📁 Full NDJSON logs: ${logPath}`);\n }\n\n return toolText(sections.join(\"\\n\\n\"), { source: source ?? \"memory\", tail: n, sections });\n }\n\n private async handleGetLastSendError() {\n const err = getLastSendError();\n if (!err) {\n return toolText(\n \"No send failure recorded. Last send either succeeded or occurred before this server run.\",\n {\n lastSendError: null,\n },\n );\n }\n const text = [\n \"Last send_message failure:\",\n ` message: ${err.message}`,\n ` timestamp: ${err.timestamp}`,\n err.stderr != null ? ` stderr: ${err.stderr}` : \"\",\n err.stdout != null ? ` stdout: ${err.stdout}` : \"\",\n err.code != null ? ` code: ${err.code}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n return toolText(text, { lastSendError: err });\n }\n\n private async handleRunBuild(): Promise<any> {\n try {\n const { stdout, stderr } = await execFileAsync(\"pnpm\", [\"build\"], {\n encoding: \"utf8\",\n maxBuffer: 2 * 1024 * 1024,\n cwd: process.cwd(),\n });\n return toolText(\n `Build succeeded.\\n\\nstdout:\\n${stdout}${stderr ? `\\n\\nstderr:\\n${stderr}` : \"\"}`,\n {\n ok: true,\n stdout,\n stderr,\n },\n );\n } catch (error: any) {\n const stderr = error.stderr?.toString?.() ?? error.message ?? \"\";\n const stdout = error.stdout?.toString?.() ?? \"\";\n appendLog(\"error\", \"run_build failed\", { stderr, stdout });\n return toolError(`Build failed.\\n\\nstdout:\\n${stdout}\\n\\nstderr:\\n${stderr}`, {\n ok: false,\n stdout,\n stderr,\n });\n }\n }\n\n private async handleRequestRestart(): Promise<any> {\n const msg =\n \"Restart requested. Please restart the MCP server in your client (e.g. Cursor) to load new code.\";\n setImmediate(() => shutdown(0));\n return toolText(msg, { restartRequested: true });\n }\n\n /**\n * Returns vital signs in a fixed text format. Designed to never touch the\n * DB so it returns instantly even when SQL is blocked — that's the whole\n * point: this tool verifies \"the MCP is alive even though queries are slow\".\n */\n private async handleHealthCheck(): Promise<any> {\n const wd = readWatchdogState();\n const uptimeMs = Date.now() - wd.startedAt;\n const idleMs = Date.now() - this.lastActivityTs;\n\n // Compute status: healthy < degraded < unhealthy\n let status = \"healthy\";\n const issues: string[] = [];\n if (wd.eventLoopP99Ms > 500) {\n status = \"degraded\";\n issues.push(`event-loop lag p99 ${wd.eventLoopP99Ms.toFixed(0)}ms`);\n }\n if (wd.eventLoopP99Ms > 5_000) {\n status = \"unhealthy\";\n }\n if (wd.rssMb > 800) {\n status = status === \"healthy\" ? \"degraded\" : status;\n issues.push(`RSS ${wd.rssMb}MB`);\n }\n if (this.recentErrorCount > 5) {\n status = status === \"healthy\" ? \"degraded\" : status;\n issues.push(`${this.recentErrorCount} recent errors`);\n }\n\n const lines = [\n `Status: ${status}`,\n issues.length ? `Issues: ${issues.join(\"; \")}` : \"\",\n \"\",\n `Uptime: ${formatDuration(uptimeMs)}`,\n `Last activity: ${formatDuration(idleMs)} ago`,\n `PID: ${process.pid}`,\n `Node: ${process.version}`,\n \"\",\n `Heap: ${wd.heapMb || round1(process.memoryUsage().heapUsed / 1024 / 1024)}MB`,\n `RSS: ${wd.rssMb || round1(process.memoryUsage().rss / 1024 / 1024)}MB`,\n `Event-loop p99: ${wd.eventLoopP99Ms.toFixed(1)}ms`,\n `Event-loop max: ${wd.eventLoopMaxMs.toFixed(1)}ms`,\n \"\",\n `Total tool calls: ${this.toolCallCount}`,\n `Recent errors: ${this.recentErrorCount}`,\n `Engine: ${engineLabel()}`,\n ].filter((l) => l !== null);\n\n return toolText(lines.join(\"\\n\"), {\n status,\n issues,\n uptimeMs,\n idleMs,\n pid: process.pid,\n node: process.version,\n heapMb: wd.heapMb || round1(process.memoryUsage().heapUsed / 1024 / 1024),\n rssMb: wd.rssMb || round1(process.memoryUsage().rss / 1024 / 1024),\n eventLoopP99Ms: wd.eventLoopP99Ms,\n eventLoopMaxMs: wd.eventLoopMaxMs,\n toolCallCount: this.toolCallCount,\n recentErrorCount: this.recentErrorCount,\n engine: engineLabel(),\n });\n }\n\n private async handleGetMessages(args: unknown) {\n const span = perf(\"tool:get_messages\");\n const parsed = GetMessagesSchema.parse(args);\n const { chatIdentifier, threadSlug, beforeMessageId } = parsed;\n // Internal cap to prevent OOM regardless of caller's request.\n const HARD_PAGE_CAP = 5000;\n const requested = resolveLimit(parsed.limit);\n const limit = Math.min(requested, HARD_PAGE_CAP);\n const wasCapped = requested > HARD_PAGE_CAP;\n\n let messages: Message[];\n let threadHeader = \"\";\n if (chatIdentifier || threadSlug) {\n let targetIdentifier = chatIdentifier;\n if (threadSlug) {\n const slugRecord = this.db.getSlugRecord(threadSlug);\n if (!slugRecord) {\n return toolError(`Unknown thread slug: ${threadSlug}`, { threadSlug });\n }\n targetIdentifier = slugRecord.chatIdentifier;\n }\n\n messages = await this.db.getMessagesForChat(targetIdentifier!, limit, { beforeMessageId });\n const conv = await this.db.findChatByHandle(targetIdentifier!);\n if (conv) {\n const name = conv.displayName || conv.rawIdentifier;\n const ident = conv.displayName ? ` (${conv.rawIdentifier})` : \"\";\n const kind = conv.isGroupChat ? \"Group\" : \"1-on-1\";\n threadHeader = `Thread: ${conv.threadSlug} | ${name}${ident} | ${conv.serviceType} | ${kind}\\n\\n`;\n }\n } else {\n messages = await this.db.getRecentMessages(limit);\n }\n\n const durMs = span.end({ limit, returned: messages.length });\n\n if (messages.length === 0) {\n return toolText(`${threadHeader}No messages found.`, {\n messages: [],\n count: 0,\n hasMore: false,\n });\n }\n\n const formatted = messages.map((m) => formatMessage(m)).join(\"\\n\");\n const oldestId = Math.min(...messages.map((m) => m.id));\n const hasMore = messages.length === limit; // heuristic — full page suggests more\n const paginationLine =\n chatIdentifier || threadSlug\n ? `\\n_Pagination: oldestMessageId=${oldestId}, hasMore=${hasMore}${wasCapped ? ` (capped at ${HARD_PAGE_CAP} per call — use beforeMessageId or export_messages)` : \"\"}_`\n : \"\";\n const perfLine = `\\n_Engine: TS | Query: ${durMs.toFixed(0)}ms | Messages: ${messages.length}_`;\n return toolText(\n `${threadHeader}Found ${messages.length} message(s):\\n\\n${formatted}${paginationLine}${perfLine}`,\n {\n messages: messages.map(messageToStructured),\n count: messages.length,\n hasMore,\n oldestMessageId: chatIdentifier || threadSlug ? oldestId : undefined,\n },\n );\n }\n\n private async handleExportMessages(args: unknown, signal?: AbortSignal) {\n const span = perf(\"tool:export_messages\");\n const parsed = ExportMessagesSchema.parse(args);\n const { format, outputPath, since, until, pageSize } = parsed;\n\n // Resolve target chat\n let chatIdentifier = parsed.chatIdentifier;\n if (parsed.threadSlug) {\n const slugRecord = this.db.getSlugRecord(parsed.threadSlug);\n if (!slugRecord) {\n return toolError(`Unknown thread slug: ${parsed.threadSlug}`, {\n threadSlug: parsed.threadSlug,\n });\n }\n chatIdentifier = slugRecord.chatIdentifier;\n }\n if (!chatIdentifier) {\n return toolError(\"chatIdentifier or threadSlug required\", {});\n }\n\n const pathError = validateExportOutputPath(outputPath);\n if (pathError) {\n return toolError(pathError, { outputPath });\n }\n\n // Parse date bounds (reuse the same parser the TUI uses)\n const sinceDate = since ? parseUserDate(since) : null;\n const untilDate = until ? parseUserDate(until) : null;\n if (since && !sinceDate) {\n return toolError(`Could not parse 'since': ${since}`, { since });\n }\n if (until && !untilDate) {\n return toolError(`Could not parse 'until': ${until}`, { until });\n }\n\n const result = await streamExport({\n db: this.db,\n chatIdentifier,\n format,\n outputPath,\n since: sinceDate,\n until: untilDate,\n pageSize,\n signal,\n });\n const durMs = span.end({ format, count: result.count, sizeBytes: result.sizeBytes });\n\n return toolText(\n [\n `Exported ${result.count} message(s) to ${result.savedTo}`,\n `Format: ${format}`,\n `Range: ${result.oldest?.toISOString() ?? \"(none)\"} → ${result.newest?.toISOString() ?? \"(none)\"}`,\n `Size: ${(result.sizeBytes / 1024).toFixed(1)} KB`,\n `_Took ${durMs.toFixed(0)}ms_`,\n ].join(\"\\n\"),\n {\n ...result,\n format,\n oldest: result.oldest?.toISOString() ?? null,\n newest: result.newest?.toISOString() ?? null,\n durationMs: durMs,\n },\n );\n }\n\n private async handleGetUnreadMessages(args: unknown) {\n const { limit } = GetUnreadMessagesSchema.parse(args ?? {});\n const resolvedLimit = resolveLimit(limit, 100);\n const messages = await this.db.getUnreadMessages(resolvedLimit + 1);\n const hasMore = messages.length > resolvedLimit;\n const results = messages.slice(0, resolvedLimit);\n\n if (results.length === 0) {\n return toolText(\"No unread messages.\", {\n messages: [],\n count: 0,\n hasMore: false,\n nextOffset: null,\n });\n }\n\n // Add conversation context per message (slug or display name)\n const formatted = results\n .map((msg) => {\n const slug = this.db.getSlugForChatIdentifier(msg.chatId);\n const label = slug ?? msg.chatId;\n return formatMessage(msg, label);\n })\n .join(\"\\n\");\n return toolText(`Found ${results.length} unread message(s):\\n\\n${formatted}`, {\n messages: results.map(messageToStructured),\n count: results.length,\n hasMore,\n nextOffset: null,\n });\n }\n\n private async handleSendMessage(args: unknown) {\n const { recipient, threadSlug, message, attachments } = SendMessageSchema.parse(args);\n\n if (!recipient && !threadSlug) {\n return toolError(\"Either recipient or threadSlug is required.\", {});\n }\n\n // Pre-validate attachment paths so we fail fast (before sending the\n // text body) when a path is bogus.\n if (attachments?.length) {\n for (const p of attachments) {\n if (!isAbsolute(p)) {\n return toolError(`Attachment path must be absolute: ${p}`, { attachment: p });\n }\n if (!existsSync(p)) {\n return toolError(`Attachment file not found: ${p}`, { attachment: p });\n }\n }\n }\n\n const available = await checkMessagesAvailable();\n if (!available) {\n return toolError(\"Messages.app is not running or accessible.\", { messagesAvailable: false });\n }\n\n let result: { success: boolean; error?: string; timestamp?: Date };\n let resolvedTarget = recipient ?? threadSlug ?? \"\";\n\n if (threadSlug) {\n const slugRecord = this.db.getSlugRecord(threadSlug);\n if (!slugRecord) {\n return toolError(\n `Unknown thread slug: ${threadSlug}. Use list_conversations to see available slugs.`,\n {\n threadSlug,\n },\n );\n }\n\n if (slugRecord.isGroup) {\n if (slugRecord.displayName && !slugRecord.displayName.startsWith(\"chat\")) {\n result = await sendToChat(slugRecord.displayName, message);\n } else {\n result = await sendToChatId(slugRecord.chatGuid, message);\n }\n } else {\n // Route 1:1 sends through the temp-file + SMS-fallback path. Falls\n // back to sendMessageAlt only if the reliable path itself errors\n // before AppleScript runs (e.g. tmp-file write failure).\n result = await sendMessageReliable(slugRecord.chatIdentifier, message);\n if (!result.success) {\n result = await sendMessageAlt(slugRecord.chatIdentifier, message);\n }\n }\n resolvedTarget = slugRecord.displayName || slugRecord.chatIdentifier;\n } else {\n result = await sendMessageReliable(recipient!, message);\n if (!result.success) {\n result = await sendMessageAlt(recipient!, message);\n }\n }\n\n if (result.success) {\n // Ship attachments as follow-up sends. 1:1 only — Messages.app's\n // `send (POSIX file …) to chat …` form is unreliable, so for slug-based\n // group sends we surface the limitation in the response rather than\n // attempting it.\n const attachmentResults: Array<{ path: string; success: boolean; error?: string }> = [];\n if (attachments?.length) {\n const targetHandle = threadSlug\n ? this.db.getSlugRecord(threadSlug)?.chatIdentifier\n : recipient;\n const isGroupTarget = threadSlug\n ? Boolean(this.db.getSlugRecord(threadSlug)?.isGroup)\n : false;\n\n if (isGroupTarget) {\n for (const p of attachments) {\n attachmentResults.push({\n path: p,\n success: false,\n error: \"Attachment send to group chats not supported (Messages.app limitation).\",\n });\n }\n } else if (targetHandle) {\n for (const p of attachments) {\n const r = await sendAttachment(targetHandle, p);\n attachmentResults.push({\n path: p,\n success: r.success,\n error: r.error,\n });\n }\n }\n }\n\n const chat = await this.db.findChatByHandle(\n threadSlug ? (this.db.getSlugRecord(threadSlug)?.chatIdentifier ?? \"\") : recipient!,\n );\n let lastMessageId: number | undefined;\n\n if (chat) {\n const lastMsg = await this.db.getLastMessage(chat.chatIdentifier);\n lastMessageId = lastMsg?.id;\n }\n\n const attSummary =\n attachmentResults.length > 0\n ? `\\nAttachments: ${attachmentResults.filter((a) => a.success).length}/${attachmentResults.length} delivered`\n : \"\";\n\n return toolText(\n `Message sent to ${resolvedTarget} at ${result.timestamp?.toLocaleString()}${chat ? `\\nThread: ${chat.threadSlug}` : \"\"}${lastMessageId ? `\\nLast message ID: ${lastMessageId} (use with wait_for_reply)` : \"\"}${attSummary}`,\n {\n success: true,\n target: resolvedTarget,\n timestamp: result.timestamp?.toISOString() ?? null,\n threadSlug: chat?.threadSlug,\n lastMessageId,\n attachments: attachmentResults.length > 0 ? attachmentResults : undefined,\n },\n );\n } else {\n appendLog(\"error\", \"send_message failed\", { recipient: resolvedTarget, error: result.error });\n return toolError(\n `Failed to send message: ${result.error}. Use get_last_send_error for details.`,\n {\n success: false,\n target: resolvedTarget,\n error: result.error,\n },\n );\n }\n }\n\n private async handleWaitForReply(args: unknown, signal?: AbortSignal): Promise<any> {\n const { chatIdentifier, threadSlug, timeoutSeconds, pollIntervalSeconds, afterMessageId } =\n WaitForReplySchema.parse(args);\n\n if (!chatIdentifier && !threadSlug) {\n return toolError(\"Either chatIdentifier or threadSlug is required.\", {});\n }\n\n const timeoutMs = timeoutSeconds * 1000;\n const pollIntervalMs = pollIntervalSeconds * 1000;\n const startTime = Date.now();\n\n let chat: Awaited<ReturnType<typeof this.db.findChatByHandle>>;\n if (threadSlug) {\n const slugRecord = this.db.getSlugRecord(threadSlug);\n if (!slugRecord) {\n return toolError(`Unknown thread slug: ${threadSlug}`, { threadSlug });\n }\n chat = await this.db.findChatByHandle(slugRecord.chatIdentifier);\n } else {\n chat = await this.db.findChatByHandle(chatIdentifier!);\n }\n if (!chat) {\n return toolError(`Could not find conversation for: ${threadSlug || chatIdentifier}`, {\n threadSlug,\n chatIdentifier,\n });\n }\n\n // Get the current last message ID if not provided\n let lastKnownId = afterMessageId;\n if (!lastKnownId) {\n const lastMsg = await this.db.getLastMessage(chat.chatIdentifier);\n lastKnownId = lastMsg?.id || 0;\n }\n\n // Poll for new messages — bail out early on cancellation\n while (Date.now() - startTime < timeoutMs) {\n if (signal?.aborted) {\n return toolError(\n `Cancelled by client after ${Math.round((Date.now() - startTime) / 1000)}s`,\n {\n cancelled: true,\n elapsedSeconds: Math.round((Date.now() - startTime) / 1000),\n },\n );\n }\n const newMessages = await this.db.getMessagesAfter(chat.chatIdentifier, lastKnownId);\n\n if (newMessages.length > 0) {\n const formatted = newMessages.map((m) => formatMessage(m)).join(\"\\n\");\n return toolText(`Received ${newMessages.length} new message(s):\\n\\n${formatted}`, {\n received: true,\n messages: newMessages.map(messageToStructured),\n count: newMessages.length,\n });\n }\n\n await sleep(pollIntervalMs);\n }\n\n // Timeout reached\n return toolText(\n `Timeout reached (${timeoutSeconds}s) - no new messages received in conversation with ${threadSlug || chatIdentifier}`,\n {\n received: false,\n timedOut: true,\n timeoutSeconds,\n threadSlug,\n chatIdentifier: chat.chatIdentifier,\n },\n );\n }\n\n private async handleListConversations(args: unknown) {\n const { limit } = ListConversationsSchema.parse(args);\n const resolvedLimit = resolveLimit(limit);\n const limited = await this.db.listConversations(resolvedLimit + 1);\n const hasMore = limited.length > resolvedLimit;\n const results = limited.slice(0, resolvedLimit);\n\n if (results.length === 0) {\n return toolText(\"No conversations found.\", {\n conversations: [],\n count: 0,\n hasMore: false,\n nextOffset: null,\n });\n }\n\n const formatted = results\n .map((conv) => {\n const slug = conv.threadSlug ?? conv.chatIdentifier;\n let name = conv.displayName || conv.chatIdentifier;\n // For group chats without a display name, show resolved participant names\n if (conv.isGroupChat && !conv.displayName) {\n const resolved = this.db.resolveParticipantNames(conv.participants);\n const names = resolved.filter((n, i) => n !== conv.participants[i]);\n if (names.length > 0) {\n name =\n names.length <= 3\n ? names.join(\", \")\n : `${names.slice(0, 3).join(\", \")} +${names.length - 3}`;\n }\n }\n const ident =\n conv.displayName && conv.displayName !== conv.rawIdentifier\n ? ` (${conv.rawIdentifier})`\n : \"\";\n const svc = conv.serviceType === \"SMS\" ? \" [SMS]\" : \"\";\n const group = conv.isGroupChat ? \" [Group]\" : \"\";\n const lastDate = conv.lastMessageDate ? ` - ${relativeDate(conv.lastMessageDate)}` : \"\";\n let snippetText = conv.lastMessageSnippet;\n if (snippetText) {\n snippetText = sanitizeUserText(snippetText);\n }\n const snippet = snippetText\n ? ` - \"${wrapUntrusted(snippetText.length > 50 ? `${snippetText.slice(0, 47)}...` : snippetText)}\"`\n : \"\";\n const unread = conv.unreadCount > 0 ? ` [${conv.unreadCount} unread]` : \"\";\n return `• [${slug}] ${name}${ident}${svc}${group}${lastDate}${snippet}${unread}`;\n })\n .join(\"\\n\");\n\n return toolText(`Found ${results.length} conversation(s):\\n\\n${formatted}`, {\n conversations: results.map((conversation) => ({\n ...conversation,\n lastMessageDate: conversation.lastMessageDate?.toISOString() ?? null,\n lastMessageSnippet: sanitizeUserText(conversation.lastMessageSnippet),\n })),\n count: results.length,\n hasMore,\n nextOffset: null,\n });\n }\n\n private async handleSearchMessages(args: unknown) {\n const { query, limit, mode, minScore } = SearchMessagesSchema.parse(args);\n const resolvedLimit = resolveLimit(limit);\n\n // Fuzzy mode: pull a wider candidate set via LIKE on individual tokens\n // (so the DB doesn't return the entire history), then score+rank in TS.\n // Pure LIKE for literal mode.\n const SOFT_CAP = 10_000;\n let messages: Message[];\n let softCapWarning: string | undefined;\n if (mode === \"fuzzy\") {\n const candidates = await this.db.searchMessages(query, SOFT_CAP);\n const ranked = rankFuzzy(query, candidates, (m) => m.text ?? \"\", minScore);\n messages = ranked.slice(0, resolvedLimit + 1).map((r) => r.item);\n if (candidates.length >= SOFT_CAP) {\n softCapWarning = `Candidate pool capped at ${SOFT_CAP} pre-scoring. Tighten the query for more reliable ranking.`;\n }\n } else {\n messages = await this.db.searchMessages(query, resolvedLimit + 1);\n }\n\n const hasMore = messages.length > resolvedLimit;\n const results = messages.slice(0, resolvedLimit);\n\n if (results.length === 0) {\n return toolText(`No messages found matching \"${query}\".`, {\n query,\n mode,\n messages: [],\n count: 0,\n hasMore: false,\n nextOffset: null,\n softCapWarning,\n });\n }\n\n const formatted = results\n .map((msg) => {\n const slug = this.db.getSlugForChatIdentifier(msg.chatId);\n const label = slug ?? msg.chatId;\n return formatMessage(msg, label);\n })\n .join(\"\\n\");\n return toolText(`Found ${results.length} message(s) matching \"${query}\":\\n\\n${formatted}`, {\n query,\n mode,\n messages: results.map(messageToStructured),\n count: results.length,\n hasMore,\n nextOffset: null,\n softCapWarning,\n });\n }\n\n // ── Contact tools ──────────────────────────────────────────────────────\n\n private async handleListContacts(args: unknown) {\n const { limit, offset } = ListContactsSchema.parse(args);\n const resolvedLimit = resolveLimit(limit);\n // Internal cap mirrors get_messages safety bound.\n const SAFETY_CAP = 5_000;\n const effectiveLimit = Math.min(resolvedLimit, SAFETY_CAP);\n const { contacts, total } = this.db.contacts.listContacts(offset, effectiveLimit);\n const hasMore = offset + contacts.length < total;\n\n if (contacts.length === 0) {\n return toolText(`No contacts found${offset > 0 ? ` (offset ${offset})` : \"\"}.`, {\n contacts: [],\n count: 0,\n hasMore: false,\n totalCount: total,\n });\n }\n\n const formatted = contacts\n .map((c) => {\n const phones = c.phoneNumbers.length > 0 ? ` 📱 ${c.phoneNumbers.join(\", \")}` : \"\";\n const emails = c.emails.length > 0 ? ` ✉ ${c.emails.join(\", \")}` : \"\";\n return `• ${sanitizeUserText(c.displayName)}${phones}${emails}`;\n })\n .join(\"\\n\");\n return toolText(`Showing ${contacts.length} of ${total} contact(s):\\n\\n${formatted}`, {\n contacts,\n count: contacts.length,\n hasMore,\n totalCount: total,\n });\n }\n\n private async handleSearchContacts(args: unknown) {\n const { query, limit } = SearchContactsSchema.parse(args);\n const resolvedLimit = resolveLimit(limit);\n const all = this.db.contacts.searchContacts(query);\n const results = resolvedLimit === Number.MAX_SAFE_INTEGER ? all : all.slice(0, resolvedLimit);\n\n if (results.length === 0) {\n return toolText(`No contacts match \"${query}\".`, {\n query,\n contacts: [],\n count: 0,\n });\n }\n\n // Remember this result set so the next call can re-select by `contact:N`.\n // Use the first phone or email as the canonical \"handle\" for the selector.\n rememberSearch(\n query,\n results.map((c) => ({\n handle: c.phoneNumbers[0] ?? c.emails[0] ?? c.displayName,\n displayName: c.displayName,\n })),\n );\n\n const formatted = results\n .map((c, i) => {\n const phones = c.phoneNumbers.length > 0 ? ` 📱 ${c.phoneNumbers.join(\", \")}` : \"\";\n const emails = c.emails.length > 0 ? ` ✉ ${c.emails.join(\", \")}` : \"\";\n return `[contact:${i + 1}] ${sanitizeUserText(c.displayName)}${phones}${emails}`;\n })\n .join(\"\\n\");\n const hint =\n results.length > 1\n ? `\\n\\nRe-select by index in any contact-accepting tool: handle: \"contact:1\" … \"contact:${results.length}\".`\n : \"\";\n return toolText(\n `Found ${results.length} contact(s) matching \"${query}\":\\n\\n${formatted}${hint}`,\n {\n query,\n contacts: results,\n count: results.length,\n },\n );\n }\n\n private async handleGetContact(args: unknown) {\n const { handle, id } = GetContactSchema.parse(args);\n let contact = null;\n if (handle !== undefined) {\n const selectorHit = resolveContactSelector(handle);\n const effectiveHandle = selectorHit?.handle ?? handle;\n const lookup = this.db.contacts.lookupContact(effectiveHandle);\n contact = lookup ? this.db.contacts.getContact(lookup.contactId) : null;\n } else if (id !== undefined) {\n contact = this.db.contacts.getContact(id);\n }\n if (!contact) {\n return toolText(\"Contact not found.\", { contact: null });\n }\n const phones =\n contact.phoneNumbers.length > 0 ? `\\nPhones: ${contact.phoneNumbers.join(\", \")}` : \"\";\n const emails = contact.emails.length > 0 ? `\\nEmails: ${contact.emails.join(\", \")}` : \"\";\n const org = contact.organization ? `\\nOrganization: ${contact.organization}` : \"\";\n return toolText(\n `${sanitizeUserText(contact.displayName)} (id ${contact.id})${phones}${emails}${org}`,\n { contact },\n );\n }\n\n private async handleResolveHandle(args: unknown) {\n const { handle } = ResolveHandleSchema.parse(args);\n const selectorHit = resolveContactSelector(handle);\n const effectiveHandle = selectorHit?.handle ?? handle;\n const lookup = this.db.contacts.lookupContact(effectiveHandle);\n if (lookup) {\n return toolText(`${handle} → ${sanitizeUserText(lookup.displayName)}`, {\n handle,\n displayName: lookup.displayName,\n contactId: lookup.contactId,\n label: lookup.label ?? null,\n resolved: true,\n });\n }\n return toolText(`No contact for ${handle}.`, {\n handle,\n displayName: handle,\n contactId: null,\n label: null,\n resolved: false,\n });\n }\n\n private async handleCheckImessageAvailability(args: unknown) {\n const { handle } = CheckImessageAvailabilitySchema.parse(args);\n const selectorHit = resolveContactSelector(handle);\n const effectiveHandle = selectorHit?.handle ?? handle;\n const result = await checkImessageAvailability(effectiveHandle);\n const text = result.reachable\n ? `${handle} reachable via ${result.service}.`\n : `${handle} not reachable. ${result.hint ?? \"\"}`.trim();\n return toolText(text, {\n handle,\n service: result.service,\n reachable: result.reachable,\n hint: result.hint,\n });\n }\n\n private async handleSearchAttachments(args: unknown) {\n const { mimePrefix, chatIdentifier, since, until, limit } = SearchAttachmentsSchema.parse(args);\n const sinceMs = since ? parseUserDate(since)?.getTime() : undefined;\n const untilMs = until ? parseUserDate(until)?.getTime() : undefined;\n const resolvedLimit = resolveLimit(limit);\n const opts: Parameters<typeof this.db.searchAttachments>[0] = {\n limit: resolvedLimit,\n };\n if (mimePrefix !== undefined) opts.mimePrefix = mimePrefix;\n if (chatIdentifier !== undefined) opts.chatIdentifier = chatIdentifier;\n if (sinceMs !== undefined) opts.sinceMs = sinceMs;\n if (untilMs !== undefined) opts.untilMs = untilMs;\n const results = this.db.searchAttachments(opts);\n\n const formatted = results\n .map(\n (a) =>\n `[${a.rowId}] ${a.mimeType ?? \"?\"} · ${a.totalBytes}B · ${a.createdDate.toISOString().slice(0, 10)} · ${a.transferName ?? a.filename}`,\n )\n .join(\"\\n\");\n return toolText(`Found ${results.length} attachment(s):\\n\\n${formatted}`, {\n attachments: results.map((a) => ({\n rowId: a.rowId,\n filename: a.filename,\n mimeType: a.mimeType,\n transferName: a.transferName,\n totalBytes: a.totalBytes,\n createdDate: a.createdDate.toISOString(),\n chatId: a.chatId,\n })),\n count: results.length,\n });\n }\n\n private async handleGetAttachment(args: unknown) {\n const { readFileSync } = await import(\"node:fs\");\n const { rowId, inlineMaxBytes } = GetAttachmentSchema.parse(args);\n const rec = this.db.getAttachmentByRowId(rowId);\n if (!rec) return toolError(`Attachment ROWID ${rowId} not found.`, { rowId });\n\n const resolvedPath = rec.filename.replace(/^~/, process.env.HOME ?? \"~\");\n if (!existsSync(resolvedPath)) {\n return toolError(`Attachment file does not exist: ${resolvedPath}`, {\n rowId,\n resolvedPath,\n });\n }\n\n const stat = statSync(resolvedPath);\n const sizeBytes = stat.size;\n const isHeic =\n (rec.mimeType ?? \"\").toLowerCase().includes(\"heic\") ||\n resolvedPath.toLowerCase().endsWith(\".heic\");\n\n // Inline if small AND not too large to base64-encode (base64 inflates ~33%).\n const inline = sizeBytes <= inlineMaxBytes;\n\n let base64: string | undefined;\n let convertedNote: string | undefined;\n let finalMime = rec.mimeType;\n let finalPath = resolvedPath;\n\n if (inline) {\n if (isHeic) {\n // Convert HEIC → PNG via macOS sips (zero-dep, ships with macOS).\n try {\n const { execFileSync } = await import(\"node:child_process\");\n const { tmpdir } = await import(\"node:os\");\n const { join: pjoin } = await import(\"node:path\");\n const out = pjoin(tmpdir(), `imsg-att-${rowId}.png`);\n execFileSync(\"sips\", [\"-s\", \"format\", \"png\", resolvedPath, \"--out\", out], {\n stdio: \"ignore\",\n });\n finalPath = out;\n finalMime = \"image/png\";\n convertedNote = \"HEIC → PNG via sips\";\n base64 = readFileSync(out).toString(\"base64\");\n } catch (e: any) {\n return toolError(`HEIC→PNG conversion failed: ${e.message ?? e}`, { rowId });\n }\n } else {\n base64 = readFileSync(resolvedPath).toString(\"base64\");\n }\n }\n\n return toolText(\n inline\n ? `Attachment ${rowId} (${sizeBytes}B, ${finalMime ?? \"?\"}) returned inline.`\n : `Attachment ${rowId} too large to inline (${sizeBytes}B > ${inlineMaxBytes}B). Use path: ${resolvedPath}`,\n {\n rowId,\n filename: rec.filename,\n resolvedPath: finalPath,\n mimeType: finalMime,\n totalBytes: sizeBytes,\n inline,\n base64,\n converted: convertedNote,\n },\n );\n }\n\n private async handleChatAnalytics(args: unknown) {\n const { type, windowDays } = ChatAnalyticsSchema.parse(args);\n // year_in_review pins to 365 days regardless of caller; otherwise use the\n // requested window.\n const effectiveDays = type === \"year_in_review_wrapped\" ? 365 : windowDays;\n const cutoffMs = Date.now() - effectiveDays * 86_400_000;\n\n // Cache lookup. Key includes effectiveDays + the DB's max message ROWID,\n // so a recent send/receive invalidates the cache.\n const maxRowId = this.db.getMaxMessageRowId();\n const cacheArgs = { type, windowDays: effectiveDays };\n const hit = lookupCache(type, cacheArgs, maxRowId);\n if (hit) {\n return toolText(`Cached ${type} (computed at ${new Date(hit.computedAt).toISOString()}).`, {\n type,\n windowDays: effectiveDays,\n computedAtIso: new Date(hit.computedAt).toISOString(),\n fromCache: true,\n data: hit.data,\n });\n }\n\n const messages = await this.db.getMessagesInWindow(cutoffMs);\n const result = dispatchAnalytic(type, messages);\n const computedAtIso = new Date().toISOString();\n storeCache(type, cacheArgs, maxRowId, result.data);\n\n return toolText(\n `Computed ${type} over ${messages.length} messages in the last ${effectiveDays}d.`,\n {\n type,\n windowDays: effectiveDays,\n computedAtIso,\n fromCache: false,\n data: result.data,\n },\n );\n }\n\n async run(): Promise<void> {\n // Install process lifecycle handlers\n installShutdownHandlers();\n registerCleanup(() => logShutdown(\"normal\"));\n registerCleanup(() => stopHeapMonitor());\n registerCleanup(() => this.db.close());\n enableStdinEofDetection();\n enableOrphanWatchdog();\n installWatchdog();\n logStartup(\"mcp-server\");\n\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n info(\"iMessage MCP Server running on stdio\");\n startHeapMonitor();\n console.error(`iMessage MCP Server running on stdio (logs: ${getLogDirectory()})`);\n }\n}\n\nexport async function runMcpServer(): Promise<void> {\n try {\n const server = new IMessageMCPServer();\n await server.run();\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n const report = await checkLocalAccess();\n console.error(\"\");\n console.error(formatAccessReport(report));\n await shutdown(1);\n }\n}\n"],"names":["ZodFirstPartyTypeKind","types","x","base"],"mappings":"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","x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]}