@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.
Files changed (139) hide show
  1. package/README.md +33 -3
  2. package/bin/server.js +1 -1
  3. package/dist/cjs/constants.js.map +1 -1
  4. package/dist/cjs/email/composition/rfc822-builder.js.map +1 -1
  5. package/dist/cjs/email/messages/fetch-message.js +7 -7
  6. package/dist/cjs/email/messages/fetch-message.js.map +1 -1
  7. package/dist/cjs/email/messages/messages.js +10 -10
  8. package/dist/cjs/email/messages/messages.js.map +1 -1
  9. package/dist/cjs/email/parsing/header-parsing.js +3 -3
  10. package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
  11. package/dist/cjs/email/parsing/headers-utils.js.map +1 -1
  12. package/dist/cjs/email/parsing/html-processing.js.map +1 -1
  13. package/dist/cjs/email/parsing/message-extraction.js +5 -5
  14. package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
  15. package/dist/cjs/email/querying/execute-query.js +2 -2
  16. package/dist/cjs/email/querying/execute-query.js.map +1 -1
  17. package/dist/cjs/email/querying/pagination.js.map +1 -1
  18. package/dist/cjs/email/querying/query-builder.js.map +1 -1
  19. package/dist/cjs/email/querying/search-execution.js +4 -4
  20. package/dist/cjs/email/querying/search-execution.js.map +1 -1
  21. package/dist/cjs/index.d.cts +4 -0
  22. package/dist/cjs/index.d.ts +4 -0
  23. package/dist/cjs/index.js +21 -13
  24. package/dist/cjs/index.js.map +1 -1
  25. package/dist/cjs/labels/gmail-labels.js.map +1 -1
  26. package/dist/cjs/lib/base64-encoding.js.map +1 -1
  27. package/dist/cjs/lib/create-store.js.map +1 -1
  28. package/dist/cjs/lib/date-conversion.js.map +1 -1
  29. package/dist/cjs/lib/messages-to-row.js.map +1 -1
  30. package/dist/cjs/mcp/index.js +6 -6
  31. package/dist/cjs/mcp/index.js.map +1 -1
  32. package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
  33. package/dist/cjs/mcp/prompts/index.js +4 -4
  34. package/dist/cjs/mcp/prompts/index.js.map +1 -1
  35. package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
  36. package/dist/cjs/mcp/resources/email.js +5 -5
  37. package/dist/cjs/mcp/resources/email.js.map +1 -1
  38. package/dist/cjs/mcp/resources/index.js +2 -2
  39. package/dist/cjs/mcp/resources/index.js.map +1 -1
  40. package/dist/cjs/mcp/tools/categories-list.d.cts +8 -2
  41. package/dist/cjs/mcp/tools/categories-list.d.ts +8 -2
  42. package/dist/cjs/mcp/tools/categories-list.js +12 -4
  43. package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
  44. package/dist/cjs/mcp/tools/index.js +22 -22
  45. package/dist/cjs/mcp/tools/index.js.map +1 -1
  46. package/dist/cjs/mcp/tools/label-add.js +2 -2
  47. package/dist/cjs/mcp/tools/label-add.js.map +1 -1
  48. package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
  49. package/dist/cjs/mcp/tools/labels-list.d.cts +8 -2
  50. package/dist/cjs/mcp/tools/labels-list.d.ts +8 -2
  51. package/dist/cjs/mcp/tools/labels-list.js +12 -4
  52. package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
  53. package/dist/cjs/mcp/tools/message-get.js +8 -8
  54. package/dist/cjs/mcp/tools/message-get.js.map +1 -1
  55. package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
  56. package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
  57. package/dist/cjs/mcp/tools/message-respond.js +4 -4
  58. package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
  59. package/dist/cjs/mcp/tools/message-search.js +6 -6
  60. package/dist/cjs/mcp/tools/message-search.js.map +1 -1
  61. package/dist/cjs/mcp/tools/message-send.js +4 -4
  62. package/dist/cjs/mcp/tools/message-send.js.map +1 -1
  63. package/dist/cjs/mcp/tools/messages-export-csv.js +6 -6
  64. package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
  65. package/dist/cjs/schemas/gmail-query-schema.js.map +1 -1
  66. package/dist/cjs/schemas/index.js.map +1 -1
  67. package/dist/cjs/setup/config.js +11 -1
  68. package/dist/cjs/setup/config.js.map +1 -1
  69. package/dist/cjs/setup/http.js +6 -2
  70. package/dist/cjs/setup/http.js.map +1 -1
  71. package/dist/cjs/setup/index.d.cts +1 -0
  72. package/dist/cjs/setup/index.d.ts +1 -0
  73. package/dist/cjs/setup/index.js +9 -9
  74. package/dist/cjs/setup/index.js.map +1 -1
  75. package/dist/cjs/setup/oauth-google.d.cts +3 -2
  76. package/dist/cjs/setup/oauth-google.d.ts +3 -2
  77. package/dist/cjs/setup/oauth-google.js +15 -12
  78. package/dist/cjs/setup/oauth-google.js.map +1 -1
  79. package/dist/cjs/setup/runtime.js +9 -9
  80. package/dist/cjs/setup/runtime.js.map +1 -1
  81. package/dist/cjs/setup/stdio.js +2 -2
  82. package/dist/cjs/setup/stdio.js.map +1 -1
  83. package/dist/esm/constants.js.map +1 -1
  84. package/dist/esm/email/composition/rfc822-builder.js.map +1 -1
  85. package/dist/esm/email/messages/fetch-message.js.map +1 -1
  86. package/dist/esm/email/messages/messages.js.map +1 -1
  87. package/dist/esm/email/parsing/header-parsing.js.map +1 -1
  88. package/dist/esm/email/parsing/headers-utils.js.map +1 -1
  89. package/dist/esm/email/parsing/html-processing.js.map +1 -1
  90. package/dist/esm/email/parsing/message-extraction.js.map +1 -1
  91. package/dist/esm/email/querying/execute-query.js.map +1 -1
  92. package/dist/esm/email/querying/pagination.js.map +1 -1
  93. package/dist/esm/email/querying/query-builder.js.map +1 -1
  94. package/dist/esm/email/querying/search-execution.js.map +1 -1
  95. package/dist/esm/index.d.ts +4 -0
  96. package/dist/esm/index.js +2 -0
  97. package/dist/esm/index.js.map +1 -1
  98. package/dist/esm/labels/gmail-labels.js.map +1 -1
  99. package/dist/esm/lib/base64-encoding.js.map +1 -1
  100. package/dist/esm/lib/create-store.js.map +1 -1
  101. package/dist/esm/lib/date-conversion.js.map +1 -1
  102. package/dist/esm/lib/messages-to-row.js.map +1 -1
  103. package/dist/esm/mcp/index.js.map +1 -1
  104. package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
  105. package/dist/esm/mcp/prompts/index.js.map +1 -1
  106. package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
  107. package/dist/esm/mcp/resources/email.js.map +1 -1
  108. package/dist/esm/mcp/resources/index.js.map +1 -1
  109. package/dist/esm/mcp/tools/categories-list.d.ts +8 -2
  110. package/dist/esm/mcp/tools/categories-list.js +4 -2
  111. package/dist/esm/mcp/tools/categories-list.js.map +1 -1
  112. package/dist/esm/mcp/tools/index.js.map +1 -1
  113. package/dist/esm/mcp/tools/label-add.js.map +1 -1
  114. package/dist/esm/mcp/tools/label-delete.js.map +1 -1
  115. package/dist/esm/mcp/tools/labels-list.d.ts +8 -2
  116. package/dist/esm/mcp/tools/labels-list.js +4 -2
  117. package/dist/esm/mcp/tools/labels-list.js.map +1 -1
  118. package/dist/esm/mcp/tools/message-get.js.map +1 -1
  119. package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
  120. package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
  121. package/dist/esm/mcp/tools/message-respond.js.map +1 -1
  122. package/dist/esm/mcp/tools/message-search.js.map +1 -1
  123. package/dist/esm/mcp/tools/message-send.js.map +1 -1
  124. package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
  125. package/dist/esm/schemas/gmail-query-schema.js.map +1 -1
  126. package/dist/esm/schemas/index.js.map +1 -1
  127. package/dist/esm/setup/config.js +12 -2
  128. package/dist/esm/setup/config.js.map +1 -1
  129. package/dist/esm/setup/http.js +4 -0
  130. package/dist/esm/setup/http.js.map +1 -1
  131. package/dist/esm/setup/index.d.ts +1 -0
  132. package/dist/esm/setup/index.js.map +1 -1
  133. package/dist/esm/setup/oauth-google.d.ts +3 -2
  134. package/dist/esm/setup/oauth-google.js +8 -11
  135. package/dist/esm/setup/oauth-google.js.map +1 -1
  136. package/dist/esm/setup/runtime.js.map +1 -1
  137. package/dist/esm/setup/stdio.js.map +1 -1
  138. package/dist/esm/types.js.map +1 -1
  139. 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 _pagination = require("./pagination.js");
