@mcp-z/mcp-outlook 2.2.2 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/email/composition/outlook-message-builder.js.map +1 -1
- package/dist/cjs/email/messages/messages.js.map +1 -1
- package/dist/cjs/email/parsing/header-parsing.js.map +1 -1
- package/dist/cjs/email/parsing/message-extraction.js.map +1 -1
- package/dist/cjs/email/parsing/message-mapping.js.map +1 -1
- package/dist/cjs/email/querying/client-filter.js.map +1 -1
- package/dist/cjs/email/querying/execute-query.js.map +1 -1
- package/dist/cjs/email/querying/pagination-token.js.map +1 -1
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/messages-to-row.js.map +1 -1
- package/dist/cjs/lib/outlook/index.js.map +1 -1
- package/dist/cjs/lib/outlook/types.js.map +1 -1
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/draft-email.js.map +1 -1
- package/dist/cjs/mcp/prompts/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/email.js.map +1 -1
- package/dist/cjs/mcp/resources/index.js.map +1 -1
- package/dist/cjs/mcp/tools/categories-list.js.map +1 -1
- package/dist/cjs/mcp/tools/index.js.map +1 -1
- package/dist/cjs/mcp/tools/label-add.js.map +1 -1
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/mcp/tools/message-get.js.map +1 -1
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/message-send.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/cjs/schemas/index.js.map +1 -1
- package/dist/cjs/schemas/outlook-query-schema.js.map +1 -1
- package/dist/cjs/schemas/outlook-validation.js.map +1 -1
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/cjs/setup/index.js.map +1 -1
- package/dist/cjs/setup/oauth-microsoft.js.map +1 -1
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js.map +1 -1
- package/dist/cjs/setup/version-help.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/email/composition/outlook-message-builder.js.map +1 -1
- package/dist/esm/email/messages/messages.js.map +1 -1
- package/dist/esm/email/parsing/header-parsing.js.map +1 -1
- package/dist/esm/email/parsing/message-extraction.js.map +1 -1
- package/dist/esm/email/parsing/message-mapping.js.map +1 -1
- package/dist/esm/email/querying/client-filter.js.map +1 -1
- package/dist/esm/email/querying/execute-query.js.map +1 -1
- package/dist/esm/email/querying/pagination-token.js.map +1 -1
- package/dist/esm/email/querying/query-builder.js.map +1 -1
- package/dist/esm/email/querying/search-execution.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/create-store.js.map +1 -1
- package/dist/esm/lib/messages-to-row.js.map +1 -1
- package/dist/esm/lib/outlook/index.js.map +1 -1
- package/dist/esm/lib/outlook/types.js.map +1 -1
- package/dist/esm/mcp/index.js.map +1 -1
- package/dist/esm/mcp/prompts/draft-email.js.map +1 -1
- package/dist/esm/mcp/prompts/index.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/resources/email.js.map +1 -1
- package/dist/esm/mcp/resources/index.js.map +1 -1
- package/dist/esm/mcp/tools/categories-list.js.map +1 -1
- package/dist/esm/mcp/tools/index.js.map +1 -1
- package/dist/esm/mcp/tools/label-add.js.map +1 -1
- package/dist/esm/mcp/tools/label-delete.js.map +1 -1
- package/dist/esm/mcp/tools/labels-list.js.map +1 -1
- package/dist/esm/mcp/tools/message-get.js.map +1 -1
- package/dist/esm/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/esm/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/esm/mcp/tools/message-respond.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/mcp/tools/message-send.js.map +1 -1
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/esm/schemas/index.js.map +1 -1
- package/dist/esm/schemas/outlook-query-schema.js.map +1 -1
- package/dist/esm/schemas/outlook-validation.js.map +1 -1
- package/dist/esm/setup/config.js.map +1 -1
- package/dist/esm/setup/http.js.map +1 -1
- package/dist/esm/setup/index.js.map +1 -1
- package/dist/esm/setup/oauth-microsoft.js.map +1 -1
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/setup/version-help.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/constants.ts"],"sourcesContent":["/**\n * Outlook MCP Server Constants\n *\n * These scopes are required for Microsoft Outlook functionality and are hardcoded\n * rather than externally configured since this server knows its own requirements.\n */\n\nimport { EMAIL_CHUNK_SIZE, EMAIL_MAX_BATCH_SIZE } from '@mcp-z/email';\n\n// Microsoft OAuth scopes required for Outlook operations\nexport const MS_SCOPE = 'openid profile offline_access https://graph.microsoft.com/User.Read https://graph.microsoft.com/Mail.ReadWrite https://graph.microsoft.com/Mail.Send https://graph.microsoft.com/MailboxSettings.ReadWrite';\n\n// Batch processing configuration (from shared email constants)\nexport const CHUNK_SIZE = EMAIL_CHUNK_SIZE;\nexport const MAX_BATCH_SIZE = EMAIL_MAX_BATCH_SIZE;\n\n// Pagination configuration\nexport const MAX_PAGE_SIZE = 1000; // Maximum number of items per page\n"],"names":["CHUNK_SIZE","MAX_BATCH_SIZE","MAX_PAGE_SIZE","MS_SCOPE","EMAIL_CHUNK_SIZE","EMAIL_MAX_BATCH_SIZE"],"mappings":"AAAA;;;;;CAKC;;;;;;;;;;;QAQYA;eAAAA;;QACAC;eAAAA;;QAGAC;eAAAA;;QAPAC;eAAAA;;;qBAH0C;AAGhD,IAAMA,WAAW;AAGjB,IAAMH,aAAaI,uBAAgB;AACnC,IAAMH,iBAAiBI,2BAAoB;AAG3C,IAAMH,gBAAgB,MAAM,mCAAmC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/composition/outlook-message-builder.ts"],"sourcesContent":["/**\n * Outlook-specific message builder for composing emails using Microsoft Graph API format\n * This is the Outlook equivalent of Gmail's RFC822 builder\n */\n\nexport interface OutlookRecipient {\n emailAddress: {\n address: string;\n name?: string;\n };\n}\n\nexport interface OutlookMessageArgs {\n to?: string | string[] | undefined;\n cc?: string | string[] | undefined;\n bcc?: string | string[] | undefined;\n subject?: string;\n body?: string;\n from?: string;\n importance?: 'Low' | 'Normal' | 'High';\n contentType?: 'Text' | 'HTML';\n}\n\nexport interface OutlookMessage {\n subject?: string;\n body?: {\n contentType: string;\n content: string;\n };\n toRecipients?: OutlookRecipient[];\n ccRecipients?: OutlookRecipient[];\n bccRecipients?: OutlookRecipient[];\n importance?: string;\n}\n\n/**\n * Build an Outlook message object from email arguments for Microsoft Graph API\n * This is the Outlook equivalent of buildRfc822FromArgs for Gmail\n */\nexport function buildOutlookMessage(args: OutlookMessageArgs): OutlookMessage {\n const { to = [], cc = [], bcc = [], subject = '', body = '', importance = 'Normal', contentType = 'Text' } = args;\n\n const message: OutlookMessage = {};\n\n if (subject) {\n message.subject = subject;\n }\n\n if (body) {\n message.body = {\n contentType: contentType,\n content: body,\n };\n }\n\n function parseEmailAddresses(emails: string | string[]): OutlookRecipient[] {\n const emailArray = Array.isArray(emails) ? emails : [emails];\n return emailArray\n .filter((email) => email && email.trim())\n .map((email) => {\n const trimmed = email.trim();\n // Simple email parsing - could be enhanced for name parsing\n return {\n emailAddress: {\n address: trimmed,\n },\n };\n });\n }\n\n if (to && (Array.isArray(to) ? to.length > 0 : to.trim())) {\n message.toRecipients = parseEmailAddresses(to);\n }\n\n if (cc && (Array.isArray(cc) ? cc.length > 0 : cc.trim())) {\n message.ccRecipients = parseEmailAddresses(cc);\n }\n\n if (bcc && (Array.isArray(bcc) ? bcc.length > 0 : bcc.trim())) {\n message.bccRecipients = parseEmailAddresses(bcc);\n }\n\n if (importance && importance !== 'Normal') {\n message.importance = importance;\n }\n\n return message;\n}\n"],"names":["buildOutlookMessage","args","to","cc","bcc","subject","body","importance","contentType","message","content","parseEmailAddresses","emails","emailArray","Array","isArray","filter","email","trim","map","trimmed","emailAddress","address","length","toRecipients","ccRecipients","bccRecipients"],"mappings":"AAAA;;;CAGC;;;;+BAoCeA;;;eAAAA;;;AAAT,SAASA,oBAAoBC,IAAwB;IAC1D,eAA6GA,KAArGC,IAAAA,2BAAK,EAAE,wBAA8FD,KAA5FE,IAAAA,2BAAK,EAAE,yBAAqFF,KAAnFG,KAAAA,6BAAM,EAAE,8BAA2EH,KAAzEI,SAAAA,qCAAU,iCAA+DJ,KAA3DK,MAAAA,+BAAO,oCAAoDL,KAAhDM,YAAAA,2CAAa,iDAAmCN,KAAzBO,aAAAA,6CAAc;IAElG,IAAMC,UAA0B,CAAC;IAEjC,IAAIJ,SAAS;QACXI,QAAQJ,OAAO,GAAGA;IACpB;IAEA,IAAIC,MAAM;QACRG,QAAQH,IAAI,GAAG;YACbE,aAAaA;YACbE,SAASJ;QACX;IACF;IAEA,SAASK,oBAAoBC,MAAyB;QACpD,IAAMC,aAAaC,MAAMC,OAAO,CAACH,UAAUA,SAAS;YAACA;SAAO;QAC5D,OAAOC,WACJG,MAAM,CAAC,SAACC;mBAAUA,SAASA,MAAMC,IAAI;WACrCC,GAAG,CAAC,SAACF;YACJ,IAAMG,UAAUH,MAAMC,IAAI;YAC1B,4DAA4D;YAC5D,OAAO;gBACLG,cAAc;oBACZC,SAASF;gBACX;YACF;QACF;IACJ;IAEA,IAAIlB,MAAOY,CAAAA,MAAMC,OAAO,CAACb,MAAMA,GAAGqB,MAAM,GAAG,IAAIrB,GAAGgB,IAAI,EAAC,GAAI;QACzDT,QAAQe,YAAY,GAAGb,oBAAoBT;IAC7C;IAEA,IAAIC,MAAOW,CAAAA,MAAMC,OAAO,CAACZ,MAAMA,GAAGoB,MAAM,GAAG,IAAIpB,GAAGe,IAAI,EAAC,GAAI;QACzDT,QAAQgB,YAAY,GAAGd,oBAAoBR;IAC7C;IAEA,IAAIC,OAAQU,CAAAA,MAAMC,OAAO,CAACX,OAAOA,IAAImB,MAAM,GAAG,IAAInB,IAAIc,IAAI,EAAC,GAAI;QAC7DT,QAAQiB,aAAa,GAAGf,oBAAoBP;IAC9C;IAEA,IAAIG,cAAcA,eAAe,UAAU;QACzCE,QAAQF,UAAU,GAAGA;IACvB;IAEA,OAAOE;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/messages/messages.ts"],"sourcesContent":["import { buildContentForItems, stripHtml, normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { OutlookMessage } from '../../lib/outlook/types.ts';\nimport { extractFrom, formatAddressList } from '../parsing/header-parsing.ts';\n\nexport { buildContentForItems };\n\nexport function toRowFromOutlook(msg: OutlookMessage, opts: { body?: boolean; addressFormat?: 'email' | 'name' | 'raw' } = { body: false, addressFormat: 'email' }) {\n const id = msg.id ?? '';\n const provider = 'outlook';\n const threadId = msg.conversationId ?? '';\n const to = msg.toRecipients ? formatAddressList(msg.toRecipients, opts.addressFormat) : '';\n const from = msg.from ? (extractFrom(msg.from) ?? '') : '';\n const cc = msg.ccRecipients ? formatAddressList(msg.ccRecipients, opts.addressFormat) : '';\n const bcc = msg.bccRecipients ? formatAddressList(msg.bccRecipients, opts.addressFormat) : '';\n const date = msg.receivedDateTime ? toIsoUtc(msg.receivedDateTime) || msg.receivedDateTime : '';\n const subject = msg.subject ?? '';\n const labels = msg.categories ? msg.categories.join(';') : '';\n const snippet = msg.bodyPreview ?? '';\n let bodyFull = '';\n if (opts.body && msg.body) {\n const raw = msg.body.content ?? '';\n if (raw) {\n bodyFull = msg.body.contentType && msg.body.contentType.toLowerCase() === 'html' ? stripHtml(raw) : String(raw);\n }\n }\n return [id, provider, threadId, to, from, cc, bcc, date, subject, labels, snippet, bodyFull];\n}\n"],"names":["buildContentForItems","toRowFromOutlook","msg","opts","body","addressFormat","extractFrom","id","provider","threadId","conversationId","to","toRecipients","formatAddressList","from","cc","ccRecipients","bcc","bccRecipients","date","receivedDateTime","toIsoUtc","subject","labels","categories","join","snippet","bodyPreview","bodyFull","raw","content","contentType","toLowerCase","stripHtml","String"],"mappings":";;;;;;;;;;;QAISA;eAAAA,2BAAoB;;QAEbC;eAAAA;;;qBANgE;+BAEjC;AAIxC,SAASA,iBAAiBC,GAAmB;QAAEC,OAAAA,iEAAqE;QAAEC,MAAM;QAAOC,eAAe;IAAQ;QACpJH,SAEMA,qBAEQI,cAITJ,cAEAA;IAVhB,IAAMK,MAAKL,UAAAA,IAAIK,EAAE,cAANL,qBAAAA,UAAU;IACrB,IAAMM,WAAW;IACjB,IAAMC,YAAWP,sBAAAA,IAAIQ,cAAc,cAAlBR,iCAAAA,sBAAsB;IACvC,IAAMS,KAAKT,IAAIU,YAAY,GAAGC,IAAAA,kCAAiB,EAACX,IAAIU,YAAY,EAAET,KAAKE,aAAa,IAAI;IACxF,IAAMS,OAAOZ,IAAIY,IAAI,IAAIR,eAAAA,IAAAA,4BAAW,EAACJ,IAAIY,IAAI,eAApBR,0BAAAA,eAAyB,KAAM;IACxD,IAAMS,KAAKb,IAAIc,YAAY,GAAGH,IAAAA,kCAAiB,EAACX,IAAIc,YAAY,EAAEb,KAAKE,aAAa,IAAI;IACxF,IAAMY,MAAMf,IAAIgB,aAAa,GAAGL,IAAAA,kCAAiB,EAACX,IAAIgB,aAAa,EAAEf,KAAKE,aAAa,IAAI;IAC3F,IAAMc,OAAOjB,IAAIkB,gBAAgB,GAAGC,IAAAA,yBAAQ,EAACnB,IAAIkB,gBAAgB,KAAKlB,IAAIkB,gBAAgB,GAAG;IAC7F,IAAME,WAAUpB,eAAAA,IAAIoB,OAAO,cAAXpB,0BAAAA,eAAe;IAC/B,IAAMqB,SAASrB,IAAIsB,UAAU,GAAGtB,IAAIsB,UAAU,CAACC,IAAI,CAAC,OAAO;IAC3D,IAAMC,WAAUxB,mBAAAA,IAAIyB,WAAW,cAAfzB,8BAAAA,mBAAmB;IACnC,IAAI0B,WAAW;IACf,IAAIzB,KAAKC,IAAI,IAAIF,IAAIE,IAAI,EAAE;YACbF;QAAZ,IAAM2B,OAAM3B,oBAAAA,IAAIE,IAAI,CAAC0B,OAAO,cAAhB5B,+BAAAA,oBAAoB;QAChC,IAAI2B,KAAK;YACPD,WAAW1B,IAAIE,IAAI,CAAC2B,WAAW,IAAI7B,IAAIE,IAAI,CAAC2B,WAAW,CAACC,WAAW,OAAO,SAASC,IAAAA,gBAAS,EAACJ,OAAOK,OAAOL;QAC7G;IACF;IACA,OAAO;QAACtB;QAAIC;QAAUC;QAAUE;QAAIG;QAAMC;QAAIE;QAAKE;QAAMG;QAASC;QAAQG;QAASE;KAAS;AAC9F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/parsing/header-parsing.ts"],"sourcesContent":["export function extractEmailsFromRecipients(recipients: Array<{ emailAddress?: { address?: string; name?: string } }>, mode: 'email' | 'name' | 'raw' = 'email'): string[] {\n if (!Array.isArray(recipients)) return [];\n return recipients\n .map((r) => {\n const name = r?.emailAddress?.name ?? '';\n const email = r?.emailAddress?.address ?? '';\n return mode === 'email' ? email : mode === 'name' ? name || email : `${name} <${email}>`;\n })\n .filter(Boolean);\n}\n\nexport function formatAddressList(recipients: Array<{ emailAddress?: { address?: string; name?: string } }>, mode: 'email' | 'name' | 'raw' = 'email'): string {\n return extractEmailsFromRecipients(recipients, mode).join(', ');\n}\n\nexport function extractFrom(from: { emailAddress?: { address?: string; name?: string } } | undefined): string | undefined {\n if (!from) return undefined;\n return from.emailAddress?.address || from.emailAddress?.name || undefined;\n}\n"],"names":["extractEmailsFromRecipients","extractFrom","formatAddressList","recipients","mode","Array","isArray","map","r","name","emailAddress","email","address","filter","Boolean","join","from","undefined"],"mappings":";;;;;;;;;;;QAAgBA;eAAAA;;QAeAC;eAAAA;;QAJAC;eAAAA;;;AAXT,SAASF,4BAA4BG,UAAyE;QAAEC,OAAAA,iEAAiC;IACtJ,IAAI,CAACC,MAAMC,OAAO,CAACH,aAAa,OAAO,EAAE;IACzC,OAAOA,WACJI,GAAG,CAAC,SAACC;;YACSA,iBACCA;QADd,IAAMC,eAAOD,cAAAA,yBAAAA,kBAAAA,EAAGE,YAAY,cAAfF,sCAAAA,gBAAiBC,IAAI,uCAAI;QACtC,IAAME,iBAAQH,cAAAA,yBAAAA,mBAAAA,EAAGE,YAAY,cAAfF,uCAAAA,iBAAiBI,OAAO,yCAAI;QAC1C,OAAOR,SAAS,UAAUO,QAAQP,SAAS,SAASK,QAAQE,QAAQ,AAAC,GAAWA,OAATF,MAAK,MAAU,OAANE,OAAM;IACxF,GACCE,MAAM,CAACC;AACZ;AAEO,SAASZ,kBAAkBC,UAAyE;QAAEC,OAAAA,iEAAiC;IAC5I,OAAOJ,4BAA4BG,YAAYC,MAAMW,IAAI,CAAC;AAC5D;AAEO,SAASd,YAAYe,IAAwE;QAE3FA,oBAA8BA;IADrC,IAAI,CAACA,MAAM,OAAOC;IAClB,OAAOD,EAAAA,qBAAAA,KAAKN,YAAY,cAAjBM,yCAAAA,mBAAmBJ,OAAO,OAAII,sBAAAA,KAAKN,YAAY,cAAjBM,0CAAAA,oBAAmBP,IAAI,KAAIQ;AAClE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/parsing/message-extraction.ts"],"sourcesContent":["import type { Client } from '@microsoft/microsoft-graph-client';\nimport type { OutlookMessage } from '../../lib/outlook/types.ts';\nimport { mapOutlookMessage, type NormalizedMessage } from './message-mapping.ts';\n\n/** Fetch a single Outlook message. Throws on non-OK Graph responses. */\nexport async function fetchOutlookMessage(graph: Client, id: string): Promise<NormalizedMessage> {\n if (!id) throw new Error('fetchOutlookMessage: id required');\n const selectFields = ['id', 'conversationId', 'receivedDateTime', 'subject', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients', 'bodyPreview', 'categories', 'body'];\n try {\n const data: unknown = await graph\n .api(`/me/messages/${encodeURIComponent(id)}`)\n .select(selectFields.join(','))\n .get();\n return mapOutlookMessage(data as OutlookMessage, { preferHtml: true });\n } catch (e: unknown) {\n const status = (e as Record<string, unknown>)?.status || (e as Record<string, unknown>)?.code || 'unknown';\n throw new Error(`outlook.fetchMessage: failed (${status})`);\n }\n}\n"],"names":["fetchOutlookMessage","graph","id","selectFields","data","e","status","Error","api","encodeURIComponent","select","join","get","mapOutlookMessage","preferHtml","code"],"mappings":";;;;+BAKsBA;;;eAAAA;;;gCAHoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGnD,SAAeA,oBAAoBC,KAAa,EAAEC,EAAU;;YAE3DC,cAEEC,MAKCC,GACDC;;;;oBATR,IAAI,CAACJ,IAAI,MAAM,IAAIK,MAAM;oBACnBJ;wBAAgB;wBAAM;wBAAkB;wBAAoB;wBAAW;wBAAQ;wBAAgB;wBAAgB;wBAAiB;wBAAe;wBAAc;;;;;;;;;;oBAE3I;;wBAAMF,MACzBO,GAAG,CAAC,AAAC,gBAAsC,OAAvBC,mBAAmBP,MACvCQ,MAAM,CAACP,aAAaQ,IAAI,CAAC,MACzBC,GAAG;;;oBAHAR,OAAgB;oBAItB;;wBAAOS,IAAAA,mCAAiB,EAACT,MAAwB;4BAAEU,YAAY;wBAAK;;;oBAC7DT;oBACDC,SAAS,CAACD,cAAAA,wBAAD,AAACA,EAA+BC,MAAM,MAAKD,cAAAA,wBAAD,AAACA,EAA+BU,IAAI,KAAI;oBACjG,MAAM,IAAIR,MAAM,AAAC,iCAAuC,OAAPD,QAAO;;;;;;;IAE5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/parsing/message-mapping.ts"],"sourcesContent":["import { stripHtml, normalizeDateToISO as toIsoUtc } from '@mcp-z/email';\nimport type { OutlookMessage } from '../../lib/outlook/types.ts';\nimport { extractEmailsFromRecipients } from './header-parsing.ts';\n\nexport interface NormalizedAddress {\n address?: string | undefined;\n name?: string | undefined;\n}\nexport interface NormalizedMessage {\n id: string;\n threadId?: string;\n date?: string;\n subject?: string;\n from?: NormalizedAddress;\n to?: string[];\n cc?: string[];\n bcc?: string[];\n snippet?: string;\n labels?: string[];\n body?: string;\n}\n\nexport function mapOutlookMessage(msg: OutlookMessage, opts: { preferHtml?: boolean } = {}): NormalizedMessage {\n const fromAddr = msg.from?.emailAddress;\n const bodyContent = msg.body?.content ?? '';\n const bodyType = String(msg.body?.contentType ?? '').toLowerCase();\n\n let body: string | undefined;\n if (bodyContent) {\n if (opts.preferHtml && bodyType === 'html') body = stripHtml(bodyContent);\n else body = bodyType === 'html' ? stripHtml(bodyContent) : String(bodyContent);\n }\n\n const out: NormalizedMessage = { id: msg.id ?? '' };\n\n if (msg.conversationId) out.threadId = String(msg.conversationId);\n if (msg.receivedDateTime) out.date = toIsoUtc(msg.receivedDateTime) ?? String(msg.receivedDateTime);\n if (msg.subject) out.subject = String(msg.subject);\n\n const fromObj = fromAddr ? { address: fromAddr.address || undefined, name: fromAddr.name || undefined } : undefined;\n if (fromObj && (fromObj.address || fromObj.name)) out.from = fromObj;\n\n const toList = extractEmailsFromRecipients(msg.toRecipients ?? []);\n if (Array.isArray(toList) && toList.length) out.to = toList;\n\n const ccList = extractEmailsFromRecipients(msg.ccRecipients ?? []);\n if (Array.isArray(ccList) && ccList.length) out.cc = ccList;\n\n const bccList = extractEmailsFromRecipients(msg.bccRecipients ?? []);\n if (Array.isArray(bccList) && bccList.length) out.bcc = bccList;\n\n if (msg.bodyPreview) out.snippet = String(msg.bodyPreview);\n if (Array.isArray(msg.categories) && msg.categories.length) out.labels = msg.categories.map(String);\n if (body) out.body = body;\n\n return out;\n}\n"],"names":["mapOutlookMessage","msg","opts","toIsoUtc","fromAddr","from","emailAddress","bodyContent","body","content","bodyType","String","contentType","toLowerCase","preferHtml","stripHtml","out","id","conversationId","threadId","receivedDateTime","date","subject","fromObj","address","undefined","name","toList","extractEmailsFromRecipients","toRecipients","Array","isArray","length","to","ccList","ccRecipients","cc","bccList","bccRecipients","bcc","bodyPreview","snippet","categories","labels","map"],"mappings":";;;;+BAsBgBA;;;eAAAA;;;qBAtB0C;+BAEd;AAoBrC,SAASA,kBAAkBC,GAAmB;QAAEC,OAAAA,iEAAiC,CAAC;qBAWlDD,SAGAE,WAMMF,mBAGAA,mBAGCA;QAzB3BA,WACGA,WACIA;IAFxB,IAAMG,YAAWH,YAAAA,IAAII,IAAI,cAARJ,gCAAAA,UAAUK,YAAY;IACvC,IAAMC,uBAAcN,YAAAA,IAAIO,IAAI,cAARP,gCAAAA,UAAUQ,OAAO,uCAAI;IACzC,IAAMC,WAAWC,iBAAOV,aAAAA,IAAIO,IAAI,cAARP,iCAAAA,WAAUW,WAAW,yCAAI,IAAIC,WAAW;IAEhE,IAAIL;IACJ,IAAID,aAAa;QACf,IAAIL,KAAKY,UAAU,IAAIJ,aAAa,QAAQF,OAAOO,IAAAA,gBAAS,EAACR;aACxDC,OAAOE,aAAa,SAASK,IAAAA,gBAAS,EAACR,eAAeI,OAAOJ;IACpE;IAEA,IAAMS,MAAyB;QAAEC,EAAE,GAAEhB,UAAAA,IAAIgB,EAAE,cAANhB,qBAAAA,UAAU;IAAG;IAElD,IAAIA,IAAIiB,cAAc,EAAEF,IAAIG,QAAQ,GAAGR,OAAOV,IAAIiB,cAAc;IAChE,IAAIjB,IAAImB,gBAAgB,EAAEJ,IAAIK,IAAI,IAAGlB,YAAAA,IAAAA,yBAAQ,EAACF,IAAImB,gBAAgB,eAA7BjB,uBAAAA,YAAkCQ,OAAOV,IAAImB,gBAAgB;IAClG,IAAInB,IAAIqB,OAAO,EAAEN,IAAIM,OAAO,GAAGX,OAAOV,IAAIqB,OAAO;IAEjD,IAAMC,UAAUnB,WAAW;QAAEoB,SAASpB,SAASoB,OAAO,IAAIC;QAAWC,MAAMtB,SAASsB,IAAI,IAAID;IAAU,IAAIA;IAC1G,IAAIF,WAAYA,CAAAA,QAAQC,OAAO,IAAID,QAAQG,IAAI,AAAD,GAAIV,IAAIX,IAAI,GAAGkB;IAE7D,IAAMI,SAASC,IAAAA,4CAA2B,GAAC3B,oBAAAA,IAAI4B,YAAY,cAAhB5B,+BAAAA,oBAAoB,EAAE;IACjE,IAAI6B,MAAMC,OAAO,CAACJ,WAAWA,OAAOK,MAAM,EAAEhB,IAAIiB,EAAE,GAAGN;IAErD,IAAMO,SAASN,IAAAA,4CAA2B,GAAC3B,oBAAAA,IAAIkC,YAAY,cAAhBlC,+BAAAA,oBAAoB,EAAE;IACjE,IAAI6B,MAAMC,OAAO,CAACG,WAAWA,OAAOF,MAAM,EAAEhB,IAAIoB,EAAE,GAAGF;IAErD,IAAMG,UAAUT,IAAAA,4CAA2B,GAAC3B,qBAAAA,IAAIqC,aAAa,cAAjBrC,gCAAAA,qBAAqB,EAAE;IACnE,IAAI6B,MAAMC,OAAO,CAACM,YAAYA,QAAQL,MAAM,EAAEhB,IAAIuB,GAAG,GAAGF;IAExD,IAAIpC,IAAIuC,WAAW,EAAExB,IAAIyB,OAAO,GAAG9B,OAAOV,IAAIuC,WAAW;IACzD,IAAIV,MAAMC,OAAO,CAAC9B,IAAIyC,UAAU,KAAKzC,IAAIyC,UAAU,CAACV,MAAM,EAAEhB,IAAI2B,MAAM,GAAG1C,IAAIyC,UAAU,CAACE,GAAG,CAACjC;IAC5F,IAAIH,MAAMQ,IAAIR,IAAI,GAAGA;IAErB,OAAOQ;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/email/querying/client-filter.ts"],"sourcesContent":["import type { FieldOperator } from '@mcp-z/email';\nimport type { Message, Recipient } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery } from '../../schemas/outlook-query-schema.ts';\nimport { mapOutlookCategory } from './query-builder.ts';\n\ntype Predicate = (message: Message) => boolean;\n\nexport function buildClientPredicate(query: OutlookQuery): Predicate {\n const nodePredicate = buildNodePredicate(query);\n return (message) => nodePredicate(message);\n}\n\nexport function needsBody(query: OutlookQuery | undefined | null): boolean {\n return hasBodyTextOrExact(query);\n}\n\nfunction buildNodePredicate(node: OutlookQuery | undefined | null): Predicate {\n if (!node || typeof node !== 'object') return () => true;\n\n if (node.$and) {\n const children = node.$and.map(buildNodePredicate);\n return (message) => children.every((child) => child(message));\n }\n if (node.$or) {\n const children = node.$or.map(buildNodePredicate);\n return (message) => children.some((child) => child(message));\n }\n if (node.$not) {\n const child = buildNodePredicate(node.$not);\n return (message) => !child(message);\n }\n\n const predicates: Predicate[] = [];\n\n if ('hasAttachment' in node && typeof node.hasAttachment === 'boolean') {\n predicates.push((message) => message.hasAttachments === node.hasAttachment);\n }\n if ('isRead' in node && typeof node.isRead === 'boolean') {\n predicates.push((message) => message.isRead === node.isRead);\n }\n if ('importance' in node && node.importance) {\n const expected = node.importance.toLowerCase();\n predicates.push((message) => typeof message.importance === 'string' && message.importance.toLowerCase() === expected);\n }\n if ('date' in node && node.date) {\n const { $gte, $lt } = node.date;\n predicates.push((message) => matchesDate(message.receivedDateTime, $gte, $lt));\n }\n\n if ('from' in node && node.from) {\n const from = node.from;\n predicates.push((message) => matchesAddressField(normalizeAddress(message.from), from));\n }\n if ('to' in node && node.to) {\n const to = node.to;\n predicates.push((message) => matchesRecipientField(message.toRecipients, to));\n }\n if ('cc' in node && node.cc) {\n const cc = node.cc;\n predicates.push((message) => matchesRecipientField(message.ccRecipients, cc));\n }\n if ('bcc' in node && node.bcc) {\n const bcc = node.bcc;\n predicates.push((message) => matchesRecipientField(message.bccRecipients, bcc));\n }\n if ('subject' in node && node.subject) {\n const subject = node.subject;\n predicates.push((message) => matchesSubject(message, subject));\n }\n if ('text' in node && node.text) {\n const text = node.text;\n predicates.push((message) => matchesText(message, text));\n }\n if ('body' in node && node.body) {\n const body = node.body;\n predicates.push((message) => matchesBody(message, body));\n }\n if ('exactPhrase' in node && node.exactPhrase) {\n const exactPhrase = node.exactPhrase;\n predicates.push((message) => matchesExactPhrase(message, exactPhrase));\n }\n if ('categories' in node && node.categories) {\n const categories = node.categories;\n predicates.push((message) => matchesCategoryField(message.categories ?? [], categories));\n }\n if ('label' in node && node.label) {\n const label = node.label;\n predicates.push((message) => matchesLabelField(message.categories ?? [], label));\n }\n\n if (predicates.length === 0) return () => true;\n return (message) => predicates.every((predicate) => predicate(message));\n}\n\nfunction hasBodyTextOrExact(node: OutlookQuery | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n if ('body' in node && node.body) return true;\n if ('text' in node && node.text) return true;\n if ('exactPhrase' in node && node.exactPhrase) return true;\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasBodyTextOrExact(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasBodyTextOrExact(child));\n }\n if ('$not' in node && node.$not) {\n return hasBodyTextOrExact(node.$not);\n }\n return false;\n}\n\nfunction matchesSubject(message: Message, value: string | FieldOperator): boolean {\n const normalizedSubject = normalizeForMatch(message.subject);\n return evaluateOperator(value, (term) => normalizedSubject.includes(term));\n}\n\nfunction matchesText(message: Message, value: string | FieldOperator): boolean {\n const textSources = getTextSources(message);\n return evaluateOperator(value, (term) => textSources.some((source) => source.includes(term)));\n}\n\nfunction matchesBody(message: Message, value: string | FieldOperator): boolean {\n const bodyContent = normalizeForMatch(message.body?.content);\n return evaluateOperator(value, (term) => bodyContent.includes(term));\n}\n\nfunction matchesExactPhrase(message: Message, phrase: string): boolean {\n const normalizedPhrase = normalizeTerm(phrase);\n if (!normalizedPhrase) return false;\n const textSources = getTextSources(message);\n return textSources.some((source) => source.includes(normalizedPhrase));\n}\n\nfunction matchesAddressField(addressData: NormalizedAddress, value: string | FieldOperator): boolean {\n const matchTerm = (term: string) => {\n const addressMatch = addressData.address.includes(term);\n const nameMatch = addressData.name.includes(term);\n if (term.includes('@')) {\n return addressMatch || nameMatch;\n }\n return addressMatch || nameMatch;\n };\n return evaluateOperator(value, matchTerm);\n}\n\ntype NormalizedAddress = { address: string; name: string };\n\nfunction normalizeAddress(recipient: Recipient | null | undefined): NormalizedAddress {\n return {\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n };\n}\n\nfunction matchesRecipientField(recipients: Recipient[] | null | undefined, value: string | FieldOperator): boolean {\n const normalizedRecipients = (recipients ?? []).map((recipient) => ({\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n }));\n const matchTerm = (term: string) => normalizedRecipients.some((recipient) => recipient.address.includes(term) || recipient.name.includes(term));\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesCategoryField(categories: string[], value: string | FieldOperator): boolean {\n const mappedCategories = categories.map((category) => category ?? '');\n const matchTerm = (term: string) => {\n try {\n const mappedTerm = mapOutlookCategory(term);\n return mappedCategories.includes(mappedTerm);\n } catch {\n return false;\n }\n };\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesLabelField(categories: string[], value: string | FieldOperator): boolean {\n const normalizeLabelTerm = (input: string): string | null => {\n const trimmed = input.trim();\n return trimmed === '' ? null : trimmed;\n };\n const matchTerm = (term: string) => categories.includes(term);\n return evaluateOperator(value, matchTerm, normalizeLabelTerm);\n}\n\nfunction matchesDate(received: string | null | undefined, gte?: string, lt?: string): boolean {\n if (!received) return false;\n const receivedTs = Date.parse(received);\n if (Number.isNaN(receivedTs)) return false;\n if (gte) {\n const start = Date.parse(`${gte}T00:00:00Z`);\n if (Number.isNaN(start) || receivedTs < start) return false;\n }\n if (lt) {\n const end = Date.parse(`${lt}T00:00:00Z`);\n if (Number.isNaN(end) || receivedTs >= end) return false;\n }\n return true;\n}\n\nfunction evaluateOperator(value: string | FieldOperator, matcher: (normalizedTerm: string) => boolean, normalizeFn: (input: string) => string | null = normalizeTerm): boolean {\n if (typeof value === 'string') {\n const normalized = normalizeFn(value);\n return normalized !== null && matcher(normalized);\n }\n let hasConstraint = false;\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n hasConstraint = true;\n const terms = value.$any.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.some(matcher)) return false;\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n hasConstraint = true;\n const terms = value.$all.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.every(matcher)) return false;\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n hasConstraint = true;\n const terms = value.$none.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.some(matcher)) return false;\n }\n return !!hasConstraint;\n}\n\nfunction normalizeTerm(input: string): string | null {\n const collapsed = input.replace(/\\s+/g, ' ').trim().toLowerCase();\n return collapsed === '' ? null : collapsed;\n}\n\nfunction normalizeForMatch(value?: string | null): string {\n return normalizeTerm(value ?? '') ?? '';\n}\n\nfunction getTextSources(message: Message): string[] {\n return [normalizeForMatch(message.subject), normalizeForMatch(message.body?.content), normalizeForMatch(message.bodyPreview)];\n}\n"],"names":["buildClientPredicate","needsBody","query","nodePredicate","buildNodePredicate","message","hasBodyTextOrExact","node","$and","children","map","every","child","$or","some","$not","predicates","hasAttachment","push","hasAttachments","isRead","importance","expected","toLowerCase","date","$gte","$lt","matchesDate","receivedDateTime","from","matchesAddressField","normalizeAddress","to","matchesRecipientField","toRecipients","cc","ccRecipients","bcc","bccRecipients","subject","matchesSubject","text","matchesText","body","matchesBody","exactPhrase","matchesExactPhrase","categories","matchesCategoryField","label","matchesLabelField","length","predicate","value","normalizedSubject","normalizeForMatch","evaluateOperator","term","includes","textSources","getTextSources","source","bodyContent","content","phrase","normalizedPhrase","normalizeTerm","addressData","matchTerm","addressMatch","address","nameMatch","name","recipient","emailAddress","recipients","normalizedRecipients","mappedCategories","category","mappedTerm","mapOutlookCategory","normalizeLabelTerm","input","trimmed","trim","received","gte","lt","receivedTs","Date","parse","Number","isNaN","start","end","matcher","normalizeFn","normalized","hasConstraint","Array","isArray","$any","terms","filter","Boolean","$all","$none","collapsed","replace","bodyPreview"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/client-filter.ts"],"sourcesContent":["import type { FieldOperator } from '@mcp-z/email';\nimport type { Message, Recipient } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery } from '../../schemas/outlook-query-schema.ts';\nimport { mapOutlookCategory } from './query-builder.ts';\n\ntype Predicate = (message: Message) => boolean;\n\nexport function buildClientPredicate(query: OutlookQuery): Predicate {\n const nodePredicate = buildNodePredicate(query);\n return (message) => nodePredicate(message);\n}\n\nexport function needsBody(query: OutlookQuery | undefined | null): boolean {\n return hasBodyTextOrExact(query);\n}\n\nfunction buildNodePredicate(node: OutlookQuery | undefined | null): Predicate {\n if (!node || typeof node !== 'object') return () => true;\n\n if (node.$and) {\n const children = node.$and.map(buildNodePredicate);\n return (message) => children.every((child) => child(message));\n }\n if (node.$or) {\n const children = node.$or.map(buildNodePredicate);\n return (message) => children.some((child) => child(message));\n }\n if (node.$not) {\n const child = buildNodePredicate(node.$not);\n return (message) => !child(message);\n }\n\n const predicates: Predicate[] = [];\n\n if ('hasAttachment' in node && typeof node.hasAttachment === 'boolean') {\n predicates.push((message) => message.hasAttachments === node.hasAttachment);\n }\n if ('isRead' in node && typeof node.isRead === 'boolean') {\n predicates.push((message) => message.isRead === node.isRead);\n }\n if ('importance' in node && node.importance) {\n const expected = node.importance.toLowerCase();\n predicates.push((message) => typeof message.importance === 'string' && message.importance.toLowerCase() === expected);\n }\n if ('date' in node && node.date) {\n const { $gte, $lt } = node.date;\n predicates.push((message) => matchesDate(message.receivedDateTime, $gte, $lt));\n }\n\n if ('from' in node && node.from) {\n const from = node.from;\n predicates.push((message) => matchesAddressField(normalizeAddress(message.from), from));\n }\n if ('to' in node && node.to) {\n const to = node.to;\n predicates.push((message) => matchesRecipientField(message.toRecipients, to));\n }\n if ('cc' in node && node.cc) {\n const cc = node.cc;\n predicates.push((message) => matchesRecipientField(message.ccRecipients, cc));\n }\n if ('bcc' in node && node.bcc) {\n const bcc = node.bcc;\n predicates.push((message) => matchesRecipientField(message.bccRecipients, bcc));\n }\n if ('subject' in node && node.subject) {\n const subject = node.subject;\n predicates.push((message) => matchesSubject(message, subject));\n }\n if ('text' in node && node.text) {\n const text = node.text;\n predicates.push((message) => matchesText(message, text));\n }\n if ('body' in node && node.body) {\n const body = node.body;\n predicates.push((message) => matchesBody(message, body));\n }\n if ('exactPhrase' in node && node.exactPhrase) {\n const exactPhrase = node.exactPhrase;\n predicates.push((message) => matchesExactPhrase(message, exactPhrase));\n }\n if ('categories' in node && node.categories) {\n const categories = node.categories;\n predicates.push((message) => matchesCategoryField(message.categories ?? [], categories));\n }\n if ('label' in node && node.label) {\n const label = node.label;\n predicates.push((message) => matchesLabelField(message.categories ?? [], label));\n }\n\n if (predicates.length === 0) return () => true;\n return (message) => predicates.every((predicate) => predicate(message));\n}\n\nfunction hasBodyTextOrExact(node: OutlookQuery | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n if ('body' in node && node.body) return true;\n if ('text' in node && node.text) return true;\n if ('exactPhrase' in node && node.exactPhrase) return true;\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasBodyTextOrExact(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasBodyTextOrExact(child));\n }\n if ('$not' in node && node.$not) {\n return hasBodyTextOrExact(node.$not);\n }\n return false;\n}\n\nfunction matchesSubject(message: Message, value: string | FieldOperator): boolean {\n const normalizedSubject = normalizeForMatch(message.subject);\n return evaluateOperator(value, (term) => normalizedSubject.includes(term));\n}\n\nfunction matchesText(message: Message, value: string | FieldOperator): boolean {\n const textSources = getTextSources(message);\n return evaluateOperator(value, (term) => textSources.some((source) => source.includes(term)));\n}\n\nfunction matchesBody(message: Message, value: string | FieldOperator): boolean {\n const bodyContent = normalizeForMatch(message.body?.content);\n return evaluateOperator(value, (term) => bodyContent.includes(term));\n}\n\nfunction matchesExactPhrase(message: Message, phrase: string): boolean {\n const normalizedPhrase = normalizeTerm(phrase);\n if (!normalizedPhrase) return false;\n const textSources = getTextSources(message);\n return textSources.some((source) => source.includes(normalizedPhrase));\n}\n\nfunction matchesAddressField(addressData: NormalizedAddress, value: string | FieldOperator): boolean {\n const matchTerm = (term: string) => {\n const addressMatch = addressData.address.includes(term);\n const nameMatch = addressData.name.includes(term);\n if (term.includes('@')) {\n return addressMatch || nameMatch;\n }\n return addressMatch || nameMatch;\n };\n return evaluateOperator(value, matchTerm);\n}\n\ntype NormalizedAddress = { address: string; name: string };\n\nfunction normalizeAddress(recipient: Recipient | null | undefined): NormalizedAddress {\n return {\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n };\n}\n\nfunction matchesRecipientField(recipients: Recipient[] | null | undefined, value: string | FieldOperator): boolean {\n const normalizedRecipients = (recipients ?? []).map((recipient) => ({\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n }));\n const matchTerm = (term: string) => normalizedRecipients.some((recipient) => recipient.address.includes(term) || recipient.name.includes(term));\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesCategoryField(categories: string[], value: string | FieldOperator): boolean {\n const mappedCategories = categories.map((category) => category ?? '');\n const matchTerm = (term: string) => {\n try {\n const mappedTerm = mapOutlookCategory(term);\n return mappedCategories.includes(mappedTerm);\n } catch {\n return false;\n }\n };\n return evaluateOperator(value, matchTerm);\n}\n\nfunction matchesLabelField(categories: string[], value: string | FieldOperator): boolean {\n const normalizeLabelTerm = (input: string): string | null => {\n const trimmed = input.trim();\n return trimmed === '' ? null : trimmed;\n };\n const matchTerm = (term: string) => categories.includes(term);\n return evaluateOperator(value, matchTerm, normalizeLabelTerm);\n}\n\nfunction matchesDate(received: string | null | undefined, gte?: string, lt?: string): boolean {\n if (!received) return false;\n const receivedTs = Date.parse(received);\n if (Number.isNaN(receivedTs)) return false;\n if (gte) {\n const start = Date.parse(`${gte}T00:00:00Z`);\n if (Number.isNaN(start) || receivedTs < start) return false;\n }\n if (lt) {\n const end = Date.parse(`${lt}T00:00:00Z`);\n if (Number.isNaN(end) || receivedTs >= end) return false;\n }\n return true;\n}\n\nfunction evaluateOperator(value: string | FieldOperator, matcher: (normalizedTerm: string) => boolean, normalizeFn: (input: string) => string | null = normalizeTerm): boolean {\n if (typeof value === 'string') {\n const normalized = normalizeFn(value);\n return normalized !== null && matcher(normalized);\n }\n let hasConstraint = false;\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n hasConstraint = true;\n const terms = value.$any.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.some(matcher)) return false;\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n hasConstraint = true;\n const terms = value.$all.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.length === 0 || !terms.every(matcher)) return false;\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n hasConstraint = true;\n const terms = value.$none.map(normalizeFn).filter((term): term is string => Boolean(term));\n if (terms.some(matcher)) return false;\n }\n return !!hasConstraint;\n}\n\nfunction normalizeTerm(input: string): string | null {\n const collapsed = input.replace(/\\s+/g, ' ').trim().toLowerCase();\n return collapsed === '' ? null : collapsed;\n}\n\nfunction normalizeForMatch(value?: string | null): string {\n return normalizeTerm(value ?? '') ?? '';\n}\n\nfunction getTextSources(message: Message): string[] {\n return [normalizeForMatch(message.subject), normalizeForMatch(message.body?.content), normalizeForMatch(message.bodyPreview)];\n}\n"],"names":["buildClientPredicate","needsBody","query","nodePredicate","buildNodePredicate","message","hasBodyTextOrExact","node","$and","children","map","every","child","$or","some","$not","predicates","hasAttachment","push","hasAttachments","isRead","importance","expected","toLowerCase","date","$gte","$lt","matchesDate","receivedDateTime","from","matchesAddressField","normalizeAddress","to","matchesRecipientField","toRecipients","cc","ccRecipients","bcc","bccRecipients","subject","matchesSubject","text","matchesText","body","matchesBody","exactPhrase","matchesExactPhrase","categories","matchesCategoryField","label","matchesLabelField","length","predicate","value","normalizedSubject","normalizeForMatch","evaluateOperator","term","includes","textSources","getTextSources","source","bodyContent","content","phrase","normalizedPhrase","normalizeTerm","addressData","matchTerm","addressMatch","address","nameMatch","name","recipient","emailAddress","recipients","normalizedRecipients","mappedCategories","category","mappedTerm","mapOutlookCategory","normalizeLabelTerm","input","trimmed","trim","received","gte","lt","receivedTs","Date","parse","Number","isNaN","start","end","matcher","normalizeFn","normalized","hasConstraint","Array","isArray","$any","terms","filter","Boolean","$all","$none","collapsed","replace","bodyPreview"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/execute-query.ts"],"sourcesContent":["import type { ExecutionResult } from '@mcp-z/email';\nimport type { Client } from '@microsoft/microsoft-graph-client';\nimport type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { searchMessages } from './search-execution.ts';\n\nexport interface ExecuteQueryOptions {\n readonly logger: Logger;\n readonly limit?: number;\n readonly includeBody?: boolean;\n readonly maxPages?: number | null;\n readonly maxItemsScanned?: number | null;\n readonly pageSize?: number;\n readonly pageToken?: string;\n readonly timezone?: string;\n readonly abortSignal?: AbortSignal;\n}\n\n/**\n * Execute an Outlook query with direct, single-attempt execution.\n * No planning, no fallbacks, no retries.\n * Microsoft Graph errors are returned directly to the caller for actionable feedback.\n */\nexport async function executeQuery<T>(graph: Client, query: QueryNode | undefined, options: ExecuteQueryOptions, transform: (item: unknown) => T): Promise<ExecutionResult<T>> {\n const { logger, limit, includeBody, maxPages, maxItemsScanned, pageSize, pageToken } = options;\n\n // Single execution - direct query to Microsoft Graph API\n logger.info('executeQuery: executing direct Outlook query');\n\n try {\n const result = await searchMessages(graph, {\n ...(query !== undefined && { query }),\n limit: limit ?? 50,\n includeBody: includeBody ?? false,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n pageSize: pageSize ?? 50,\n pageToken: pageToken ?? undefined,\n logger,\n });\n\n // Transform directly - if Microsoft Graph returns invalid data, fail loud\n const transformedResults = result.messages.map((item, index) => {\n try {\n return transform(item);\n } catch (transformError) {\n logger.error(`Transform function failed for item ${index}`, {\n itemIndex: index,\n error: transformError instanceof Error ? transformError.message : String(transformError),\n });\n throw new Error(`Transform failed at item ${index}: ${transformError}`);\n }\n });\n\n logger.info(`executeQuery: succeeded with ${transformedResults.length} results`);\n\n return {\n success: true,\n items: transformedResults,\n metadata: {\n nextPageToken: result.nextPageToken,\n totalFetched: result.messages.length,\n },\n };\n } catch (error) {\n // Re-throw errors directly - no fallback logic\n logger.error('executeQuery: failed', error as Record<string, unknown>);\n throw error;\n }\n}\n"],"names":["executeQuery","graph","query","options","transform","logger","limit","includeBody","maxPages","maxItemsScanned","pageSize","pageToken","result","transformedResults","error","info","searchMessages","undefined","messages","map","item","index","transformError","itemIndex","Error","message","String","length","success","items","metadata","nextPageToken","totalFetched"],"mappings":";;;;+BAuBsBA;;;eAAAA;;;iCAnBS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBxB,SAAeA,aAAgBC,KAAa,EAAEC,KAA4B,EAAEC,OAA4B,EAAEC,SAA+B;;YACtIC,QAAQC,OAAOC,aAAaC,UAAUC,iBAAiBC,UAAUC,WAMjEC,QAYAC,oBAsBCC;;;;oBAxCDT,SAA+EF,QAA/EE,QAAQC,QAAuEH,QAAvEG,OAAOC,cAAgEJ,QAAhEI,aAAaC,WAAmDL,QAAnDK,UAAUC,kBAAyCN,QAAzCM,iBAAiBC,WAAwBP,QAAxBO,UAAUC,YAAcR,QAAdQ;oBAEzE,yDAAyD;oBACzDN,OAAOU,IAAI,CAAC;;;;;;;;;oBAGK;;wBAAMC,IAAAA,iCAAc,EAACf,OAAO,wCACrCC,UAAUe,aAAa;4BAAEf,OAAAA;wBAAM;4BACnCI,KAAK,EAAEA,kBAAAA,mBAAAA,QAAS;4BAChBC,WAAW,EAAEA,wBAAAA,yBAAAA,cAAe;4BAC5BC,QAAQ,EAAEA,qBAAAA,sBAAAA,WAAY;4BACtBC,eAAe,EAAEA,4BAAAA,6BAAAA,kBAAmB;4BACpCC,QAAQ,EAAEA,qBAAAA,sBAAAA,WAAY;4BACtBC,SAAS,EAAEA,sBAAAA,uBAAAA,YAAaM;4BACxBZ,QAAAA;;;;oBARIO,SAAS;oBAWf,0EAA0E;oBACpEC,qBAAqBD,OAAOM,QAAQ,CAACC,GAAG,CAAC,SAACC,MAAMC;wBACpD,IAAI;4BACF,OAAOjB,UAAUgB;wBACnB,EAAE,OAAOE,gBAAgB;4BACvBjB,OAAOS,KAAK,CAAC,AAAC,sCAA2C,OAANO,QAAS;gCAC1DE,WAAWF;gCACXP,OAAOQ,AAAc,YAAdA,gBAA0BE,SAAQF,eAAeG,OAAO,GAAGC,OAAOJ;4BAC3E;4BACA,MAAM,IAAIE,MAAM,AAAC,4BAAqCF,OAAVD,OAAM,MAAmB,OAAfC;wBACxD;oBACF;oBAEAjB,OAAOU,IAAI,CAAC,AAAC,gCAAyD,OAA1BF,mBAAmBc,MAAM,EAAC;oBAEtE;;wBAAO;4BACLC,SAAS;4BACTC,OAAOhB;4BACPiB,UAAU;gCACRC,eAAenB,OAAOmB,aAAa;gCACnCC,cAAcpB,OAAOM,QAAQ,CAACS,MAAM;4BACtC;wBACF;;;oBACOb;oBACP,+CAA+C;oBAC/CT,OAAOS,KAAK,CAAC,wBAAwBA;oBACrC,MAAMA;;;;;;;IAEV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/pagination-token.ts"],"sourcesContent":["const PREFIX = 'v2:';\nexport const FIRST_PAGE_SKIP_TOKEN = '__mcp_outlook_first_page__';\n\ninterface V2Payload {\n v: 2;\n skipToken: string;\n offset: number;\n mode?: string;\n}\n\nexport interface DecodeNextPageTokenResult {\n skipToken?: string;\n offset: number;\n mode?: string;\n legacy: boolean;\n}\n\nexport function encodeNextPageToken(params: { skipToken?: string; offset: number; mode?: string }): string {\n const sanitizedOffset = Math.max(0, Math.trunc(params.offset));\n const payload: V2Payload = {\n v: 2,\n skipToken: params.skipToken ?? FIRST_PAGE_SKIP_TOKEN,\n offset: sanitizedOffset,\n };\n if (typeof params.mode === 'string' && params.mode.length > 0) {\n payload.mode = params.mode;\n }\n const serialized = JSON.stringify(payload);\n return `${PREFIX}${base64UrlEncode(serialized)}`;\n}\n\nexport function decodeNextPageToken(token: string | undefined): DecodeNextPageTokenResult {\n if (!token) {\n return { offset: 0, legacy: true };\n }\n\n if (!token.startsWith(PREFIX)) {\n return { skipToken: token, offset: 0, legacy: true };\n }\n\n const encoded = token.slice(PREFIX.length);\n try {\n const decodedJson = base64UrlDecode(encoded);\n const parsed = JSON.parse(decodedJson) as Record<string, unknown>;\n if (parsed.v !== 2) throw new Error('unsupported token version');\n const skipTokenRaw = parsed.skipToken;\n const offsetRaw = parsed.offset;\n if (typeof skipTokenRaw !== 'string' || skipTokenRaw.trim() === '') throw new Error('missing skipToken');\n if (typeof offsetRaw !== 'number' || !Number.isInteger(offsetRaw) || offsetRaw < 0) throw new Error('invalid offset');\n\n return {\n skipToken: skipTokenRaw === FIRST_PAGE_SKIP_TOKEN ? undefined : skipTokenRaw,\n offset: offsetRaw,\n mode: typeof parsed.mode === 'string' ? parsed.mode : undefined,\n legacy: false,\n };\n } catch {\n return { skipToken: token, offset: 0, legacy: true };\n }\n}\n\nfunction base64UrlEncode(value: string): string {\n return Buffer.from(value, 'utf8').toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nfunction base64UrlDecode(value: string): string {\n const padded = value.replace(/-/g, '+').replace(/_/g, '/');\n const padLength = (4 - (padded.length % 4)) % 4;\n const normalized = padded + '='.repeat(padLength);\n return Buffer.from(normalized, 'base64').toString('utf8');\n}\n"],"names":["FIRST_PAGE_SKIP_TOKEN","decodeNextPageToken","encodeNextPageToken","PREFIX","params","sanitizedOffset","Math","max","trunc","offset","payload","v","skipToken","mode","length","serialized","JSON","stringify","base64UrlEncode","token","legacy","startsWith","encoded","slice","decodedJson","base64UrlDecode","parsed","parse","Error","skipTokenRaw","offsetRaw","trim","Number","isInteger","undefined","value","Buffer","from","toString","replace","padded","padLength","normalized","repeat"],"mappings":";;;;;;;;;;;QACaA;eAAAA;;QA8BGC;eAAAA;;QAdAC;eAAAA;;;AAjBhB,IAAMC,SAAS;AACR,IAAMH,wBAAwB;AAgB9B,SAASE,oBAAoBE,MAA6D;QAIlFA;IAHb,IAAMC,kBAAkBC,KAAKC,GAAG,CAAC,GAAGD,KAAKE,KAAK,CAACJ,OAAOK,MAAM;IAC5D,IAAMC,UAAqB;QACzBC,GAAG;QACHC,SAAS,GAAER,oBAAAA,OAAOQ,SAAS,cAAhBR,+BAAAA,oBAAoBJ;QAC/BS,QAAQJ;IACV;IACA,IAAI,OAAOD,OAAOS,IAAI,KAAK,YAAYT,OAAOS,IAAI,CAACC,MAAM,GAAG,GAAG;QAC7DJ,QAAQG,IAAI,GAAGT,OAAOS,IAAI;IAC5B;IACA,IAAME,aAAaC,KAAKC,SAAS,CAACP;IAClC,OAAO,AAAC,GAAWQ,OAATf,QAAqC,OAA5Be,gBAAgBH;AACrC;AAEO,SAASd,oBAAoBkB,KAAyB;IAC3D,IAAI,CAACA,OAAO;QACV,OAAO;YAAEV,QAAQ;YAAGW,QAAQ;QAAK;IACnC;IAEA,IAAI,CAACD,MAAME,UAAU,CAAClB,SAAS;QAC7B,OAAO;YAAES,WAAWO;YAAOV,QAAQ;YAAGW,QAAQ;QAAK;IACrD;IAEA,IAAME,UAAUH,MAAMI,KAAK,CAACpB,OAAOW,MAAM;IACzC,IAAI;QACF,IAAMU,cAAcC,gBAAgBH;QACpC,IAAMI,SAASV,KAAKW,KAAK,CAACH;QAC1B,IAAIE,OAAOf,CAAC,KAAK,GAAG,MAAM,IAAIiB,MAAM;QACpC,IAAMC,eAAeH,OAAOd,SAAS;QACrC,IAAMkB,YAAYJ,OAAOjB,MAAM;QAC/B,IAAI,OAAOoB,iBAAiB,YAAYA,aAAaE,IAAI,OAAO,IAAI,MAAM,IAAIH,MAAM;QACpF,IAAI,OAAOE,cAAc,YAAY,CAACE,OAAOC,SAAS,CAACH,cAAcA,YAAY,GAAG,MAAM,IAAIF,MAAM;QAEpG,OAAO;YACLhB,WAAWiB,iBAAiB7B,wBAAwBkC,YAAYL;YAChEpB,QAAQqB;YACRjB,MAAM,OAAOa,OAAOb,IAAI,KAAK,WAAWa,OAAOb,IAAI,GAAGqB;YACtDd,QAAQ;QACV;IACF,EAAE,eAAM;QACN,OAAO;YAAER,WAAWO;YAAOV,QAAQ;YAAGW,QAAQ;QAAK;IACrD;AACF;AAEA,SAASF,gBAAgBiB,KAAa;IACpC,OAAOC,OAAOC,IAAI,CAACF,OAAO,QAAQG,QAAQ,CAAC,UAAUC,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,OAAO;AAC9G;AAEA,SAASd,gBAAgBU,KAAa;IACpC,IAAMK,SAASL,MAAMI,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,MAAM;IACtD,IAAME,YAAY,AAAC,CAAA,IAAKD,OAAO1B,MAAM,GAAG,CAAC,IAAK;IAC9C,IAAM4B,aAAaF,SAAS,IAAIG,MAAM,CAACF;IACvC,OAAOL,OAAOC,IAAI,CAACK,YAAY,UAAUJ,QAAQ,CAAC;AACpD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/email/querying/query-builder.ts"],"sourcesContent":["import type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\n\ntype FieldOperator = {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n};\n\ntype DateOperator = {\n $gte?: string;\n $lt?: string;\n};\n\ntype 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 * Outlook category mappings - case insensitive input to exact system categories\n * Note: These are user-defined categories in Outlook, not system categories like Gmail\n */\nexport const OUTLOOK_CATEGORIES = {\n personal: 'Personal',\n work: 'Work',\n family: 'Family',\n travel: 'Travel',\n important: 'Important',\n urgent: 'Urgent',\n} as const;\n\n/**\n * Validate and map category name to Outlook system category\n * Throws error for invalid categories (fail fast principle)\n */\nexport function mapOutlookCategory(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 systemCategory = OUTLOOK_CATEGORIES[normalizedCategory as keyof typeof OUTLOOK_CATEGORIES];\n\n if (!systemCategory) {\n throw new Error(`Invalid Outlook category: \"${category}\". Valid categories: ${Object.keys(OUTLOOK_CATEGORIES).join(', ')}`);\n }\n\n return systemCategory;\n}\n\nexport interface ODataFilterResult {\n search: string | null;\n filter: string | null;\n requireBodyClientFilter: boolean;\n hasFullText: boolean;\n}\n\nexport function toGraphFilter(query: QueryNode): ODataFilterResult {\n if (query.kqlQuery) {\n return {\n search: query.kqlQuery,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: true,\n };\n }\n\n if (hasFullTextIntent(query)) {\n const searchCollect = collectSearchTerms(query);\n const search = searchCollect.terms.length ? searchCollect.terms.join(' OR ') : null;\n return {\n search,\n filter: null,\n requireBodyClientFilter: searchCollect.usesBody || searchCollect.usesText,\n hasFullText: true,\n };\n }\n\n const filterStr = buildQueryFilter(query);\n const cleanedFilter = filterStr && typeof filterStr === 'string' && filterStr.trim().length ? filterStr.trim() : null;\n return {\n search: null,\n filter: cleanedFilter,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n}\n\nfunction collectSearchTerms(query: QueryNode): { terms: string[]; usesText: boolean; usesBody: boolean; usesExact: boolean } {\n const state = {\n terms: [] as string[],\n usesText: false,\n usesBody: false,\n usesExact: false,\n };\n\n walkNode(query);\n return state;\n\n function walkNode(node: QueryNode | undefined) {\n if (!node || typeof node !== 'object') return;\n\n if (node.$and) {\n node.$and.forEach((child) => walkNode(child));\n return;\n }\n if (node.$or) {\n node.$or.forEach((child) => walkNode(child));\n return;\n }\n if (node.$not) {\n walkNode(node.$not);\n return;\n }\n\n if ('exactPhrase' in node && node.exactPhrase) {\n state.usesExact = true;\n pushExactPhrase(node.exactPhrase);\n }\n\n pushOperatorTerms(node.subject);\n\n if ('text' in node && node.text) {\n state.usesText = true;\n pushOperatorTerms(node.text);\n }\n if ('body' in node && node.body) {\n state.usesBody = true;\n pushOperatorTerms(node.body);\n }\n\n // Other fields (hasAttachment, importance, date) are handled via OData filters (emit())\n // and should not create search terms with colon prefixes that break Graph $search.\n }\n\n function pushExactPhrase(value: string) {\n const phrase = String(value);\n if (!phrase.trim()) return;\n pushAnyTerms([`\"${phrase}\"`]);\n }\n\n function pushOperatorTerms(value: FieldOperator | string | undefined) {\n if (!value) return;\n if (typeof value === 'string') {\n const clause = buildClause(null, value);\n if (clause) state.terms.push(clause);\n return;\n }\n\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n pushAnyTerms(value.$any);\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n pushAllTerms(value.$all);\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n const clauses = value.$none.map((term) => buildClause(null, String(term ?? ''))).filter(Boolean);\n if (clauses.length === 1) {\n state.terms.push(`NOT ${clauses[0]}`);\n } else if (clauses.length > 1) {\n state.terms.push(`NOT (${clauses.join(' OR ')})`);\n }\n }\n }\n\n function pushAnyTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n state.terms.push(clauses.length === 1 ? clauses[0] : `(${clauses.join(' OR ')})`);\n }\n\n function pushAllTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n // Graph $search silently ignores \"(A AND B)\" expressions, so narrow with the\n // first term only; the client-side $all predicate enforces the rest.\n state.terms.push(clauses[0]);\n }\n\n function escapeKQL(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/:/g, '\\\\:')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\{/g, '\\\\{')\n .replace(/\\}/g, '\\\\}')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\*/g, '\\\\*')\n .replace(/\\?/g, '\\\\?')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/_/g, '\\\\_');\n }\n\n function buildClause(_prefix: string | null, value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n const escaped = escapeKQL(trimmed);\n const shouldQuote = /[^a-zA-Z\\s]/.test(trimmed) || /\\s/.test(trimmed);\n return shouldQuote ? `\"${escaped}\"` : escaped;\n }\n}\n\nfunction hasFullTextIntent(node: QueryNode | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n\n if (node.kqlQuery) return true;\n if (node.exactPhrase) return true;\n if ('subject' in node && node.subject) return true;\n if ('text' in node && node.text) return true;\n if ('body' in node && node.body) return true;\n\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasFullTextIntent(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasFullTextIntent(child));\n }\n if ('$not' in node && node.$not) {\n return hasFullTextIntent(node.$not);\n }\n\n return false;\n}\n\nexport function buildQueryFilter(query: QueryNode): string {\n function L(s: string) {\n return s;\n }\n\n function p(s: string) {\n return `(${s})`;\n }\n\n function recip(coll: string, V: string) {\n const left = `r/emailAddress/address eq ${V}`;\n const right = `r/emailAddress/name eq ${V}`;\n return `${coll}/any(r: ${left} or ${right})`;\n }\n\n function fv(field: string, raw: string | number | boolean | null | undefined): string {\n if (raw == null) return '';\n const rawStr = String(raw);\n\n if (field === 'text' || field === 'body') {\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n return '';\n }\n\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n\n const V = `'${rawStr.toLowerCase().replace(/'/g, \"''\")}'`;\n switch (field) {\n case 'from': {\n if (rawStr.includes('@')) {\n const addrEq = `${L('from/emailAddress/address')} eq ${V}`;\n const nameEq = `${L('from/emailAddress/name')} eq ${V}`;\n return p(`${addrEq} or ${nameEq}`);\n }\n return '';\n }\n case 'to':\n return recip('toRecipients', V);\n case 'cc':\n return recip('ccRecipients', V);\n case 'bcc':\n return recip('bccRecipients', V);\n case 'subject':\n if (rawStr.includes('-') || rawStr.length < 3) return '';\n return `startswith(subject, ${V})`;\n case 'categories': {\n const systemCategory = mapOutlookCategory(rawStr);\n return `categories/any(c: c eq '${systemCategory}')`;\n }\n case 'label':\n return `categories/any(c: c eq '${rawStr.replace(/'/g, \"''\")}')`;\n default:\n return '';\n }\n }\n\n function chain(op: 'and' | 'or', arr: Array<string | undefined>) {\n if (!arr || arr.length === 0) {\n throw new Error(`chain: empty array for ${op} operation`);\n }\n if (arr.length === 1) {\n const first = arr[0] ?? '';\n return String(first);\n }\n const joined = arr.join(` ${op} `);\n return p(joined);\n }\n\n function fieldExpr(field: string, op: FieldOperator | string): string {\n if (typeof op === 'string') {\n return fv(field, op);\n }\n\n if (Array.isArray(op.$any)) {\n const results = op.$any.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('or', validResults);\n }\n if (Array.isArray(op.$all)) {\n const results = op.$all.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('and', validResults);\n }\n if (Array.isArray(op.$none)) {\n const results = op.$none.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return `not ${p(chain('or', validResults))}`;\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: DateOperator): string {\n const parts: string[] = [];\n if (d.$gte) parts.push(`receivedDateTime ge ${d.$gte}T00:00:00Z`);\n if (d.$lt) parts.push(`receivedDateTime lt ${d.$lt}T00:00:00Z`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function emit(n: QueryNode): string {\n if (!n || typeof n !== 'object') return '';\n\n if ('$and' in n && n.$and) {\n const andParts = n.$and.map(emit).filter((part: string): part is string => Boolean(part));\n if (andParts.length === 0) return '';\n if (andParts.length === 1) {\n const firstPart = andParts[0];\n return firstPart ?? '';\n }\n return p(andParts.join(' and '));\n }\n if ('$or' in n && n.$or) {\n const orParts = n.$or.map(emit).filter((part: string): part is string => Boolean(part));\n if (orParts.length === 0) return '';\n if (orParts.length === 1) {\n const firstPart = orParts[0];\n return firstPart ?? '';\n }\n return p(orParts.join(' or '));\n }\n if ('$not' in n && n.$not) {\n const notExpr = emit(n.$not);\n return notExpr ? `not (${notExpr})` : '';\n }\n if ('hasAttachment' in n && n.hasAttachment) return 'hasAttachments eq true';\n if ('date' in n && n.date) return dateExpr(n.date);\n\n const keys = Object.keys(n);\n if (keys.length === 1) {\n const k0 = String(keys[0] ?? '');\n if (k0 && ['from', 'to', 'cc', 'bcc', 'subject', 'text', 'body', 'categories', 'label'].includes(k0)) {\n const fieldValue = (n as FieldQuery)[k0 as keyof FieldQuery];\n if (fieldValue) return fieldExpr(k0, fieldValue);\n }\n }\n return '';\n }\n\n return emit(query);\n}\nexport function toOutlookFilter(parsed: QueryNode, _options?: { includeBodyContent?: boolean; useCaseInsensitiveWrap?: boolean }) {\n const graphResult = toGraphFilter(parsed);\n const filters = extractOutlookFilters(parsed);\n return {\n filter: graphResult.filter,\n search: graphResult.search,\n requireBodyClientFilter: graphResult.requireBodyClientFilter,\n filters,\n };\n}\n\ninterface ExtractedFilters {\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\nexport function extractOutlookFilters(parsed: QueryNode): ExtractedFilters {\n const filters: ExtractedFilters = {\n subjectIncludes: [],\n bodyIncludes: [],\n textIncludes: [],\n fromIncludes: [],\n toIncludes: [],\n ccIncludes: [],\n bccIncludes: [],\n categoriesIncludes: [],\n labelIncludes: [],\n };\n function walk(node: QueryNode): void {\n if (!node || typeof node !== 'object') return;\n\n if ('$and' in node && node.$and) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && node.$or) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node && node.$not) {\n walk(node.$not);\n return;\n }\n\n if ('hasAttachment' in node && node.hasAttachment !== undefined) {\n filters.hasAttachment = node.hasAttachment === true;\n return;\n }\n if ('date' in node && node.date) {\n if (node.date.$gte) filters.since = node.date.$gte;\n if (node.date.$lt) filters.before = node.date.$lt;\n return;\n }\n\n if ('subject' in node && node.subject) {\n if (typeof node.subject === 'string') {\n filters.subjectIncludes.push(node.subject);\n } else {\n if (node.subject.$any) filters.subjectIncludes.push(...node.subject.$any);\n if (node.subject.$all) filters.subjectIncludes.push(...node.subject.$all);\n }\n }\n if ('body' in node && node.body) {\n if (typeof node.body === 'string') {\n filters.bodyIncludes.push(node.body);\n } else {\n if (node.body.$any) filters.bodyIncludes.push(...node.body.$any);\n if (node.body.$all) filters.bodyIncludes.push(...node.body.$all);\n }\n }\n if ('text' in node && node.text) {\n if (typeof node.text === 'string') {\n filters.textIncludes.push(node.text);\n filters.bodyIncludes.push(node.text);\n } else {\n if (node.text.$any) {\n filters.textIncludes.push(...node.text.$any);\n filters.bodyIncludes.push(...node.text.$any);\n }\n if (node.text.$all) {\n filters.textIncludes.push(...node.text.$all);\n filters.bodyIncludes.push(...node.text.$all);\n }\n }\n }\n if ('from' in node && node.from) {\n if (typeof node.from === 'string') {\n filters.fromIncludes.push(node.from);\n } else {\n if (node.from.$any) filters.fromIncludes.push(...node.from.$any);\n if (node.from.$all) filters.fromIncludes.push(...node.from.$all);\n }\n }\n if ('to' in node && node.to) {\n if (typeof node.to === 'string') {\n filters.toIncludes.push(node.to);\n } else {\n if (node.to.$any) filters.toIncludes.push(...node.to.$any);\n if (node.to.$all) filters.toIncludes.push(...node.to.$all);\n }\n }\n if ('cc' in node && node.cc) {\n if (typeof node.cc === 'string') {\n filters.ccIncludes.push(node.cc);\n } else {\n if (node.cc.$any) filters.ccIncludes.push(...node.cc.$any);\n if (node.cc.$all) filters.ccIncludes.push(...node.cc.$all);\n }\n }\n if ('bcc' in node && node.bcc) {\n if (typeof node.bcc === 'string') {\n filters.bccIncludes.push(node.bcc);\n } else {\n if (node.bcc.$any) filters.bccIncludes.push(...node.bcc.$any);\n if (node.bcc.$all) filters.bccIncludes.push(...node.bcc.$all);\n }\n }\n if ('categories' in node && node.categories) {\n if (typeof node.categories === 'string') {\n if (mapOutlookCategory(node.categories) !== null) {\n filters.categoriesIncludes.push(node.categories);\n }\n } else {\n // Filter out invalid categories to prevent memory leaks and maintain clean state\n if (node.categories.$any) {\n const validCategories = node.categories.$any.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$all) {\n const validCategories = node.categories.$all.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$none) {\n const validCategories = node.categories.$none.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n }\n }\n if ('label' in node && node.label) {\n if (typeof node.label === 'string') {\n filters.labelIncludes.push(node.label);\n } else {\n if (node.label.$any) filters.labelIncludes.push(...node.label.$any);\n if (node.label.$all) filters.labelIncludes.push(...node.label.$all);\n if (node.label.$none) filters.labelIncludes.push(...node.label.$none);\n }\n }\n }\n walk(parsed);\n return filters;\n}\n"],"names":["OUTLOOK_CATEGORIES","buildQueryFilter","extractOutlookFilters","mapOutlookCategory","toGraphFilter","toOutlookFilter","personal","work","family","travel","important","urgent","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemCategory","Object","keys","join","query","kqlQuery","search","filter","requireBodyClientFilter","hasFullText","hasFullTextIntent","searchCollect","collectSearchTerms","terms","length","usesBody","usesText","filterStr","cleanedFilter","state","usesExact","walkNode","node","$and","forEach","child","$or","$not","exactPhrase","pushExactPhrase","pushOperatorTerms","subject","text","body","value","phrase","String","pushAnyTerms","clause","buildClause","push","Array","isArray","$any","$all","pushAllTerms","$none","clauses","map","term","Boolean","values","val","escapeKQL","replace","_prefix","escaped","shouldQuote","test","some","L","s","p","recip","coll","V","left","right","fv","field","raw","rawStr","includes","addrEq","nameEq","chain","op","arr","first","joined","fieldExpr","results","v","validResults","JSON","stringify","dateExpr","d","parts","$gte","$lt","emit","n","andParts","part","firstPart","orParts","notExpr","hasAttachment","date","k0","fieldValue","parsed","_options","graphResult","filters","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","walk","undefined","since","before","from","to","cc","bcc","categories","validCategories","cat","label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/query-builder.ts"],"sourcesContent":["import type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\n\ntype FieldOperator = {\n $any?: string[];\n $all?: string[];\n $none?: string[];\n};\n\ntype DateOperator = {\n $gte?: string;\n $lt?: string;\n};\n\ntype 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 * Outlook category mappings - case insensitive input to exact system categories\n * Note: These are user-defined categories in Outlook, not system categories like Gmail\n */\nexport const OUTLOOK_CATEGORIES = {\n personal: 'Personal',\n work: 'Work',\n family: 'Family',\n travel: 'Travel',\n important: 'Important',\n urgent: 'Urgent',\n} as const;\n\n/**\n * Validate and map category name to Outlook system category\n * Throws error for invalid categories (fail fast principle)\n */\nexport function mapOutlookCategory(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 systemCategory = OUTLOOK_CATEGORIES[normalizedCategory as keyof typeof OUTLOOK_CATEGORIES];\n\n if (!systemCategory) {\n throw new Error(`Invalid Outlook category: \"${category}\". Valid categories: ${Object.keys(OUTLOOK_CATEGORIES).join(', ')}`);\n }\n\n return systemCategory;\n}\n\nexport interface ODataFilterResult {\n search: string | null;\n filter: string | null;\n requireBodyClientFilter: boolean;\n hasFullText: boolean;\n}\n\nexport function toGraphFilter(query: QueryNode): ODataFilterResult {\n if (query.kqlQuery) {\n return {\n search: query.kqlQuery,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: true,\n };\n }\n\n if (hasFullTextIntent(query)) {\n const searchCollect = collectSearchTerms(query);\n const search = searchCollect.terms.length ? searchCollect.terms.join(' OR ') : null;\n return {\n search,\n filter: null,\n requireBodyClientFilter: searchCollect.usesBody || searchCollect.usesText,\n hasFullText: true,\n };\n }\n\n const filterStr = buildQueryFilter(query);\n const cleanedFilter = filterStr && typeof filterStr === 'string' && filterStr.trim().length ? filterStr.trim() : null;\n return {\n search: null,\n filter: cleanedFilter,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n}\n\nfunction collectSearchTerms(query: QueryNode): { terms: string[]; usesText: boolean; usesBody: boolean; usesExact: boolean } {\n const state = {\n terms: [] as string[],\n usesText: false,\n usesBody: false,\n usesExact: false,\n };\n\n walkNode(query);\n return state;\n\n function walkNode(node: QueryNode | undefined) {\n if (!node || typeof node !== 'object') return;\n\n if (node.$and) {\n node.$and.forEach((child) => walkNode(child));\n return;\n }\n if (node.$or) {\n node.$or.forEach((child) => walkNode(child));\n return;\n }\n if (node.$not) {\n walkNode(node.$not);\n return;\n }\n\n if ('exactPhrase' in node && node.exactPhrase) {\n state.usesExact = true;\n pushExactPhrase(node.exactPhrase);\n }\n\n pushOperatorTerms(node.subject);\n\n if ('text' in node && node.text) {\n state.usesText = true;\n pushOperatorTerms(node.text);\n }\n if ('body' in node && node.body) {\n state.usesBody = true;\n pushOperatorTerms(node.body);\n }\n\n // Other fields (hasAttachment, importance, date) are handled via OData filters (emit())\n // and should not create search terms with colon prefixes that break Graph $search.\n }\n\n function pushExactPhrase(value: string) {\n const phrase = String(value);\n if (!phrase.trim()) return;\n pushAnyTerms([`\"${phrase}\"`]);\n }\n\n function pushOperatorTerms(value: FieldOperator | string | undefined) {\n if (!value) return;\n if (typeof value === 'string') {\n const clause = buildClause(null, value);\n if (clause) state.terms.push(clause);\n return;\n }\n\n if (Array.isArray(value.$any) && value.$any.length > 0) {\n pushAnyTerms(value.$any);\n }\n if (Array.isArray(value.$all) && value.$all.length > 0) {\n pushAllTerms(value.$all);\n }\n if (Array.isArray(value.$none) && value.$none.length > 0) {\n const clauses = value.$none.map((term) => buildClause(null, String(term ?? ''))).filter(Boolean);\n if (clauses.length === 1) {\n state.terms.push(`NOT ${clauses[0]}`);\n } else if (clauses.length > 1) {\n state.terms.push(`NOT (${clauses.join(' OR ')})`);\n }\n }\n }\n\n function pushAnyTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n state.terms.push(clauses.length === 1 ? clauses[0] : `(${clauses.join(' OR ')})`);\n }\n\n function pushAllTerms(values: string[]) {\n const clauses = values.map((val) => buildClause(null, val)).filter(Boolean);\n if (!clauses.length) return;\n // Graph $search silently ignores \"(A AND B)\" expressions, so narrow with the\n // first term only; the client-side $all predicate enforces the rest.\n state.terms.push(clauses[0]);\n }\n\n function escapeKQL(value: string): string {\n return value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/:/g, '\\\\:')\n .replace(/\\(/g, '\\\\(')\n .replace(/\\)/g, '\\\\)')\n .replace(/\\{/g, '\\\\{')\n .replace(/\\}/g, '\\\\}')\n .replace(/\\[/g, '\\\\[')\n .replace(/\\]/g, '\\\\]')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\*/g, '\\\\*')\n .replace(/\\?/g, '\\\\?')\n .replace(/</g, '\\\\<')\n .replace(/>/g, '\\\\>')\n .replace(/_/g, '\\\\_');\n }\n\n function buildClause(_prefix: string | null, value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '';\n const escaped = escapeKQL(trimmed);\n const shouldQuote = /[^a-zA-Z\\s]/.test(trimmed) || /\\s/.test(trimmed);\n return shouldQuote ? `\"${escaped}\"` : escaped;\n }\n}\n\nfunction hasFullTextIntent(node: QueryNode | undefined | null): boolean {\n if (!node || typeof node !== 'object') return false;\n\n if (node.kqlQuery) return true;\n if (node.exactPhrase) return true;\n if ('subject' in node && node.subject) return true;\n if ('text' in node && node.text) return true;\n if ('body' in node && node.body) return true;\n\n if ('$and' in node && node.$and) {\n return node.$and.some((child) => hasFullTextIntent(child));\n }\n if ('$or' in node && node.$or) {\n return node.$or.some((child) => hasFullTextIntent(child));\n }\n if ('$not' in node && node.$not) {\n return hasFullTextIntent(node.$not);\n }\n\n return false;\n}\n\nexport function buildQueryFilter(query: QueryNode): string {\n function L(s: string) {\n return s;\n }\n\n function p(s: string) {\n return `(${s})`;\n }\n\n function recip(coll: string, V: string) {\n const left = `r/emailAddress/address eq ${V}`;\n const right = `r/emailAddress/name eq ${V}`;\n return `${coll}/any(r: ${left} or ${right})`;\n }\n\n function fv(field: string, raw: string | number | boolean | null | undefined): string {\n if (raw == null) return '';\n const rawStr = String(raw);\n\n if (field === 'text' || field === 'body') {\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n return '';\n }\n\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n\n const V = `'${rawStr.toLowerCase().replace(/'/g, \"''\")}'`;\n switch (field) {\n case 'from': {\n if (rawStr.includes('@')) {\n const addrEq = `${L('from/emailAddress/address')} eq ${V}`;\n const nameEq = `${L('from/emailAddress/name')} eq ${V}`;\n return p(`${addrEq} or ${nameEq}`);\n }\n return '';\n }\n case 'to':\n return recip('toRecipients', V);\n case 'cc':\n return recip('ccRecipients', V);\n case 'bcc':\n return recip('bccRecipients', V);\n case 'subject':\n if (rawStr.includes('-') || rawStr.length < 3) return '';\n return `startswith(subject, ${V})`;\n case 'categories': {\n const systemCategory = mapOutlookCategory(rawStr);\n return `categories/any(c: c eq '${systemCategory}')`;\n }\n case 'label':\n return `categories/any(c: c eq '${rawStr.replace(/'/g, \"''\")}')`;\n default:\n return '';\n }\n }\n\n function chain(op: 'and' | 'or', arr: Array<string | undefined>) {\n if (!arr || arr.length === 0) {\n throw new Error(`chain: empty array for ${op} operation`);\n }\n if (arr.length === 1) {\n const first = arr[0] ?? '';\n return String(first);\n }\n const joined = arr.join(` ${op} `);\n return p(joined);\n }\n\n function fieldExpr(field: string, op: FieldOperator | string): string {\n if (typeof op === 'string') {\n return fv(field, op);\n }\n\n if (Array.isArray(op.$any)) {\n const results = op.$any.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('or', validResults);\n }\n if (Array.isArray(op.$all)) {\n const results = op.$all.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return chain('and', validResults);\n }\n if (Array.isArray(op.$none)) {\n const results = op.$none.map((v) => fv(field, String(v ?? '')));\n const validResults = results.filter((s) => s && s.trim());\n if (validResults.length === 0) return '';\n return `not ${p(chain('or', validResults))}`;\n }\n throw new Error(`Unknown field operator ${JSON.stringify(op)}`);\n }\n\n function dateExpr(d: DateOperator): string {\n const parts: string[] = [];\n if (d.$gte) parts.push(`receivedDateTime ge ${d.$gte}T00:00:00Z`);\n if (d.$lt) parts.push(`receivedDateTime lt ${d.$lt}T00:00:00Z`);\n return parts.length > 1 ? p(parts.join(' and ')) : (parts[0] ?? '');\n }\n\n function emit(n: QueryNode): string {\n if (!n || typeof n !== 'object') return '';\n\n if ('$and' in n && n.$and) {\n const andParts = n.$and.map(emit).filter((part: string): part is string => Boolean(part));\n if (andParts.length === 0) return '';\n if (andParts.length === 1) {\n const firstPart = andParts[0];\n return firstPart ?? '';\n }\n return p(andParts.join(' and '));\n }\n if ('$or' in n && n.$or) {\n const orParts = n.$or.map(emit).filter((part: string): part is string => Boolean(part));\n if (orParts.length === 0) return '';\n if (orParts.length === 1) {\n const firstPart = orParts[0];\n return firstPart ?? '';\n }\n return p(orParts.join(' or '));\n }\n if ('$not' in n && n.$not) {\n const notExpr = emit(n.$not);\n return notExpr ? `not (${notExpr})` : '';\n }\n if ('hasAttachment' in n && n.hasAttachment) return 'hasAttachments eq true';\n if ('date' in n && n.date) return dateExpr(n.date);\n\n const keys = Object.keys(n);\n if (keys.length === 1) {\n const k0 = String(keys[0] ?? '');\n if (k0 && ['from', 'to', 'cc', 'bcc', 'subject', 'text', 'body', 'categories', 'label'].includes(k0)) {\n const fieldValue = (n as FieldQuery)[k0 as keyof FieldQuery];\n if (fieldValue) return fieldExpr(k0, fieldValue);\n }\n }\n return '';\n }\n\n return emit(query);\n}\nexport function toOutlookFilter(parsed: QueryNode, _options?: { includeBodyContent?: boolean; useCaseInsensitiveWrap?: boolean }) {\n const graphResult = toGraphFilter(parsed);\n const filters = extractOutlookFilters(parsed);\n return {\n filter: graphResult.filter,\n search: graphResult.search,\n requireBodyClientFilter: graphResult.requireBodyClientFilter,\n filters,\n };\n}\n\ninterface ExtractedFilters {\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\nexport function extractOutlookFilters(parsed: QueryNode): ExtractedFilters {\n const filters: ExtractedFilters = {\n subjectIncludes: [],\n bodyIncludes: [],\n textIncludes: [],\n fromIncludes: [],\n toIncludes: [],\n ccIncludes: [],\n bccIncludes: [],\n categoriesIncludes: [],\n labelIncludes: [],\n };\n function walk(node: QueryNode): void {\n if (!node || typeof node !== 'object') return;\n\n if ('$and' in node && node.$and) {\n node.$and.forEach(walk);\n return;\n }\n if ('$or' in node && node.$or) {\n node.$or.forEach(walk);\n return;\n }\n if ('$not' in node && node.$not) {\n walk(node.$not);\n return;\n }\n\n if ('hasAttachment' in node && node.hasAttachment !== undefined) {\n filters.hasAttachment = node.hasAttachment === true;\n return;\n }\n if ('date' in node && node.date) {\n if (node.date.$gte) filters.since = node.date.$gte;\n if (node.date.$lt) filters.before = node.date.$lt;\n return;\n }\n\n if ('subject' in node && node.subject) {\n if (typeof node.subject === 'string') {\n filters.subjectIncludes.push(node.subject);\n } else {\n if (node.subject.$any) filters.subjectIncludes.push(...node.subject.$any);\n if (node.subject.$all) filters.subjectIncludes.push(...node.subject.$all);\n }\n }\n if ('body' in node && node.body) {\n if (typeof node.body === 'string') {\n filters.bodyIncludes.push(node.body);\n } else {\n if (node.body.$any) filters.bodyIncludes.push(...node.body.$any);\n if (node.body.$all) filters.bodyIncludes.push(...node.body.$all);\n }\n }\n if ('text' in node && node.text) {\n if (typeof node.text === 'string') {\n filters.textIncludes.push(node.text);\n filters.bodyIncludes.push(node.text);\n } else {\n if (node.text.$any) {\n filters.textIncludes.push(...node.text.$any);\n filters.bodyIncludes.push(...node.text.$any);\n }\n if (node.text.$all) {\n filters.textIncludes.push(...node.text.$all);\n filters.bodyIncludes.push(...node.text.$all);\n }\n }\n }\n if ('from' in node && node.from) {\n if (typeof node.from === 'string') {\n filters.fromIncludes.push(node.from);\n } else {\n if (node.from.$any) filters.fromIncludes.push(...node.from.$any);\n if (node.from.$all) filters.fromIncludes.push(...node.from.$all);\n }\n }\n if ('to' in node && node.to) {\n if (typeof node.to === 'string') {\n filters.toIncludes.push(node.to);\n } else {\n if (node.to.$any) filters.toIncludes.push(...node.to.$any);\n if (node.to.$all) filters.toIncludes.push(...node.to.$all);\n }\n }\n if ('cc' in node && node.cc) {\n if (typeof node.cc === 'string') {\n filters.ccIncludes.push(node.cc);\n } else {\n if (node.cc.$any) filters.ccIncludes.push(...node.cc.$any);\n if (node.cc.$all) filters.ccIncludes.push(...node.cc.$all);\n }\n }\n if ('bcc' in node && node.bcc) {\n if (typeof node.bcc === 'string') {\n filters.bccIncludes.push(node.bcc);\n } else {\n if (node.bcc.$any) filters.bccIncludes.push(...node.bcc.$any);\n if (node.bcc.$all) filters.bccIncludes.push(...node.bcc.$all);\n }\n }\n if ('categories' in node && node.categories) {\n if (typeof node.categories === 'string') {\n if (mapOutlookCategory(node.categories) !== null) {\n filters.categoriesIncludes.push(node.categories);\n }\n } else {\n // Filter out invalid categories to prevent memory leaks and maintain clean state\n if (node.categories.$any) {\n const validCategories = node.categories.$any.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$all) {\n const validCategories = node.categories.$all.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n if (node.categories.$none) {\n const validCategories = node.categories.$none.filter((cat: string) => mapOutlookCategory(cat) !== null);\n if (validCategories.length > 0) filters.categoriesIncludes.push(...validCategories);\n }\n }\n }\n if ('label' in node && node.label) {\n if (typeof node.label === 'string') {\n filters.labelIncludes.push(node.label);\n } else {\n if (node.label.$any) filters.labelIncludes.push(...node.label.$any);\n if (node.label.$all) filters.labelIncludes.push(...node.label.$all);\n if (node.label.$none) filters.labelIncludes.push(...node.label.$none);\n }\n }\n }\n walk(parsed);\n return filters;\n}\n"],"names":["OUTLOOK_CATEGORIES","buildQueryFilter","extractOutlookFilters","mapOutlookCategory","toGraphFilter","toOutlookFilter","personal","work","family","travel","important","urgent","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemCategory","Object","keys","join","query","kqlQuery","search","filter","requireBodyClientFilter","hasFullText","hasFullTextIntent","searchCollect","collectSearchTerms","terms","length","usesBody","usesText","filterStr","cleanedFilter","state","usesExact","walkNode","node","$and","forEach","child","$or","$not","exactPhrase","pushExactPhrase","pushOperatorTerms","subject","text","body","value","phrase","String","pushAnyTerms","clause","buildClause","push","Array","isArray","$any","$all","pushAllTerms","$none","clauses","map","term","Boolean","values","val","escapeKQL","replace","_prefix","escaped","shouldQuote","test","some","L","s","p","recip","coll","V","left","right","fv","field","raw","rawStr","includes","addrEq","nameEq","chain","op","arr","first","joined","fieldExpr","results","v","validResults","JSON","stringify","dateExpr","d","parts","$gte","$lt","emit","n","andParts","part","firstPart","orParts","notExpr","hasAttachment","date","k0","fieldValue","parsed","_options","graphResult","filters","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","walk","undefined","since","before","from","to","cc","bcc","categories","validCategories","cat","label"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-outlook/src/email/querying/search-execution.ts"],"sourcesContent":["import type { Client } from '@microsoft/microsoft-graph-client';\nimport type { Message } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { buildClientPredicate } from './client-filter.ts';\nimport { decodeNextPageToken, encodeNextPageToken, FIRST_PAGE_SKIP_TOKEN } from './pagination-token.ts';\nimport { buildQueryFilter, toGraphFilter } from './query-builder.ts';\n\nexport interface OutlookSearchOptions {\n query?: QueryNode;\n limit?: number;\n includeBody?: boolean;\n maxPages?: number | null;\n maxItemsScanned?: number | null;\n pageSize?: number;\n pageToken?: string | undefined;\n logger: Logger;\n}\n\nexport interface OutlookSearchResult {\n messages: Message[];\n nextPageToken?: string | undefined;\n}\n\nexport async function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult> {\n const { query, includeBody = false, pageSize = 50, pageToken, maxPages = null, maxItemsScanned = null, logger } = opts;\n\n const graphPlan = query\n ? toGraphFilter(query)\n : {\n search: null,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n const pageState = decodeNextPageToken(pageToken);\n const useClientFiltering = Boolean(query && graphPlan.hasFullText);\n const predicate = useClientFiltering && query ? buildClientPredicate(query) : null;\n const requireBody = graphPlan.requireBodyClientFilter;\n const effectiveIncludeBody = includeBody || (requireBody && !includeBody);\n\n logger.info('Executing Outlook search', {\n hasSearch: !!graphPlan.search,\n hasFilter: !!graphPlan.filter,\n useClientFiltering,\n pageSize,\n includeBody: effectiveIncludeBody,\n pageToken: pageToken ? '[provided]' : undefined,\n forcedBody: requireBody && !includeBody,\n });\n\n if (!useClientFiltering) {\n const result = await fetchGraphPage(graph, {\n search: graphPlan.search ?? undefined,\n filter: graphPlan.filter ?? undefined,\n skipToken: pageState.skipToken,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n });\n return {\n messages: result.messages,\n nextPageToken: result.nextSkipToken,\n };\n }\n\n const searchResult = await collectClientFilteredPages({\n graph,\n search: graphPlan.search ?? undefined,\n filter: undefined,\n startSkipToken: pageState.skipToken,\n startOffset: pageState.offset,\n predicate,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n mode: 'search',\n });\n\n if (searchResult.capHit) {\n return { messages: searchResult.collected };\n }\n if (searchResult.midPageToken) {\n return { messages: searchResult.collected, nextPageToken: searchResult.midPageToken };\n }\n if (searchResult.nextSkipToken) {\n return {\n messages: searchResult.collected,\n nextPageToken: encodeNextPageToken({ skipToken: searchResult.nextSkipToken, offset: 0, mode: 'search' }),\n };\n }\n if (searchResult.collected.length > 0) {\n return { messages: searchResult.collected };\n }\n\n if (predicate && query) {\n const fallbackFilter = buildQueryFilter(query).trim();\n if (fallbackFilter) {\n const fallbackResult = await collectClientFilteredPages({\n graph,\n filter: fallbackFilter,\n includeBody: effectiveIncludeBody,\n pageSize,\n predicate,\n logger,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n startSkipToken: undefined,\n startOffset: 0,\n mode: 'filter',\n });\n\n if (fallbackResult.capHit) {\n return { messages: fallbackResult.collected };\n }\n if (fallbackResult.midPageToken) {\n return { messages: fallbackResult.collected, nextPageToken: fallbackResult.midPageToken };\n }\n if (fallbackResult.nextSkipToken) {\n return {\n messages: fallbackResult.collected,\n nextPageToken: encodeNextPageToken({ skipToken: fallbackResult.nextSkipToken, offset: 0, mode: 'filter' }),\n };\n }\n if (fallbackResult.collected.length > 0) {\n return { messages: fallbackResult.collected };\n }\n }\n }\n\n return { messages: searchResult.collected };\n}\n\ninterface GraphPageParams {\n search?: string;\n filter?: string;\n skipToken?: string;\n includeBody: boolean;\n pageSize: number;\n logger: Logger;\n}\n\nasync function fetchGraphPage(graph: Client, params: GraphPageParams): Promise<{ messages: Message[]; nextSkipToken?: string }> {\n const { search, filter, skipToken, includeBody, pageSize, logger } = params;\n let request = graph.api('/me/messages');\n\n if (search) {\n request = request.search(search);\n }\n if (filter) {\n request = request.filter(filter);\n }\n\n const top = Math.min(pageSize, 1000);\n request = request.top(top);\n\n const selectFields = includeBody ? ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'body', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'] : ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'];\n request = request.select(selectFields.join(','));\n\n if (skipToken && skipToken !== FIRST_PAGE_SKIP_TOKEN) {\n request = request.skipToken(skipToken);\n }\n\n logger.info('Fetching Outlook Graph page', {\n search: !!search,\n filter: !!filter,\n skipToken: skipToken ? '[provided]' : undefined,\n pageSize: top,\n });\n\n const response = await request.get();\n const messages: Message[] = response.value || [];\n let nextSkipToken: string | undefined;\n if (response['@odata.nextLink']) {\n try {\n const nextLinkUrl = new URL(response['@odata.nextLink']);\n nextSkipToken = nextLinkUrl.searchParams.get('$skiptoken') || undefined;\n } catch {\n logger.info('Failed to parse nextLink skipToken', { nextLink: response['@odata.nextLink'] });\n }\n }\n\n logger.info(`Graph page returned ${messages.length} messages`, {\n hasNextPage: !!nextSkipToken,\n });\n\n return { messages, nextSkipToken };\n}\n\ninterface CollectParams {\n graph: Client;\n search?: string;\n filter?: string;\n startSkipToken?: string;\n startOffset?: number;\n predicate: ((message: Message) => boolean) | null;\n includeBody: boolean;\n pageSize: number;\n logger: Logger;\n maxPages: number | null;\n maxItemsScanned: number | null;\n mode: 'search' | 'filter';\n}\n\ninterface CollectResult {\n collected: Message[];\n midPageToken?: string;\n nextSkipToken?: string;\n capHit: boolean;\n}\n\nasync function collectClientFilteredPages(params: CollectParams): Promise<CollectResult> {\n const { graph, search, filter, startSkipToken, startOffset = 0, predicate, includeBody, pageSize, logger, maxPages, maxItemsScanned, mode } = params;\n let currentSkipToken = startSkipToken;\n let offset = startOffset;\n const collected: Message[] = [];\n let midPageToken: string | undefined;\n let lastNextSkipToken: string | undefined;\n let capHit = false;\n let pagesFetched = 0;\n let scannedItems = 0;\n\n mainLoop: while (collected.length < pageSize) {\n if (maxPages !== null && pagesFetched >= maxPages) {\n capHit = true;\n break;\n }\n\n const pageTokenUsed = currentSkipToken;\n const graphPage = await fetchGraphPage(graph, {\n search,\n filter,\n skipToken: currentSkipToken,\n includeBody,\n pageSize,\n logger,\n });\n\n pagesFetched += 1;\n lastNextSkipToken = graphPage.nextSkipToken;\n const pageItems = graphPage.messages;\n if (!pageItems.length) {\n break;\n }\n\n const startIndex = offset;\n const sliced = startIndex > 0 ? pageItems.slice(startIndex) : pageItems;\n offset = 0;\n\n for (let idx = 0; idx < sliced.length; idx += 1) {\n const message = sliced[idx];\n scannedItems += 1;\n if (maxItemsScanned !== null && scannedItems > maxItemsScanned) {\n capHit = true;\n break mainLoop;\n }\n if (predicate && !predicate(message)) {\n continue;\n }\n collected.push(message);\n if (collected.length === pageSize) {\n const nextOffset = startIndex + idx + 1;\n midPageToken = encodeNextPageToken({\n skipToken: pageTokenUsed,\n offset: nextOffset,\n mode,\n });\n break mainLoop;\n }\n }\n\n currentSkipToken = graphPage.nextSkipToken;\n if (!currentSkipToken) {\n break;\n }\n }\n\n return {\n collected,\n midPageToken,\n nextSkipToken: lastNextSkipToken,\n capHit,\n };\n}\n"],"names":["searchMessages","graph","opts","graphPlan","query","includeBody","pageSize","pageToken","maxPages","maxItemsScanned","logger","pageState","useClientFiltering","predicate","requireBody","effectiveIncludeBody","result","searchResult","fallbackFilter","fallbackResult","toGraphFilter","search","filter","requireBodyClientFilter","hasFullText","decodeNextPageToken","Boolean","buildClientPredicate","info","hasSearch","hasFilter","undefined","forcedBody","fetchGraphPage","skipToken","messages","nextPageToken","nextSkipToken","collectClientFilteredPages","startSkipToken","startOffset","offset","mode","capHit","collected","midPageToken","encodeNextPageToken","length","buildQueryFilter","trim","params","request","top","selectFields","response","nextLinkUrl","api","Math","min","select","join","FIRST_PAGE_SKIP_TOKEN","get","value","URL","searchParams","nextLink","hasNextPage","currentSkipToken","lastNextSkipToken","pagesFetched","scannedItems","pageTokenUsed","graphPage","pageItems","startIndex","sliced","idx","message","nextOffset","slice","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/email/querying/search-execution.ts"],"sourcesContent":["import type { Client } from '@microsoft/microsoft-graph-client';\nimport type { Message } from '@microsoft/microsoft-graph-types';\nimport type { OutlookQuery as QueryNode } from '../../schemas/outlook-query-schema.ts';\nimport type { Logger } from '../../types.ts';\nimport { buildClientPredicate } from './client-filter.ts';\nimport { decodeNextPageToken, encodeNextPageToken, FIRST_PAGE_SKIP_TOKEN } from './pagination-token.ts';\nimport { buildQueryFilter, toGraphFilter } from './query-builder.ts';\n\nexport interface OutlookSearchOptions {\n query?: QueryNode;\n limit?: number;\n includeBody?: boolean;\n maxPages?: number | null;\n maxItemsScanned?: number | null;\n pageSize?: number;\n pageToken?: string | undefined;\n logger: Logger;\n}\n\nexport interface OutlookSearchResult {\n messages: Message[];\n nextPageToken?: string | undefined;\n}\n\nexport async function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult> {\n const { query, includeBody = false, pageSize = 50, pageToken, maxPages = null, maxItemsScanned = null, logger } = opts;\n\n const graphPlan = query\n ? toGraphFilter(query)\n : {\n search: null,\n filter: null,\n requireBodyClientFilter: false,\n hasFullText: false,\n };\n const pageState = decodeNextPageToken(pageToken);\n const useClientFiltering = Boolean(query && graphPlan.hasFullText);\n const predicate = useClientFiltering && query ? buildClientPredicate(query) : null;\n const requireBody = graphPlan.requireBodyClientFilter;\n const effectiveIncludeBody = includeBody || (requireBody && !includeBody);\n\n logger.info('Executing Outlook search', {\n hasSearch: !!graphPlan.search,\n hasFilter: !!graphPlan.filter,\n useClientFiltering,\n pageSize,\n includeBody: effectiveIncludeBody,\n pageToken: pageToken ? '[provided]' : undefined,\n forcedBody: requireBody && !includeBody,\n });\n\n if (!useClientFiltering) {\n const result = await fetchGraphPage(graph, {\n search: graphPlan.search ?? undefined,\n filter: graphPlan.filter ?? undefined,\n skipToken: pageState.skipToken,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n });\n return {\n messages: result.messages,\n nextPageToken: result.nextSkipToken,\n };\n }\n\n const searchResult = await collectClientFilteredPages({\n graph,\n search: graphPlan.search ?? undefined,\n filter: undefined,\n startSkipToken: pageState.skipToken,\n startOffset: pageState.offset,\n predicate,\n includeBody: effectiveIncludeBody,\n pageSize,\n logger,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n mode: 'search',\n });\n\n if (searchResult.capHit) {\n return { messages: searchResult.collected };\n }\n if (searchResult.midPageToken) {\n return { messages: searchResult.collected, nextPageToken: searchResult.midPageToken };\n }\n if (searchResult.nextSkipToken) {\n return {\n messages: searchResult.collected,\n nextPageToken: encodeNextPageToken({ skipToken: searchResult.nextSkipToken, offset: 0, mode: 'search' }),\n };\n }\n if (searchResult.collected.length > 0) {\n return { messages: searchResult.collected };\n }\n\n if (predicate && query) {\n const fallbackFilter = buildQueryFilter(query).trim();\n if (fallbackFilter) {\n const fallbackResult = await collectClientFilteredPages({\n graph,\n filter: fallbackFilter,\n includeBody: effectiveIncludeBody,\n pageSize,\n predicate,\n logger,\n maxPages: maxPages ?? null,\n maxItemsScanned: maxItemsScanned ?? null,\n startSkipToken: undefined,\n startOffset: 0,\n mode: 'filter',\n });\n\n if (fallbackResult.capHit) {\n return { messages: fallbackResult.collected };\n }\n if (fallbackResult.midPageToken) {\n return { messages: fallbackResult.collected, nextPageToken: fallbackResult.midPageToken };\n }\n if (fallbackResult.nextSkipToken) {\n return {\n messages: fallbackResult.collected,\n nextPageToken: encodeNextPageToken({ skipToken: fallbackResult.nextSkipToken, offset: 0, mode: 'filter' }),\n };\n }\n if (fallbackResult.collected.length > 0) {\n return { messages: fallbackResult.collected };\n }\n }\n }\n\n return { messages: searchResult.collected };\n}\n\ninterface GraphPageParams {\n search?: string;\n filter?: string;\n skipToken?: string;\n includeBody: boolean;\n pageSize: number;\n logger: Logger;\n}\n\nasync function fetchGraphPage(graph: Client, params: GraphPageParams): Promise<{ messages: Message[]; nextSkipToken?: string }> {\n const { search, filter, skipToken, includeBody, pageSize, logger } = params;\n let request = graph.api('/me/messages');\n\n if (search) {\n request = request.search(search);\n }\n if (filter) {\n request = request.filter(filter);\n }\n\n const top = Math.min(pageSize, 1000);\n request = request.top(top);\n\n const selectFields = includeBody ? ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'body', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'] : ['id', 'conversationId', 'receivedDateTime', 'subject', 'bodyPreview', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients'];\n request = request.select(selectFields.join(','));\n\n if (skipToken && skipToken !== FIRST_PAGE_SKIP_TOKEN) {\n request = request.skipToken(skipToken);\n }\n\n logger.info('Fetching Outlook Graph page', {\n search: !!search,\n filter: !!filter,\n skipToken: skipToken ? '[provided]' : undefined,\n pageSize: top,\n });\n\n const response = await request.get();\n const messages: Message[] = response.value || [];\n let nextSkipToken: string | undefined;\n if (response['@odata.nextLink']) {\n try {\n const nextLinkUrl = new URL(response['@odata.nextLink']);\n nextSkipToken = nextLinkUrl.searchParams.get('$skiptoken') || undefined;\n } catch {\n logger.info('Failed to parse nextLink skipToken', { nextLink: response['@odata.nextLink'] });\n }\n }\n\n logger.info(`Graph page returned ${messages.length} messages`, {\n hasNextPage: !!nextSkipToken,\n });\n\n return { messages, nextSkipToken };\n}\n\ninterface CollectParams {\n graph: Client;\n search?: string;\n filter?: string;\n startSkipToken?: string;\n startOffset?: number;\n predicate: ((message: Message) => boolean) | null;\n includeBody: boolean;\n pageSize: number;\n logger: Logger;\n maxPages: number | null;\n maxItemsScanned: number | null;\n mode: 'search' | 'filter';\n}\n\ninterface CollectResult {\n collected: Message[];\n midPageToken?: string;\n nextSkipToken?: string;\n capHit: boolean;\n}\n\nasync function collectClientFilteredPages(params: CollectParams): Promise<CollectResult> {\n const { graph, search, filter, startSkipToken, startOffset = 0, predicate, includeBody, pageSize, logger, maxPages, maxItemsScanned, mode } = params;\n let currentSkipToken = startSkipToken;\n let offset = startOffset;\n const collected: Message[] = [];\n let midPageToken: string | undefined;\n let lastNextSkipToken: string | undefined;\n let capHit = false;\n let pagesFetched = 0;\n let scannedItems = 0;\n\n mainLoop: while (collected.length < pageSize) {\n if (maxPages !== null && pagesFetched >= maxPages) {\n capHit = true;\n break;\n }\n\n const pageTokenUsed = currentSkipToken;\n const graphPage = await fetchGraphPage(graph, {\n search,\n filter,\n skipToken: currentSkipToken,\n includeBody,\n pageSize,\n logger,\n });\n\n pagesFetched += 1;\n lastNextSkipToken = graphPage.nextSkipToken;\n const pageItems = graphPage.messages;\n if (!pageItems.length) {\n break;\n }\n\n const startIndex = offset;\n const sliced = startIndex > 0 ? pageItems.slice(startIndex) : pageItems;\n offset = 0;\n\n for (let idx = 0; idx < sliced.length; idx += 1) {\n const message = sliced[idx];\n scannedItems += 1;\n if (maxItemsScanned !== null && scannedItems > maxItemsScanned) {\n capHit = true;\n break mainLoop;\n }\n if (predicate && !predicate(message)) {\n continue;\n }\n collected.push(message);\n if (collected.length === pageSize) {\n const nextOffset = startIndex + idx + 1;\n midPageToken = encodeNextPageToken({\n skipToken: pageTokenUsed,\n offset: nextOffset,\n mode,\n });\n break mainLoop;\n }\n }\n\n currentSkipToken = graphPage.nextSkipToken;\n if (!currentSkipToken) {\n break;\n }\n }\n\n return {\n collected,\n midPageToken,\n nextSkipToken: lastNextSkipToken,\n capHit,\n };\n}\n"],"names":["searchMessages","graph","opts","graphPlan","query","includeBody","pageSize","pageToken","maxPages","maxItemsScanned","logger","pageState","useClientFiltering","predicate","requireBody","effectiveIncludeBody","result","searchResult","fallbackFilter","fallbackResult","toGraphFilter","search","filter","requireBodyClientFilter","hasFullText","decodeNextPageToken","Boolean","buildClientPredicate","info","hasSearch","hasFilter","undefined","forcedBody","fetchGraphPage","skipToken","messages","nextPageToken","nextSkipToken","collectClientFilteredPages","startSkipToken","startOffset","offset","mode","capHit","collected","midPageToken","encodeNextPageToken","length","buildQueryFilter","trim","params","request","top","selectFields","response","nextLinkUrl","api","Math","min","select","join","FIRST_PAGE_SKIP_TOKEN","get","value","URL","searchParams","nextLink","hasNextPage","currentSkipToken","lastNextSkipToken","pagesFetched","scannedItems","pageTokenUsed","graphPage","pageItems","startIndex","sliced","idx","message","nextOffset","slice","push"],"mappings":"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"}
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/index.ts"],"sourcesContent":["import { handleVersionHelp } from './setup/version-help.ts';\nimport type { ServerConfig } from './types.ts';\n\nexport { MS_SCOPE } from './constants.ts';\nexport * as mcp from './mcp/index.ts';\n// Export input schemas for documentation visibility\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 type { AuthMiddleware, OAuthAdapters, OAuthRuntimeDeps } from './setup/oauth-microsoft.ts';\nexport * from './types.ts';\n\nexport async function startServer(config: ServerConfig): Promise<void> {\n // createHTTPServer/createStdioServer pull in @mcp-z/server and every mcp/tools/*.ts\n // (@microsoft/microsoft-graph-client included); deferred so a --version/--help run never reaches them.\n const { createHTTPServer } = await import('./setup/http.ts');\n const { createStdioServer } = await import('./setup/stdio.ts');\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. config.ts's own heavy imports (@mcp-z/oauth-microsoft,\n // @mcp-z/server) are deferred internally, so this static-looking call stays cheap until here.\n const { createConfig } = await import('./setup/config.ts');\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":["MS_SCOPE","categoriesListInputSchema","inputSchema","main","labelsListInputSchema","mcp","schemas","setup","startServer","config","createHTTPServer","createStdioServer","logger","close","transport","type","process","on","exit","info","Promise","versionHelpResult","createConfig","handleVersionHelp","argv","handled","console","log","output","URL","pathname"],"mappings":";;;;;;;;;;;QAGSA;eAAAA,qBAAQ;;QAIOC;eAAfC,6BAAW;;QAwBpB;eAA8BC;;QAtBNC;eAAfF,yBAAW;;QALRG;;;QAMAC;;;QACAC;;;QAIUC;eAAAA;;;6BAfY;2BAGT;+DACJ;gCAGoC;4BAEJ;gEAC5B;gEACF;qBAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,SAAeA,YAAYC,MAAoB;;YAG5CC,kBACAC,mBACkBF,MAAlBG,QAAQC;;;;oBAFa;;wBAAM;2EAAA,QAAO;;;;oBAAlCH,mBAAqB,cAArBA;oBACsB;;wBAAM;2EAAA,QAAO;;;;oBAAnCC,oBAAsB,cAAtBA;yBACkBF,CAAAA,OAAOK,SAAS,CAACC,IAAI,KAAK,OAAM,GAAhCN;;;;oBAAoC;;wBAAME,kBAAkBF;;;2BAAxB;;;;;;oBAAkC;;wBAAMC,iBAAiBD;;;2BAAvB;;;oBAAtEA,aAAlBG,SAAkBH,KAAlBG,QAAQC,QAAUJ,KAAVI;oBAEhBG,QAAQC,EAAE,CAAC,UAAU;;;;;wCACnB;;4CAAMJ;;;wCAAN;wCACAG,QAAQE,IAAI,CAAC;;;;;;wBACf;;oBAEAN,OAAOO,IAAI,CAAC,AAAC,uBAA4C,OAAtBV,OAAOK,SAAS,CAACC,IAAI,EAAC;oBACzD;;wBAAM,IAAIK,QAAQ,YAAO;;;oBAAzB;;;;;;IACF;;AAEe,SAAejB;;YAEtBkB,mBAQEC,cACFb;;;;oBAVN,4DAA4D;oBACtDY,oBAAoBE,IAAAA,gCAAiB,EAACP,QAAQQ,IAAI;oBACxD,IAAIH,kBAAkBI,OAAO,EAAE;wBAC7BC,QAAQC,GAAG,CAACN,kBAAkBO,MAAM;wBACpCZ,QAAQE,IAAI,CAAC;oBACf;oBAIyB;;wBAAM;2EAAA,QAAO;;;;oBAA9BI,eAAiB,cAAjBA;oBACFb,SAASa;oBACf;;wBAAMd,YAAYC;;;oBAAlB;;;;;;IACF;;AAEA,IAAIO,QAAQQ,IAAI,CAAC,EAAE,KAAK,IAAIK,IAAI,qDAAiBC,QAAQ,EAAE;IACzD3B;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/mcp-z/mcp-outlook/src/lib/create-store.ts"],"sourcesContent":["import type Keyv from 'keyv';\nimport keyvRegistry from 'keyv-registry';\n\n// keyv-file is a direct dependency so the default file:// URIs resolve; keyv-registry\n// loads adapters with require() rather than depending on any of them itself.\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,sFAAsF;AACtF,6EAA6E;AAE7E;;;eAA8BA;;;mEALL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKV,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"}
|