@mcp-z/mcp-outlook 1.0.13 → 1.0.14
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 +2 -5
- 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.d.cts +1 -1
- package/dist/cjs/email/querying/client-filter.d.ts +1 -1
- package/dist/cjs/email/querying/client-filter.js +25 -15
- package/dist/cjs/email/querying/client-filter.js.map +1 -1
- package/dist/cjs/email/querying/execute-query.js +7 -14
- 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.d.cts +2 -2
- package/dist/cjs/email/querying/query-builder.d.ts +2 -2
- package/dist/cjs/email/querying/query-builder.js +4 -2
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.js +6 -9
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/index.js +10 -24
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/lib/create-store.js +2 -5
- package/dist/cjs/lib/create-store.js.map +1 -1
- package/dist/cjs/lib/messages-to-row.js +2 -2
- 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 +8 -19
- package/dist/cjs/mcp/index.js.map +1 -1
- package/dist/cjs/mcp/prompts/draft-email.js +3 -6
- 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 +3 -6
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/resources/email.js +3 -6
- 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 +4 -8
- 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 +4 -8
- package/dist/cjs/mcp/tools/label-add.js.map +1 -1
- package/dist/cjs/mcp/tools/label-delete.js +36 -32
- package/dist/cjs/mcp/tools/label-delete.js.map +1 -1
- package/dist/cjs/mcp/tools/labels-list.js +4 -8
- package/dist/cjs/mcp/tools/labels-list.js.map +1 -1
- package/dist/cjs/mcp/tools/message-get.js +4 -8
- package/dist/cjs/mcp/tools/message-get.js.map +1 -1
- package/dist/cjs/mcp/tools/message-mark-read.js +4 -8
- package/dist/cjs/mcp/tools/message-mark-read.js.map +1 -1
- package/dist/cjs/mcp/tools/message-move-to-trash.js +36 -32
- package/dist/cjs/mcp/tools/message-move-to-trash.js.map +1 -1
- package/dist/cjs/mcp/tools/message-respond.js +4 -8
- package/dist/cjs/mcp/tools/message-respond.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.js +7 -14
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/message-send.js +4 -8
- package/dist/cjs/mcp/tools/message-send.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.js +7 -14
- 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 +5 -9
- 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 +11 -25
- package/dist/cjs/setup/config.js.map +1 -1
- package/dist/cjs/setup/http.js +15 -16
- 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 +9 -15
- package/dist/cjs/setup/oauth-microsoft.js.map +1 -1
- package/dist/cjs/setup/runtime.d.cts +1 -1
- package/dist/cjs/setup/runtime.d.ts +1 -1
- package/dist/cjs/setup/runtime.js +29 -44
- package/dist/cjs/setup/runtime.js.map +1 -1
- package/dist/cjs/setup/stdio.js +15 -16
- package/dist/cjs/setup/stdio.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.d.ts +1 -1
- package/dist/esm/email/querying/client-filter.js +20 -10
- 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.d.ts +2 -2
- 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.d.ts +1 -1
- package/dist/esm/setup/runtime.js.map +1 -1
- package/dist/esm/setup/stdio.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +9 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/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/OpenSource/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/OpenSource/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/OpenSource/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"}
|
|
@@ -17,11 +17,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
17
17
|
reject(error);
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
if (info.done)
|
|
21
|
-
|
|
22
|
-
} else {
|
|
23
|
-
Promise.resolve(value).then(_next, _throw);
|
|
24
|
-
}
|
|
20
|
+
if (info.done) resolve(value);
|
|
21
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
25
22
|
}
|
|
26
23
|
function _async_to_generator(fn) {
|
|
27
24
|
return function() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/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/OpenSource/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"}
|
|
@@ -2,5 +2,5 @@ import type { Message } from '@microsoft/microsoft-graph-types';
|
|
|
2
2
|
import type { OutlookQuery } from '../../schemas/outlook-query-schema.js';
|
|
3
3
|
type Predicate = (message: Message) => boolean;
|
|
4
4
|
export declare function buildClientPredicate(query: OutlookQuery): Predicate;
|
|
5
|
-
export declare function needsBody(query: OutlookQuery): boolean;
|
|
5
|
+
export declare function needsBody(query: OutlookQuery | undefined | null): boolean;
|
|
6
6
|
export {};
|
|
@@ -2,5 +2,5 @@ import type { Message } from '@microsoft/microsoft-graph-types';
|
|
|
2
2
|
import type { OutlookQuery } from '../../schemas/outlook-query-schema.js';
|
|
3
3
|
type Predicate = (message: Message) => boolean;
|
|
4
4
|
export declare function buildClientPredicate(query: OutlookQuery): Predicate;
|
|
5
|
-
export declare function needsBody(query: OutlookQuery): boolean;
|
|
5
|
+
export declare function needsBody(query: OutlookQuery | undefined | null): boolean;
|
|
6
6
|
export {};
|
|
@@ -80,55 +80,65 @@ function buildNodePredicate(node) {
|
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
if ('from' in node && node.from) {
|
|
83
|
+
var from = node.from;
|
|
83
84
|
predicates.push(function(message) {
|
|
84
|
-
return matchesAddressField(normalizeAddress(message.from),
|
|
85
|
+
return matchesAddressField(normalizeAddress(message.from), from);
|
|
85
86
|
});
|
|
86
87
|
}
|
|
87
88
|
if ('to' in node && node.to) {
|
|
89
|
+
var to = node.to;
|
|
88
90
|
predicates.push(function(message) {
|
|
89
|
-
return matchesRecipientField(message.toRecipients,
|
|
91
|
+
return matchesRecipientField(message.toRecipients, to);
|
|
90
92
|
});
|
|
91
93
|
}
|
|
92
94
|
if ('cc' in node && node.cc) {
|
|
95
|
+
var cc = node.cc;
|
|
93
96
|
predicates.push(function(message) {
|
|
94
|
-
return matchesRecipientField(message.ccRecipients,
|
|
97
|
+
return matchesRecipientField(message.ccRecipients, cc);
|
|
95
98
|
});
|
|
96
99
|
}
|
|
97
100
|
if ('bcc' in node && node.bcc) {
|
|
101
|
+
var bcc = node.bcc;
|
|
98
102
|
predicates.push(function(message) {
|
|
99
|
-
return matchesRecipientField(message.bccRecipients,
|
|
103
|
+
return matchesRecipientField(message.bccRecipients, bcc);
|
|
100
104
|
});
|
|
101
105
|
}
|
|
102
106
|
if ('subject' in node && node.subject) {
|
|
107
|
+
var subject = node.subject;
|
|
103
108
|
predicates.push(function(message) {
|
|
104
|
-
return matchesSubject(message,
|
|
109
|
+
return matchesSubject(message, subject);
|
|
105
110
|
});
|
|
106
111
|
}
|
|
107
112
|
if ('text' in node && node.text) {
|
|
113
|
+
var text = node.text;
|
|
108
114
|
predicates.push(function(message) {
|
|
109
|
-
return matchesText(message,
|
|
115
|
+
return matchesText(message, text);
|
|
110
116
|
});
|
|
111
117
|
}
|
|
112
118
|
if ('body' in node && node.body) {
|
|
119
|
+
var body = node.body;
|
|
113
120
|
predicates.push(function(message) {
|
|
114
|
-
return matchesBody(message,
|
|
121
|
+
return matchesBody(message, body);
|
|
115
122
|
});
|
|
116
123
|
}
|
|
117
124
|
if ('exactPhrase' in node && node.exactPhrase) {
|
|
125
|
+
var exactPhrase = node.exactPhrase;
|
|
118
126
|
predicates.push(function(message) {
|
|
119
|
-
return matchesExactPhrase(message,
|
|
127
|
+
return matchesExactPhrase(message, exactPhrase);
|
|
120
128
|
});
|
|
121
129
|
}
|
|
122
130
|
if ('categories' in node && node.categories) {
|
|
131
|
+
var categories = node.categories;
|
|
123
132
|
predicates.push(function(message) {
|
|
124
133
|
var _message_categories;
|
|
125
|
-
return matchesCategoryField((_message_categories = message.categories) !== null && _message_categories !== void 0 ? _message_categories : [],
|
|
134
|
+
return matchesCategoryField((_message_categories = message.categories) !== null && _message_categories !== void 0 ? _message_categories : [], categories);
|
|
126
135
|
});
|
|
127
136
|
}
|
|
128
137
|
if ('label' in node && node.label) {
|
|
138
|
+
var label = node.label;
|
|
129
139
|
predicates.push(function(message) {
|
|
130
140
|
var _message_categories;
|
|
131
|
-
return matchesLabelField((_message_categories = message.categories) !== null && _message_categories !== void 0 ? _message_categories : [],
|
|
141
|
+
return matchesLabelField((_message_categories = message.categories) !== null && _message_categories !== void 0 ? _message_categories : [], label);
|
|
132
142
|
});
|
|
133
143
|
}
|
|
134
144
|
if (predicates.length === 0) return function() {
|
|
@@ -190,7 +200,7 @@ function matchesExactPhrase(message, phrase) {
|
|
|
190
200
|
});
|
|
191
201
|
}
|
|
192
202
|
function matchesAddressField(addressData, value) {
|
|
193
|
-
var matchTerm = function(term) {
|
|
203
|
+
var matchTerm = function matchTerm(term) {
|
|
194
204
|
var addressMatch = addressData.address.includes(term);
|
|
195
205
|
var nameMatch = addressData.name.includes(term);
|
|
196
206
|
if (term.includes('@')) {
|
|
@@ -215,7 +225,7 @@ function matchesRecipientField(recipients, value) {
|
|
|
215
225
|
name: normalizeForMatch(recipient === null || recipient === void 0 ? void 0 : (_recipient_emailAddress1 = recipient.emailAddress) === null || _recipient_emailAddress1 === void 0 ? void 0 : _recipient_emailAddress1.name)
|
|
216
226
|
};
|
|
217
227
|
});
|
|
218
|
-
var matchTerm = function(term) {
|
|
228
|
+
var matchTerm = function matchTerm(term) {
|
|
219
229
|
return normalizedRecipients.some(function(recipient) {
|
|
220
230
|
return recipient.address.includes(term) || recipient.name.includes(term);
|
|
221
231
|
});
|
|
@@ -226,7 +236,7 @@ function matchesCategoryField(categories, value) {
|
|
|
226
236
|
var mappedCategories = categories.map(function(category) {
|
|
227
237
|
return category !== null && category !== void 0 ? category : '';
|
|
228
238
|
});
|
|
229
|
-
var matchTerm = function(term) {
|
|
239
|
+
var matchTerm = function matchTerm(term) {
|
|
230
240
|
try {
|
|
231
241
|
var mappedTerm = (0, _querybuilderts.mapOutlookCategory)(term);
|
|
232
242
|
return mappedCategories.includes(mappedTerm);
|
|
@@ -237,11 +247,11 @@ function matchesCategoryField(categories, value) {
|
|
|
237
247
|
return evaluateOperator(value, matchTerm);
|
|
238
248
|
}
|
|
239
249
|
function matchesLabelField(categories, value) {
|
|
240
|
-
var normalizeLabelTerm = function(input) {
|
|
250
|
+
var normalizeLabelTerm = function normalizeLabelTerm(input) {
|
|
241
251
|
var trimmed = input.trim();
|
|
242
252
|
return trimmed === '' ? null : trimmed;
|
|
243
253
|
};
|
|
244
|
-
var matchTerm = function(term) {
|
|
254
|
+
var matchTerm = function matchTerm(term) {
|
|
245
255
|
return categories.includes(term);
|
|
246
256
|
};
|
|
247
257
|
return evaluateOperator(value, matchTerm, normalizeLabelTerm);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/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): 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 predicates.push((message) => matchesAddressField(normalizeAddress(message.from), node.from));\n }\n if ('to' in node && node.to) {\n predicates.push((message) => matchesRecipientField(message.toRecipients, node.to));\n }\n if ('cc' in node && node.cc) {\n predicates.push((message) => matchesRecipientField(message.ccRecipients, node.cc));\n }\n if ('bcc' in node && node.bcc) {\n predicates.push((message) => matchesRecipientField(message.bccRecipients, node.bcc));\n }\n if ('subject' in node && node.subject) {\n predicates.push((message) => matchesSubject(message, node.subject));\n }\n if ('text' in node && node.text) {\n predicates.push((message) => matchesText(message, node.text));\n }\n if ('body' in node && node.body) {\n predicates.push((message) => matchesBody(message, node.body));\n }\n if ('exactPhrase' in node && node.exactPhrase) {\n predicates.push((message) => matchesExactPhrase(message, node.exactPhrase));\n }\n if ('categories' in node && node.categories) {\n predicates.push((message) => matchesCategoryField(message.categories ?? [], node.categories));\n }\n if ('label' in node && node.label) {\n predicates.push((message) => matchesLabelField(message.categories ?? [], node.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 | undefined): NormalizedAddress {\n return {\n address: normalizeForMatch(recipient?.emailAddress?.address),\n name: normalizeForMatch(recipient?.emailAddress?.name),\n };\n}\n\nfunction matchesRecipientField(recipients: Recipient[] | 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 | 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 = 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): 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/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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"}
|
|
@@ -17,11 +17,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
|
17
17
|
reject(error);
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
20
|
-
if (info.done)
|
|
21
|
-
|
|
22
|
-
} else {
|
|
23
|
-
Promise.resolve(value).then(_next, _throw);
|
|
24
|
-
}
|
|
20
|
+
if (info.done) resolve(value);
|
|
21
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
25
22
|
}
|
|
26
23
|
function _async_to_generator(fn) {
|
|
27
24
|
return function() {
|
|
@@ -46,17 +43,14 @@ function _define_property(obj, key, value) {
|
|
|
46
43
|
configurable: true,
|
|
47
44
|
writable: true
|
|
48
45
|
});
|
|
49
|
-
} else
|
|
50
|
-
obj[key] = value;
|
|
51
|
-
}
|
|
46
|
+
} else obj[key] = value;
|
|
52
47
|
return obj;
|
|
53
48
|
}
|
|
54
49
|
function _instanceof(left, right) {
|
|
50
|
+
"@swc/helpers - instanceof";
|
|
55
51
|
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
56
52
|
return !!right[Symbol.hasInstance](left);
|
|
57
|
-
} else
|
|
58
|
-
return left instanceof right;
|
|
59
|
-
}
|
|
53
|
+
} else return left instanceof right;
|
|
60
54
|
}
|
|
61
55
|
function _object_spread(target) {
|
|
62
56
|
for(var i = 1; i < arguments.length; i++){
|
|
@@ -88,9 +82,8 @@ function ownKeys(object, enumerableOnly) {
|
|
|
88
82
|
}
|
|
89
83
|
function _object_spread_props(target, source) {
|
|
90
84
|
source = source != null ? source : {};
|
|
91
|
-
if (Object.getOwnPropertyDescriptors)
|
|
92
|
-
|
|
93
|
-
} else {
|
|
85
|
+
if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
86
|
+
else {
|
|
94
87
|
ownKeys(Object(source)).forEach(function(key) {
|
|
95
88
|
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
96
89
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/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/OpenSource/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"}
|
|
@@ -28,8 +28,8 @@ export declare function toOutlookFilter(parsed: QueryNode, _options?: {
|
|
|
28
28
|
includeBodyContent?: boolean;
|
|
29
29
|
useCaseInsensitiveWrap?: boolean;
|
|
30
30
|
}): {
|
|
31
|
-
filter: string;
|
|
32
|
-
search: string;
|
|
31
|
+
filter: string | null;
|
|
32
|
+
search: string | null;
|
|
33
33
|
requireBodyClientFilter: boolean;
|
|
34
34
|
filters: ExtractedFilters;
|
|
35
35
|
};
|
|
@@ -28,8 +28,8 @@ export declare function toOutlookFilter(parsed: QueryNode, _options?: {
|
|
|
28
28
|
includeBodyContent?: boolean;
|
|
29
29
|
useCaseInsensitiveWrap?: boolean;
|
|
30
30
|
}): {
|
|
31
|
-
filter: string;
|
|
32
|
-
search: string;
|
|
31
|
+
filter: string | null;
|
|
32
|
+
search: string | null;
|
|
33
33
|
requireBodyClientFilter: boolean;
|
|
34
34
|
filters: ExtractedFilters;
|
|
35
35
|
};
|
|
@@ -37,10 +37,12 @@ function _array_without_holes(arr) {
|
|
|
37
37
|
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
38
38
|
}
|
|
39
39
|
function _iterable_to_array(iter) {
|
|
40
|
-
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null)
|
|
40
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
|
|
41
|
+
return Array.from(iter);
|
|
42
|
+
}
|
|
41
43
|
}
|
|
42
44
|
function _non_iterable_spread() {
|
|
43
|
-
throw new TypeError("Invalid attempt to spread non-iterable instance
|
|
45
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
44
46
|
}
|
|
45
47
|
function _to_consumable_array(arr) {
|
|
46
48
|
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|