12
- var _querybuilder = require("./query-builder.js");
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, _querybuilder.toGmailQuery)(query);
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, _pagination.fetchMessagesPage)(gmail, pageParams)
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/ai/mcp-z/servers/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.js';\nimport type { Logger } from '../../types.js';\nimport { type FetchMessagesPageParams, fetchMessagesPage } from './pagination.js';\nimport { toGmailQuery } from './query-builder.js';\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;;;0BArC0C;4BACnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyB7B,SAASC,YAAYC,KAA4B;;IAC/C,IAAI,CAACA,OAAO,OAAO;IACnB,IAAMC,UAAUC,IAAAA,0BAAY,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,6BAAiB,EAACX,OAAOQ;;;oBAAxCC,SAAS;oBAEf,+DAA+D;oBAC/D;;wBAAO;4BACLG,UAAUH,OAAOG,QAAQ;4BACzBC,eAAeJ,OAAOI,aAAa;wBACrC;;;;IACF"}
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"}
@@ -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';
@@ -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 _index;
25
+ return _indexts;
20
26
  },
21
27
  get schemas () {
22
- return _index1;
28
+ return _indexts1;
23
29
  },
24
30
  get setup () {
25
- return _index2;
31
+ return _indexts2;
26
32
  },
27
33
  get startServer () {
28
34
  return startServer;
29
35
  }
