@noteplanco/noteplan-mcp 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +257 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/noteplan/embeddings.d.ts +170 -0
  7. package/dist/noteplan/embeddings.d.ts.map +1 -0
  8. package/dist/noteplan/embeddings.js +684 -0
  9. package/dist/noteplan/embeddings.js.map +1 -0
  10. package/dist/noteplan/file-reader.d.ts +77 -0
  11. package/dist/noteplan/file-reader.d.ts.map +1 -0
  12. package/dist/noteplan/file-reader.js +488 -0
  13. package/dist/noteplan/file-reader.js.map +1 -0
  14. package/dist/noteplan/file-writer.d.ts +108 -0
  15. package/dist/noteplan/file-writer.d.ts.map +1 -0
  16. package/dist/noteplan/file-writer.js +621 -0
  17. package/dist/noteplan/file-writer.js.map +1 -0
  18. package/dist/noteplan/filter-store.d.ts +28 -0
  19. package/dist/noteplan/filter-store.d.ts.map +1 -0
  20. package/dist/noteplan/filter-store.js +180 -0
  21. package/dist/noteplan/filter-store.js.map +1 -0
  22. package/dist/noteplan/frontmatter-parser.d.ts +45 -0
  23. package/dist/noteplan/frontmatter-parser.d.ts.map +1 -0
  24. package/dist/noteplan/frontmatter-parser.js +259 -0
  25. package/dist/noteplan/frontmatter-parser.js.map +1 -0
  26. package/dist/noteplan/fuzzy-search.d.ts +7 -0
  27. package/dist/noteplan/fuzzy-search.d.ts.map +1 -0
  28. package/dist/noteplan/fuzzy-search.js +66 -0
  29. package/dist/noteplan/fuzzy-search.js.map +1 -0
  30. package/dist/noteplan/markdown-parser.d.ts +87 -0
  31. package/dist/noteplan/markdown-parser.d.ts.map +1 -0
  32. package/dist/noteplan/markdown-parser.js +519 -0
  33. package/dist/noteplan/markdown-parser.js.map +1 -0
  34. package/dist/noteplan/preferences.d.ts +44 -0
  35. package/dist/noteplan/preferences.d.ts.map +1 -0
  36. package/dist/noteplan/preferences.js +156 -0
  37. package/dist/noteplan/preferences.js.map +1 -0
  38. package/dist/noteplan/ripgrep-search.d.ts +29 -0
  39. package/dist/noteplan/ripgrep-search.d.ts.map +1 -0
  40. package/dist/noteplan/ripgrep-search.js +110 -0
  41. package/dist/noteplan/ripgrep-search.js.map +1 -0
  42. package/dist/noteplan/sqlite-reader.d.ts +77 -0
  43. package/dist/noteplan/sqlite-reader.d.ts.map +1 -0
  44. package/dist/noteplan/sqlite-reader.js +605 -0
  45. package/dist/noteplan/sqlite-reader.js.map +1 -0
  46. package/dist/noteplan/sqlite-writer.d.ts +63 -0
  47. package/dist/noteplan/sqlite-writer.d.ts.map +1 -0
  48. package/dist/noteplan/sqlite-writer.js +574 -0
  49. package/dist/noteplan/sqlite-writer.js.map +1 -0
  50. package/dist/noteplan/types.d.ts +97 -0
  51. package/dist/noteplan/types.d.ts.map +1 -0
  52. package/dist/noteplan/types.js +33 -0
  53. package/dist/noteplan/types.js.map +1 -0
  54. package/dist/noteplan/unified-store.d.ts +289 -0
  55. package/dist/noteplan/unified-store.d.ts.map +1 -0
  56. package/dist/noteplan/unified-store.js +1308 -0
  57. package/dist/noteplan/unified-store.js.map +1 -0
  58. package/dist/server.d.ts +4 -0
  59. package/dist/server.d.ts.map +1 -0
  60. package/dist/server.js +2468 -0
  61. package/dist/server.js.map +1 -0
  62. package/dist/tools/calendar.d.ts +311 -0
  63. package/dist/tools/calendar.d.ts.map +1 -0
  64. package/dist/tools/calendar.js +504 -0
  65. package/dist/tools/calendar.js.map +1 -0
  66. package/dist/tools/embeddings.d.ts +244 -0
  67. package/dist/tools/embeddings.d.ts.map +1 -0
  68. package/dist/tools/embeddings.js +226 -0
  69. package/dist/tools/embeddings.js.map +1 -0
  70. package/dist/tools/events.d.ts +176 -0
  71. package/dist/tools/events.d.ts.map +1 -0
  72. package/dist/tools/events.js +326 -0
  73. package/dist/tools/events.js.map +1 -0
  74. package/dist/tools/filters.d.ts +205 -0
  75. package/dist/tools/filters.d.ts.map +1 -0
  76. package/dist/tools/filters.js +347 -0
  77. package/dist/tools/filters.js.map +1 -0
  78. package/dist/tools/memory.d.ts +6 -0
  79. package/dist/tools/memory.d.ts.map +1 -0
  80. package/dist/tools/memory.js +161 -0
  81. package/dist/tools/memory.js.map +1 -0
  82. package/dist/tools/notes.d.ts +1221 -0
  83. package/dist/tools/notes.d.ts.map +1 -0
  84. package/dist/tools/notes.js +1868 -0
  85. package/dist/tools/notes.js.map +1 -0
  86. package/dist/tools/plugins.d.ts +140 -0
  87. package/dist/tools/plugins.d.ts.map +1 -0
  88. package/dist/tools/plugins.js +782 -0
  89. package/dist/tools/plugins.js.map +1 -0
  90. package/dist/tools/reminders.d.ts +207 -0
  91. package/dist/tools/reminders.d.ts.map +1 -0
  92. package/dist/tools/reminders.js +323 -0
  93. package/dist/tools/reminders.js.map +1 -0
  94. package/dist/tools/search.d.ts +58 -0
  95. package/dist/tools/search.d.ts.map +1 -0
  96. package/dist/tools/search.js +373 -0
  97. package/dist/tools/search.js.map +1 -0
  98. package/dist/tools/spaces.d.ts +484 -0
  99. package/dist/tools/spaces.d.ts.map +1 -0
  100. package/dist/tools/spaces.js +870 -0
  101. package/dist/tools/spaces.js.map +1 -0
  102. package/dist/tools/tasks.d.ts +313 -0
  103. package/dist/tools/tasks.d.ts.map +1 -0
  104. package/dist/tools/tasks.js +690 -0
  105. package/dist/tools/tasks.js.map +1 -0
  106. package/dist/tools/themes.d.ts +91 -0
  107. package/dist/tools/themes.d.ts.map +1 -0
  108. package/dist/tools/themes.js +294 -0
  109. package/dist/tools/themes.js.map +1 -0
  110. package/dist/tools/ui.d.ts +89 -0
  111. package/dist/tools/ui.d.ts.map +1 -0
  112. package/dist/tools/ui.js +137 -0
  113. package/dist/tools/ui.js.map +1 -0
  114. package/dist/utils/applescript.d.ts +5 -0
  115. package/dist/utils/applescript.d.ts.map +1 -0
  116. package/dist/utils/applescript.js +27 -0
  117. package/dist/utils/applescript.js.map +1 -0
  118. package/dist/utils/confirmation-tokens.d.ts +19 -0
  119. package/dist/utils/confirmation-tokens.d.ts.map +1 -0
  120. package/dist/utils/confirmation-tokens.js +58 -0
  121. package/dist/utils/confirmation-tokens.js.map +1 -0
  122. package/dist/utils/date-filters.d.ts +15 -0
  123. package/dist/utils/date-filters.d.ts.map +1 -0
  124. package/dist/utils/date-filters.js +129 -0
  125. package/dist/utils/date-filters.js.map +1 -0
  126. package/dist/utils/date-utils.d.ts +113 -0
  127. package/dist/utils/date-utils.d.ts.map +1 -0
  128. package/dist/utils/date-utils.js +341 -0
  129. package/dist/utils/date-utils.js.map +1 -0
  130. package/dist/utils/folder-matcher.d.ts +14 -0
  131. package/dist/utils/folder-matcher.d.ts.map +1 -0
  132. package/dist/utils/folder-matcher.js +191 -0
  133. package/dist/utils/folder-matcher.js.map +1 -0
  134. package/dist/utils/version.d.ts +10 -0
  135. package/dist/utils/version.d.ts.map +1 -0
  136. package/dist/utils/version.js +88 -0
  137. package/dist/utils/version.js.map +1 -0
  138. package/docs/plugin-api/Calendar.md +448 -0
  139. package/docs/plugin-api/CalendarItem.md +198 -0
  140. package/docs/plugin-api/Clipboard.md +101 -0
  141. package/docs/plugin-api/CommandBar.md +251 -0
  142. package/docs/plugin-api/DataStore.md +700 -0
  143. package/docs/plugin-api/Editor.md +982 -0
  144. package/docs/plugin-api/HTMLView.md +337 -0
  145. package/docs/plugin-api/NoteObject.md +588 -0
  146. package/docs/plugin-api/NotePlan.md +398 -0
  147. package/docs/plugin-api/ParagraphObject.md +242 -0
  148. package/docs/plugin-api/RangeObject.md +56 -0
  149. package/docs/plugin-api/getting-started.md +545 -0
  150. package/docs/plugin-api/plugin-api-condensed.md +526 -0
  151. package/docs/plugin-api/plugin.json +26 -0
  152. package/docs/plugin-api/script.js +542 -0
  153. package/package.json +60 -0
  154. package/scripts/calendar-helper +0 -0
  155. package/scripts/reminders-helper +0 -0
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ export declare const searchSchema: z.ZodObject<{
3
+ query: z.ZodString;
4
+ searchField: z.ZodDefault<z.ZodOptional<z.ZodEnum<["content", "title", "filename", "title_or_filename"]>>>;
5
+ queryMode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["phrase", "smart", "any", "all"]>>>;
6
+ minTokenMatches: z.ZodOptional<z.ZodNumber>;
7
+ types: z.ZodOptional<z.ZodArray<z.ZodEnum<["calendar", "note", "trash"]>, "many">>;
8
+ folders: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
9
+ space: z.ZodOptional<z.ZodString>;
10
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
11
+ fuzzy: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
12
+ caseSensitive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
13
+ contextLines: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
14
+ propertyFilters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
15
+ propertyCaseSensitive: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
16
+ modifiedAfter: z.ZodOptional<z.ZodString>;
17
+ modifiedBefore: z.ZodOptional<z.ZodString>;
18
+ createdAfter: z.ZodOptional<z.ZodString>;
19
+ createdBefore: z.ZodOptional<z.ZodString>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ limit: number;
22
+ caseSensitive: boolean;
23
+ contextLines: number;
24
+ fuzzy: boolean;
25
+ query: string;
26
+ searchField: "title" | "content" | "filename" | "title_or_filename";
27
+ queryMode: "phrase" | "smart" | "any" | "all";
28
+ propertyCaseSensitive: boolean;
29
+ space?: string | undefined;
30
+ types?: ("calendar" | "note" | "trash")[] | undefined;
31
+ minTokenMatches?: number | undefined;
32
+ folders?: string[] | undefined;
33
+ propertyFilters?: Record<string, string> | undefined;
34
+ modifiedAfter?: string | undefined;
35
+ modifiedBefore?: string | undefined;
36
+ createdAfter?: string | undefined;
37
+ createdBefore?: string | undefined;
38
+ }, {
39
+ query: string;
40
+ space?: string | undefined;
41
+ types?: ("calendar" | "note" | "trash")[] | undefined;
42
+ limit?: number | undefined;
43
+ caseSensitive?: boolean | undefined;
44
+ contextLines?: number | undefined;
45
+ fuzzy?: boolean | undefined;
46
+ searchField?: "title" | "content" | "filename" | "title_or_filename" | undefined;
47
+ queryMode?: "phrase" | "smart" | "any" | "all" | undefined;
48
+ minTokenMatches?: number | undefined;
49
+ folders?: string[] | undefined;
50
+ propertyFilters?: Record<string, string> | undefined;
51
+ propertyCaseSensitive?: boolean | undefined;
52
+ modifiedAfter?: string | undefined;
53
+ modifiedBefore?: string | undefined;
54
+ createdAfter?: string | undefined;
55
+ createdBefore?: string | undefined;
56
+ }>;
57
+ export declare function searchNotes(params: z.infer<typeof searchSchema>): Promise<Record<string, unknown>>;
58
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2HxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8EvB,CAAC;AAEH,wBAAsB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,oCA6OrE"}
@@ -0,0 +1,373 @@
1
+ // Search operations
2
+ import { z } from 'zod';
3
+ import * as store from '../noteplan/unified-store.js';
4
+ function toBoundedInt(value, defaultValue, min, max) {
5
+ const numeric = typeof value === 'number' ? value : Number(value);
6
+ if (!Number.isFinite(numeric))
7
+ return defaultValue;
8
+ return Math.min(max, Math.max(min, Math.floor(numeric)));
9
+ }
10
+ function isDebugTimingsEnabled(value) {
11
+ if (typeof value === 'boolean')
12
+ return value;
13
+ if (typeof value === 'string') {
14
+ const normalized = value.trim().toLowerCase();
15
+ return normalized === 'true' || normalized === '1';
16
+ }
17
+ return false;
18
+ }
19
+ function normalizeFolderFilterInput(folder) {
20
+ let normalized = folder.trim().replace(/\\/g, '/');
21
+ normalized = normalized.replace(/^\/+|\/+$/g, '');
22
+ if (!normalized || normalized === 'Notes') {
23
+ return '';
24
+ }
25
+ if (normalized.startsWith('Notes/')) {
26
+ normalized = normalized.slice('Notes/'.length);
27
+ }
28
+ return normalized;
29
+ }
30
+ function tokenizeSearchTerms(query) {
31
+ const stopWords = new Set([
32
+ 'a',
33
+ 'an',
34
+ 'and',
35
+ 'the',
36
+ 'or',
37
+ 'for',
38
+ 'to',
39
+ 'of',
40
+ 'in',
41
+ 'on',
42
+ 'with',
43
+ 'at',
44
+ 'by',
45
+ 'from',
46
+ 'is',
47
+ 'are',
48
+ ]);
49
+ const tokens = query
50
+ .split(/\s+/)
51
+ .map((token) => token.trim())
52
+ .map((token) => token.replace(/^[^a-zA-Z0-9]+|[^a-zA-Z0-9._-]+$/g, ''))
53
+ .filter((token) => token.length > 0);
54
+ const unique = new Set();
55
+ for (const token of tokens) {
56
+ const lower = token.toLowerCase();
57
+ if (stopWords.has(lower))
58
+ continue;
59
+ if (lower.length === 1 && !/^\d$/.test(lower))
60
+ continue;
61
+ unique.add(lower);
62
+ }
63
+ return Array.from(unique);
64
+ }
65
+ function countTokenHitsInText(text, tokens) {
66
+ const lowerText = text.toLowerCase();
67
+ return tokens.reduce((count, token) => (lowerText.includes(token) ? count + 1 : count), 0);
68
+ }
69
+ function buildTokenAwareQueryMode(query, searchField, queryMode, requestedMinTokenMatches) {
70
+ if (searchField !== 'content' || queryMode === 'phrase') {
71
+ return {
72
+ effectiveQuery: query,
73
+ tokens: [],
74
+ minTokenMatches: 0,
75
+ active: false,
76
+ };
77
+ }
78
+ const tokens = tokenizeSearchTerms(query);
79
+ if (tokens.length < 2 || query.includes('|')) {
80
+ return {
81
+ effectiveQuery: query,
82
+ tokens,
83
+ minTokenMatches: 0,
84
+ active: false,
85
+ };
86
+ }
87
+ const defaultMinMatches = queryMode === 'any'
88
+ ? 1
89
+ : queryMode === 'all'
90
+ ? tokens.length
91
+ : Math.max(2, Math.ceil(tokens.length * 0.6));
92
+ const minTokenMatches = Math.min(tokens.length, Math.max(1, toBoundedInt(requestedMinTokenMatches, defaultMinMatches, 1, 50)));
93
+ return {
94
+ effectiveQuery: tokens.join('|'),
95
+ tokens,
96
+ minTokenMatches,
97
+ active: true,
98
+ };
99
+ }
100
+ export const searchSchema = z.object({
101
+ query: z.string().describe('Search query. Supports OR patterns like "meeting|standup"'),
102
+ searchField: z
103
+ .enum(['content', 'title', 'filename', 'title_or_filename'])
104
+ .optional()
105
+ .default('content')
106
+ .describe('Search scope: content (full-text), title, filename, or title_or_filename. Use title/title_or_filename for faster note discovery by version/name.'),
107
+ queryMode: z
108
+ .enum(['phrase', 'smart', 'any', 'all'])
109
+ .optional()
110
+ .default('smart')
111
+ .describe('How multi-word content queries are interpreted: phrase (exact phrase), smart (token OR with relevance threshold), any (any token), all (all tokens)'),
112
+ minTokenMatches: z
113
+ .number()
114
+ .min(1)
115
+ .max(20)
116
+ .optional()
117
+ .describe('When queryMode is smart/any/all, minimum token matches required per note (auto by default)'),
118
+ types: z
119
+ .array(z.enum(['calendar', 'note', 'trash']))
120
+ .optional()
121
+ .describe('Filter by note types'),
122
+ folders: z
123
+ .array(z.string())
124
+ .optional()
125
+ .describe('Filter by folders (canonical paths like "20 - Areas"; "Notes/20 - Areas" is accepted). If multiple folders are provided, the first is used for full-text scope.'),
126
+ space: z.string().optional().describe('Space name or ID to search in'),
127
+ limit: z.number().min(1).max(200).optional().default(20).describe('Maximum number of results'),
128
+ // Enhanced options
129
+ fuzzy: z
130
+ .boolean()
131
+ .optional()
132
+ .default(false)
133
+ .describe('Enable fuzzy/typo-tolerant matching'),
134
+ caseSensitive: z
135
+ .boolean()
136
+ .optional()
137
+ .default(false)
138
+ .describe('Case-sensitive search (default: case-insensitive)'),
139
+ contextLines: z
140
+ .number()
141
+ .min(0)
142
+ .max(5)
143
+ .optional()
144
+ .default(0)
145
+ .describe('Lines of context around matches'),
146
+ propertyFilters: z
147
+ .record(z.string())
148
+ .optional()
149
+ .describe('Exact frontmatter property filters (all must match), e.g. {"category":"marketing","status":"Doing"}'),
150
+ propertyCaseSensitive: z
151
+ .boolean()
152
+ .optional()
153
+ .default(false)
154
+ .describe('Case-sensitive frontmatter property matching (default: false)'),
155
+ // Date filtering
156
+ modifiedAfter: z
157
+ .string()
158
+ .optional()
159
+ .describe('Filter notes modified after date (ISO date or "today", "yesterday", "this week", "this month")'),
160
+ modifiedBefore: z.string().optional().describe('Filter notes modified before date'),
161
+ createdAfter: z
162
+ .string()
163
+ .optional()
164
+ .describe('Filter notes created after date (ISO date or "today", "yesterday", "this week", "this month")'),
165
+ createdBefore: z.string().optional().describe('Filter notes created before date'),
166
+ });
167
+ export async function searchNotes(params) {
168
+ const query = typeof params?.query === 'string' ? params.query.trim() : '';
169
+ if (!query) {
170
+ return {
171
+ success: false,
172
+ error: 'query is required',
173
+ };
174
+ }
175
+ const normalizedFolders = (params.folders ?? [])
176
+ .map((folder) => normalizeFolderFilterInput(folder))
177
+ .filter((folder) => folder.length > 0);
178
+ const searchField = (params.searchField ?? 'content');
179
+ const queryMode = (params.queryMode ?? 'smart');
180
+ const tokenPlan = buildTokenAwareQueryMode(query, searchField, queryMode, params.minTokenMatches);
181
+ const isWildcardQuery = query === '*';
182
+ if (isWildcardQuery) {
183
+ const allNotes = normalizedFolders.length > 0
184
+ ? normalizedFolders.flatMap((folder) => store.listNotes({
185
+ folder,
186
+ space: params.space,
187
+ }))
188
+ : store.listNotes({ space: params.space });
189
+ const uniqueByKey = new Map();
190
+ for (const note of allNotes) {
191
+ const key = note.id?.trim().length > 0 ? `id:${note.id}` : `file:${note.filename}`;
192
+ if (!uniqueByKey.has(key)) {
193
+ uniqueByKey.set(key, note);
194
+ }
195
+ }
196
+ const typed = (params.types?.length ?? 0) > 0
197
+ ? Array.from(uniqueByKey.values()).filter((note) => params.types.includes(note.type))
198
+ : Array.from(uniqueByKey.values());
199
+ const limit = toBoundedInt(params.limit, 20, 1, 200);
200
+ const page = typed.slice(0, limit);
201
+ const response = {
202
+ success: true,
203
+ query,
204
+ searchField,
205
+ queryMode,
206
+ count: page.length,
207
+ propertyFilters: params.propertyFilters,
208
+ propertyCaseSensitive: params.propertyCaseSensitive ?? false,
209
+ partialResults: false,
210
+ searchBackend: 'browse',
211
+ warnings: [
212
+ 'Wildcard query "*" runs in browse mode (metadata listing) and does not perform text matching.',
213
+ ],
214
+ results: page.map((note) => ({
215
+ note: {
216
+ id: note.id,
217
+ title: note.title,
218
+ filename: note.filename,
219
+ type: note.type,
220
+ source: note.source,
221
+ folder: note.folder,
222
+ spaceId: note.spaceId,
223
+ modifiedAt: note.modifiedAt?.toISOString(),
224
+ createdAt: note.createdAt?.toISOString(),
225
+ },
226
+ score: 0,
227
+ matchCount: 0,
228
+ preview: [],
229
+ })),
230
+ performanceHints: [
231
+ 'Use noteplan_list_folders to discover folder trees and subfolders.',
232
+ 'Use a text query instead of "*" to run full-text search.',
233
+ ],
234
+ };
235
+ return response;
236
+ }
237
+ const limit = toBoundedInt(params.limit, 20, 1, 200);
238
+ const includeStageTimings = isDebugTimingsEnabled(params.debugTimings);
239
+ const stageTimings = {};
240
+ const searchStart = Date.now();
241
+ const searchExecution = await store.searchNotes(tokenPlan.effectiveQuery, {
242
+ searchField,
243
+ types: params.types,
244
+ folder: normalizedFolders[0], // Single-folder scope in search backend
245
+ space: params.space,
246
+ limit,
247
+ fuzzy: params.fuzzy,
248
+ caseSensitive: params.caseSensitive,
249
+ contextLines: params.contextLines,
250
+ propertyFilters: params.propertyFilters,
251
+ propertyCaseSensitive: params.propertyCaseSensitive,
252
+ modifiedAfter: params.modifiedAfter,
253
+ modifiedBefore: params.modifiedBefore,
254
+ createdAfter: params.createdAfter,
255
+ createdBefore: params.createdBefore,
256
+ });
257
+ let results = searchExecution.results;
258
+ let appliedMinTokenMatches = tokenPlan.active ? tokenPlan.minTokenMatches : undefined;
259
+ if (tokenPlan.active) {
260
+ const rankByTokens = (minTokenMatches) => results
261
+ .map((result) => {
262
+ const searchable = `${result.note.title}\n${result.note.filename}\n${result.note.content}`;
263
+ const tokenHits = countTokenHitsInText(searchable, tokenPlan.tokens);
264
+ if (tokenHits < minTokenMatches)
265
+ return null;
266
+ return {
267
+ ...result,
268
+ score: result.score + tokenHits * 20,
269
+ tokenHits,
270
+ };
271
+ })
272
+ .filter((entry) => entry !== null)
273
+ .sort((a, b) => {
274
+ if (b.tokenHits !== a.tokenHits)
275
+ return b.tokenHits - a.tokenHits;
276
+ return b.score - a.score;
277
+ })
278
+ .slice(0, limit)
279
+ .map(({ tokenHits: _tokenHits, ...result }) => result);
280
+ const ranked = rankByTokens(tokenPlan.minTokenMatches);
281
+ if (ranked.length > 0 || queryMode !== 'smart' || tokenPlan.minTokenMatches <= 1) {
282
+ results = ranked;
283
+ }
284
+ else {
285
+ // Safety fallback for smart mode: if strict threshold returns zero, relax to one-token match.
286
+ appliedMinTokenMatches = 1;
287
+ results = rankByTokens(1);
288
+ }
289
+ }
290
+ const searchStoreMs = Date.now() - searchStart;
291
+ if (includeStageTimings) {
292
+ stageTimings.searchStoreMs = searchStoreMs;
293
+ }
294
+ const mapStart = Date.now();
295
+ const mappedResults = results.map((result) => ({
296
+ note: {
297
+ id: result.note.id, // Important: Use this ID with noteplan_get_note for space notes
298
+ title: result.note.title,
299
+ filename: result.note.filename,
300
+ type: result.note.type,
301
+ source: result.note.source,
302
+ folder: result.note.folder,
303
+ spaceId: result.note.spaceId,
304
+ // Include date metadata in output
305
+ modifiedAt: result.note.modifiedAt?.toISOString(),
306
+ createdAt: result.note.createdAt?.toISOString(),
307
+ },
308
+ score: result.score,
309
+ matchCount: result.matches.length,
310
+ preview: result.matches.slice(0, 3).map((m) => ({
311
+ line: m.lineNumber,
312
+ content: m.lineContent.substring(0, 100) + (m.lineContent.length > 100 ? '...' : ''),
313
+ })),
314
+ }));
315
+ const mapResultMs = Date.now() - mapStart;
316
+ if (includeStageTimings) {
317
+ stageTimings.mapResultMs = mapResultMs;
318
+ }
319
+ const response = {
320
+ success: true,
321
+ query,
322
+ searchField,
323
+ queryMode,
324
+ effectiveQuery: tokenPlan.active ? tokenPlan.effectiveQuery : query,
325
+ tokenTerms: tokenPlan.tokens,
326
+ minTokenMatches: appliedMinTokenMatches,
327
+ count: results.length,
328
+ propertyFilters: params.propertyFilters,
329
+ propertyCaseSensitive: params.propertyCaseSensitive ?? false,
330
+ partialResults: searchExecution.partialResults,
331
+ searchBackend: searchExecution.backend,
332
+ warnings: searchExecution.warnings,
333
+ results: mappedResults,
334
+ };
335
+ if ((params.folders?.length ?? 0) > 1) {
336
+ const existingWarnings = Array.isArray(response.warnings)
337
+ ? response.warnings
338
+ : [];
339
+ response.warnings = [
340
+ ...existingWarnings,
341
+ 'Multiple folders were provided; only the first folder is currently used for full-text search scope.',
342
+ ];
343
+ }
344
+ const performanceHints = [];
345
+ if (searchStoreMs > 2000) {
346
+ if (!params.space) {
347
+ performanceHints.push('Set space to constrain search to one workspace.');
348
+ }
349
+ if (!params.folders || params.folders.length === 0) {
350
+ performanceHints.push('Set folders to narrow full-text search scope.');
351
+ }
352
+ if (params.fuzzy) {
353
+ performanceHints.push('Disable fuzzy matching when exact search is acceptable.');
354
+ }
355
+ if ((params.contextLines ?? 0) > 0) {
356
+ performanceHints.push('Set contextLines=0 for faster broad searches.');
357
+ }
358
+ }
359
+ if (results.length === limit) {
360
+ performanceHints.push('Increase precision or add filters to reduce ties at the result limit.');
361
+ }
362
+ if (tokenPlan.active) {
363
+ performanceHints.push(`queryMode=${queryMode} used token-aware matching (${appliedMinTokenMatches}/${tokenPlan.tokens.length} token threshold).`);
364
+ }
365
+ if (performanceHints.length > 0) {
366
+ response.performanceHints = performanceHints;
367
+ }
368
+ if (includeStageTimings) {
369
+ response.stageTimings = stageTimings;
370
+ }
371
+ return response;
372
+ }
373
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}