@mcp-z/mcp-outlook 1.0.11 → 1.0.13
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/email/querying/client-filter.d.cts +6 -0
- package/dist/cjs/email/querying/client-filter.d.ts +6 -0
- package/dist/cjs/email/querying/client-filter.js +309 -0
- package/dist/cjs/email/querying/client-filter.js.map +1 -0
- package/dist/cjs/email/querying/execute-query.d.cts +1 -0
- package/dist/cjs/email/querying/execute-query.d.ts +1 -0
- package/dist/cjs/email/querying/execute-query.js +3 -2
- package/dist/cjs/email/querying/execute-query.js.map +1 -1
- package/dist/cjs/email/querying/pagination-token.d.cts +13 -0
- package/dist/cjs/email/querying/pagination-token.d.ts +13 -0
- package/dist/cjs/email/querying/pagination-token.js +84 -0
- package/dist/cjs/email/querying/pagination-token.js.map +1 -0
- package/dist/cjs/email/querying/query-builder.d.cts +19 -0
- package/dist/cjs/email/querying/query-builder.d.ts +19 -0
- package/dist/cjs/email/querying/query-builder.js +156 -134
- package/dist/cjs/email/querying/query-builder.js.map +1 -1
- package/dist/cjs/email/querying/search-execution.d.cts +1 -6
- package/dist/cjs/email/querying/search-execution.d.ts +1 -6
- package/dist/cjs/email/querying/search-execution.js +317 -58
- package/dist/cjs/email/querying/search-execution.js.map +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js +1 -1
- package/dist/cjs/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/cjs/mcp/tools/message-search.d.cts +2 -2
- package/dist/cjs/mcp/tools/message-search.d.ts +2 -2
- package/dist/cjs/mcp/tools/message-search.js +17 -11
- package/dist/cjs/mcp/tools/message-search.js.map +1 -1
- package/dist/cjs/mcp/tools/messages-export-csv.d.cts +2 -2
- package/dist/cjs/mcp/tools/messages-export-csv.d.ts +2 -2
- package/dist/cjs/mcp/tools/messages-export-csv.js +9 -8
- package/dist/cjs/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/cjs/schemas/outlook-query-schema.d.cts +2 -1
- package/dist/cjs/schemas/outlook-query-schema.d.ts +2 -1
- package/dist/cjs/schemas/outlook-query-schema.js +40 -18
- package/dist/cjs/schemas/outlook-query-schema.js.map +1 -1
- package/dist/esm/email/querying/client-filter.d.ts +6 -0
- package/dist/esm/email/querying/client-filter.js +213 -0
- package/dist/esm/email/querying/client-filter.js.map +1 -0
- package/dist/esm/email/querying/execute-query.d.ts +1 -0
- package/dist/esm/email/querying/execute-query.js +2 -1
- package/dist/esm/email/querying/execute-query.js.map +1 -1
- package/dist/esm/email/querying/pagination-token.d.ts +13 -0
- package/dist/esm/email/querying/pagination-token.js +62 -0
- package/dist/esm/email/querying/pagination-token.js.map +1 -0
- package/dist/esm/email/querying/query-builder.d.ts +19 -0
- package/dist/esm/email/querying/query-builder.js +133 -109
- package/dist/esm/email/querying/query-builder.js.map +1 -1
- package/dist/esm/email/querying/search-execution.d.ts +1 -6
- package/dist/esm/email/querying/search-execution.js +221 -55
- package/dist/esm/email/querying/search-execution.js.map +1 -1
- package/dist/esm/mcp/prompts/query-syntax.js +4 -1
- package/dist/esm/mcp/prompts/query-syntax.js.map +1 -1
- package/dist/esm/mcp/tools/message-search.d.ts +2 -2
- package/dist/esm/mcp/tools/message-search.js +15 -11
- package/dist/esm/mcp/tools/message-search.js.map +1 -1
- package/dist/esm/mcp/tools/messages-export-csv.d.ts +2 -2
- package/dist/esm/mcp/tools/messages-export-csv.js +9 -8
- package/dist/esm/mcp/tools/messages-export-csv.js.map +1 -1
- package/dist/esm/schemas/outlook-query-schema.d.ts +2 -1
- package/dist/esm/schemas/outlook-query-schema.js +37 -18
- package/dist/esm/schemas/outlook-query-schema.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,9 +9,18 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
+
get OUTLOOK_CATEGORIES () {
|
|
13
|
+
return OUTLOOK_CATEGORIES;
|
|
14
|
+
},
|
|
15
|
+
get buildQueryFilter () {
|
|
16
|
+
return buildQueryFilter;
|
|
17
|
+
},
|
|
12
18
|
get extractOutlookFilters () {
|
|
13
19
|
return extractOutlookFilters;
|
|
14
20
|
},
|
|
21
|
+
get mapOutlookCategory () {
|
|
22
|
+
return mapOutlookCategory;
|
|
23
|
+
},
|
|
15
24
|
get toGraphFilter () {
|
|
16
25
|
return toGraphFilter;
|
|
17
26
|
},
|
|
@@ -48,10 +57,7 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
48
57
|
if (n === "Map" || n === "Set") return Array.from(n);
|
|
49
58
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
50
59
|
}
|
|
51
|
-
|
|
52
|
-
* Outlook category mappings - case insensitive input to exact system categories
|
|
53
|
-
* Note: These are user-defined categories in Outlook, not system categories like Gmail
|
|
54
|
-
*/ var OUTLOOK_CATEGORIES = {
|
|
60
|
+
var OUTLOOK_CATEGORIES = {
|
|
55
61
|
personal: 'Personal',
|
|
56
62
|
work: 'Work',
|
|
57
63
|
family: 'Family',
|
|
@@ -59,10 +65,7 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
59
65
|
important: 'Important',
|
|
60
66
|
urgent: 'Urgent'
|
|
61
67
|
};
|
|
62
|
-
|
|
63
|
-
* Validate and map category name to Outlook system category
|
|
64
|
-
* Throws error for invalid categories (fail fast principle)
|
|
65
|
-
*/ function mapOutlookCategory(category) {
|
|
68
|
+
function mapOutlookCategory(category) {
|
|
66
69
|
// Input validation - fail fast on invalid input
|
|
67
70
|
if (!category || typeof category !== 'string') {
|
|
68
71
|
throw new Error("Invalid category: expected non-empty string, got ".concat(typeof category === "undefined" ? "undefined" : _type_of(category)));
|
|
@@ -84,20 +87,158 @@ function toGraphFilter(query) {
|
|
|
84
87
|
return {
|
|
85
88
|
search: query.kqlQuery,
|
|
86
89
|
filter: null,
|
|
87
|
-
requireBodyClientFilter: false
|
|
90
|
+
requireBodyClientFilter: false,
|
|
91
|
+
hasFullText: true
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
if (hasFullTextIntent(query)) {
|
|
95
|
+
var searchCollect = collectSearchTerms(query);
|
|
96
|
+
var search = searchCollect.terms.length ? searchCollect.terms.join(' OR ') : null;
|
|
97
|
+
return {
|
|
98
|
+
search: search,
|
|
99
|
+
filter: null,
|
|
100
|
+
requireBodyClientFilter: searchCollect.usesBody || searchCollect.usesText,
|
|
101
|
+
hasFullText: true
|
|
88
102
|
};
|
|
89
103
|
}
|
|
90
|
-
var
|
|
104
|
+
var filterStr = buildQueryFilter(query);
|
|
105
|
+
var cleanedFilter = filterStr && typeof filterStr === 'string' && filterStr.trim().length ? filterStr.trim() : null;
|
|
106
|
+
return {
|
|
107
|
+
search: null,
|
|
108
|
+
filter: cleanedFilter,
|
|
109
|
+
requireBodyClientFilter: false,
|
|
110
|
+
hasFullText: false
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function collectSearchTerms(query) {
|
|
114
|
+
var state = {
|
|
115
|
+
terms: [],
|
|
116
|
+
usesText: false,
|
|
117
|
+
usesBody: false,
|
|
118
|
+
usesExact: false
|
|
119
|
+
};
|
|
120
|
+
walkNode(query);
|
|
121
|
+
return state;
|
|
122
|
+
function walkNode(node) {
|
|
123
|
+
if (!node || (typeof node === "undefined" ? "undefined" : _type_of(node)) !== 'object') return;
|
|
124
|
+
if (node.$and) {
|
|
125
|
+
node.$and.forEach(function(child) {
|
|
126
|
+
return walkNode(child);
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (node.$or) {
|
|
131
|
+
node.$or.forEach(function(child) {
|
|
132
|
+
return walkNode(child);
|
|
133
|
+
});
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (node.$not) {
|
|
137
|
+
walkNode(node.$not);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if ('exactPhrase' in node && node.exactPhrase) {
|
|
141
|
+
state.usesExact = true;
|
|
142
|
+
pushExactPhrase(node.exactPhrase);
|
|
143
|
+
}
|
|
144
|
+
pushOperatorTerms(node.subject);
|
|
145
|
+
if ('text' in node && node.text) {
|
|
146
|
+
state.usesText = true;
|
|
147
|
+
pushOperatorTerms(node.text);
|
|
148
|
+
}
|
|
149
|
+
if ('body' in node && node.body) {
|
|
150
|
+
state.usesBody = true;
|
|
151
|
+
pushOperatorTerms(node.body);
|
|
152
|
+
}
|
|
153
|
+
// Other fields (hasAttachment, importance, date) are handled via OData filters (emit())
|
|
154
|
+
// and should not create search terms with colon prefixes that break Graph $search.
|
|
155
|
+
}
|
|
156
|
+
function pushExactPhrase(value) {
|
|
157
|
+
var phrase = String(value);
|
|
158
|
+
if (!phrase.trim()) return;
|
|
159
|
+
pushAnyTerms([
|
|
160
|
+
'"'.concat(phrase, '"')
|
|
161
|
+
]);
|
|
162
|
+
}
|
|
163
|
+
function pushOperatorTerms(value) {
|
|
164
|
+
if (!value) return;
|
|
165
|
+
if (typeof value === 'string') {
|
|
166
|
+
var clause = buildClause(null, value);
|
|
167
|
+
if (clause) state.terms.push(clause);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (Array.isArray(value.$any) && value.$any.length > 0) {
|
|
171
|
+
pushAnyTerms(value.$any);
|
|
172
|
+
}
|
|
173
|
+
if (Array.isArray(value.$all) && value.$all.length > 0) {
|
|
174
|
+
pushAllTerms(value.$all);
|
|
175
|
+
}
|
|
176
|
+
if (Array.isArray(value.$none) && value.$none.length > 0) {
|
|
177
|
+
var clauses = value.$none.map(function(term) {
|
|
178
|
+
return buildClause(null, String(term !== null && term !== void 0 ? term : ''));
|
|
179
|
+
}).filter(Boolean);
|
|
180
|
+
if (clauses.length === 1) {
|
|
181
|
+
state.terms.push("NOT ".concat(clauses[0]));
|
|
182
|
+
} else if (clauses.length > 1) {
|
|
183
|
+
state.terms.push("NOT (".concat(clauses.join(' OR '), ")"));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function pushAnyTerms(values) {
|
|
188
|
+
var clauses = values.map(function(val) {
|
|
189
|
+
return buildClause(null, val);
|
|
190
|
+
}).filter(Boolean);
|
|
191
|
+
if (!clauses.length) return;
|
|
192
|
+
state.terms.push(clauses.length === 1 ? clauses[0] : "(".concat(clauses.join(' OR '), ")"));
|
|
193
|
+
}
|
|
194
|
+
function pushAllTerms(values) {
|
|
195
|
+
var clauses = values.map(function(val) {
|
|
196
|
+
return buildClause(null, val);
|
|
197
|
+
}).filter(Boolean);
|
|
198
|
+
if (!clauses.length) return;
|
|
199
|
+
state.terms.push(clauses.length === 1 ? clauses[0] : "(".concat(clauses.join(' AND '), ")"));
|
|
200
|
+
}
|
|
201
|
+
function escapeKQL(value) {
|
|
202
|
+
return value.replace(/\\/g, '\\\\').replace(/:/g, '\\:').replace(/\(/g, '\\(').replace(/\)/g, '\\)').replace(/\{/g, '\\{').replace(/\}/g, '\\}').replace(/\[/g, '\\[').replace(/\]/g, '\\]').replace(/"/g, '\\"').replace(/\*/g, '\\*').replace(/\?/g, '\\?').replace(/</g, '\\<').replace(/>/g, '\\>').replace(/_/g, '\\_');
|
|
203
|
+
}
|
|
204
|
+
function buildClause(_prefix, value) {
|
|
205
|
+
var trimmed = value.trim();
|
|
206
|
+
if (!trimmed) return '';
|
|
207
|
+
var escaped = escapeKQL(trimmed);
|
|
208
|
+
var shouldQuote = /[^a-zA-Z\s]/.test(trimmed) || /\s/.test(trimmed);
|
|
209
|
+
return shouldQuote ? '"'.concat(escaped, '"') : escaped;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function hasFullTextIntent(node) {
|
|
213
|
+
if (!node || (typeof node === "undefined" ? "undefined" : _type_of(node)) !== 'object') return false;
|
|
214
|
+
if (node.kqlQuery) return true;
|
|
215
|
+
if (node.exactPhrase) return true;
|
|
216
|
+
if ('subject' in node && node.subject) return true;
|
|
217
|
+
if ('text' in node && node.text) return true;
|
|
218
|
+
if ('body' in node && node.body) return true;
|
|
219
|
+
if ('$and' in node && node.$and) {
|
|
220
|
+
return node.$and.some(function(child) {
|
|
221
|
+
return hasFullTextIntent(child);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
if ('$or' in node && node.$or) {
|
|
225
|
+
return node.$or.some(function(child) {
|
|
226
|
+
return hasFullTextIntent(child);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
if ('$not' in node && node.$not) {
|
|
230
|
+
return hasFullTextIntent(node.$not);
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
function buildQueryFilter(query) {
|
|
91
235
|
function L(s) {
|
|
92
|
-
// Microsoft Graph does NOT support toLower() function in OData filters
|
|
93
|
-
// Case-insensitive matching must be done client-side or via $search
|
|
94
236
|
return s;
|
|
95
237
|
}
|
|
96
238
|
function p(s) {
|
|
97
239
|
return "(".concat(s, ")");
|
|
98
240
|
}
|
|
99
241
|
function recip(coll, V) {
|
|
100
|
-
// Graph may reject functions on nested properties; use equality on nested address/name fields.
|
|
101
242
|
var left = "r/emailAddress/address eq ".concat(V);
|
|
102
243
|
var right = "r/emailAddress/name eq ".concat(V);
|
|
103
244
|
return "".concat(coll, "/any(r: ").concat(left, " or ").concat(right, ")");
|
|
@@ -105,16 +246,12 @@ function toGraphFilter(query) {
|
|
|
105
246
|
function fv(field, raw) {
|
|
106
247
|
if (raw == null) return '';
|
|
107
248
|
var rawStr = String(raw);
|
|
108
|
-
// For text and body fields, skip OData filtering entirely (uses KQL search instead)
|
|
109
|
-
// Do this BEFORE validation so we don't throw on valid text/body queries
|
|
110
249
|
if (field === 'text' || field === 'body') {
|
|
111
250
|
if (rawStr.trim() === '') {
|
|
112
251
|
throw new Error("Invalid ".concat(field, " value: empty string"));
|
|
113
252
|
}
|
|
114
|
-
requireBodyClientFilter = true;
|
|
115
253
|
return '';
|
|
116
254
|
}
|
|
117
|
-
// For all other fields, validate non-empty AFTER checking for null
|
|
118
255
|
if (rawStr.trim() === '') {
|
|
119
256
|
throw new Error("Invalid ".concat(field, " value: empty string"));
|
|
120
257
|
}
|
|
@@ -122,14 +259,11 @@ function toGraphFilter(query) {
|
|
|
122
259
|
switch(field){
|
|
123
260
|
case 'from':
|
|
124
261
|
{
|
|
125
|
-
// For email addresses emit equality checks on nested address/name;
|
|
126
|
-
// for name-only tokens, skip server-side filter (handled client-side or via $search).
|
|
127
262
|
if (rawStr.includes('@')) {
|
|
128
263
|
var addrEq = "".concat(L('from/emailAddress/address'), " eq ").concat(V);
|
|
129
264
|
var nameEq = "".concat(L('from/emailAddress/name'), " eq ").concat(V);
|
|
130
265
|
return p("".concat(addrEq, " or ").concat(nameEq));
|
|
131
266
|
}
|
|
132
|
-
// Don't emit a server-side filter for name-only 'from' tokens.
|
|
133
267
|
return '';
|
|
134
268
|
}
|
|
135
269
|
case 'to':
|
|
@@ -139,25 +273,16 @@ function toGraphFilter(query) {
|
|
|
139
273
|
case 'bcc':
|
|
140
274
|
return recip('bccRecipients', V);
|
|
141
275
|
case 'subject':
|
|
142
|
-
// Microsoft Graph does NOT support contains() function in OData filters
|
|
143
|
-
// Use startswith as a partial alternative or rely on $search
|
|
144
276
|
if (rawStr.includes('-') || rawStr.length < 3) return '';
|
|
145
277
|
return "startswith(subject, ".concat(V, ")");
|
|
146
278
|
case 'categories':
|
|
147
279
|
{
|
|
148
|
-
// mapOutlookCategory will throw on invalid input (fail fast)
|
|
149
280
|
var systemCategory = mapOutlookCategory(rawStr);
|
|
150
|
-
// Use the categories OData property with exact case-sensitive match
|
|
151
281
|
return "categories/any(c: c eq '".concat(systemCategory, "')");
|
|
152
282
|
}
|
|
153
283
|
case 'label':
|
|
154
|
-
|
|
155
|
-
// Direct passthrough to categories for Outlook (case-sensitive)
|
|
156
|
-
return "categories/any(c: c eq '".concat(rawStr.replace(/'/g, "''"), "')");
|
|
157
|
-
}
|
|
284
|
+
return "categories/any(c: c eq '".concat(rawStr.replace(/'/g, "''"), "')");
|
|
158
285
|
default:
|
|
159
|
-
// Microsoft Graph does NOT support contains() function
|
|
160
|
-
// For unknown fields, skip server-side filtering
|
|
161
286
|
return '';
|
|
162
287
|
}
|
|
163
288
|
}
|
|
@@ -181,7 +306,6 @@ function toGraphFilter(query) {
|
|
|
181
306
|
var results = op.$any.map(function(v) {
|
|
182
307
|
return fv(field, String(v !== null && v !== void 0 ? v : ''));
|
|
183
308
|
});
|
|
184
|
-
// Filter out empty strings (from fields like text/body that don't generate OData filters)
|
|
185
309
|
var validResults = results.filter(function(s) {
|
|
186
310
|
return s && s.trim();
|
|
187
311
|
});
|
|
@@ -192,7 +316,6 @@ function toGraphFilter(query) {
|
|
|
192
316
|
var results1 = op.$all.map(function(v) {
|
|
193
317
|
return fv(field, String(v !== null && v !== void 0 ? v : ''));
|
|
194
318
|
});
|
|
195
|
-
// Filter out empty strings (from fields like text/body that don't generate OData filters)
|
|
196
319
|
var validResults1 = results1.filter(function(s) {
|
|
197
320
|
return s && s.trim();
|
|
198
321
|
});
|
|
@@ -203,7 +326,6 @@ function toGraphFilter(query) {
|
|
|
203
326
|
var results2 = op.$none.map(function(v) {
|
|
204
327
|
return fv(field, String(v !== null && v !== void 0 ? v : ''));
|
|
205
328
|
});
|
|
206
|
-
// Filter out empty strings (from fields like text/body that don't generate OData filters)
|
|
207
329
|
var validResults2 = results2.filter(function(s) {
|
|
208
330
|
return s && s.trim();
|
|
209
331
|
});
|
|
@@ -270,107 +392,7 @@ function toGraphFilter(query) {
|
|
|
270
392
|
}
|
|
271
393
|
return '';
|
|
272
394
|
}
|
|
273
|
-
|
|
274
|
-
var terms = [];
|
|
275
|
-
function pushTerms(arr) {
|
|
276
|
-
if (Array.isArray(arr)) {
|
|
277
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
278
|
-
try {
|
|
279
|
-
for(var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
280
|
-
var t = _step.value;
|
|
281
|
-
if ((t !== null && t !== void 0 ? t : '').toString().trim()) terms.push(String(t).trim());
|
|
282
|
-
}
|
|
283
|
-
} catch (err) {
|
|
284
|
-
_didIteratorError = true;
|
|
285
|
-
_iteratorError = err;
|
|
286
|
-
} finally{
|
|
287
|
-
try {
|
|
288
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
289
|
-
_iterator.return();
|
|
290
|
-
}
|
|
291
|
-
} finally{
|
|
292
|
-
if (_didIteratorError) {
|
|
293
|
-
throw _iteratorError;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
function walk(node) {
|
|
300
|
-
if (!node || (typeof node === "undefined" ? "undefined" : _type_of(node)) !== 'object') return;
|
|
301
|
-
if ('$and' in node && node.$and) {
|
|
302
|
-
node.$and.forEach(walk);
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
if ('$or' in node && node.$or) {
|
|
306
|
-
node.$or.forEach(walk);
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
if ('$not' in node && node.$not) {
|
|
310
|
-
walk(node.$not);
|
|
311
|
-
return;
|
|
312
|
-
}
|
|
313
|
-
if ('exactPhrase' in node && node.exactPhrase) {
|
|
314
|
-
// KQL uses double quotes for exact phrase matching
|
|
315
|
-
pushTerms([
|
|
316
|
-
'"'.concat(String(node.exactPhrase).replace(/"/g, '\\"'), '"')
|
|
317
|
-
]);
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
if ('subject' in node && node.subject) {
|
|
321
|
-
if (typeof node.subject === 'string') {
|
|
322
|
-
pushTerms([
|
|
323
|
-
node.subject
|
|
324
|
-
]);
|
|
325
|
-
} else {
|
|
326
|
-
pushTerms(node.subject.$any);
|
|
327
|
-
pushTerms(node.subject.$all);
|
|
328
|
-
pushTerms(node.subject.$none);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
if ('body' in node && node.body) {
|
|
332
|
-
if (typeof node.body === 'string') {
|
|
333
|
-
pushTerms([
|
|
334
|
-
node.body
|
|
335
|
-
]);
|
|
336
|
-
} else {
|
|
337
|
-
pushTerms(node.body.$any);
|
|
338
|
-
pushTerms(node.body.$all);
|
|
339
|
-
pushTerms(node.body.$none);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
if ('text' in node && node.text) {
|
|
343
|
-
if (typeof node.text === 'string') {
|
|
344
|
-
pushTerms([
|
|
345
|
-
node.text
|
|
346
|
-
]);
|
|
347
|
-
} else {
|
|
348
|
-
pushTerms(node.text.$any);
|
|
349
|
-
pushTerms(node.text.$all);
|
|
350
|
-
pushTerms(node.text.$none);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
walk(query);
|
|
355
|
-
/**
|
|
356
|
-
* Escape KQL (Keyword Query Language) special characters in search terms.
|
|
357
|
-
* KQL special characters that need escaping: \ : ( ) { } [ ] " * ? < > - _
|
|
358
|
-
* According to Microsoft Graph KQL syntax, these must be escaped with backslash.
|
|
359
|
-
*/ function escapeKQL(term) {
|
|
360
|
-
if (!term) return term;
|
|
361
|
-
// Escape backslash first, then other special characters
|
|
362
|
-
return term.replace(/\\/g, '\\\\').replace(/:/g, '\\:').replace(/\(/g, '\\(').replace(/\)/g, '\\)').replace(/\{/g, '\\{').replace(/\}/g, '\\}').replace(/\[/g, '\\[').replace(/\]/g, '\\]').replace(/"/g, '\\"').replace(/\*/g, '\\*').replace(/\?/g, '\\?').replace(/</g, '\\<').replace(/>/g, '\\>').replace(/-/g, '\\-').replace(/_/g, '\\_');
|
|
363
|
-
}
|
|
364
|
-
var mapped = terms.map(function(t) {
|
|
365
|
-
var escaped = escapeKQL(String(t));
|
|
366
|
-
return escaped;
|
|
367
|
-
});
|
|
368
|
-
var search = mapped.length ? mapped.join(' OR ') : null;
|
|
369
|
-
return {
|
|
370
|
-
search: search,
|
|
371
|
-
filter: filterStr && typeof filterStr === 'string' && filterStr.length ? filterStr : null,
|
|
372
|
-
requireBodyClientFilter: requireBodyClientFilter
|
|
373
|
-
};
|
|
395
|
+
return emit(query);
|
|
374
396
|
}
|
|
375
397
|
function toOutlookFilter(parsed, _options) {
|
|
376
398
|
var graphResult = toGraphFilter(parsed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/Projects/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 */\nconst 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 */\nfunction 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}\n\nexport function toGraphFilter(query: QueryNode): ODataFilterResult {\n if (query.kqlQuery) {\n return { search: query.kqlQuery, filter: null, requireBodyClientFilter: false };\n }\n let requireBodyClientFilter = false;\n\n function L(s: string) {\n // Microsoft Graph does NOT support toLower() function in OData filters\n // Case-insensitive matching must be done client-side or via $search\n return s;\n }\n function p(s: string) {\n return `(${s})`;\n }\n\n function recip(coll: string, V: string) {\n // Graph may reject functions on nested properties; use equality on nested address/name fields.\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 // For text and body fields, skip OData filtering entirely (uses KQL search instead)\n // Do this BEFORE validation so we don't throw on valid text/body queries\n if (field === 'text' || field === 'body') {\n if (rawStr.trim() === '') {\n throw new Error(`Invalid ${field} value: empty string`);\n }\n requireBodyClientFilter = true;\n return '';\n }\n\n // For all other fields, validate non-empty AFTER checking for null\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 // For email addresses emit equality checks on nested address/name;\n // for name-only tokens, skip server-side filter (handled client-side or via $search).\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 // Don't emit a server-side filter for name-only 'from' tokens.\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 // Microsoft Graph does NOT support contains() function in OData filters\n // Use startswith as a partial alternative or rely on $search\n if (rawStr.includes('-') || rawStr.length < 3) return '';\n return `startswith(subject, ${V})`;\n case 'categories': {\n // mapOutlookCategory will throw on invalid input (fail fast)\n const systemCategory = mapOutlookCategory(rawStr);\n // Use the categories OData property with exact case-sensitive match\n return `categories/any(c: c eq '${systemCategory}')`;\n }\n case 'label': {\n // Direct passthrough to categories for Outlook (case-sensitive)\n return `categories/any(c: c eq '${rawStr.replace(/'/g, \"''\")}')`;\n }\n default:\n // Microsoft Graph does NOT support contains() function\n // For unknown fields, skip server-side filtering\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 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 // Filter out empty strings (from fields like text/body that don't generate OData filters)\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 // Filter out empty strings (from fields like text/body that don't generate OData filters)\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 // Filter out empty strings (from fields like text/body that don't generate OData filters)\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 const filterStr = emit(query);\n\n const terms: string[] = [];\n function pushTerms(arr?: string[]) {\n if (Array.isArray(arr)) for (const t of arr) if ((t ?? '').toString().trim()) terms.push(String(t).trim());\n }\n\n function walk(node: QueryNode): void {\n if (!node || typeof node !== 'object') return;\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 ('exactPhrase' in node && node.exactPhrase) {\n // KQL uses double quotes for exact phrase matching\n pushTerms([`\"${String(node.exactPhrase).replace(/\"/g, '\\\\\"')}\"`]);\n return;\n }\n\n if ('subject' in node && node.subject) {\n if (typeof node.subject === 'string') {\n pushTerms([node.subject]);\n } else {\n pushTerms(node.subject.$any);\n pushTerms(node.subject.$all);\n pushTerms(node.subject.$none);\n }\n }\n if ('body' in node && node.body) {\n if (typeof node.body === 'string') {\n pushTerms([node.body]);\n } else {\n pushTerms(node.body.$any);\n pushTerms(node.body.$all);\n pushTerms(node.body.$none);\n }\n }\n if ('text' in node && node.text) {\n if (typeof node.text === 'string') {\n pushTerms([node.text]);\n } else {\n pushTerms(node.text.$any);\n pushTerms(node.text.$all);\n pushTerms(node.text.$none);\n }\n }\n }\n walk(query);\n\n /**\n * Escape KQL (Keyword Query Language) special characters in search terms.\n * KQL special characters that need escaping: \\ : ( ) { } [ ] \" * ? < > - _\n * According to Microsoft Graph KQL syntax, these must be escaped with backslash.\n */\n function escapeKQL(term: string): string {\n if (!term) return term;\n // Escape backslash first, then other special characters\n return term\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 .replace(/_/g, '\\\\_');\n }\n\n const mapped = terms.map((t) => {\n const escaped = escapeKQL(String(t));\n return escaped;\n });\n const search = mapped.length ? mapped.join(' OR ') : null;\n\n return { search, filter: filterStr && typeof filterStr === 'string' && filterStr.length ? filterStr : null, requireBodyClientFilter };\n}\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":["extractOutlookFilters","toGraphFilter","toOutlookFilter","OUTLOOK_CATEGORIES","personal","work","family","travel","important","urgent","mapOutlookCategory","category","Error","trimmed","trim","normalizedCategory","toLowerCase","systemCategory","Object","keys","join","query","kqlQuery","search","filter","requireBodyClientFilter","L","s","p","recip","coll","V","left","right","fv","field","raw","rawStr","String","replace","includes","addrEq","nameEq","length","chain","op","arr","first","joined","fieldExpr","Array","isArray","$any","results","map","v","validResults","$all","$none","JSON","stringify","dateExpr","d","parts","$gte","push","$lt","emit","n","$and","andParts","part","Boolean","firstPart","$or","orParts","$not","notExpr","hasAttachment","date","k0","fieldValue","filterStr","terms","pushTerms","t","toString","walk","node","forEach","exactPhrase","subject","body","text","escapeKQL","term","mapped","escaped","parsed","_options","graphResult","filters","subjectIncludes","bodyIncludes","textIncludes","fromIncludes","toIncludes","ccIncludes","bccIncludes","categoriesIncludes","labelIncludes","undefined","since","before","from","to","cc","bcc","categories","validCategories","cat","label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/Projects/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 state.terms.push(clauses.length === 1 ? clauses[0] : `(${clauses.join(' AND ')})`);\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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"}
|
|
@@ -7,6 +7,7 @@ export interface OutlookSearchOptions {
|
|
|
7
7
|
limit?: number;
|
|
8
8
|
includeBody?: boolean;
|
|
9
9
|
maxPages?: number | null;
|
|
10
|
+
maxItemsScanned?: number | null;
|
|
10
11
|
pageSize?: number;
|
|
11
12
|
pageToken?: string | undefined;
|
|
12
13
|
logger: Logger;
|
|
@@ -15,10 +16,4 @@ export interface OutlookSearchResult {
|
|
|
15
16
|
messages: Message[];
|
|
16
17
|
nextPageToken?: string | undefined;
|
|
17
18
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Execute a direct Microsoft Graph API query.
|
|
20
|
-
* Single attempt with no fallbacks or retries.
|
|
21
|
-
* Errors are returned directly for actionable feedback.
|
|
22
|
-
* Returns raw Graph API Message objects for transformation by caller.
|
|
23
|
-
*/
|
|
24
19
|
export declare function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult>;
|
|
@@ -7,6 +7,7 @@ export interface OutlookSearchOptions {
|
|
|
7
7
|
limit?: number;
|
|
8
8
|
includeBody?: boolean;
|
|
9
9
|
maxPages?: number | null;
|
|
10
|
+
maxItemsScanned?: number | null;
|
|
10
11
|
pageSize?: number;
|
|
11
12
|
pageToken?: string | undefined;
|
|
12
13
|
logger: Logger;
|
|
@@ -15,10 +16,4 @@ export interface OutlookSearchResult {
|
|
|
15
16
|
messages: Message[];
|
|
16
17
|
nextPageToken?: string | undefined;
|
|
17
18
|
}
|
|
18
|
-
/**
|
|
19
|
-
* Execute a direct Microsoft Graph API query.
|
|
20
|
-
* Single attempt with no fallbacks or retries.
|
|
21
|
-
* Errors are returned directly for actionable feedback.
|
|
22
|
-
* Returns raw Graph API Message objects for transformation by caller.
|
|
23
|
-
*/
|
|
24
19
|
export declare function searchMessages(graph: Client, opts: OutlookSearchOptions): Promise<OutlookSearchResult>;
|