30
36
  });
31
- var _config = require("./setup/config.js");
32
- var _http = require("./setup/http.js");
33
- var _stdio = require("./setup/stdio.js");
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 _index = /*#__PURE__*/ _interop_require_wildcard(require("./mcp/index.js"));
36
- var _index1 = /*#__PURE__*/ _interop_require_wildcard(require("./schemas/index.js"));
37
- var _index2 = /*#__PURE__*/ _interop_require_wildcard(require("./setup/index.js"));
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, _stdio.createStdioServer)(config)
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, _http.createHTTPServer)(config)
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, _config.handleVersionHelp)(process.argv);
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, _config.createConfig)();
305
+ config = (0, _configts.createConfig)();
298
306
  return [
299
307
  4,
300
308
  startServer(config)
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/Projects/ai/mcp-z/servers/mcp-gmail/src/index.ts"],"sourcesContent":["import { createConfig, handleVersionHelp } from './setup/config.js';\nimport { createHTTPServer } from './setup/http.js';\nimport { createStdioServer } from './setup/stdio.js';\nimport type { ServerConfig } from './types.js';\n\nexport { GOOGLE_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.js';\nexport * as schemas from './schemas/index.js';\nexport * as setup from './setup/index.js';\nexport * from './types.js';\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":["GOOGLE_SCOPE","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":";;;;;;;;;;;QAKSA;eAAAA,yBAAY;;QAkBrB;eAA8BC;;QAjBlBC;;;QACAC;;;QACAC;;;QAGUC;eAAAA;;;sBAX0B;oBACf;qBACC;2BAGL;6DACR;8DACI;8DACF;qBACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAC1BA,MAAlBC,QAAQC;;;;yBAAUF,CAAAA,OAAOG,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCJ;;;;oBAAoC;;wBAAMK,IAAAA,wBAAiB,EAACL;;;2BAAxB;;;;;;oBAAkC;;wBAAMM,IAAAA,sBAAgB,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,yBAAiB,EAACN,QAAQO,IAAI;oBACxD,IAAIF,kBAAkBG,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACL,kBAAkBM,MAAM;wBACpCX,QAAQE,IAAI,CAAC;oBACf;oBAEA,6CAA6C;oBACvCT,SAASmB,IAAAA,oBAAY;oBAC3B;;wBAAMpB,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQO,IAAI,CAAC,EAAE,KAAK,IAAIM,IAAI,qDAAiBC,QAAQ,EAAE;IACzD1B;AACF"}
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/ai/mcp-z/servers/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
+ {"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/ai/mcp-z/servers/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
+ {"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/ai/mcp-z/servers/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
+ {"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/ai/mcp-z/servers/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
+ {"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":"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"}
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":";;;;;;;;;;;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"}
@@ -10,18 +10,18 @@ function _export(target, all) {
10
10
  }
11
11
  _export(exports, {
12
12
  get promptFactories () {
13
- return _index;
13
+ return _indexts;
14
14
  },
15
15
  get resourceFactories () {
16
- return _index1;
16
+ return _indexts1;
17
17
  },
18
18
  get toolFactories () {
19
- return _index2;
19
+ return _indexts2;
20
20
  }
21
21
  });
22
- var _index = /*#__PURE__*/ _interop_require_wildcard(require("./prompts/index.js"));
23
- var _index1 = /*#__PURE__*/ _interop_require_wildcard(require("./resources/index.js"));
24
- var _index2 = /*#__PURE__*/ _interop_require_wildcard(require("./tools/index.js"));
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/ai/mcp-z/servers/mcp-gmail/src/mcp/index.ts"],"sourcesContent":["export * as promptFactories from './prompts/index.js';\nexport * as resourceFactories from './resources/index.js';\nexport * as toolFactories from './tools/index.js';\n"],"names":["promptFactories","resourceFactories","toolFactories"],"mappings":";;;;;;;;;;;QAAYA;;;QACAC;;;QACAC;;;;6DAFqB;8DACE;8DACJ"}
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/ai/mcp-z/servers/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"}
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 _draftemail.default;
13
+ return _draftemailts.default;
14
14
  },
15
15
  get querySyntax () {
16
- return _querysyntax.default;
16
+ return _querysyntaxts.default;
17
17
  }
18
18
  });
19
- var _draftemail = /*#__PURE__*/ _interop_require_default(require("./draft-email.js"));
20
- var _querysyntax = /*#__PURE__*/ _interop_require_default(require("./query-syntax.js"));
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/ai/mcp-z/servers/mcp-gmail/src/mcp/prompts/index.ts"],"sourcesContent":["export { default as draftEmail } from './draft-email.js';\nexport { default as querySyntax } from './query-syntax.js';\n"],"names":["draftEmail","querySyntax"],"mappings":";;;;;;;;;;;QAAoBA;eAAAA,mBAAU;;QACVC;eAAAA,oBAAW;;;iEADO;kEACC"}
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/ai/mcp-z/servers/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"}
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 _messageextraction = require("../../email/parsing/message-extraction.js");
14
- var _dateconversion = require("../../lib/date-conversion.js");
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, _messageextraction.extractFrom)(headersMap.From);
201
- toStr = (0, _messageextraction.extractEmails)(headersMap.To).join(', ');
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, _dateconversion.toIsoUtc)(headersMap.Date) || headersMap.Date
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/ai/mcp-z/servers/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.js';\nimport { toIsoUtc } from '../../lib/date-conversion.js';\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":";;;;+BASA;;;eAAwBA;;;mBAPS;0BAGK;iCACK;8BAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEV,SAASA;IACtB,IAAMC,WAAW,IAAIC,qBAAgB,CAAC,yBAAyB;QAC7DC,MAAMC;IACR;IACA,IAAMC,SAAyB;QAC7BC,aAAa;QACbC,UAAU;IACZ;IAEA,IAAMC,UAAU,SAAOC,KAAUC,WAA2BC;;gBAkClDC,cACKC,qBAfKD,mBAlBRE,QAAQC,aAIVC,OACAC,UAOAL,UAMAM,SACAC,cACAN,YAOAO,UACAC,OAGAC,UAiBCC,SACCT,SAEFU;;;;;;;;;;wBAnDEV,SAAwBH,MAAxBG,QAAQC,cAAgBJ,MAAhBI;wBAEhBD,OAAOW,IAAI,CAACf,WAAW;wBAEjBM,QAAQU,kBAAM,CAACV,KAAK,CAAC;4BAAEW,SAAS;4BAAMC,MAAMb,YAAYa,IAAI;wBAAC;wBAClD;;4BAAMZ,MAAMa,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC;gCAC9CC,QAAQ;gCACRC,IAAIvB,UAAUuB,EAAE;gCAChBC,QAAQ;gCACRC,eAAe;oCAAG;oCAAQ;oCAAM;oCAAW;;4BAC7C;;;wBALMlB,WAAW;wBAOXL,WAAWK,SAASmB,IAAI;wBAC9B,IAAI,CAACxB,UAAU;4BACb,MAAM,IAAIyB,MAAM;wBAClB;wBAEA,kBAAkB;wBACZnB,UAAUN,qBAAAA,gCAAAA,oBAAAA,SAAU0B,OAAO,cAAjB1B,wCAAAA,kBAAmBM,OAAO;wBACpCC,eAAeoB,MAAMC,OAAO,CAACtB,WAAWA;wBACxCL,aAAqC4B,OAAOC,WAAW,CAC3DvB,aAAawB,GAAG,CAAC,SAACC;gCAEDC,cAA2BA;4BAD1C,IAAMA,SAASD;4BACf,OAAO;gCAACE,QAAOD,eAAAA,OAAOE,IAAI,cAAXF,0BAAAA,eAAe;gCAAKC,QAAOD,gBAAAA,OAAOG,KAAK,cAAZH,2BAAAA,gBAAgB;6BAAI;wBAChE;wBAGIzB,WAAW6B,IAAAA,8BAAW,EAACpC,WAAWqC,IAAI;wBACtC7B,QAAQ8B,IAAAA,gCAAa,EAACtC,WAAWuC,EAAE,EAAEC,IAAI,CAAC;wBAEhD,qDAAqD;wBAC/C/B,WAAW;4BACfW,EAAE,GAAErB,eAAAA,SAASqB,EAAE,cAAXrB,0BAAAA,eAAeF,UAAUuB,EAAE;4BAC/BqB,OAAO,GAAEzC,sBAAAA,WAAW0C,OAAO,cAAlB1C,iCAAAA,sBAAsB;4BAC/B2C,MAAMpC,CAAAA,qBAAAA,+BAAAA,SAAUqC,OAAO,KAAI5C,WAAWqC,IAAI;4BAC1CQ,IAAIrC;4BACJsC,MAAMC,IAAAA,wBAAQ,EAAC/C,WAAWgD,IAAI,KAAKhD,WAAWgD,IAAI;wBACpD;wBAEA;;4BAAO;gCACLC,QAAQ;oCACN;wCACErD,KAAKA,IAAIsD,IAAI;wCACbxD,UAAU;wCACVyD,MAAMC,KAAKC,SAAS,CAAC5C;oCACvB;;4BAEJ;;;wBACOC;wBACCT,UAAWH,MAAXG;wBACRA,QAAOU,KAAK,CAACD,GAA8B;wBACrCC,QAAQD;wBACd;;4BAAO;gCACLuC,QAAQ;oCACN;wCACErD,KAAKA,IAAIsD,IAAI;wCACbxD,UAAU;wCACVyD,MAAMC,KAAKC,SAAS,CAAC;4CAAE1C,OAAOsB,eAAOtB,kBAAAA,4BAAAA,MAAO2C,OAAO,uCAAI5C;wCAAG;oCAC5D;;4BAEJ;;;;;;;;QAEJ;;IAEA,OAAO;QACLwB,MAAM;QACN9C,UAAAA;QACAI,QAAAA;QACAG,SAAAA;IACF;AACF"}
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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"}