@mcp-z/mcp-gmail 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -3
- package/bin/server.js +1 -1
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/email/composition/rfc822-builder.js.map +1 -1
- package/dist/cjs/email/messages/fetch-message.js +7 -7
- package/dist/cjs/email/messages/fetch-message.js.map +1 -1
- package/dist/cjs/email/messages/messages.js +10 -10
- package/dist/cjs/email/messages/messages.js.map +1 -1
- package/dist/cjs/email/parsing/header-parsing.js +3 -3
- package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
- package/dist/cjs/email/parsing/headers-utils.js.map +1 -1
- package/dist/cjs/email/parsing/html-processing.js.map +1 -1
- package/dist/cjs/email/parsing/message-extraction.js +5 -5
- package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
- package/dist/cjs/email/querying/execute-query.js +2 -2
- package/dist/cjs/email/querying/execute-query.js.map +1 -1
- package/dist/cjs/email/querying/pagination.js.map +1 -1
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.js +4 -4
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/index.d.cts +4 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +21 -13
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/labels/gmail-labels.js.map +1 -1
- package/dist/cjs/lib/base64-encoding.js.map +1 -1
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/date-conversion.js.map +1 -1
- package/dist/cjs/lib/messages-to-row.js.map +1 -1
- package/dist/cjs/mcp/index.js +6 -6
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
- package/dist/cjs/mcp/prompts/index.js +4 -4
- package/dist/cjs/mcp/prompts/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/email.js +5 -5
- package/dist/cjs/mcp/resources/email.js.map +1 -1
- package/dist/cjs/mcp/resources/index.js +2 -2
- package/dist/cjs/mcp/resources/index.js.map +1 -1
- package/dist/cjs/mcp/tools/categories-list.d.cts +8 -2
- package/dist/cjs/mcp/tools/categories-list.d.ts +8 -2
- package/dist/cjs/mcp/tools/categories-list.js +12 -4
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
- package/dist/cjs/mcp/tools/index.js +22 -22
- package/dist/cjs/mcp/tools/index.js.map +1 -1
- package/dist/cjs/mcp/tools/label-add.js +2 -2
- package/dist/cjs/mcp/tools/label-add.js.map +1 -1
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.d.cts +8 -2
- package/dist/cjs/mcp/tools/labels-list.d.ts +8 -2
- package/dist/cjs/mcp/tools/labels-list.js +12 -4
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/mcp/tools/message-get.js +8 -8
- package/dist/cjs/mcp/tools/message-get.js.map +1 -1
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/message-respond.js +4 -4
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.js +6 -6
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/message-send.js +4 -4
- package/dist/cjs/mcp/tools/message-send.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.js +6 -6
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/cjs/schemas/gmail-query-schema.js.map +1 -1
- package/dist/cjs/schemas/index.js.map +1 -1
- package/dist/cjs/setup/config.js +11 -1
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js +6 -2
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/index.d.cts +1 -0
- package/dist/cjs/setup/index.d.ts +1 -0
- package/dist/cjs/setup/index.js +9 -9
- package/dist/cjs/setup/index.js.map +1 -1
- package/dist/cjs/setup/oauth-google.d.cts +3 -2
- package/dist/cjs/setup/oauth-google.d.ts +3 -2
- package/dist/cjs/setup/oauth-google.js +15 -12
- package/dist/cjs/setup/oauth-google.js.map +1 -1
- package/dist/cjs/setup/runtime.js +9 -9
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js +2 -2
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/email/composition/rfc822-builder.js.map +1 -1
- package/dist/esm/email/messages/fetch-message.js.map +1 -1
- package/dist/esm/email/messages/messages.js.map +1 -1
- package/dist/esm/email/parsing/header-parsing.js.map +1 -1
- package/dist/esm/email/parsing/headers-utils.js.map +1 -1
- package/dist/esm/email/parsing/html-processing.js.map +1 -1
- package/dist/esm/email/parsing/message-extraction.js.map +1 -1
- package/dist/esm/email/querying/execute-query.js.map +1 -1
- package/dist/esm/email/querying/pagination.js.map +1 -1
- package/dist/esm/email/querying/query-builder.js.map +1 -1
- package/dist/esm/email/querying/search-execution.js.map +1 -1
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/labels/gmail-labels.js.map +1 -1
- package/dist/esm/lib/base64-encoding.js.map +1 -1
- package/dist/esm/lib/create-store.js.map +1 -1
- package/dist/esm/lib/date-conversion.js.map +1 -1
- package/dist/esm/lib/messages-to-row.js.map +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
- package/dist/esm/mcp/prompts/index.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/email.js.map +1 -1
- package/dist/esm/mcp/resources/index.js.map +1 -1
- package/dist/esm/mcp/tools/categories-list.d.ts +8 -2
- package/dist/esm/mcp/tools/categories-list.js +4 -2
- package/dist/esm/mcp/tools/categories-list.js.map +1 -1
- package/dist/esm/mcp/tools/index.js.map +1 -1
- package/dist/esm/mcp/tools/label-add.js.map +1 -1
- package/dist/esm/mcp/tools/label-delete.js.map +1 -1
- package/dist/esm/mcp/tools/labels-list.d.ts +8 -2
- package/dist/esm/mcp/tools/labels-list.js +4 -2
- package/dist/esm/mcp/tools/labels-list.js.map +1 -1
- package/dist/esm/mcp/tools/message-get.js.map +1 -1
- package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/message-respond.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/mcp/tools/message-send.js.map +1 -1
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/esm/schemas/gmail-query-schema.js.map +1 -1
- package/dist/esm/schemas/index.js.map +1 -1
- package/dist/esm/setup/config.js +12 -2
- package/dist/esm/setup/config.js.map +1 -1
- package/dist/esm/setup/http.js +4 -0
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/index.d.ts +1 -0
- package/dist/esm/setup/index.js.map +1 -1
- package/dist/esm/setup/oauth-google.d.ts +3 -2
- package/dist/esm/setup/oauth-google.js +8 -11
- package/dist/esm/setup/oauth-google.js.map +1 -1
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/email/querying/query-builder.ts"],"sourcesContent":["import type { GmailQuery as QueryNode } from '../../schemas/gmail-query-schema.js';\n\n/**\n * Field operator interface for query filters\n */\nexport interface FieldOperator {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n}\n\n/**\n * Field query interface with support for all email fields including categories and labels\n */\nexport interface FieldQuery {\n from?: FieldOperator | string;\n to?: FieldOperator | string;\n cc?: FieldOperator | string;\n bcc?: FieldOperator | string;\n subject?: FieldOperator | string;\n text?: FieldOperator | string;\n body?: FieldOperator | string;\n categories?: FieldOperator | string;\n label?: FieldOperator | string;\n}\n\n/**\n * Filter extraction result with all collected values from a query\n */\nexport interface Filters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n categoriesIncludes?: string[];\n labelIncludes?: string[];\n hasAttachment?: boolean;\n since?: string;\n before?: string;\n}\n\n/**\n * Gmail category mappings - case insensitive input to exact system labels\n */\nconst GMAIL_CATEGORIES = {\n primary: 'CATEGORY_PERSONAL',\n social: 'CATEGORY_SOCIAL',\n promotions: 'CATEGORY_PROMOTIONS',\n updates: 'CATEGORY_UPDATES',\n forums: 'CATEGORY_FORUMS',\n} as const;\n\n/**\n * Validate and map category name to Gmail system label\n * Throws error for invalid categories (fail fast principle)\n */\nfunction mapCategoryToLabel(category: string): string {\n // Input validation - fail fast on invalid input\n if (!category || typeof category !== 'string') {\n throw new Error(`Invalid category: expected non-empty string, got ${typeof category}`);\n }\n\n const trimmed = category.trim();\n if (trimmed === '') {\n throw new Error('Invalid category: empty string after trimming');\n }\n\n // Fail fast on unknown categories\n const normalizedCategory = trimmed.toLowerCase();\n const systemLabel = GMAIL_CATEGORIES[normalizedCategory as keyof typeof GMAIL_CATEGORIES];\n\n if (!systemLabel) {\n throw new Error(`Invalid Gmail category: \"${category}\". Valid categories: ${Object.keys(GMAIL_CATEGORIES).join(', ')}`);\n }\n\n return systemLabel;\n}\n\nexport function toGmailQuery(query: QueryNode, options: { dateSlash?: boolean } = {}) {\n const slashDates = options.dateSlash !== false;\n const subjectIncludes: string[] = [];\n const bodyIncludes: string[] = [];\n const textIncludes: string[] = [];\n const fromIncludes: string[] = [];\n const toIncludes: string[] = [];\n const ccIncludes: string[] = [];\n const bccIncludes: string[] = [];\n const categoriesIncludes: string[] = [];\n const labelIncludes: string[] = [];\n let hasAttachment: boolean | undefined;\n\n function p(s: unknown) {\n return `(${String(s ?? '')})`;\n }\n function fmt(d: unknown) {\n const str = String(d ?? '');\n return slashDates ? str.replace(/-/g, '/') : str;\n }\n\n function fv(field: string, raw?: unknown) {\n const rawVal = String(raw ?? '');\n if (rawVal.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n const v = quote(rawVal);\n if (field === 'subject') subjectIncludes.push(rawVal);\n if (field === 'body') bodyIncludes.push(rawVal);\n if (field === 'text') {\n textIncludes.push(rawVal);\n bodyIncludes.push(rawVal);\n }\n if (field === 'from') fromIncludes.push(rawVal);\n if (field === 'to') toIncludes.push(rawVal);\n if (field === 'cc') ccIncludes.push(rawVal);\n if (field === 'bcc') bccIncludes.push(rawVal);\n if (field === 'categories') {\n const systemLabel = mapCategoryToLabel(rawVal);\n categoriesIncludes.push(rawVal);\n return `label:${systemLabel}`;\n }\n if (field === 'label') {\n // Direct passthrough to Gmail's label syntax (case-sensitive)\n labelIncludes.push(rawVal);\n return `label:${quote(rawVal)}`;\n }\n if (field === 'text' || field === 'body') return p(`subject:${v} OR ${v}`);\n return `${field}:${v}`;\n }\n\n function chain(op: 'AND' | 'OR', arr: string[]) {\n if (arr.length === 0) throw new Error(`chain: empty array for ${op} operation`);\n if (arr.length === 1) {\n const first = arr[0] ?? '';\n return first;\n }\n return p(arr.join(` ${op} `));\n }\n\n function fieldExpr(field: string, op: FieldOperator) {\n if (op.$any) {\n const results = op.$any.map((v: string) => fv(field, String(v ?? '')));\n return chain('OR', results);\n }\n if (op.$all) {\n const results = op.$all.map((v: string) => fv(field, String(v ?? '')));\n return chain('AND', results);\n }\n if (op.$none) {\n const results = op.$none.map((v: string) => fv(field, String(v ?? '')));\n return `NOT ${p(chain('OR', results))}`;\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: unknown) {\n const parts: string[] = [];\n if (d && typeof d === 'object' && '$gte' in d) {\n parts.push(`after:${fmt(d.$gte)}`);\n }\n if (d && typeof d === 'object' && '$lt' in d) {\n parts.push(`before:${fmt(d.$lt)}`);\n }\n return parts.length > 1 ? p(parts.join(' AND ')) : (parts[0] ?? '');\n }\n\n function fieldKeys() {\n return ['from', 'to', 'cc', 'bcc', 'subject', 'text', 'body', 'categories', 'label'];\n }\n\n function quote(s?: unknown) {\n const str = String(s ?? '');\n return /[\\s\"()]/.test(str) ? `\"${str.replace(/[\"\\\\]/g, (m) => `\\\\${m}`)}\"` : str;\n }\n\n function emit(n: unknown): string {\n if (!n || typeof n !== 'object') return '';\n\n if ('$and' in n && Array.isArray(n.$and)) {\n return p(n.$and.map(emit).join(' AND '));\n }\n if ('$or' in n && Array.isArray(n.$or)) {\n return p(n.$or.map(emit).join(' OR '));\n }\n if ('$not' in n) {\n return `NOT ${emit(n.$not)}`;\n }\n if ('hasAttachment' in n) {\n hasAttachment = true;\n return 'has:attachment';\n }\n if ('fuzzyPhrase' in n) {\n // Gmail fuzzy phrase matching using quoted strings\n // Example: { fuzzyPhrase: \"quarterly report\" } -> \"quarterly report\"\n return quote(n.fuzzyPhrase);\n }\n if ('date' in n) {\n return dateExpr(n.date);\n }\n\n // Handle empty objects\n const keys = Object.keys(n);\n if (keys.length === 0) return '';\n\n if (keys.length === 1) {\n const k = String(keys[0] ?? '');\n if (fieldKeys().includes(k)) {\n const op = (n as Record<string, unknown>)[k];\n // Handle string-only category queries properly (C2 fix)\n const normalizedOp: FieldOperator = typeof op === 'string' ? { $any: [op] } : (op ?? {});\n return fieldExpr(k, normalizedOp);\n }\n }\n throw new Error(`Unknown node: ${JSON.stringify(n)}`);\n }\n\n function emitTop(n: unknown): string {\n if (!n || typeof n !== 'object') return '';\n\n // Handle empty objects\n if (Object.keys(n).length === 0) return '';\n\n if ('$and' in n && Array.isArray(n.$and)) {\n return n.$and.map(emit).join(' ');\n }\n if ('$or' in n && Array.isArray(n.$or)) {\n return n.$or.map(emit).join(' OR ');\n }\n if ('$not' in n) {\n return `NOT ${emit(n.$not)}`;\n }\n if ('hasAttachment' in n) {\n hasAttachment = true;\n return 'has:attachment';\n }\n if ('fuzzyPhrase' in n) {\n // Gmail fuzzy phrase matching using quoted strings\n return quote(n.fuzzyPhrase);\n }\n if ('date' in n) {\n return dateExpr(n.date);\n }\n return emit(n);\n }\n\n const q = emitTop(query);\n const filters: Record<string, unknown> = {};\n if (subjectIncludes.length) filters.subjectIncludes = subjectIncludes;\n if (bodyIncludes.length) filters.bodyIncludes = bodyIncludes;\n if (textIncludes.length) filters.textIncludes = textIncludes;\n if (fromIncludes.length) filters.fromIncludes = fromIncludes;\n if (toIncludes.length) filters.toIncludes = toIncludes;\n if (ccIncludes.length) filters.ccIncludes = ccIncludes;\n if (bccIncludes.length) filters.bccIncludes = bccIncludes;\n if (categoriesIncludes.length) filters.categoriesIncludes = categoriesIncludes;\n if (labelIncludes.length) filters.labelIncludes = labelIncludes;\n if (typeof hasAttachment === 'boolean') filters.hasAttachment = hasAttachment;\n return { q: q ?? '', filters };\n}\n\nexport function extractFiltersFromParsed(parsed: QueryNode): Filters {\n const filters: Filters = {\n subjectIncludes: [],\n bodyIncludes: [],\n textIncludes: [],\n categoriesIncludes: [],\n labelIncludes: [],\n };\n\n function walk(node: unknown): void {\n if (!node || typeof node !== 'object') return;\n\n if ('$and' in node && Array.isArray(node.$and)) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && Array.isArray(node.$or)) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node) {\n walk(node.$not);\n return;\n }\n if ('hasAttachment' in node) {\n filters.hasAttachment = node.hasAttachment === true;\n return;\n }\n if ('date' in node) {\n const dateObj = node.date;\n if (dateObj && typeof dateObj === 'object') {\n if ('$gte' in dateObj) {\n filters.since = String(dateObj.$gte);\n }\n if ('$lt' in dateObj) {\n filters.before = String(dateObj.$lt);\n }\n }\n return;\n }\n\n const keys = Object.keys(node || {});\n for (const k of keys) {\n const v = (node as Record<string, unknown>)[k];\n if (!v || typeof v !== 'object') continue;\n\n if (k === 'subject') {\n if ('$any' in v && Array.isArray(v.$any)) filters.subjectIncludes?.push(...v.$any);\n if ('$all' in v && Array.isArray(v.$all)) filters.subjectIncludes?.push(...v.$all);\n if ('$none' in v && Array.isArray(v.$none)) filters.subjectIncludes?.push(...v.$none);\n } else if (k === 'body') {\n if ('$any' in v && Array.isArray(v.$any)) filters.bodyIncludes?.push(...v.$any);\n if ('$all' in v && Array.isArray(v.$all)) filters.bodyIncludes?.push(...v.$all);\n if ('$none' in v && Array.isArray(v.$none)) filters.bodyIncludes?.push(...v.$none);\n } else if (k === 'text') {\n if ('$any' in v && Array.isArray(v.$any)) filters.textIncludes?.push(...v.$any);\n if ('$all' in v && Array.isArray(v.$all)) filters.textIncludes?.push(...v.$all);\n if ('$none' in v && Array.isArray(v.$none)) filters.textIncludes?.push(...v.$none);\n } else if (k === 'categories') {\n // Validate all categories (will throw on invalid)\n if ('$any' in v && Array.isArray(v.$any)) {\n v.$any.forEach((cat: unknown) => {\n mapCategoryToLabel(String(cat));\n });\n filters.categoriesIncludes?.push(...v.$any.map(String));\n }\n if ('$all' in v && Array.isArray(v.$all)) {\n v.$all.forEach((cat: unknown) => {\n mapCategoryToLabel(String(cat));\n });\n filters.categoriesIncludes?.push(...v.$all.map(String));\n }\n if ('$none' in v && Array.isArray(v.$none)) {\n v.$none.forEach((cat: unknown) => {\n mapCategoryToLabel(String(cat));\n });\n filters.categoriesIncludes?.push(...v.$none.map(String));\n }\n } else if (k === 'label') {\n // Direct passthrough for labels (case-sensitive)\n if ('$any' in v && Array.isArray(v.$any)) filters.labelIncludes?.push(...v.$any.map(String));\n if ('$all' in v && Array.isArray(v.$all)) filters.labelIncludes?.push(...v.$all.map(String));\n if ('$none' in v && Array.isArray(v.$none)) filters.labelIncludes?.push(...v.$none.map(String));\n }\n }\n }\n walk(parsed);\n return filters;\n}\n"],"names":["extractFiltersFromParsed","toGmailQuery","GMAIL_CATEGORIES","primary","social","promotions","updates","forums","mapCategoryToLabel","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemLabel","Object","keys","join","query","options","slashDates","dateSlash","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","hasAttachment","p","s","String","fmt","d","str","replace","fv","field","raw","rawVal","v","quote","push","chain","op","arr","length","first","fieldExpr","$any","results","map","$all","$none","JSON","stringify","dateExpr","parts","$gte","$lt","fieldKeys","test","m","emit","n","Array","isArray","$and","$or","$not","fuzzyPhrase","date","k","includes","normalizedOp","emitTop","q","filters","parsed","walk","node","forEach","dateObj","since","before","cat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/querying/query-builder.ts"],"sourcesContent":["import type { GmailQuery as QueryNode } from '../../schemas/gmail-query-schema.ts';\n\n/**\n * Field operator interface for query filters\n */\nexport interface FieldOperator {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n}\n\n/**\n * Field query interface with support for all email fields including categories and labels\n */\nexport interface FieldQuery {\n from?: FieldOperator | string;\n to?: FieldOperator | string;\n cc?: FieldOperator | string;\n bcc?: FieldOperator | string;\n subject?: FieldOperator | string;\n text?: FieldOperator | string;\n body?: FieldOperator | string;\n categories?: FieldOperator | string;\n label?: FieldOperator | string;\n}\n\n/**\n * Filter extraction result with all collected values from a query\n */\nexport interface Filters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n categoriesIncludes?: string[];\n labelIncludes?: string[];\n hasAttachment?: boolean;\n since?: string;\n before?: string;\n}\n\n/**\n * Gmail category mappings - case insensitive input to exact system labels\n */\nconst GMAIL_CATEGORIES = {\n primary: 'CATEGORY_PERSONAL',\n social: 'CATEGORY_SOCIAL',\n promotions: 'CATEGORY_PROMOTIONS',\n updates: 'CATEGORY_UPDATES',\n forums: 'CATEGORY_FORUMS',\n} as const;\n\n/**\n * Validate and map category name to Gmail system label\n * Throws error for invalid categories (fail fast principle)\n */\nfunction mapCategoryToLabel(category: string): string {\n // Input validation - fail fast on invalid input\n if (!category || typeof category !== 'string') {\n throw new Error(`Invalid category: expected non-empty string, got ${typeof category}`);\n }\n\n const trimmed = category.trim();\n if (trimmed === '') {\n throw new Error('Invalid category: empty string after trimming');\n }\n\n // Fail fast on unknown categories\n const normalizedCategory = trimmed.toLowerCase();\n const systemLabel = GMAIL_CATEGORIES[normalizedCategory as keyof typeof GMAIL_CATEGORIES];\n\n if (!systemLabel) {\n throw new Error(`Invalid Gmail category: \"${category}\". Valid categories: ${Object.keys(GMAIL_CATEGORIES).join(', ')}`);\n }\n\n return systemLabel;\n}\n\nexport function toGmailQuery(query: QueryNode, options: { dateSlash?: boolean } = {}) {\n const slashDates = options.dateSlash !== false;\n const subjectIncludes: string[] = [];\n const bodyIncludes: string[] = [];\n const textIncludes: string[] = [];\n const fromIncludes: string[] = [];\n const toIncludes: string[] = [];\n const ccIncludes: string[] = [];\n const bccIncludes: string[] = [];\n const categoriesIncludes: string[] = [];\n const labelIncludes: string[] = [];\n let hasAttachment: boolean | undefined;\n\n function p(s: unknown) {\n return `(${String(s ?? '')})`;\n }\n function fmt(d: unknown) {\n const str = String(d ?? '');\n return slashDates ? str.replace(/-/g, '/') : str;\n }\n\n function fv(field: string, raw?: unknown) {\n const rawVal = String(raw ?? '');\n if (rawVal.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n const v = quote(rawVal);\n if (field === 'subject') subjectIncludes.push(rawVal);\n if (field === 'body') bodyIncludes.push(rawVal);\n if (field === 'text') {\n textIncludes.push(rawVal);\n bodyIncludes.push(rawVal);\n }\n if (field === 'from') fromIncludes.push(rawVal);\n if (field === 'to') toIncludes.push(rawVal);\n if (field === 'cc') ccIncludes.push(rawVal);\n if (field === 'bcc') bccIncludes.push(rawVal);\n if (field === 'categories') {\n const systemLabel = mapCategoryToLabel(rawVal);\n categoriesIncludes.push(rawVal);\n return `label:${systemLabel}`;\n }\n if (field === 'label') {\n // Direct passthrough to Gmail's label syntax (case-sensitive)\n labelIncludes.push(rawVal);\n return `label:${quote(rawVal)}`;\n }\n if (field === 'text' || field === 'body') return p(`subject:${v} OR ${v}`);\n return `${field}:${v}`;\n }\n\n function chain(op: 'AND' | 'OR', arr: string[]) {\n if (arr.length === 0) throw new Error(`chain: empty array for ${op} operation`);\n if (arr.length === 1) {\n const first = arr[0] ?? '';\n return first;\n }\n return p(arr.join(` ${op} `));\n }\n\n function fieldExpr(field: string, op: FieldOperator) {\n if (op.$any) {\n const results = op.$any.map((v: string) => fv(field, String(v ?? '')));\n return chain('OR', results);\n }\n if (op.$all) {\n const results = op.$all.map((v: string) => fv(field, String(v ?? '')));\n return chain('AND', results);\n }\n if (op.$none) {\n const results = op.$none.map((v: string) => fv(field, String(v ?? '')));\n return `NOT ${p(chain('OR', results))}`;\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: unknown) {\n const parts: string[] = [];\n if (d && typeof d === 'object' && '$gte' in d) {\n parts.push(`after:${fmt(d.$gte)}`);\n }\n if (d && typeof d === 'object' && '$lt' in d) {\n parts.push(`before:${fmt(d.$lt)}`);\n }\n return parts.length > 1 ? p(parts.join(' AND ')) : (parts[0] ?? '');\n }\n\n function fieldKeys() {\n return ['from', 'to', 'cc', 'bcc', 'subject', 'text', 'body', 'categories', 'label'];\n }\n\n function quote(s?: unknown) {\n const str = String(s ?? '');\n return /[\\s\"()]/.test(str) ? `\"${str.replace(/[\"\\\\]/g, (m) => `\\\\${m}`)}\"` : str;\n }\n\n function emit(n: unknown): string {\n if (!n || typeof n !== 'object') return '';\n\n if ('$and' in n && Array.isArray(n.$and)) {\n return p(n.$and.map(emit).join(' AND '));\n }\n if ('$or' in n && Array.isArray(n.$or)) {\n return p(n.$or.map(emit).join(' OR '));\n }\n if ('$not' in n) {\n return `NOT ${emit(n.$not)}`;\n }\n if ('hasAttachment' in n) {\n hasAttachment = true;\n return 'has:attachment';\n }\n if ('fuzzyPhrase' in n) {\n // Gmail fuzzy phrase matching using quoted strings\n // Example: { fuzzyPhrase: \"quarterly report\" } -> \"quarterly report\"\n return quote(n.fuzzyPhrase);\n }\n if ('date' in n) {\n return dateExpr(n.date);\n }\n\n // Handle empty objects\n const keys = Object.keys(n);\n if (keys.length === 0) return '';\n\n if (keys.length === 1) {\n const k = String(keys[0] ?? '');\n if (fieldKeys().includes(k)) {\n const op = (n as Record<string, unknown>)[k];\n // Handle string-only category queries properly (C2 fix)\n const normalizedOp: FieldOperator = typeof op === 'string' ? { $any: [op] } : (op ?? {});\n return fieldExpr(k, normalizedOp);\n }\n }\n throw new Error(`Unknown node: ${JSON.stringify(n)}`);\n }\n\n function emitTop(n: unknown): string {\n if (!n || typeof n !== 'object') return '';\n\n // Handle empty objects\n if (Object.keys(n).length === 0) return '';\n\n if ('$and' in n && Array.isArray(n.$and)) {\n return n.$and.map(emit).join(' ');\n }\n if ('$or' in n && Array.isArray(n.$or)) {\n return n.$or.map(emit).join(' OR ');\n }\n if ('$not' in n) {\n return `NOT ${emit(n.$not)}`;\n }\n if ('hasAttachment' in n) {\n hasAttachment = true;\n return 'has:attachment';\n }\n if ('fuzzyPhrase' in n) {\n // Gmail fuzzy phrase matching using quoted strings\n return quote(n.fuzzyPhrase);\n }\n if ('date' in n) {\n return dateExpr(n.date);\n }\n return emit(n);\n }\n\n const q = emitTop(query);\n const filters: Record<string, unknown> = {};\n if (subjectIncludes.length) filters.subjectIncludes = subjectIncludes;\n if (bodyIncludes.length) filters.bodyIncludes = bodyIncludes;\n if (textIncludes.length) filters.textIncludes = textIncludes;\n if (fromIncludes.length) filters.fromIncludes = fromIncludes;\n if (toIncludes.length) filters.toIncludes = toIncludes;\n if (ccIncludes.length) filters.ccIncludes = ccIncludes;\n if (bccIncludes.length) filters.bccIncludes = bccIncludes;\n if (categoriesIncludes.length) filters.categoriesIncludes = categoriesIncludes;\n if (labelIncludes.length) filters.labelIncludes = labelIncludes;\n if (typeof hasAttachment === 'boolean') filters.hasAttachment = hasAttachment;\n return { q: q ?? '', filters };\n}\n\nexport function extractFiltersFromParsed(parsed: QueryNode): Filters {\n const filters: Filters = {\n subjectIncludes: [],\n bodyIncludes: [],\n textIncludes: [],\n categoriesIncludes: [],\n labelIncludes: [],\n };\n\n function walk(node: unknown): void {\n if (!node || typeof node !== 'object') return;\n\n if ('$and' in node && Array.isArray(node.$and)) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && Array.isArray(node.$or)) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node) {\n walk(node.$not);\n return;\n }\n if ('hasAttachment' in node) {\n filters.hasAttachment = node.hasAttachment === true;\n return;\n }\n if ('date' in node) {\n const dateObj = node.date;\n if (dateObj && typeof dateObj === 'object') {\n if ('$gte' in dateObj) {\n filters.since = String(dateObj.$gte);\n }\n if ('$lt' in dateObj) {\n filters.before = String(dateObj.$lt);\n }\n }\n return;\n }\n\n const keys = Object.keys(node || {});\n for (const k of keys) {\n const v = (node as Record<string, unknown>)[k];\n if (!v || typeof v !== 'object') continue;\n\n if (k === 'subject') {\n if ('$any' in v && Array.isArray(v.$any)) filters.subjectIncludes?.push(...v.$any);\n if ('$all' in v && Array.isArray(v.$all)) filters.subjectIncludes?.push(...v.$all);\n if ('$none' in v && Array.isArray(v.$none)) filters.subjectIncludes?.push(...v.$none);\n } else if (k === 'body') {\n if ('$any' in v && Array.isArray(v.$any)) filters.bodyIncludes?.push(...v.$any);\n if ('$all' in v && Array.isArray(v.$all)) filters.bodyIncludes?.push(...v.$all);\n if ('$none' in v && Array.isArray(v.$none)) filters.bodyIncludes?.push(...v.$none);\n } else if (k === 'text') {\n if ('$any' in v && Array.isArray(v.$any)) filters.textIncludes?.push(...v.$any);\n if ('$all' in v && Array.isArray(v.$all)) filters.textIncludes?.push(...v.$all);\n if ('$none' in v && Array.isArray(v.$none)) filters.textIncludes?.push(...v.$none);\n } else if (k === 'categories') {\n // Validate all categories (will throw on invalid)\n if ('$any' in v && Array.isArray(v.$any)) {\n v.$any.forEach((cat: unknown) => {\n mapCategoryToLabel(String(cat));\n });\n filters.categoriesIncludes?.push(...v.$any.map(String));\n }\n if ('$all' in v && Array.isArray(v.$all)) {\n v.$all.forEach((cat: unknown) => {\n mapCategoryToLabel(String(cat));\n });\n filters.categoriesIncludes?.push(...v.$all.map(String));\n }\n if ('$none' in v && Array.isArray(v.$none)) {\n v.$none.forEach((cat: unknown) => {\n mapCategoryToLabel(String(cat));\n });\n filters.categoriesIncludes?.push(...v.$none.map(String));\n }\n } else if (k === 'label') {\n // Direct passthrough for labels (case-sensitive)\n if ('$any' in v && Array.isArray(v.$any)) filters.labelIncludes?.push(...v.$any.map(String));\n if ('$all' in v && Array.isArray(v.$all)) filters.labelIncludes?.push(...v.$all.map(String));\n if ('$none' in v && Array.isArray(v.$none)) filters.labelIncludes?.push(...v.$none.map(String));\n }\n }\n }\n walk(parsed);\n return filters;\n}\n"],"names":["extractFiltersFromParsed","toGmailQuery","GMAIL_CATEGORIES","primary","social","promotions","updates","forums","mapCategoryToLabel","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemLabel","Object","keys","join","query","options","slashDates","dateSlash","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","hasAttachment","p","s","String","fmt","d","str","replace","fv","field","raw","rawVal","v","quote","push","chain","op","arr","length","first","fieldExpr","$any","results","map","$all","$none","JSON","stringify","dateExpr","parts","$gte","$lt","fieldKeys","test","m","emit","n","Array","isArray","$and","$or","$not","fuzzyPhrase","date","k","includes","normalizedOp","emitTop","q","filters","parsed","walk","node","forEach","dateObj","since","before","cat"],"mappings":";;;;;;;;;;;QAsQgBA;eAAAA;;QArLAC;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AArChB;;CAEC,GACD,IAAMC,mBAAmB;IACvBC,SAAS;IACTC,QAAQ;IACRC,YAAY;IACZC,SAAS;IACTC,QAAQ;AACV;AAEA;;;CAGC,GACD,SAASC,mBAAmBC,QAAgB;IAC1C,gDAAgD;IAChD,IAAI,CAACA,YAAY,OAAOA,aAAa,UAAU;QAC7C,MAAM,IAAIC,MAAM,AAAC,oDAAmE,OAAhB,OAAOD,yCAAP,SAAOA;IAC7E;IAEA,IAAME,UAAUF,SAASG,IAAI;IAC7B,IAAID,YAAY,IAAI;QAClB,MAAM,IAAID,MAAM;IAClB;IAEA,kCAAkC;IAClC,IAAMG,qBAAqBF,QAAQG,WAAW;IAC9C,IAAMC,cAAcb,gBAAgB,CAACW,mBAAoD;IAEzF,IAAI,CAACE,aAAa;QAChB,MAAM,IAAIL,MAAM,AAAC,4BAA2DM,OAAhCP,UAAS,yBAAgE,OAAzCO,OAAOC,IAAI,CAACf,kBAAkBgB,IAAI,CAAC;IACjH;IAEA,OAAOH;AACT;AAEO,SAASd,aAAakB,KAAgB;QAAEC,UAAAA,iEAAmC,CAAC;IACjF,IAAMC,aAAaD,QAAQE,SAAS,KAAK;IACzC,IAAMC,kBAA4B,EAAE;IACpC,IAAMC,eAAyB,EAAE;IACjC,IAAMC,eAAyB,EAAE;IACjC,IAAMC,eAAyB,EAAE;IACjC,IAAMC,aAAuB,EAAE;IAC/B,IAAMC,aAAuB,EAAE;IAC/B,IAAMC,cAAwB,EAAE;IAChC,IAAMC,qBAA+B,EAAE;IACvC,IAAMC,gBAA0B,EAAE;IAClC,IAAIC;IAEJ,SAASC,EAAEC,CAAU;QACnB,OAAO,AAAC,IAAmB,OAAhBC,OAAOD,cAAAA,eAAAA,IAAK,KAAI;IAC7B;IACA,SAASE,IAAIC,CAAU;QACrB,IAAMC,MAAMH,OAAOE,cAAAA,eAAAA,IAAK;QACxB,OAAOhB,aAAaiB,IAAIC,OAAO,CAAC,MAAM,OAAOD;IAC/C;IAEA,SAASE,GAAGC,KAAa,EAAEC,GAAa;QACtC,IAAMC,SAASR,OAAOO,gBAAAA,iBAAAA,MAAO;QAC7B,IAAIC,OAAO/B,IAAI,OAAO,IAAI;YACxB,MAAM,IAAIF,MAAM,AAAC,WAAgB,OAAN+B,OAAM;QACnC;QACA,IAAMG,IAAIC,MAAMF;QAChB,IAAIF,UAAU,WAAWlB,gBAAgBuB,IAAI,CAACH;QAC9C,IAAIF,UAAU,QAAQjB,aAAasB,IAAI,CAACH;QACxC,IAAIF,UAAU,QAAQ;YACpBhB,aAAaqB,IAAI,CAACH;YAClBnB,aAAasB,IAAI,CAACH;QACpB;QACA,IAAIF,UAAU,QAAQf,aAAaoB,IAAI,CAACH;QACxC,IAAIF,UAAU,MAAMd,WAAWmB,IAAI,CAACH;QACpC,IAAIF,UAAU,MAAMb,WAAWkB,IAAI,CAACH;QACpC,IAAIF,UAAU,OAAOZ,YAAYiB,IAAI,CAACH;QACtC,IAAIF,UAAU,cAAc;YAC1B,IAAM1B,cAAcP,mBAAmBmC;YACvCb,mBAAmBgB,IAAI,CAACH;YACxB,OAAO,AAAC,SAAoB,OAAZ5B;QAClB;QACA,IAAI0B,UAAU,SAAS;YACrB,8DAA8D;YAC9DV,cAAce,IAAI,CAACH;YACnB,OAAO,AAAC,SAAsB,OAAdE,MAAMF;QACxB;QACA,IAAIF,UAAU,UAAUA,UAAU,QAAQ,OAAOR,EAAE,AAAC,WAAkBW,OAARA,GAAE,QAAQ,OAAFA;QACtE,OAAO,AAAC,GAAWA,OAATH,OAAM,KAAK,OAAFG;IACrB;IAEA,SAASG,MAAMC,EAAgB,EAAEC,GAAa;QAC5C,IAAIA,IAAIC,MAAM,KAAK,GAAG,MAAM,IAAIxC,MAAM,AAAC,0BAA4B,OAAHsC,IAAG;QACnE,IAAIC,IAAIC,MAAM,KAAK,GAAG;gBACND;YAAd,IAAME,SAAQF,QAAAA,GAAG,CAAC,EAAE,cAANA,mBAAAA,QAAU;YACxB,OAAOE;QACT;QACA,OAAOlB,EAAEgB,IAAI/B,IAAI,CAAC,AAAC,IAAM,OAAH8B,IAAG;IAC3B;IAEA,SAASI,UAAUX,KAAa,EAAEO,EAAiB;QACjD,IAAIA,GAAGK,IAAI,EAAE;YACX,IAAMC,UAAUN,GAAGK,IAAI,CAACE,GAAG,CAAC,SAACX;uBAAcJ,GAAGC,OAAON,OAAOS,cAAAA,eAAAA,IAAK;;YACjE,OAAOG,MAAM,MAAMO;QACrB;QACA,IAAIN,GAAGQ,IAAI,EAAE;YACX,IAAMF,WAAUN,GAAGQ,IAAI,CAACD,GAAG,CAAC,SAACX;uBAAcJ,GAAGC,OAAON,OAAOS,cAAAA,eAAAA,IAAK;;YACjE,OAAOG,MAAM,OAAOO;QACtB;QACA,IAAIN,GAAGS,KAAK,EAAE;YACZ,IAAMH,WAAUN,GAAGS,KAAK,CAACF,GAAG,CAAC,SAACX;uBAAcJ,GAAGC,OAAON,OAAOS,cAAAA,eAAAA,IAAK;;YAClE,OAAO,AAAC,OAA8B,OAAxBX,EAAEc,MAAM,MAAMO;QAC9B;QACA,MAAM,IAAI5C,MAAM,AAAC,0BAA4C,OAAnBgD,KAAKC,SAAS,CAACX;IAC3D;IAEA,SAASY,SAASvB,CAAU;YAQ0BwB;QAPpD,IAAMA,QAAkB,EAAE;QAC1B,IAAIxB,KAAK,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,YAAY,UAAUA,GAAG;YAC7CwB,MAAMf,IAAI,CAAC,AAAC,SAAoB,OAAZV,IAAIC,EAAEyB,IAAI;QAChC;QACA,IAAIzB,KAAK,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,YAAY,SAASA,GAAG;YAC5CwB,MAAMf,IAAI,CAAC,AAAC,UAAoB,OAAXV,IAAIC,EAAE0B,GAAG;QAChC;QACA,OAAOF,MAAMX,MAAM,GAAG,IAAIjB,EAAE4B,MAAM3C,IAAI,CAAC,aAAa2C,UAAAA,KAAK,CAAC,EAAE,cAARA,qBAAAA,UAAY;IAClE;IAEA,SAASG;QACP,OAAO;YAAC;YAAQ;YAAM;YAAM;YAAO;YAAW;YAAQ;YAAQ;YAAc;SAAQ;IACtF;IAEA,SAASnB,MAAMX,CAAW;QACxB,IAAMI,MAAMH,OAAOD,cAAAA,eAAAA,IAAK;QACxB,OAAO,UAAU+B,IAAI,CAAC3B,OAAO,AAAC,IAA0C,OAAvCA,IAAIC,OAAO,CAAC,UAAU,SAAC2B;mBAAM,AAAC,KAAM,OAAFA;YAAK,OAAK5B;IAC/E;IAEA,SAAS6B,KAAKC,CAAU;QACtB,IAAI,CAACA,KAAK,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,UAAU,OAAO;QAExC,IAAI,UAAUA,KAAKC,MAAMC,OAAO,CAACF,EAAEG,IAAI,GAAG;YACxC,OAAOtC,EAAEmC,EAAEG,IAAI,CAAChB,GAAG,CAACY,MAAMjD,IAAI,CAAC;QACjC;QACA,IAAI,SAASkD,KAAKC,MAAMC,OAAO,CAACF,EAAEI,GAAG,GAAG;YACtC,OAAOvC,EAAEmC,EAAEI,GAAG,CAACjB,GAAG,CAACY,MAAMjD,IAAI,CAAC;QAChC;QACA,IAAI,UAAUkD,GAAG;YACf,OAAO,AAAC,OAAmB,OAAbD,KAAKC,EAAEK,IAAI;QAC3B;QACA,IAAI,mBAAmBL,GAAG;YACxBpC,gBAAgB;YAChB,OAAO;QACT;QACA,IAAI,iBAAiBoC,GAAG;YACtB,mDAAmD;YACnD,qEAAqE;YACrE,OAAOvB,MAAMuB,EAAEM,WAAW;QAC5B;QACA,IAAI,UAAUN,GAAG;YACf,OAAOR,SAASQ,EAAEO,IAAI;QACxB;QAEA,uBAAuB;QACvB,IAAM1D,OAAOD,OAAOC,IAAI,CAACmD;QACzB,IAAInD,KAAKiC,MAAM,KAAK,GAAG,OAAO;QAE9B,IAAIjC,KAAKiC,MAAM,KAAK,GAAG;gBACJjC;YAAjB,IAAM2D,IAAIzC,QAAOlB,SAAAA,IAAI,CAAC,EAAE,cAAPA,oBAAAA,SAAW;YAC5B,IAAI+C,YAAYa,QAAQ,CAACD,IAAI;gBAC3B,IAAM5B,KAAK,AAACoB,CAA6B,CAACQ,EAAE;gBAC5C,wDAAwD;gBACxD,IAAME,eAA8B,OAAO9B,OAAO,WAAW;oBAAEK,MAAM;wBAACL;qBAAG;gBAAC,IAAKA,eAAAA,gBAAAA,KAAM,CAAC;gBACtF,OAAOI,UAAUwB,GAAGE;YACtB;QACF;QACA,MAAM,IAAIpE,MAAM,AAAC,iBAAkC,OAAlBgD,KAAKC,SAAS,CAACS;IAClD;IAEA,SAASW,QAAQX,CAAU;QACzB,IAAI,CAACA,KAAK,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,UAAU,OAAO;QAExC,uBAAuB;QACvB,IAAIpD,OAAOC,IAAI,CAACmD,GAAGlB,MAAM,KAAK,GAAG,OAAO;QAExC,IAAI,UAAUkB,KAAKC,MAAMC,OAAO,CAACF,EAAEG,IAAI,GAAG;YACxC,OAAOH,EAAEG,IAAI,CAAChB,GAAG,CAACY,MAAMjD,IAAI,CAAC;QAC/B;QACA,IAAI,SAASkD,KAAKC,MAAMC,OAAO,CAACF,EAAEI,GAAG,GAAG;YACtC,OAAOJ,EAAEI,GAAG,CAACjB,GAAG,CAACY,MAAMjD,IAAI,CAAC;QAC9B;QACA,IAAI,UAAUkD,GAAG;YACf,OAAO,AAAC,OAAmB,OAAbD,KAAKC,EAAEK,IAAI;QAC3B;QACA,IAAI,mBAAmBL,GAAG;YACxBpC,gBAAgB;YAChB,OAAO;QACT;QACA,IAAI,iBAAiBoC,GAAG;YACtB,mDAAmD;YACnD,OAAOvB,MAAMuB,EAAEM,WAAW;QAC5B;QACA,IAAI,UAAUN,GAAG;YACf,OAAOR,SAASQ,EAAEO,IAAI;QACxB;QACA,OAAOR,KAAKC;IACd;IAEA,IAAMY,IAAID,QAAQ5D;IAClB,IAAM8D,UAAmC,CAAC;IAC1C,IAAI1D,gBAAgB2B,MAAM,EAAE+B,QAAQ1D,eAAe,GAAGA;IACtD,IAAIC,aAAa0B,MAAM,EAAE+B,QAAQzD,YAAY,GAAGA;IAChD,IAAIC,aAAayB,MAAM,EAAE+B,QAAQxD,YAAY,GAAGA;IAChD,IAAIC,aAAawB,MAAM,EAAE+B,QAAQvD,YAAY,GAAGA;IAChD,IAAIC,WAAWuB,MAAM,EAAE+B,QAAQtD,UAAU,GAAGA;IAC5C,IAAIC,WAAWsB,MAAM,EAAE+B,QAAQrD,UAAU,GAAGA;IAC5C,IAAIC,YAAYqB,MAAM,EAAE+B,QAAQpD,WAAW,GAAGA;IAC9C,IAAIC,mBAAmBoB,MAAM,EAAE+B,QAAQnD,kBAAkB,GAAGA;IAC5D,IAAIC,cAAcmB,MAAM,EAAE+B,QAAQlD,aAAa,GAAGA;IAClD,IAAI,OAAOC,kBAAkB,WAAWiD,QAAQjD,aAAa,GAAGA;IAChE,OAAO;QAAEgD,CAAC,EAAEA,cAAAA,eAAAA,IAAK;QAAIC,SAAAA;IAAQ;AAC/B;AAEO,SAASjF,yBAAyBkF,MAAiB;IACxD,IAAMD,UAAmB;QACvB1D,iBAAiB,EAAE;QACnBC,cAAc,EAAE;QAChBC,cAAc,EAAE;QAChBK,oBAAoB,EAAE;QACtBC,eAAe,EAAE;IACnB;IAEA,SAASoD,KAAKC,IAAa;QACzB,IAAI,CAACA,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,UAAU;QAEvC,IAAI,UAAUA,QAAQf,MAAMC,OAAO,CAACc,KAAKb,IAAI,GAAG;YAC9Ca,KAAKb,IAAI,CAACc,OAAO,CAACF;YAClB;QACF;QACA,IAAI,SAASC,QAAQf,MAAMC,OAAO,CAACc,KAAKZ,GAAG,GAAG;YAC5CY,KAAKZ,GAAG,CAACa,OAAO,CAACF;YACjB;QACF;QACA,IAAI,UAAUC,MAAM;YAClBD,KAAKC,KAAKX,IAAI;YACd;QACF;QACA,IAAI,mBAAmBW,MAAM;YAC3BH,QAAQjD,aAAa,GAAGoD,KAAKpD,aAAa,KAAK;YAC/C;QACF;QACA,IAAI,UAAUoD,MAAM;YAClB,IAAME,UAAUF,KAAKT,IAAI;YACzB,IAAIW,WAAW,CAAA,OAAOA,wCAAP,SAAOA,QAAM,MAAM,UAAU;gBAC1C,IAAI,UAAUA,SAAS;oBACrBL,QAAQM,KAAK,GAAGpD,OAAOmD,QAAQxB,IAAI;gBACrC;gBACA,IAAI,SAASwB,SAAS;oBACpBL,QAAQO,MAAM,GAAGrD,OAAOmD,QAAQvB,GAAG;gBACrC;YACF;YACA;QACF;QAEA,IAAM9C,OAAOD,OAAOC,IAAI,CAACmE,QAAQ,CAAC;YAC7B,kCAAA,2BAAA;;YAAL,QAAK,YAAWnE,yBAAX,SAAA,6BAAA,QAAA,yBAAA,iCAAiB;gBAAjB,IAAM2D,IAAN;gBACH,IAAMhC,IAAI,AAACwC,IAAgC,CAACR,EAAE;gBAC9C,IAAI,CAAChC,KAAK,CAAA,OAAOA,kCAAP,SAAOA,EAAAA,MAAM,UAAU;gBAEjC,IAAIgC,MAAM,WAAW;wBACuBK,0BACAA,2BACEA;wBAFFA,2BACAA,2BACEA;oBAF5C,IAAI,UAAUrC,KAAKyB,MAAMC,OAAO,CAAC1B,EAAES,IAAI,IAAG4B,4BAAAA,QAAQ1D,eAAe,cAAvB0D,gDAAAA,CAAAA,2BAAAA,2BAAyBnC,IAAI,OAA7BmC,0BAA8B,qBAAGrC,EAAES,IAAI;oBACjF,IAAI,UAAUT,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEY,IAAI,IAAGyB,4BAAAA,QAAQ1D,eAAe,cAAvB0D,gDAAAA,CAAAA,4BAAAA,2BAAyBnC,IAAI,OAA7BmC,2BAA8B,qBAAGrC,EAAEY,IAAI;oBACjF,IAAI,WAAWZ,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEa,KAAK,IAAGwB,4BAAAA,QAAQ1D,eAAe,cAAvB0D,gDAAAA,CAAAA,4BAAAA,2BAAyBnC,IAAI,OAA7BmC,2BAA8B,qBAAGrC,EAAEa,KAAK;gBACtF,OAAO,IAAImB,MAAM,QAAQ;wBACmBK,uBACAA,wBACEA;wBAFFA,wBACAA,wBACEA;oBAF5C,IAAI,UAAUrC,KAAKyB,MAAMC,OAAO,CAAC1B,EAAES,IAAI,IAAG4B,yBAAAA,QAAQzD,YAAY,cAApByD,6CAAAA,CAAAA,wBAAAA,wBAAsBnC,IAAI,OAA1BmC,uBAA2B,qBAAGrC,EAAES,IAAI;oBAC9E,IAAI,UAAUT,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEY,IAAI,IAAGyB,yBAAAA,QAAQzD,YAAY,cAApByD,6CAAAA,CAAAA,yBAAAA,wBAAsBnC,IAAI,OAA1BmC,wBAA2B,qBAAGrC,EAAEY,IAAI;oBAC9E,IAAI,WAAWZ,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEa,KAAK,IAAGwB,yBAAAA,QAAQzD,YAAY,cAApByD,6CAAAA,CAAAA,yBAAAA,wBAAsBnC,IAAI,OAA1BmC,wBAA2B,qBAAGrC,EAAEa,KAAK;gBACnF,OAAO,IAAImB,MAAM,QAAQ;wBACmBK,uBACAA,wBACEA;wBAFFA,wBACAA,wBACEA;oBAF5C,IAAI,UAAUrC,KAAKyB,MAAMC,OAAO,CAAC1B,EAAES,IAAI,IAAG4B,yBAAAA,QAAQxD,YAAY,cAApBwD,6CAAAA,CAAAA,wBAAAA,wBAAsBnC,IAAI,OAA1BmC,uBAA2B,qBAAGrC,EAAES,IAAI;oBAC9E,IAAI,UAAUT,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEY,IAAI,IAAGyB,yBAAAA,QAAQxD,YAAY,cAApBwD,6CAAAA,CAAAA,yBAAAA,wBAAsBnC,IAAI,OAA1BmC,wBAA2B,qBAAGrC,EAAEY,IAAI;oBAC9E,IAAI,WAAWZ,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEa,KAAK,IAAGwB,yBAAAA,QAAQxD,YAAY,cAApBwD,6CAAAA,CAAAA,yBAAAA,wBAAsBnC,IAAI,OAA1BmC,wBAA2B,qBAAGrC,EAAEa,KAAK;gBACnF,OAAO,IAAImB,MAAM,cAAc;oBAC7B,kDAAkD;oBAClD,IAAI,UAAUhC,KAAKyB,MAAMC,OAAO,CAAC1B,EAAES,IAAI,GAAG;4BAIxC4B;4BAAAA;wBAHArC,EAAES,IAAI,CAACgC,OAAO,CAAC,SAACI;4BACdjF,mBAAmB2B,OAAOsD;wBAC5B;yBACAR,+BAAAA,QAAQnD,kBAAkB,cAA1BmD,mDAAAA,CAAAA,8BAAAA,8BAA4BnC,IAAI,OAAhCmC,6BAAiC,qBAAGrC,EAAES,IAAI,CAACE,GAAG,CAACpB;oBACjD;oBACA,IAAI,UAAUS,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEY,IAAI,GAAG;4BAIxCyB;4BAAAA;wBAHArC,EAAEY,IAAI,CAAC6B,OAAO,CAAC,SAACI;4BACdjF,mBAAmB2B,OAAOsD;wBAC5B;yBACAR,+BAAAA,QAAQnD,kBAAkB,cAA1BmD,mDAAAA,CAAAA,+BAAAA,8BAA4BnC,IAAI,OAAhCmC,8BAAiC,qBAAGrC,EAAEY,IAAI,CAACD,GAAG,CAACpB;oBACjD;oBACA,IAAI,WAAWS,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEa,KAAK,GAAG;4BAI1CwB;4BAAAA;wBAHArC,EAAEa,KAAK,CAAC4B,OAAO,CAAC,SAACI;4BACfjF,mBAAmB2B,OAAOsD;wBAC5B;yBACAR,+BAAAA,QAAQnD,kBAAkB,cAA1BmD,mDAAAA,CAAAA,+BAAAA,8BAA4BnC,IAAI,OAAhCmC,8BAAiC,qBAAGrC,EAAEa,KAAK,CAACF,GAAG,CAACpB;oBAClD;gBACF,OAAO,IAAIyC,MAAM,SAAS;wBAEkBK,wBACAA,yBACEA;wBAFFA,yBACAA,yBACEA;oBAH5C,iDAAiD;oBACjD,IAAI,UAAUrC,KAAKyB,MAAMC,OAAO,CAAC1B,EAAES,IAAI,IAAG4B,0BAAAA,QAAQlD,aAAa,cAArBkD,8CAAAA,CAAAA,yBAAAA,yBAAuBnC,IAAI,OAA3BmC,wBAA4B,qBAAGrC,EAAES,IAAI,CAACE,GAAG,CAACpB;oBACpF,IAAI,UAAUS,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEY,IAAI,IAAGyB,0BAAAA,QAAQlD,aAAa,cAArBkD,8CAAAA,CAAAA,0BAAAA,yBAAuBnC,IAAI,OAA3BmC,yBAA4B,qBAAGrC,EAAEY,IAAI,CAACD,GAAG,CAACpB;oBACpF,IAAI,WAAWS,KAAKyB,MAAMC,OAAO,CAAC1B,EAAEa,KAAK,IAAGwB,0BAAAA,QAAQlD,aAAa,cAArBkD,8CAAAA,CAAAA,0BAAAA,yBAAuBnC,IAAI,OAA3BmC,yBAA4B,qBAAGrC,EAAEa,KAAK,CAACF,GAAG,CAACpB;gBACzF;YACF;;YA1CK;YAAA;;;qBAAA,6BAAA;oBAAA;;;oBAAA;0BAAA;;;;IA2CP;IACAgD,KAAKD;IACL,OAAOD;AACT"}
|
|
@@ -8,8 +8,8 @@ Object.defineProperty(exports, "searchMessages", {
|
|
|
8
8
|
return searchMessages;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
var
|
|
12
|
-
var
|
|
11
|
+
var _paginationts = require("./pagination.js");
|
|
12
|
+
var _querybuilderts = require("./query-builder.js");
|
|
13
13
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
14
14
|
try {
|
|
15
15
|
var info = gen[key](arg);
|
|
@@ -141,7 +141,7 @@ function _ts_generator(thisArg, body) {
|
|
|
141
141
|
function buildGmailQ(query) {
|
|
142
142
|
var _ref;
|
|
143
143
|
if (!query) return '';
|
|
144
|
-
var emitted = (0,
|
|
144
|
+
var emitted = (0, _querybuilderts.toGmailQuery)(query);
|
|
145
145
|
return (_ref = emitted === null || emitted === void 0 ? void 0 : emitted.q) !== null && _ref !== void 0 ? _ref : '';
|
|
146
146
|
}
|
|
147
147
|
function searchMessages(gmail, opts) {
|
|
@@ -171,7 +171,7 @@ function searchMessages(gmail, opts) {
|
|
|
171
171
|
};
|
|
172
172
|
return [
|
|
173
173
|
4,
|
|
174
|
-
(0,
|
|
174
|
+
(0, _paginationts.fetchMessagesPage)(gmail, pageParams)
|
|
175
175
|
];
|
|
176
176
|
case 1:
|
|
177
177
|
result = _state.sent();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/email/querying/search-execution.ts"],"sourcesContent":["import type { gmail_v1 } from 'googleapis';\nimport type { GmailQuery as QueryNode } from '../../schemas/gmail-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { type FetchMessagesPageParams, fetchMessagesPage } from './pagination.ts';\nimport { toGmailQuery } from './query-builder.ts';\n\nexport interface GmailSearchOptions {\n readonly query?: QueryNode;\n readonly pageSize?: number;\n readonly includeBody?: boolean;\n readonly pageToken: string | undefined; // For pagination support - explicit undefined allowed\n readonly logger: Logger;\n}\n\nexport interface GmailEmailSummary {\n readonly id: string;\n readonly provider: 'gmail';\n readonly threadId?: string;\n readonly date?: string;\n readonly from?: string;\n readonly fromName?: string;\n readonly to?: string;\n readonly cc?: string;\n readonly bcc?: string;\n readonly subject?: string;\n readonly snippet?: string;\n readonly body?: string;\n}\n\nfunction buildGmailQ(query: QueryNode | undefined): string {\n if (!query) return '';\n const emitted = toGmailQuery(query);\n return emitted?.q ?? '';\n}\n\nexport interface GmailSearchResult {\n readonly messages: gmail_v1.Schema$Message[]; // Raw Gmail API messages for transformation by caller\n readonly nextPageToken: string | undefined;\n}\n\nexport async function searchMessages(gmail: gmail_v1.Gmail, opts: GmailSearchOptions): Promise<GmailSearchResult> {\n const { query, pageSize = 50, includeBody = false, pageToken, logger } = opts;\n const gmailQ = buildGmailQ(query);\n const metadataHeaders = ['Date', 'Subject', 'From', 'To', 'Cc', 'Bcc'];\n // Always fetch metadata headers - body is additional content, not a replacement for headers\n const pageParams: FetchMessagesPageParams = {\n gmailQ,\n pageSize,\n body: includeBody,\n metadataHeaders,\n pageToken,\n logger,\n };\n const result = await fetchMessagesPage(gmail, pageParams);\n\n // Return raw Gmail messages - transformation happens in caller\n return {\n messages: result.messages,\n nextPageToken: result.nextPageToken,\n };\n}\n"],"names":["searchMessages","buildGmailQ","query","emitted","toGmailQuery","q","gmail","opts","pageSize","includeBody","pageToken","logger","gmailQ","metadataHeaders","pageParams","result","body","fetchMessagesPage","messages","nextPageToken"],"mappings":";;;;+BAwCsBA;;;eAAAA;;;4BArC0C;8BACnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyB7B,SAASC,YAAYC,KAA4B;;IAC/C,IAAI,CAACA,OAAO,OAAO;IACnB,IAAMC,UAAUC,IAAAA,4BAAY,EAACF;IAC7B,eAAOC,oBAAAA,8BAAAA,QAASE,CAAC,uCAAI;AACvB;AAOO,SAAeL,eAAeM,KAAqB,EAAEC,IAAwB;;YAC1EL,uBAAOM,6BAAeC,aAAqBC,WAAWC,QACxDC,QACAC,iBAEAC,YAQAC;;;;oBAZEb,QAAiEK,KAAjEL,wBAAiEK,KAA1DC,UAAAA,uCAAW,yCAA+CD,KAA3CE,aAAAA,6CAAc,2BAAOC,YAAsBH,KAAtBG,WAAWC,SAAWJ,KAAXI;oBACxDC,SAASX,YAAYC;oBACrBW;wBAAmB;wBAAQ;wBAAW;wBAAQ;wBAAM;wBAAM;;oBAChE,4FAA4F;oBACtFC,aAAsC;wBAC1CF,QAAAA;wBACAJ,UAAAA;wBACAQ,MAAMP;wBACNI,iBAAAA;wBACAH,WAAAA;wBACAC,QAAAA;oBACF;oBACe;;wBAAMM,IAAAA,+BAAiB,EAACX,OAAOQ;;;oBAAxCC,SAAS;oBAEf,+DAA+D;oBAC/D;;wBAAO;4BACLG,UAAUH,OAAOG,QAAQ;4BACzBC,eAAeJ,OAAOI,aAAa;wBACrC;;;;IACF"}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { ServerConfig } from './types.js';
|
|
2
2
|
export { GOOGLE_SCOPE } from './constants.js';
|
|
3
3
|
export * as mcp from './mcp/index.js';
|
|
4
|
+
export type { Input as CategoriesListInput } from './mcp/tools/categories-list.js';
|
|
5
|
+
export { inputSchema as CategoriesListInputSchema } from './mcp/tools/categories-list.js';
|
|
6
|
+
export type { Input as LabelsListInput } from './mcp/tools/labels-list.js';
|
|
7
|
+
export { inputSchema as LabelsListInputSchema } from './mcp/tools/labels-list.js';
|
|
4
8
|
export * as schemas from './schemas/index.js';
|
|
5
9
|
export * as setup from './setup/index.js';
|
|
6
10
|
export * from './types.js';
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { ServerConfig } from './types.js';
|
|
2
2
|
export { GOOGLE_SCOPE } from './constants.js';
|
|
3
3
|
export * as mcp from './mcp/index.js';
|
|
4
|
+
export type { Input as CategoriesListInput } from './mcp/tools/categories-list.js';
|
|
5
|
+
export { inputSchema as CategoriesListInputSchema } from './mcp/tools/categories-list.js';
|
|
6
|
+
export type { Input as LabelsListInput } from './mcp/tools/labels-list.js';
|
|
7
|
+
export { inputSchema as LabelsListInputSchema } from './mcp/tools/labels-list.js';
|
|
4
8
|
export * as schemas from './schemas/index.js';
|
|
5
9
|
export * as setup from './setup/index.js';
|
|
6
10
|
export * from './types.js';
|
package/dist/cjs/index.js
CHANGED
|
@@ -9,32 +9,40 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
+
get CategoriesListInputSchema () {
|
|
13
|
+
return _categorieslistts.inputSchema;
|
|
14
|
+
},
|
|
12
15
|
get GOOGLE_SCOPE () {
|
|
13
16
|
return _constantsts.GOOGLE_SCOPE;
|
|
14
17
|
},
|
|
18
|
+
get LabelsListInputSchema () {
|
|
19
|
+
return _labelslistts.inputSchema;
|
|
20
|
+
},
|
|
15
21
|
get default () {
|
|
16
22
|
return main;
|
|
17
23
|
},
|
|
18
24
|
get mcp () {
|
|
19
|
-
return
|
|
25
|
+
return _indexts;
|
|
20
26
|
},
|
|
21
27
|
get schemas () {
|
|
22
|
-
return
|
|
28
|
+
return _indexts1;
|
|
23
29
|
},
|
|
24
30
|
get setup () {
|
|
25
|
-
return
|
|
31
|
+
return _indexts2;
|
|
26
32
|
},
|
|
27
33
|
get startServer () {
|
|
28
34
|
return startServer;
|
|
29
35
|
}
|
|
30
36
|
});
|
|
31
|
-
var
|
|
32
|
-
var
|
|
33
|
-
var
|
|
37
|
+
var _configts = require("./setup/config.js");
|
|
38
|
+
var _httpts = require("./setup/http.js");
|
|
39
|
+
var _stdiots = require("./setup/stdio.js");
|
|
34
40
|
var _constantsts = require("./constants.js");
|
|
35
|
-
var
|
|
36
|
-
var
|
|
37
|
-
var
|
|
41
|
+
var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("./mcp/index.js"));
|
|
42
|
+
var _categorieslistts = require("./mcp/tools/categories-list.js");
|
|
43
|
+
var _labelslistts = require("./mcp/tools/labels-list.js");
|
|
44
|
+
var _indexts1 = /*#__PURE__*/ _interop_require_wildcard(require("./schemas/index.js"));
|
|
45
|
+
var _indexts2 = /*#__PURE__*/ _interop_require_wildcard(require("./setup/index.js"));
|
|
38
46
|
_export_star(require("./types.js"), exports);
|
|
39
47
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
40
48
|
try {
|
|
@@ -230,7 +238,7 @@ function startServer(config) {
|
|
|
230
238
|
];
|
|
231
239
|
return [
|
|
232
240
|
4,
|
|
233
|
-
(0,
|
|
241
|
+
(0, _stdiots.createStdioServer)(config)
|
|
234
242
|
];
|
|
235
243
|
case 1:
|
|
236
244
|
_tmp = _state.sent();
|
|
@@ -241,7 +249,7 @@ function startServer(config) {
|
|
|
241
249
|
case 2:
|
|
242
250
|
return [
|
|
243
251
|
4,
|
|
244
|
-
(0,
|
|
252
|
+
(0, _httpts.createHTTPServer)(config)
|
|
245
253
|
];
|
|
246
254
|
case 3:
|
|
247
255
|
_tmp = _state.sent();
|
|
@@ -288,13 +296,13 @@ function main() {
|
|
|
288
296
|
switch(_state.label){
|
|
289
297
|
case 0:
|
|
290
298
|
// Check for help/version flags FIRST, before config parsing
|
|
291
|
-
versionHelpResult = (0,
|
|
299
|
+
versionHelpResult = (0, _configts.handleVersionHelp)(process.argv);
|
|
292
300
|
if (versionHelpResult.handled) {
|
|
293
301
|
console.log(versionHelpResult.output);
|
|
294
302
|
process.exit(0);
|
|
295
303
|
}
|
|
296
304
|
// Only parse config if no help/version flags
|
|
297
|
-
config = (0,
|
|
305
|
+
config = (0, _configts.createConfig)();
|
|
298
306
|
return [
|
|
299
307
|
4,
|
|
300
308
|
startServer(config)
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.ts';\nimport { createHTTPServer } from './setup/http.ts';\nimport { createStdioServer } from './setup/stdio.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\n// Export types and schemas for documentation\nexport type { Input as CategoriesListInput } from './mcp/tools/categories-list.ts';\nexport { inputSchema as CategoriesListInputSchema } from './mcp/tools/categories-list.ts';\nexport type { Input as LabelsListInput } from './mcp/tools/labels-list.ts';\nexport { inputSchema as LabelsListInputSchema } from './mcp/tools/labels-list.ts';\nexport * as schemas from './schemas/index.ts';\nexport * as setup from './setup/index.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n const { logger, close } = config.transport.type === 'stdio' ? await createStdioServer(config) : await createHTTPServer(config);\n\n process.on('SIGINT', async () => {\n await close();\n process.exit(0);\n });\n\n logger.info(`Server started with ${config.transport.type} transport`);\n await new Promise(() => {});\n}\n\nexport default async function main(): Promise<void> {\n // Check for help/version flags FIRST, before config parsing\n const versionHelpResult = handleVersionHelp(process.argv);\n if (versionHelpResult.handled) {\n console.log(versionHelpResult.output);\n process.exit(0);\n }\n\n // Only parse config if no help/version flags\n const config = createConfig();\n await startServer(config);\n}\n\nif (process.argv[1] === new URL(import.meta.url).pathname) {\n main();\n}\n"],"names":["CategoriesListInputSchema","inputSchema","GOOGLE_SCOPE","LabelsListInputSchema","main","mcp","schemas","setup","startServer","config","logger","close","transport","type","createStdioServer","createHTTPServer","process","on","exit","info","Promise","versionHelpResult","handleVersionHelp","argv","handled","console","log","output","createConfig","URL","pathname"],"mappings":";;;;;;;;;;;QASwBA;eAAfC,6BAAW;;QAJXC;eAAAA,yBAAY;;QAMGC;eAAfF,yBAAW;;QAiBpB;eAA8BG;;QAtBlBC;;;QAMAC;;;QACAC;;;QAGUC;eAAAA;;;wBAhB0B;sBACf;uBACC;2BAGL;+DACR;gCAGoC;4BAEJ;gEAC5B;gEACF;qBACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,0BAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,wBAAgB,EAACN;;;2BAAvB;;;oBAAtEA,aAAlBC,SAAkBD,KAAlBC,QAAQC,QAAUF,KAAVE;oBAEhBK,QAAQC,EAAE,CAAC,UAAU;;;;;wCACnB;;4CAAMN;;;wCAAN;wCACAK,QAAQE,IAAI,CAAC;;;;;;wBACf;;oBAEAR,OAAOS,IAAI,CAAC,AAAC,uBAA4C,OAAtBV,OAAOG,SAAS,CAACC,IAAI,EAAC;oBACzD;;wBAAM,IAAIO,QAAQ,YAAO;;;oBAAzB;;;;;;IACF;;AAEe,SAAehB;;YAEtBiB,mBAOAZ;;;;oBARN,4DAA4D;oBACtDY,oBAAoBC,IAAAA,2BAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,sBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD1B;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/labels/gmail-labels.ts"],"sourcesContent":["import type { gmail_v1 } from 'googleapis';\n\nexport async function ensureLabelId(gmail: gmail_v1.Gmail, userId: string, labelName: string): Promise<string> {\n // Built-in system labels: pass through by name\n const builtInLabels: Record<string, string> = {\n INBOX: 'INBOX',\n SPAM: 'SPAM',\n TRASH: 'TRASH',\n UNREAD: 'UNREAD',\n STARRED: 'STARRED',\n IMPORTANT: 'IMPORTANT',\n SENT: 'SENT',\n DRAFT: 'DRAFT',\n CATEGORY_PERSONAL: 'CATEGORY_PERSONAL',\n CATEGORY_SOCIAL: 'CATEGORY_SOCIAL',\n CATEGORY_PROMOTIONS: 'CATEGORY_PROMOTIONS',\n CATEGORY_UPDATES: 'CATEGORY_UPDATES',\n CATEGORY_FORUMS: 'CATEGORY_FORUMS',\n };\n\n const upper = labelName.toUpperCase();\n if (builtInLabels[upper]) return builtInLabels[upper];\n\n // Try to find an existing user label by name\n const listed = await gmail.users.labels.list({ userId });\n const labels = Array.isArray(listed?.data?.labels) ? listed.data.labels : [];\n const existing = labels.find((l: unknown) => {\n const label = l as { name?: unknown; id?: unknown };\n return label?.name === labelName;\n });\n const existingTyped = existing as { id?: unknown } | undefined;\n if (existingTyped?.id) return String(existingTyped.id);\n\n // Create the label if it doesn't exist\n const created = await gmail.users.labels.create({\n userId,\n requestBody: {\n name: labelName,\n labelListVisibility: 'labelShow',\n messageListVisibility: 'show',\n },\n });\n if (!created?.data?.id) throw new Error('Failed to create label');\n return created.data.id as string;\n}\n"],"names":["ensureLabelId","gmail","userId","labelName","listed","created","builtInLabels","upper","labels","existing","existingTyped","INBOX","SPAM","TRASH","UNREAD","STARRED","IMPORTANT","SENT","DRAFT","CATEGORY_PERSONAL","CATEGORY_SOCIAL","CATEGORY_PROMOTIONS","CATEGORY_UPDATES","CATEGORY_FORUMS","toUpperCase","users","list","Array","isArray","data","find","l","label","name","id","String","create","requestBody","labelListVisibility","messageListVisibility","Error"],"mappings":";;;;+BAEsBA;;;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAf,SAAeA,cAAcC,KAAqB,EAAEC,MAAc,EAAEC,SAAiB;;YAuB7DC,cAiBxBC,eAtCCC,eAgBAC,OAIAH,QACAI,QACAC,UAIAC,eAIAL;;;;oBA/BN,+CAA+C;oBACzCC,gBAAwC;wBAC5CK,OAAO;wBACPC,MAAM;wBACNC,OAAO;wBACPC,QAAQ;wBACRC,SAAS;wBACTC,WAAW;wBACXC,MAAM;wBACNC,OAAO;wBACPC,mBAAmB;wBACnBC,iBAAiB;wBACjBC,qBAAqB;wBACrBC,kBAAkB;wBAClBC,iBAAiB;oBACnB;oBAEMhB,QAAQJ,UAAUqB,WAAW;oBACnC,IAAIlB,aAAa,CAACC,MAAM,EAAE;;wBAAOD,aAAa,CAACC,MAAM;;oBAGtC;;wBAAMN,MAAMwB,KAAK,CAACjB,MAAM,CAACkB,IAAI,CAAC;4BAAExB,QAAAA;wBAAO;;;oBAAhDE,SAAS;oBACTI,SAASmB,MAAMC,OAAO,CAACxB,mBAAAA,8BAAAA,eAAAA,OAAQyB,IAAI,cAAZzB,mCAAAA,aAAcI,MAAM,IAAIJ,OAAOyB,IAAI,CAACrB,MAAM;oBACjEC,WAAWD,OAAOsB,IAAI,CAAC,SAACC;wBAC5B,IAAMC,QAAQD;wBACd,OAAOC,CAAAA,kBAAAA,4BAAAA,MAAOC,IAAI,MAAK9B;oBACzB;oBACMO,gBAAgBD;oBACtB,IAAIC,0BAAAA,oCAAAA,cAAewB,EAAE,EAAE;;wBAAOC,OAAOzB,cAAcwB,EAAE;;oBAGrC;;wBAAMjC,MAAMwB,KAAK,CAACjB,MAAM,CAAC4B,MAAM,CAAC;4BAC9ClC,QAAAA;4BACAmC,aAAa;gCACXJ,MAAM9B;gCACNmC,qBAAqB;gCACrBC,uBAAuB;4BACzB;wBACF;;;oBAPMlC,UAAU;oBAQhB,IAAI,EAACA,oBAAAA,+BAAAA,gBAAAA,QAASwB,IAAI,cAAbxB,oCAAAA,cAAe6B,EAAE,GAAE,MAAM,IAAIM,MAAM;oBACxC;;wBAAOnC,QAAQwB,IAAI,CAACK,EAAE;;;;IACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/lib/base64-encoding.ts"],"sourcesContent":["import { safeBase64UrlDecode } from '@mcp-z/email';\n\nexport function safeBase64Decode(raw?: string): string {\n if (!raw) return '';\n try {\n return safeBase64UrlDecode(raw);\n } catch {\n // Fallback to original input if decoding fails\n return String(raw);\n }\n}\n\nexport function b64url(input: string): string {\n return Buffer.from(input).toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n"],"names":["b64url","safeBase64Decode","raw","safeBase64UrlDecode","String","input","Buffer","from","toString","replace"],"mappings":";;;;;;;;;;;QAYgBA;eAAAA;;QAVAC;eAAAA;;;qBAFoB;AAE7B,SAASA,iBAAiBC,GAAY;IAC3C,IAAI,CAACA,KAAK,OAAO;IACjB,IAAI;QACF,OAAOC,IAAAA,0BAAmB,EAACD;IAC7B,EAAE,eAAM;QACN,+CAA+C;QAC/C,OAAOE,OAAOF;IAChB;AACF;AAEO,SAASF,OAAOK,KAAa;IAClC,OAAOC,OAAOC,IAAI,CAACF,OAAOG,QAAQ,CAAC,UAAUC,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,OAAO;AACtG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\nexport default async function createStore<T>(uri: string): Promise<Keyv<T>> {\n const store = await keyvRegistry<T>(uri);\n if (!store) throw new Error(`Failed to create store for URI: ${uri}`);\n return store;\n}\n"],"names":["createStore","uri","store","keyvRegistry","Error"],"mappings":";;;;+BAGA;;;eAA8BA;;;mEAFL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEV,SAAeA,YAAeC,GAAW;;YAChDC;;;;oBAAQ;;wBAAMC,IAAAA,qBAAY,EAAIF;;;oBAA9BC,QAAQ;oBACd,IAAI,CAACA,OAAO,MAAM,IAAIE,MAAM,AAAC,mCAAsC,OAAJH;oBAC/D;;wBAAOC;;;;IACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/lib/date-conversion.ts"],"sourcesContent":["export function toIsoUtc(dateStr?: string): string | undefined {\n if (!dateStr) return undefined;\n const d = new Date(dateStr);\n return Number.isNaN(d.getTime()) ? undefined : d.toISOString();\n}\n"],"names":["toIsoUtc","dateStr","undefined","d","Date","Number","isNaN","getTime","toISOString"],"mappings":";;;;+BAAgBA;;;eAAAA;;;AAAT,SAASA,SAASC,OAAgB;IACvC,IAAI,CAACA,SAAS,OAAOC;IACrB,IAAMC,IAAI,IAAIC,KAAKH;IACnB,OAAOI,OAAOC,KAAK,CAACH,EAAEI,OAAO,MAAML,YAAYC,EAAEK,WAAW;AAC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/lib/messages-to-row.ts"],"sourcesContent":["import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';\n\nexport interface GmailMessage {\n id?: string;\n threadId?: string;\n labelIds?: string[];\n snippet?: string;\n payload?: {\n headers?: Array<{ name: string; value: string }>;\n body?: {\n data?: string;\n };\n parts?: Array<{\n mimeType: string;\n body?: {\n data?: string;\n };\n }>;\n };\n}\n\ninterface GmailEmailSummary {\n id: string;\n provider: 'gmail';\n threadId?: string | undefined;\n date?: string | undefined;\n from?: string | undefined;\n fromName?: string | undefined;\n to?: string | undefined;\n cc?: string | undefined;\n bcc?: string | undefined;\n subject?: string | undefined;\n snippet?: string | undefined;\n body?: string | undefined;\n}\n\ninterface FormatOptions {\n body?: boolean;\n addressFormat?: 'raw' | 'name' | 'email';\n}\n\nfunction getHeader(headers: Array<{ name: string; value: string }> | undefined, name: string): string {\n if (!headers || !Array.isArray(headers)) return '';\n const header = headers.find((h) => h.name.toLowerCase() === name.toLowerCase());\n return header ? header.value : '';\n}\n\ninterface AddressToken {\n name?: string | undefined;\n email: string;\n}\n\nfunction parseEmailHeader(headerValue: string): AddressToken[] {\n if (!headerValue) return [];\n\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < headerValue.length; i++) {\n const char = headerValue[i];\n if (char === '\"') {\n inQuotes = !inQuotes;\n current += char;\n } else if (char === ',' && !inQuotes) {\n parts.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) parts.push(current.trim());\n\n return parts\n .map((part): AddressToken => {\n const match = part.match(/^(?:\"?([^\"]*)\"? <([^>]+)>|([^,]+))$/);\n if (match) {\n if (match[2]) {\n return { name: match[1] || undefined, email: match[2] };\n }\n return { email: match[3] || '' };\n }\n return { email: part.trim() };\n })\n .filter((token) => !!token.email); // Type guard to ensure email is always present\n}\n\nfunction formatRecipientHeader(headerValue: string, mode: 'raw' | 'name' | 'email' = 'email'): string {\n const addresses = parseEmailHeader(headerValue);\n return formatAddresses(addresses, mode);\n}\n\n/**\n * Sanitizes email body text for Google Sheets export by enforcing cell character limits.\n * Google Sheets API limits cells to 50,000 characters - this prevents API errors during export.\n */\nfunction sanitizeForSheetsExport(text: string): string {\n // Google Sheets has a 50,000 character limit per cell\n // Leave some buffer for safety\n const GOOGLE_SHEETS_CELL_LIMIT = 49000;\n\n if (text.length <= GOOGLE_SHEETS_CELL_LIMIT) return text;\n\n // Truncate and add indication that it was truncated\n const truncated = text.substring(0, GOOGLE_SHEETS_CELL_LIMIT - 100);\n return `${truncated}\\n\\n[...content truncated to fit Google Sheets cell limit...]`;\n}\n\nexport function toRowFromGmail(msg: GmailMessage = {}, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const headers = msg.payload?.headers || [];\n const toHeader = getHeader(headers, 'To');\n const fromHeader = getHeader(headers, 'From');\n const ccHeader = getHeader(headers, 'Cc');\n const bccHeader = getHeader(headers, 'Bcc');\n const dateHeader = getHeader(headers, 'Date');\n const subjectHeader = getHeader(headers, 'Subject');\n\n const to = formatRecipientHeader(toHeader, fmt);\n const from = formatRecipientHeader(fromHeader, fmt);\n const cc = formatRecipientHeader(ccHeader, fmt);\n const bcc = formatRecipientHeader(bccHeader, fmt);\n const date = normalizeDateToISO(dateHeader) ?? '';\n const subject = subjectHeader ?? '';\n\n const labels = (msg.labelIds || []).join(', ');\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body) {\n if (msg.payload) {\n if (msg.payload.body?.data) {\n const rawBody = Buffer.from(msg.payload.body.data, 'base64').toString('utf-8');\n bodyFull = extractCurrentMessageFromText(rawBody);\n } else if (msg.payload.parts && Array.isArray(msg.payload.parts)) {\n for (const part of msg.payload.parts) {\n if (part.body?.data) {\n const rawBody = Buffer.from(part.body.data, 'base64').toString('utf-8');\n if (part.mimeType === 'text/plain') {\n bodyFull = extractCurrentMessageFromText(rawBody);\n break;\n }\n if (part.mimeType === 'text/html') {\n bodyFull = extractCurrentMessageFromHtmlToText(rawBody);\n break;\n }\n }\n }\n }\n }\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(bodyFull)];\n}\n\nexport function toRowFromGmailSummary(msg: GmailEmailSummary, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = msg.provider || 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const to = formatRecipientHeader(msg.to ?? '', fmt);\n const from = formatRecipientHeader(msg.from ?? '', fmt);\n const cc = formatRecipientHeader(msg.cc ?? '', fmt);\n const bcc = formatRecipientHeader(msg.bcc ?? '', fmt);\n const date = normalizeDateToISO(msg.date) ?? '';\n const subject = msg.subject ?? '';\n const labels = '';\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body && msg.body) {\n bodyFull = extractCurrentMessageFromText(msg.body);\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(bodyFull)];\n}\n\ninterface ClientSideFilters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n}\n\ninterface FilterContent {\n subject?: string;\n snippetOrPreview?: string;\n fullBody?: string;\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n}\n\nexport function filterClientSide(filters: ClientSideFilters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' }: FilterContent = {}) {\n const lower = (a: string[]) => a.map((t) => String(t).toLowerCase());\n const subjectTokens = lower(filters.subjectIncludes || []);\n const bodyTokens = lower(filters.bodyIncludes || []);\n const textTokens = lower(filters.textIncludes || []);\n const fromTokens = lower(filters.fromIncludes || []);\n const toCredentials = lower(filters.toIncludes || []);\n const ccTokens = lower(filters.ccIncludes || []);\n const bccTokens = lower(filters.bccIncludes || []);\n\n const s = String(subject ?? '').toLowerCase();\n const b = String((fullBody || snippetOrPreview) ?? '').toLowerCase();\n const f = String(from ?? '').toLowerCase();\n const t = String(to ?? '').toLowerCase();\n const c = String(cc ?? '').toLowerCase();\n const bc = String(bcc ?? '').toLowerCase();\n\n const anyIncludes = (val: string, tokens: string[]) => (tokens.length === 1 ? val.includes(tokens[0] ?? '') : tokens.some((token) => val.includes(token)));\n const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;\n const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;\n const textOk = textTokens.length ? textTokens.some((token) => s.includes(token) || b.includes(token)) : true;\n const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;\n const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;\n const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;\n const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;\n\n return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;\n}\n"],"names":["filterClientSide","toRowFromGmail","toRowFromGmailSummary","getHeader","headers","name","Array","isArray","header","find","h","toLowerCase","value","parseEmailHeader","headerValue","parts","current","inQuotes","i","length","char","push","trim","map","part","match","undefined","email","filter","token","formatRecipientHeader","mode","addresses","formatAddresses","sanitizeForSheetsExport","text","GOOGLE_SHEETS_CELL_LIMIT","truncated","substring","msg","opts","body","addressFormat","normalizeDateToISO","id","provider","threadId","fmt","payload","toHeader","fromHeader","ccHeader","bccHeader","dateHeader","subjectHeader","to","from","cc","bcc","date","subject","labels","labelIds","join","snippet","bodyFull","data","rawBody","Buffer","toString","extractCurrentMessageFromText","mimeType","extractCurrentMessageFromHtmlToText","filters","snippetOrPreview","fullBody","lower","a","t","String","subjectTokens","subjectIncludes","bodyTokens","bodyIncludes","textTokens","textIncludes","fromTokens","fromIncludes","toCredentials","toIncludes","ccTokens","ccIncludes","bccTokens","bccIncludes","s","b","f","c","bc","anyIncludes","val","tokens","includes","some","subjectOk","bodyOk","textOk","fromOk","toOk","ccOk","bccOk"],"mappings":";;;;;;;;;;;QA2MgBA;eAAAA;;QA9FAC;eAAAA;;QAmDAC;eAAAA;;;qBAhKwG;AAyCxH,SAASC,UAAUC,OAA2D,EAAEC,IAAY;IAC1F,IAAI,CAACD,WAAW,CAACE,MAAMC,OAAO,CAACH,UAAU,OAAO;IAChD,IAAMI,SAASJ,QAAQK,IAAI,CAAC,SAACC;eAAMA,EAAEL,IAAI,CAACM,WAAW,OAAON,KAAKM,WAAW;;IAC5E,OAAOH,SAASA,OAAOI,KAAK,GAAG;AACjC;AAOA,SAASC,iBAAiBC,WAAmB;IAC3C,IAAI,CAACA,aAAa,OAAO,EAAE;IAE3B,IAAMC,QAAkB,EAAE;IAC1B,IAAIC,UAAU;IACd,IAAIC,WAAW;IAEf,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,YAAYK,MAAM,EAAED,IAAK;QAC3C,IAAME,OAAON,WAAW,CAACI,EAAE;QAC3B,IAAIE,SAAS,KAAK;YAChBH,WAAW,CAACA;YACZD,WAAWI;QACb,OAAO,IAAIA,SAAS,OAAO,CAACH,UAAU;YACpCF,MAAMM,IAAI,CAACL,QAAQM,IAAI;YACvBN,UAAU;QACZ,OAAO;YACLA,WAAWI;QACb;IACF;IAEA,IAAIJ,SAASD,MAAMM,IAAI,CAACL,QAAQM,IAAI;IAEpC,OAAOP,MACJQ,GAAG,CAAC,SAACC;QACJ,IAAMC,QAAQD,KAAKC,KAAK,CAAC;QACzB,IAAIA,OAAO;YACT,IAAIA,KAAK,CAAC,EAAE,EAAE;gBACZ,OAAO;oBAAEpB,MAAMoB,KAAK,CAAC,EAAE,IAAIC;oBAAWC,OAAOF,KAAK,CAAC,EAAE;gBAAC;YACxD;YACA,OAAO;gBAAEE,OAAOF,KAAK,CAAC,EAAE,IAAI;YAAG;QACjC;QACA,OAAO;YAAEE,OAAOH,KAAKF,IAAI;QAAG;IAC9B,GACCM,MAAM,CAAC,SAACC;eAAU,CAAC,CAACA,MAAMF,KAAK;QAAG,+CAA+C;AACtF;AAEA,SAASG,sBAAsBhB,WAAmB;QAAEiB,OAAAA,iEAAiC;IACnF,IAAMC,YAAYnB,iBAAiBC;IACnC,OAAOmB,IAAAA,sBAAe,EAACD,WAAWD;AACpC;AAEA;;;CAGC,GACD,SAASG,wBAAwBC,IAAY;IAC3C,sDAAsD;IACtD,+BAA+B;IAC/B,IAAMC,2BAA2B;IAEjC,IAAID,KAAKhB,MAAM,IAAIiB,0BAA0B,OAAOD;IAEpD,oDAAoD;IACpD,IAAME,YAAYF,KAAKG,SAAS,CAAC,GAAGF,2BAA2B;IAC/D,OAAO,AAAC,GAAY,OAAVC,WAAU;AACtB;AAEO,SAASpC;QAAesC,MAAAA,iEAAoB,CAAC,GAAGC,OAAAA,iEAAsB;QAAEC,MAAM;QAAOC,eAAe;IAAQ;QACtGH,SAEMA,eAeJI,qBAIGJ;QAhBAA;IALhB,IAAMK,MAAKL,UAAAA,IAAIK,EAAE,cAANL,qBAAAA,UAAU;IACrB,IAAMM,WAAW;IACjB,IAAMC,YAAWP,gBAAAA,IAAIO,QAAQ,cAAZP,2BAAAA,gBAAgB;IACjC,IAAMQ,MAAMP,KAAKE,aAAa,IAAI;IAElC,IAAMtC,UAAUmC,EAAAA,eAAAA,IAAIS,OAAO,cAAXT,mCAAAA,aAAanC,OAAO,KAAI,EAAE;IAC1C,IAAM6C,WAAW9C,UAAUC,SAAS;IACpC,IAAM8C,aAAa/C,UAAUC,SAAS;IACtC,IAAM+C,WAAWhD,UAAUC,SAAS;IACpC,IAAMgD,YAAYjD,UAAUC,SAAS;IACrC,IAAMiD,aAAalD,UAAUC,SAAS;IACtC,IAAMkD,gBAAgBnD,UAAUC,SAAS;IAEzC,IAAMmD,KAAKzB,sBAAsBmB,UAAUF;IAC3C,IAAMS,OAAO1B,sBAAsBoB,YAAYH;IAC/C,IAAMU,KAAK3B,sBAAsBqB,UAAUJ;IAC3C,IAAMW,MAAM5B,sBAAsBsB,WAAWL;IAC7C,IAAMY,QAAOhB,sBAAAA,IAAAA,yBAAkB,EAACU,yBAAnBV,iCAAAA,sBAAkC;IAC/C,IAAMiB,UAAUN,0BAAAA,2BAAAA,gBAAiB;IAEjC,IAAMO,SAAS,AAACtB,CAAAA,IAAIuB,QAAQ,IAAI,EAAE,AAAD,EAAGC,IAAI,CAAC;IACzC,IAAMC,WAAUzB,eAAAA,IAAIyB,OAAO,cAAXzB,0BAAAA,eAAe;IAE/B,IAAI0B,WAAW;IACf,IAAIzB,KAAKC,IAAI,EAAE;QACb,IAAIF,IAAIS,OAAO,EAAE;gBACXT;YAAJ,KAAIA,oBAAAA,IAAIS,OAAO,CAACP,IAAI,cAAhBF,wCAAAA,kBAAkB2B,IAAI,EAAE;gBAC1B,IAAMC,UAAUC,OAAOZ,IAAI,CAACjB,IAAIS,OAAO,CAACP,IAAI,CAACyB,IAAI,EAAE,UAAUG,QAAQ,CAAC;gBACtEJ,WAAWK,IAAAA,oCAA6B,EAACH;YAC3C,OAAO,IAAI5B,IAAIS,OAAO,CAACjC,KAAK,IAAIT,MAAMC,OAAO,CAACgC,IAAIS,OAAO,CAACjC,KAAK,GAAG;oBAC3D,kCAAA,2BAAA;;oBAAL,QAAK,YAAcwB,IAAIS,OAAO,CAACjC,KAAK,qBAA/B,SAAA,6BAAA,QAAA,yBAAA,iCAAiC;wBAAjC,IAAMS,OAAN;4BACCA;wBAAJ,KAAIA,aAAAA,KAAKiB,IAAI,cAATjB,iCAAAA,WAAW0C,IAAI,EAAE;4BACnB,IAAMC,WAAUC,OAAOZ,IAAI,CAAChC,KAAKiB,IAAI,CAACyB,IAAI,EAAE,UAAUG,QAAQ,CAAC;4BAC/D,IAAI7C,KAAK+C,QAAQ,KAAK,cAAc;gCAClCN,WAAWK,IAAAA,oCAA6B,EAACH;gCACzC;4BACF;4BACA,IAAI3C,KAAK+C,QAAQ,KAAK,aAAa;gCACjCN,WAAWO,IAAAA,0CAAmC,EAACL;gCAC/C;4BACF;wBACF;oBACF;;oBAZK;oBAAA;;;6BAAA,6BAAA;4BAAA;;;4BAAA;kCAAA;;;;YAaP;QACF;IACF;IAEA,OAAO;QAACvB;QAAIC;QAAUC;QAAUS;QAAIC;QAAMC;QAAIC;QAAKC;QAAMC;QAASC;QAAQG;QAAS9B,wBAAwB+B;KAAU;AACvH;AAEO,SAAS/D,sBAAsBqC,GAAsB;QAAEC,OAAAA,iEAAsB;QAAEC,MAAM;QAAOC,eAAe;IAAQ;QAC7GH,SAEMA,eAGgBA,SACEA,WACFA,SACCA,UACrBI,qBACGJ,cAEAA;IAZhB,IAAMK,MAAKL,UAAAA,IAAIK,EAAE,cAANL,qBAAAA,UAAU;IACrB,IAAMM,WAAWN,IAAIM,QAAQ,IAAI;IACjC,IAAMC,YAAWP,gBAAAA,IAAIO,QAAQ,cAAZP,2BAAAA,gBAAgB;IACjC,IAAMQ,MAAMP,KAAKE,aAAa,IAAI;IAElC,IAAMa,KAAKzB,uBAAsBS,UAAAA,IAAIgB,EAAE,cAANhB,qBAAAA,UAAU,IAAIQ;IAC/C,IAAMS,OAAO1B,uBAAsBS,YAAAA,IAAIiB,IAAI,cAARjB,uBAAAA,YAAY,IAAIQ;IACnD,IAAMU,KAAK3B,uBAAsBS,UAAAA,IAAIkB,EAAE,cAANlB,qBAAAA,UAAU,IAAIQ;IAC/C,IAAMW,MAAM5B,uBAAsBS,WAAAA,IAAImB,GAAG,cAAPnB,sBAAAA,WAAW,IAAIQ;IACjD,IAAMY,QAAOhB,sBAAAA,IAAAA,yBAAkB,EAACJ,IAAIoB,IAAI,eAA3BhB,iCAAAA,sBAAgC;IAC7C,IAAMiB,WAAUrB,eAAAA,IAAIqB,OAAO,cAAXrB,0BAAAA,eAAe;IAC/B,IAAMsB,SAAS;IACf,IAAMG,WAAUzB,eAAAA,IAAIyB,OAAO,cAAXzB,0BAAAA,eAAe;IAE/B,IAAI0B,WAAW;IACf,IAAIzB,KAAKC,IAAI,IAAIF,IAAIE,IAAI,EAAE;QACzBwB,WAAWK,IAAAA,oCAA6B,EAAC/B,IAAIE,IAAI;IACnD;IAEA,OAAO;QAACG;QAAIC;QAAUC;QAAUS;QAAIC;QAAMC;QAAIC;QAAKC;QAAMC;QAASC;QAAQG;QAAS9B,wBAAwB+B;KAAU;AACvH;AAsBO,SAASjE,iBAAiByE,OAA0B;QAAE,OAAA,iEAA+G,CAAC,kBAAhH,KAAEb,SAAAA,oCAAU,2CAAZ,KAAgBc,kBAAAA,sDAAmB,4CAAnC,KAAuCC,UAAAA,sCAAW,gCAAlD,KAAsDnB,MAAAA,8BAAO,0BAA7D,KAAiED,IAAAA,0BAAK,wBAAtE,KAA0EE,IAAAA,0BAAK,yBAA/E,KAAmFC,KAAAA,4BAAM;QAWlIiB;IAVlB,IAAMC,QAAQ,SAACC;eAAgBA,EAAEtD,GAAG,CAAC,SAACuD;mBAAMC,OAAOD,GAAGnE,WAAW;;;IACjE,IAAMqE,gBAAgBJ,MAAMH,QAAQQ,eAAe,IAAI,EAAE;IACzD,IAAMC,aAAaN,MAAMH,QAAQU,YAAY,IAAI,EAAE;IACnD,IAAMC,aAAaR,MAAMH,QAAQY,YAAY,IAAI,EAAE;IACnD,IAAMC,aAAaV,MAAMH,QAAQc,YAAY,IAAI,EAAE;IACnD,IAAMC,gBAAgBZ,MAAMH,QAAQgB,UAAU,IAAI,EAAE;IACpD,IAAMC,WAAWd,MAAMH,QAAQkB,UAAU,IAAI,EAAE;IAC/C,IAAMC,YAAYhB,MAAMH,QAAQoB,WAAW,IAAI,EAAE;IAEjD,IAAMC,IAAIf,OAAOnB,oBAAAA,qBAAAA,UAAW,IAAIjD,WAAW;IAC3C,IAAMoF,IAAIhB,QAAQJ,QAAAA,YAAYD,8BAAZC,mBAAAA,QAAiC,IAAIhE,WAAW;IAClE,IAAMqF,IAAIjB,OAAOvB,iBAAAA,kBAAAA,OAAQ,IAAI7C,WAAW;IACxC,IAAMmE,IAAIC,OAAOxB,eAAAA,gBAAAA,KAAM,IAAI5C,WAAW;IACtC,IAAMsF,IAAIlB,OAAOtB,eAAAA,gBAAAA,KAAM,IAAI9C,WAAW;IACtC,IAAMuF,KAAKnB,OAAOrB,gBAAAA,iBAAAA,MAAO,IAAI/C,WAAW;IAExC,IAAMwF,cAAc,SAACC,KAAaC;YAAyDA;eAAnCA,OAAOlF,MAAM,KAAK,IAAIiF,IAAIE,QAAQ,EAACD,WAAAA,MAAM,CAAC,EAAE,cAATA,sBAAAA,WAAa,MAAMA,OAAOE,IAAI,CAAC,SAAC1E;mBAAUuE,IAAIE,QAAQ,CAACzE;;;IAClJ,IAAM2E,YAAYxB,cAAc7D,MAAM,GAAGgF,YAAYL,GAAGd,iBAAiB;IACzE,IAAMyB,SAASvB,WAAW/D,MAAM,GAAGgF,YAAYJ,GAAGb,cAAc;IAChE,IAAMwB,SAAStB,WAAWjE,MAAM,GAAGiE,WAAWmB,IAAI,CAAC,SAAC1E;eAAUiE,EAAEQ,QAAQ,CAACzE,UAAUkE,EAAEO,QAAQ,CAACzE;SAAU;IACxG,IAAM8E,SAASrB,WAAWnE,MAAM,GAAGgF,YAAYH,GAAGV,cAAc;IAChE,IAAMsB,OAAOpB,cAAcrE,MAAM,GAAGgF,YAAYrB,GAAGU,iBAAiB;IACpE,IAAMqB,OAAOnB,SAASvE,MAAM,GAAGgF,YAAYF,GAAGP,YAAY;IAC1D,IAAMoB,QAAQlB,UAAUzE,MAAM,GAAGgF,YAAYD,IAAIN,aAAa;IAE9D,OAAOY,aAAaC,UAAUC,UAAUC,UAAUC,QAAQC,QAAQC;AACpE"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/lib/messages-to-row.ts"],"sourcesContent":["import { extractCurrentMessageFromHtmlToText, extractCurrentMessageFromText, formatAddresses, normalizeDateToISO } from '@mcp-z/email';\n\nexport interface GmailMessage {\n id?: string;\n threadId?: string;\n labelIds?: string[];\n snippet?: string;\n payload?: {\n headers?: Array<{ name: string; value: string }>;\n body?: {\n data?: string;\n };\n parts?: Array<{\n mimeType: string;\n body?: {\n data?: string;\n };\n }>;\n };\n}\n\ninterface GmailEmailSummary {\n id: string;\n provider: 'gmail';\n threadId?: string | undefined;\n date?: string | undefined;\n from?: string | undefined;\n fromName?: string | undefined;\n to?: string | undefined;\n cc?: string | undefined;\n bcc?: string | undefined;\n subject?: string | undefined;\n snippet?: string | undefined;\n body?: string | undefined;\n}\n\ninterface FormatOptions {\n body?: boolean;\n addressFormat?: 'raw' | 'name' | 'email';\n}\n\nfunction getHeader(headers: Array<{ name: string; value: string }> | undefined, name: string): string {\n if (!headers || !Array.isArray(headers)) return '';\n const header = headers.find((h) => h.name.toLowerCase() === name.toLowerCase());\n return header ? header.value : '';\n}\n\ninterface AddressToken {\n name?: string | undefined;\n email: string;\n}\n\nfunction parseEmailHeader(headerValue: string): AddressToken[] {\n if (!headerValue) return [];\n\n const parts: string[] = [];\n let current = '';\n let inQuotes = false;\n\n for (let i = 0; i < headerValue.length; i++) {\n const char = headerValue[i];\n if (char === '\"') {\n inQuotes = !inQuotes;\n current += char;\n } else if (char === ',' && !inQuotes) {\n parts.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current) parts.push(current.trim());\n\n return parts\n .map((part): AddressToken => {\n const match = part.match(/^(?:\"?([^\"]*)\"? <([^>]+)>|([^,]+))$/);\n if (match) {\n if (match[2]) {\n return { name: match[1] || undefined, email: match[2] };\n }\n return { email: match[3] || '' };\n }\n return { email: part.trim() };\n })\n .filter((token) => !!token.email); // Type guard to ensure email is always present\n}\n\nfunction formatRecipientHeader(headerValue: string, mode: 'raw' | 'name' | 'email' = 'email'): string {\n const addresses = parseEmailHeader(headerValue);\n return formatAddresses(addresses, mode);\n}\n\n/**\n * Sanitizes email body text for Google Sheets export by enforcing cell character limits.\n * Google Sheets API limits cells to 50,000 characters - this prevents API errors during export.\n */\nfunction sanitizeForSheetsExport(text: string): string {\n // Google Sheets has a 50,000 character limit per cell\n // Leave some buffer for safety\n const GOOGLE_SHEETS_CELL_LIMIT = 49000;\n\n if (text.length <= GOOGLE_SHEETS_CELL_LIMIT) return text;\n\n // Truncate and add indication that it was truncated\n const truncated = text.substring(0, GOOGLE_SHEETS_CELL_LIMIT - 100);\n return `${truncated}\\n\\n[...content truncated to fit Google Sheets cell limit...]`;\n}\n\nexport function toRowFromGmail(msg: GmailMessage = {}, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const headers = msg.payload?.headers || [];\n const toHeader = getHeader(headers, 'To');\n const fromHeader = getHeader(headers, 'From');\n const ccHeader = getHeader(headers, 'Cc');\n const bccHeader = getHeader(headers, 'Bcc');\n const dateHeader = getHeader(headers, 'Date');\n const subjectHeader = getHeader(headers, 'Subject');\n\n const to = formatRecipientHeader(toHeader, fmt);\n const from = formatRecipientHeader(fromHeader, fmt);\n const cc = formatRecipientHeader(ccHeader, fmt);\n const bcc = formatRecipientHeader(bccHeader, fmt);\n const date = normalizeDateToISO(dateHeader) ?? '';\n const subject = subjectHeader ?? '';\n\n const labels = (msg.labelIds || []).join(', ');\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body) {\n if (msg.payload) {\n if (msg.payload.body?.data) {\n const rawBody = Buffer.from(msg.payload.body.data, 'base64').toString('utf-8');\n bodyFull = extractCurrentMessageFromText(rawBody);\n } else if (msg.payload.parts && Array.isArray(msg.payload.parts)) {\n for (const part of msg.payload.parts) {\n if (part.body?.data) {\n const rawBody = Buffer.from(part.body.data, 'base64').toString('utf-8');\n if (part.mimeType === 'text/plain') {\n bodyFull = extractCurrentMessageFromText(rawBody);\n break;\n }\n if (part.mimeType === 'text/html') {\n bodyFull = extractCurrentMessageFromHtmlToText(rawBody);\n break;\n }\n }\n }\n }\n }\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(bodyFull)];\n}\n\nexport function toRowFromGmailSummary(msg: GmailEmailSummary, opts: FormatOptions = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = msg.provider || 'gmail';\n const threadId = msg.threadId ?? '';\n const fmt = opts.addressFormat || 'email';\n\n const to = formatRecipientHeader(msg.to ?? '', fmt);\n const from = formatRecipientHeader(msg.from ?? '', fmt);\n const cc = formatRecipientHeader(msg.cc ?? '', fmt);\n const bcc = formatRecipientHeader(msg.bcc ?? '', fmt);\n const date = normalizeDateToISO(msg.date) ?? '';\n const subject = msg.subject ?? '';\n const labels = '';\n const snippet = msg.snippet ?? '';\n\n let bodyFull = '';\n if (opts.body && msg.body) {\n bodyFull = extractCurrentMessageFromText(msg.body);\n }\n\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, sanitizeForSheetsExport(bodyFull)];\n}\n\ninterface ClientSideFilters {\n subjectIncludes?: string[];\n bodyIncludes?: string[];\n textIncludes?: string[];\n fromIncludes?: string[];\n toIncludes?: string[];\n ccIncludes?: string[];\n bccIncludes?: string[];\n}\n\ninterface FilterContent {\n subject?: string;\n snippetOrPreview?: string;\n fullBody?: string;\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n}\n\nexport function filterClientSide(filters: ClientSideFilters, { subject = '', snippetOrPreview = '', fullBody = '', from = '', to = '', cc = '', bcc = '' }: FilterContent = {}) {\n const lower = (a: string[]) => a.map((t) => String(t).toLowerCase());\n const subjectTokens = lower(filters.subjectIncludes || []);\n const bodyTokens = lower(filters.bodyIncludes || []);\n const textTokens = lower(filters.textIncludes || []);\n const fromTokens = lower(filters.fromIncludes || []);\n const toCredentials = lower(filters.toIncludes || []);\n const ccTokens = lower(filters.ccIncludes || []);\n const bccTokens = lower(filters.bccIncludes || []);\n\n const s = String(subject ?? '').toLowerCase();\n const b = String((fullBody || snippetOrPreview) ?? '').toLowerCase();\n const f = String(from ?? '').toLowerCase();\n const t = String(to ?? '').toLowerCase();\n const c = String(cc ?? '').toLowerCase();\n const bc = String(bcc ?? '').toLowerCase();\n\n const anyIncludes = (val: string, tokens: string[]) => (tokens.length === 1 ? val.includes(tokens[0] ?? '') : tokens.some((token) => val.includes(token)));\n const subjectOk = subjectTokens.length ? anyIncludes(s, subjectTokens) : true;\n const bodyOk = bodyTokens.length ? anyIncludes(b, bodyTokens) : true;\n const textOk = textTokens.length ? textTokens.some((token) => s.includes(token) || b.includes(token)) : true;\n const fromOk = fromTokens.length ? anyIncludes(f, fromTokens) : true;\n const toOk = toCredentials.length ? anyIncludes(t, toCredentials) : true;\n const ccOk = ccTokens.length ? anyIncludes(c, ccTokens) : true;\n const bccOk = bccTokens.length ? anyIncludes(bc, bccTokens) : true;\n\n return subjectOk && bodyOk && textOk && fromOk && toOk && ccOk && bccOk;\n}\n"],"names":["filterClientSide","toRowFromGmail","toRowFromGmailSummary","getHeader","headers","name","Array","isArray","header","find","h","toLowerCase","value","parseEmailHeader","headerValue","parts","current","inQuotes","i","length","char","push","trim","map","part","match","undefined","email","filter","token","formatRecipientHeader","mode","addresses","formatAddresses","sanitizeForSheetsExport","text","GOOGLE_SHEETS_CELL_LIMIT","truncated","substring","msg","opts","body","addressFormat","normalizeDateToISO","id","provider","threadId","fmt","payload","toHeader","fromHeader","ccHeader","bccHeader","dateHeader","subjectHeader","to","from","cc","bcc","date","subject","labels","labelIds","join","snippet","bodyFull","data","rawBody","Buffer","toString","extractCurrentMessageFromText","mimeType","extractCurrentMessageFromHtmlToText","filters","snippetOrPreview","fullBody","lower","a","t","String","subjectTokens","subjectIncludes","bodyTokens","bodyIncludes","textTokens","textIncludes","fromTokens","fromIncludes","toCredentials","toIncludes","ccTokens","ccIncludes","bccTokens","bccIncludes","s","b","f","c","bc","anyIncludes","val","tokens","includes","some","subjectOk","bodyOk","textOk","fromOk","toOk","ccOk","bccOk"],"mappings":"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"}
|
package/dist/cjs/mcp/index.js
CHANGED
|
@@ -10,18 +10,18 @@ function _export(target, all) {
|
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
12
|
get promptFactories () {
|
|
13
|
-
return
|
|
13
|
+
return _indexts;
|
|
14
14
|
},
|
|
15
15
|
get resourceFactories () {
|
|
16
|
-
return
|
|
16
|
+
return _indexts1;
|
|
17
17
|
},
|
|
18
18
|
get toolFactories () {
|
|
19
|
-
return
|
|
19
|
+
return _indexts2;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
var
|
|
23
|
-
var
|
|
24
|
-
var
|
|
22
|
+
var _indexts = /*#__PURE__*/ _interop_require_wildcard(require("./prompts/index.js"));
|
|
23
|
+
var _indexts1 = /*#__PURE__*/ _interop_require_wildcard(require("./resources/index.js"));
|
|
24
|
+
var _indexts2 = /*#__PURE__*/ _interop_require_wildcard(require("./tools/index.js"));
|
|
25
25
|
function _getRequireWildcardCache(nodeInterop) {
|
|
26
26
|
if (typeof WeakMap !== "function") return null;
|
|
27
27
|
var cacheBabelInterop = new WeakMap();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.ts';\nexport * as resourceFactories from './resources/index.ts';\nexport * as toolFactories from './tools/index.ts';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;+DAFqB;gEACE;gEACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/mcp/prompts/draft-email.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\n\nexport default function createPrompt() {\n const argsSchema = z.object({\n context: z.string().min(1).describe('Email context to draft response for'),\n tone: z.string().optional().describe('Email tone (default: professional)'),\n });\n\n const config = {\n description: 'Draft an email response',\n argsSchema: argsSchema.shape,\n };\n\n const handler = async (args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n const { context, tone } = argsSchema.parse(args);\n return {\n messages: [\n { role: 'system' as const, content: { type: 'text' as const, text: 'You are an expert email assistant.' } },\n { role: 'user' as const, content: { type: 'text' as const, text: `Draft a ${tone || 'professional'} email:\\n\\n${context}` } },\n ],\n };\n };\n\n return {\n name: 'draft-email',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","argsSchema","z","object","context","string","min","describe","tone","optional","config","description","shape","handler","args","_extra","parse","messages","role","content","type","text","name"],"mappings":";;;;+BAKA;;;eAAwBA;;;mBAFN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,SAASA;IACtB,IAAMC,aAAaC,MAAC,CAACC,MAAM,CAAC;QAC1BC,SAASF,MAAC,CAACG,MAAM,GAAGC,GAAG,CAAC,GAAGC,QAAQ,CAAC;QACpCC,MAAMN,MAAC,CAACG,MAAM,GAAGI,QAAQ,GAAGF,QAAQ,CAAC;IACvC;IAEA,IAAMG,SAAS;QACbC,aAAa;QACbV,YAAYA,WAAWW,KAAK;IAC9B;IAEA,IAAMC,UAAU,SAAOC,MAAgCC;;gBAC3Bd,mBAAlBG,SAASI;;gBAASP,oBAAAA,WAAWe,KAAK,CAACF,OAAnCV,UAAkBH,kBAAlBG,SAASI,OAASP,kBAATO;gBACjB;;oBAAO;wBACLS,QAAQ;4BACN;gCAAEC,MAAM;gCAAmBC,SAAS;oCAAEC,MAAM;oCAAiBC,MAAM;gCAAqC;4BAAE;4BAC1G;gCAAEH,MAAM;gCAAiBC,SAAS;oCAAEC,MAAM;oCAAiBC,MAAM,AAAC,WAA8CjB,OAApCI,QAAQ,gBAAe,eAAqB,OAARJ;gCAAU;4BAAE;;oBAEhI;;;QACF;;IAEA,OAAO;QACLkB,MAAM;QACNZ,QAAAA;QACAG,SAAAA;IACF;AACF"}
|
|
@@ -10,14 +10,14 @@ function _export(target, all) {
|
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
12
|
get draftEmail () {
|
|
13
|
-
return
|
|
13
|
+
return _draftemailts.default;
|
|
14
14
|
},
|
|
15
15
|
get querySyntax () {
|
|
16
|
-
return
|
|
16
|
+
return _querysyntaxts.default;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
-
var
|
|
20
|
-
var
|
|
19
|
+
var _draftemailts = /*#__PURE__*/ _interop_require_default(require("./draft-email.js"));
|
|
20
|
+
var _querysyntaxts = /*#__PURE__*/ _interop_require_default(require("./query-syntax.js"));
|
|
21
21
|
function _interop_require_default(obj) {
|
|
22
22
|
return obj && obj.__esModule ? obj : {
|
|
23
23
|
default: obj
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as draftEmail } from './draft-email.ts';\nexport { default as querySyntax } from './query-syntax.ts';\n"],"names":["draftEmail","querySyntax"],"mappings":";;;;;;;;;;;QAAoBA;eAAAA,qBAAU;;QACVC;eAAAA,sBAAW;;;mEADO;oEACC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/mcp/prompts/query-syntax.ts"],"sourcesContent":["import type { PromptModule } from '@mcp-z/server';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport default function createPrompt() {\n const config = {\n description: 'Reference guide for Gmail query syntax',\n };\n\n const handler = async (_args: { [x: string]: unknown }, _extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => {\n return {\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `# Gmail Query Syntax Reference\n\n## Logical Operators\n- \\`$and\\`: Array of conditions that ALL must match\n- \\`$or\\`: Array of conditions where ANY must match\n- \\`$not\\`: Condition that must NOT match\n\n## Email Address Fields\n- \\`from\\`, \\`to\\`, \\`cc\\`, \\`bcc\\`: String or field operators\n\n## Content Fields\n- \\`subject\\`: Search subject line\n- \\`body\\`: Search message body\n- \\`text\\`: Search all text content\n- \\`fuzzyPhrase\\`: Approximate phrase matching (words appear together)\n\n## Boolean Flags\n- \\`hasAttachment\\`: true/false\n- \\`isRead\\`: true/false\n\n## Date Range\n\\`\\`\\`json\n{ \"date\": { \"$gte\": \"2024-01-01\", \"$lt\": \"2024-12-31\" } }\n\\`\\`\\`\n\n## Gmail-Specific\n- \\`categories\\`: primary, social, promotions, updates, forums\n- \\`label\\`: User labels (case-sensitive, use gmail-labels-list to discover)\n- \\`rawGmailQuery\\`: Escape hatch for advanced Gmail syntax\n\n## Field Operators (for multi-value fields)\n- \\`$any\\`: OR - matches if ANY value matches\n- \\`$all\\`: AND - matches if ALL values match\n- \\`$none\\`: NOT - matches if NONE match\n\n## Example Queries\n\\`\\`\\`json\n// Unread from specific sender\n{ \"from\": \"boss@company.com\", \"isRead\": false }\n\n// Recent with attachment\n{ \"hasAttachment\": true, \"date\": { \"$gte\": \"2024-01-01\" } }\n\n// Multiple senders\n{ \"from\": { \"$any\": [\"alice@example.com\", \"bob@example.com\"] } }\n\n// Complex: promotions OR social, unread\n{ \"$and\": [\n { \"categories\": { \"$any\": [\"promotions\", \"social\"] } },\n { \"isRead\": false }\n]}\n\\`\\`\\``,\n },\n },\n ],\n };\n };\n\n return {\n name: 'query-syntax',\n config,\n handler,\n } satisfies PromptModule;\n}\n"],"names":["createPrompt","config","description","handler","_args","_extra","messages","role","content","type","text","name"],"mappings":";;;;+BAIA;;;eAAwBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAT,SAASA;IACtB,IAAMC,SAAS;QACbC,aAAa;IACf;IAEA,IAAMC,UAAU,SAAOC,OAAiCC;;;gBACtD;;oBAAO;wBACLC,QAAQ;4BACN;gCACEC,MAAM;gCACNC,SAAS;oCACPC,MAAM;oCACNC,MAAM;gCAoDR;4BACF;;oBAEJ;;;QACF;;IAEA,OAAO;QACLC,MAAM;QACNV,QAAAA;QACAE,SAAAA;IACF;AACF"}
|
|
@@ -10,8 +10,8 @@ Object.defineProperty(exports, "default", {
|
|
|
10
10
|
});
|
|
11
11
|
var _mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
12
12
|
var _googleapis = require("googleapis");
|
|
13
|
-
var
|
|
14
|
-
var
|
|
13
|
+
var _messageextractionts = require("../../email/parsing/message-extraction.js");
|
|
14
|
+
var _dateconversionts = require("../../lib/date-conversion.js");
|
|
15
15
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
16
16
|
try {
|
|
17
17
|
var info = gen[key](arg);
|
|
@@ -197,15 +197,15 @@ function createResource() {
|
|
|
197
197
|
String((_header_value = header.value) !== null && _header_value !== void 0 ? _header_value : '')
|
|
198
198
|
];
|
|
199
199
|
}));
|
|
200
|
-
fromInfo = (0,
|
|
201
|
-
toStr = (0,
|
|
200
|
+
fromInfo = (0, _messageextractionts.extractFrom)(headersMap.From);
|
|
201
|
+
toStr = (0, _messageextractionts.extractEmails)(headersMap.To).join(', ');
|
|
202
202
|
// Return lightweight metadata only (no body/snippet)
|
|
203
203
|
metadata = {
|
|
204
204
|
id: (_fullData_id = fullData.id) !== null && _fullData_id !== void 0 ? _fullData_id : variables.id,
|
|
205
205
|
subject: (_headersMap_Subject = headersMap.Subject) !== null && _headersMap_Subject !== void 0 ? _headersMap_Subject : '',
|
|
206
206
|
from: (fromInfo === null || fromInfo === void 0 ? void 0 : fromInfo.address) || headersMap.From,
|
|
207
207
|
to: toStr,
|
|
208
|
-
date: (0,
|
|
208
|
+
date: (0, _dateconversionts.toIsoUtc)(headersMap.Date) || headersMap.Date
|
|
209
209
|
};
|
|
210
210
|
return [
|
|
211
211
|
2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/mcp-z/mcp-gmail/src/mcp/resources/email.ts"],"sourcesContent":["import type { EnrichedExtra } from '@mcp-z/oauth-google';\nimport type { ResourceConfig, ResourceModule } from '@mcp-z/server';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { type gmail_v1, google } from 'googleapis';\nimport { extractEmails, extractFrom } from '../../email/parsing/message-extraction.ts';\nimport { toIsoUtc } from '../../lib/date-conversion.ts';\n\nexport default function createResource() {\n const template = new ResourceTemplate('gmail://messages/{id}', {\n list: undefined,\n });\n const config: ResourceConfig = {\n description: 'Gmail message metadata (lightweight: id, subject, from, to, date)',\n mimeType: 'application/json',\n };\n\n const handler = async (uri: URL, variables: { id: string }, extra: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult> => {\n try {\n const { logger, authContext } = extra as unknown as EnrichedExtra;\n\n logger.info(variables, 'gmail-email resource fetch');\n\n const gmail = google.gmail({ version: 'v1', auth: authContext.auth });\n const response = await gmail.users.messages.get({\n userId: 'me',\n id: variables.id,\n format: 'metadata',\n metadataHeaders: ['From', 'To', 'Subject', 'Date'],\n });\n\n const fullData = response.data;\n if (!fullData) {\n throw new Error('Message not found');\n }\n\n // Extract headers\n const headers = fullData?.payload?.headers;\n const headersArray = Array.isArray(headers) ? headers : [];\n const headersMap: Record<string, string> = Object.fromEntries(\n headersArray.map((h: unknown) => {\n const header = h as gmail_v1.Schema$MessagePartHeader;\n return [String(header.name ?? ''), String(header.value ?? '')];\n })\n );\n\n const fromInfo = extractFrom(headersMap.From);\n const toStr = extractEmails(headersMap.To).join(', ');\n\n // Return lightweight metadata only (no body/snippet)\n const metadata = {\n id: fullData.id ?? variables.id,\n subject: headersMap.Subject ?? '',\n from: fromInfo?.address || headersMap.From,\n to: toStr,\n date: toIsoUtc(headersMap.Date) || headersMap.Date,\n };\n\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify(metadata),\n },\n ],\n };\n } catch (e) {\n const { logger } = extra as unknown as EnrichedExtra;\n logger.error(e as Record<string, unknown>, 'gmail-email resource fetch failed');\n const error = e as { message?: unknown };\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: 'application/json',\n text: JSON.stringify({ error: String(error?.message ?? e) }),\n },\n ],\n };\n }\n };\n\n return {\n name: 'email',\n template,\n config,\n handler,\n } satisfies ResourceModule;\n}\n"],"names":["createResource","template","ResourceTemplate","list","undefined","config","description","mimeType","handler","uri","variables","extra","fullData","headersMap","logger","authContext","gmail","response","headers","headersArray","fromInfo","toStr","metadata","e","error","info","google","version","auth","users","messages","get","userId","id","format","metadataHeaders","data","Error","payload","Array","isArray","Object","fromEntries","map","h","header","String","name","value","extractFrom","From","extractEmails","To","join","subject","Subject","from","address","to","date","toIsoUtc","Date","contents","href","text","JSON","stringify","message"],"mappings":"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"}
|