@noteplanco/noteplan-mcp 1.1.5 → 1.1.7

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 (75) hide show
  1. package/dist/noteplan/file-writer.d.ts.map +1 -1
  2. package/dist/noteplan/file-writer.js +73 -16
  3. package/dist/noteplan/file-writer.js.map +1 -1
  4. package/dist/noteplan/file-writer.test.d.ts +2 -0
  5. package/dist/noteplan/file-writer.test.d.ts.map +1 -0
  6. package/dist/noteplan/file-writer.test.js +892 -0
  7. package/dist/noteplan/file-writer.test.js.map +1 -0
  8. package/dist/noteplan/filter-store.d.ts.map +1 -1
  9. package/dist/noteplan/filter-store.js +13 -1
  10. package/dist/noteplan/filter-store.js.map +1 -1
  11. package/dist/noteplan/frontmatter-parser.d.ts +10 -1
  12. package/dist/noteplan/frontmatter-parser.d.ts.map +1 -1
  13. package/dist/noteplan/frontmatter-parser.js +69 -18
  14. package/dist/noteplan/frontmatter-parser.js.map +1 -1
  15. package/dist/noteplan/frontmatter-parser.test.d.ts +2 -0
  16. package/dist/noteplan/frontmatter-parser.test.d.ts.map +1 -0
  17. package/dist/noteplan/frontmatter-parser.test.js +595 -0
  18. package/dist/noteplan/frontmatter-parser.test.js.map +1 -0
  19. package/dist/noteplan/markdown-parser.d.ts +6 -1
  20. package/dist/noteplan/markdown-parser.d.ts.map +1 -1
  21. package/dist/noteplan/markdown-parser.js +21 -44
  22. package/dist/noteplan/markdown-parser.js.map +1 -1
  23. package/dist/noteplan/markdown-parser.test.d.ts +2 -0
  24. package/dist/noteplan/markdown-parser.test.d.ts.map +1 -0
  25. package/dist/noteplan/markdown-parser.test.js +653 -0
  26. package/dist/noteplan/markdown-parser.test.js.map +1 -0
  27. package/dist/server.d.ts.map +1 -1
  28. package/dist/server.js +405 -205
  29. package/dist/server.js.map +1 -1
  30. package/dist/tools/attachments.d.ts +151 -0
  31. package/dist/tools/attachments.d.ts.map +1 -0
  32. package/dist/tools/attachments.js +421 -0
  33. package/dist/tools/attachments.js.map +1 -0
  34. package/dist/tools/attachments.test.d.ts +2 -0
  35. package/dist/tools/attachments.test.d.ts.map +1 -0
  36. package/dist/tools/attachments.test.js +561 -0
  37. package/dist/tools/attachments.test.js.map +1 -0
  38. package/dist/tools/calendar.d.ts +5 -5
  39. package/dist/tools/notes.d.ts +67 -26
  40. package/dist/tools/notes.d.ts.map +1 -1
  41. package/dist/tools/notes.js +124 -33
  42. package/dist/tools/notes.js.map +1 -1
  43. package/dist/tools/notes.test.d.ts +2 -0
  44. package/dist/tools/notes.test.d.ts.map +1 -0
  45. package/dist/tools/notes.test.js +598 -0
  46. package/dist/tools/notes.test.js.map +1 -0
  47. package/dist/tools/reminders.d.ts +4 -4
  48. package/dist/tools/tasks.d.ts +10 -10
  49. package/dist/tools/tasks.d.ts.map +1 -1
  50. package/dist/tools/tasks.js +14 -27
  51. package/dist/tools/tasks.js.map +1 -1
  52. package/dist/tools/templates.d.ts +69 -0
  53. package/dist/tools/templates.d.ts.map +1 -0
  54. package/dist/tools/templates.js +145 -0
  55. package/dist/tools/templates.js.map +1 -0
  56. package/dist/tools/templates.test.d.ts +2 -0
  57. package/dist/tools/templates.test.d.ts.map +1 -0
  58. package/dist/tools/templates.test.js +48 -0
  59. package/dist/tools/templates.test.js.map +1 -0
  60. package/dist/tools/ui.d.ts +2 -0
  61. package/dist/tools/ui.d.ts.map +1 -1
  62. package/dist/tools/ui.js +24 -0
  63. package/dist/tools/ui.js.map +1 -1
  64. package/dist/utils/applescript.d.ts.map +1 -1
  65. package/dist/utils/applescript.js +21 -0
  66. package/dist/utils/applescript.js.map +1 -1
  67. package/dist/utils/confirmation-tokens.test.d.ts +2 -0
  68. package/dist/utils/confirmation-tokens.test.d.ts.map +1 -0
  69. package/dist/utils/confirmation-tokens.test.js +159 -0
  70. package/dist/utils/confirmation-tokens.test.js.map +1 -0
  71. package/dist/utils/version.d.ts +2 -0
  72. package/dist/utils/version.d.ts.map +1 -1
  73. package/dist/utils/version.js +4 -0
  74. package/dist/utils/version.js.map +1 -1
  75. package/package.json +4 -2
@@ -0,0 +1,598 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ // ---------------------------------------------------------------------------
3
+ // Copies of private helper functions from notes.ts
4
+ // These are verbatim copies so we can unit-test them without exporting.
5
+ // ---------------------------------------------------------------------------
6
+ function toBoundedInt(value, defaultValue, min, max) {
7
+ const numeric = typeof value === 'number' ? value : Number(value);
8
+ if (!Number.isFinite(numeric))
9
+ return defaultValue;
10
+ return Math.min(max, Math.max(min, Math.floor(numeric)));
11
+ }
12
+ function isDebugTimingsEnabled(value) {
13
+ if (typeof value === 'boolean')
14
+ return value;
15
+ if (typeof value === 'string') {
16
+ const normalized = value.trim().toLowerCase();
17
+ return normalized === 'true' || normalized === '1';
18
+ }
19
+ return false;
20
+ }
21
+ function toOptionalBoolean(value) {
22
+ if (value === undefined || value === null || value === '')
23
+ return undefined;
24
+ if (typeof value === 'boolean')
25
+ return value;
26
+ if (typeof value === 'string') {
27
+ const normalized = value.trim().toLowerCase();
28
+ if (normalized === 'true')
29
+ return true;
30
+ if (normalized === 'false')
31
+ return false;
32
+ }
33
+ return undefined;
34
+ }
35
+ function normalizeIndentationStyle(value) {
36
+ if (value === 'preserve')
37
+ return 'preserve';
38
+ return 'tabs';
39
+ }
40
+ function retabListIndentation(content) {
41
+ const lines = content.split('\n');
42
+ let linesRetabbed = 0;
43
+ const normalized = lines.map((line) => {
44
+ const match = line.match(/^( +)(?=(?:[*+-]|\d+[.)])(?:\s|\t|\[))/);
45
+ if (!match)
46
+ return line;
47
+ const spaceCount = match[1].length;
48
+ if (spaceCount < 2)
49
+ return line;
50
+ const tabs = '\t'.repeat(Math.floor(spaceCount / 2));
51
+ linesRetabbed += 1;
52
+ return `${tabs}${line.slice(spaceCount)}`;
53
+ });
54
+ return {
55
+ content: normalized.join('\n'),
56
+ linesRetabbed,
57
+ };
58
+ }
59
+ function extractAttachmentReferences(text) {
60
+ const matches = text.matchAll(/!\[[^\]]*\]\(([^)]+)\)/g);
61
+ const refs = new Set();
62
+ for (const match of matches) {
63
+ const ref = (match[1] || '').trim();
64
+ if (!ref)
65
+ continue;
66
+ refs.add(ref);
67
+ }
68
+ return Array.from(refs);
69
+ }
70
+ function getRemovedAttachmentReferences(beforeText, afterText) {
71
+ const before = new Set(extractAttachmentReferences(beforeText));
72
+ const after = new Set(extractAttachmentReferences(afterText));
73
+ return Array.from(before).filter((ref) => !after.has(ref));
74
+ }
75
+ function buildLineWindow(allLines, options) {
76
+ const totalLineCount = allLines.length;
77
+ const requestedStartLine = toBoundedInt(options.startLine, 1, 1, Math.max(1, totalLineCount));
78
+ const requestedEndLine = toBoundedInt(options.endLine, totalLineCount, requestedStartLine, Math.max(requestedStartLine, totalLineCount));
79
+ const rangeStartIndex = requestedStartLine - 1;
80
+ const rangeEndIndexExclusive = requestedEndLine;
81
+ const rangeLines = allLines.slice(rangeStartIndex, rangeEndIndexExclusive);
82
+ const offset = toBoundedInt(options.cursor ?? options.offset, 0, 0, Number.MAX_SAFE_INTEGER);
83
+ const limit = toBoundedInt(options.limit, options.defaultLimit, 1, options.maxLimit);
84
+ const page = rangeLines.slice(offset, offset + limit);
85
+ const hasMore = offset + page.length < rangeLines.length;
86
+ const nextCursor = hasMore ? String(offset + page.length) : null;
87
+ return {
88
+ lineCount: totalLineCount,
89
+ rangeStartLine: requestedStartLine,
90
+ rangeEndLine: requestedEndLine,
91
+ rangeLineCount: rangeLines.length,
92
+ returnedLineCount: page.length,
93
+ offset,
94
+ limit,
95
+ hasMore,
96
+ nextCursor,
97
+ content: page.join('\n'),
98
+ lines: page.map((content, index) => ({
99
+ line: requestedStartLine + offset + index,
100
+ lineIndex: rangeStartIndex + offset + index,
101
+ content,
102
+ })),
103
+ };
104
+ }
105
+ function normalizeDateToken(value) {
106
+ if (!value)
107
+ return null;
108
+ const digits = value.replace(/\D/g, '');
109
+ return digits.length === 8 ? digits : null;
110
+ }
111
+ function noteMatchScore(note, query, queryDateToken) {
112
+ const queryLower = query.toLowerCase();
113
+ const idLower = (note.id || '').toLowerCase();
114
+ const titleLower = (note.title || '').toLowerCase();
115
+ const filenameLower = (note.filename || '').toLowerCase();
116
+ const path_basename = filenameLower.split('/').pop() || '';
117
+ const path_extname_idx = path_basename.lastIndexOf('.');
118
+ const basenameLower = path_extname_idx > 0 ? path_basename.slice(0, path_extname_idx) : path_basename;
119
+ const noteDateToken = normalizeDateToken(note.date);
120
+ if (idLower && idLower === queryLower)
121
+ return 1.0;
122
+ if (filenameLower === queryLower)
123
+ return 0.99;
124
+ if (basenameLower === queryLower)
125
+ return 0.97;
126
+ if (titleLower === queryLower)
127
+ return 0.96;
128
+ if (queryDateToken && noteDateToken && queryDateToken === noteDateToken)
129
+ return 0.95;
130
+ if (titleLower.startsWith(queryLower))
131
+ return 0.9;
132
+ if (basenameLower.startsWith(queryLower))
133
+ return 0.88;
134
+ if (filenameLower.includes(`/${queryLower}`) || filenameLower.includes(queryLower))
135
+ return 0.83;
136
+ if (`${titleLower} ${filenameLower}`.includes(queryLower))
137
+ return 0.76;
138
+ return 0;
139
+ }
140
+ function findParagraphBounds(lines, lineIndex) {
141
+ let startIndex = lineIndex;
142
+ while (startIndex > 0 && lines[startIndex - 1].trim() !== '') {
143
+ startIndex -= 1;
144
+ }
145
+ let endIndex = lineIndex;
146
+ while (endIndex < lines.length - 1 && lines[endIndex + 1].trim() !== '') {
147
+ endIndex += 1;
148
+ }
149
+ return { startIndex, endIndex };
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // Tests
153
+ // ---------------------------------------------------------------------------
154
+ describe('toBoundedInt', () => {
155
+ it('returns default for NaN', () => {
156
+ expect(toBoundedInt(NaN, 10, 0, 100)).toBe(10);
157
+ });
158
+ it('returns default for undefined', () => {
159
+ expect(toBoundedInt(undefined, 10, 0, 100)).toBe(10);
160
+ });
161
+ it('returns clamped value for null (Number(null) === 0)', () => {
162
+ // Number(null) === 0 which is finite, so it gets clamped to [min, max]
163
+ expect(toBoundedInt(null, 10, 0, 100)).toBe(0);
164
+ expect(toBoundedInt(null, 10, 5, 100)).toBe(5);
165
+ });
166
+ it('returns default for Infinity', () => {
167
+ expect(toBoundedInt(Infinity, 10, 0, 100)).toBe(10);
168
+ });
169
+ it('returns default for -Infinity', () => {
170
+ expect(toBoundedInt(-Infinity, 10, 0, 100)).toBe(10);
171
+ });
172
+ it('returns default for non-numeric strings', () => {
173
+ expect(toBoundedInt('hello', 10, 0, 100)).toBe(10);
174
+ });
175
+ it('returns clamped value for empty string (Number("") === 0)', () => {
176
+ // Number('') === 0 which is finite, so it gets clamped to [min, max]
177
+ expect(toBoundedInt('', 10, 0, 100)).toBe(0);
178
+ expect(toBoundedInt('', 10, 5, 100)).toBe(5);
179
+ });
180
+ it('floors decimal numbers', () => {
181
+ expect(toBoundedInt(3.7, 10, 0, 100)).toBe(3);
182
+ expect(toBoundedInt(3.2, 10, 0, 100)).toBe(3);
183
+ expect(toBoundedInt(9.999, 10, 0, 100)).toBe(9);
184
+ });
185
+ it('clamps below min', () => {
186
+ expect(toBoundedInt(-5, 10, 0, 100)).toBe(0);
187
+ expect(toBoundedInt(3, 10, 5, 100)).toBe(5);
188
+ });
189
+ it('clamps above max', () => {
190
+ expect(toBoundedInt(200, 10, 0, 100)).toBe(100);
191
+ expect(toBoundedInt(50, 10, 0, 20)).toBe(20);
192
+ });
193
+ it('accepts numeric strings', () => {
194
+ expect(toBoundedInt('42', 10, 0, 100)).toBe(42);
195
+ expect(toBoundedInt('7', 10, 0, 100)).toBe(7);
196
+ });
197
+ it('accepts actual numbers within range', () => {
198
+ expect(toBoundedInt(42, 10, 0, 100)).toBe(42);
199
+ expect(toBoundedInt(0, 10, 0, 100)).toBe(0);
200
+ expect(toBoundedInt(100, 10, 0, 100)).toBe(100);
201
+ });
202
+ });
203
+ describe('isDebugTimingsEnabled', () => {
204
+ it('returns true for boolean true', () => {
205
+ expect(isDebugTimingsEnabled(true)).toBe(true);
206
+ });
207
+ it('returns false for boolean false', () => {
208
+ expect(isDebugTimingsEnabled(false)).toBe(false);
209
+ });
210
+ it('returns true for string "true" (case-insensitive)', () => {
211
+ expect(isDebugTimingsEnabled('true')).toBe(true);
212
+ expect(isDebugTimingsEnabled('TRUE')).toBe(true);
213
+ expect(isDebugTimingsEnabled('True')).toBe(true);
214
+ expect(isDebugTimingsEnabled(' true ')).toBe(true);
215
+ });
216
+ it('returns true for string "1"', () => {
217
+ expect(isDebugTimingsEnabled('1')).toBe(true);
218
+ });
219
+ it('returns false for string "false", "0", and random strings', () => {
220
+ expect(isDebugTimingsEnabled('false')).toBe(false);
221
+ expect(isDebugTimingsEnabled('0')).toBe(false);
222
+ expect(isDebugTimingsEnabled('random')).toBe(false);
223
+ expect(isDebugTimingsEnabled('yes')).toBe(false);
224
+ });
225
+ it('returns false for undefined, null, and number', () => {
226
+ expect(isDebugTimingsEnabled(undefined)).toBe(false);
227
+ expect(isDebugTimingsEnabled(null)).toBe(false);
228
+ expect(isDebugTimingsEnabled(1)).toBe(false);
229
+ expect(isDebugTimingsEnabled(0)).toBe(false);
230
+ });
231
+ });
232
+ describe('toOptionalBoolean', () => {
233
+ it('returns undefined for undefined', () => {
234
+ expect(toOptionalBoolean(undefined)).toBeUndefined();
235
+ });
236
+ it('returns undefined for null', () => {
237
+ expect(toOptionalBoolean(null)).toBeUndefined();
238
+ });
239
+ it('returns undefined for empty string', () => {
240
+ expect(toOptionalBoolean('')).toBeUndefined();
241
+ });
242
+ it('returns true for boolean true', () => {
243
+ expect(toOptionalBoolean(true)).toBe(true);
244
+ });
245
+ it('returns false for boolean false', () => {
246
+ expect(toOptionalBoolean(false)).toBe(false);
247
+ });
248
+ it('returns true for string "true" (case-insensitive, trimmed)', () => {
249
+ expect(toOptionalBoolean('true')).toBe(true);
250
+ expect(toOptionalBoolean('TRUE')).toBe(true);
251
+ expect(toOptionalBoolean('True')).toBe(true);
252
+ expect(toOptionalBoolean(' true ')).toBe(true);
253
+ });
254
+ it('returns false for string "false" (case-insensitive, trimmed)', () => {
255
+ expect(toOptionalBoolean('false')).toBe(false);
256
+ expect(toOptionalBoolean('FALSE')).toBe(false);
257
+ expect(toOptionalBoolean('False')).toBe(false);
258
+ expect(toOptionalBoolean(' false ')).toBe(false);
259
+ });
260
+ it('returns undefined for unrecognized string', () => {
261
+ expect(toOptionalBoolean('yes')).toBeUndefined();
262
+ expect(toOptionalBoolean('no')).toBeUndefined();
263
+ expect(toOptionalBoolean('1')).toBeUndefined();
264
+ expect(toOptionalBoolean('0')).toBeUndefined();
265
+ expect(toOptionalBoolean('random')).toBeUndefined();
266
+ });
267
+ });
268
+ describe('normalizeIndentationStyle', () => {
269
+ it('returns "preserve" for "preserve"', () => {
270
+ expect(normalizeIndentationStyle('preserve')).toBe('preserve');
271
+ });
272
+ it('returns "tabs" for "tabs"', () => {
273
+ expect(normalizeIndentationStyle('tabs')).toBe('tabs');
274
+ });
275
+ it('returns "tabs" for anything else', () => {
276
+ expect(normalizeIndentationStyle(undefined)).toBe('tabs');
277
+ expect(normalizeIndentationStyle(null)).toBe('tabs');
278
+ expect(normalizeIndentationStyle('spaces')).toBe('tabs');
279
+ expect(normalizeIndentationStyle(42)).toBe('tabs');
280
+ expect(normalizeIndentationStyle('')).toBe('tabs');
281
+ });
282
+ });
283
+ describe('retabListIndentation', () => {
284
+ it('converts 2 spaces to 1 tab for * item', () => {
285
+ const result = retabListIndentation(' * item');
286
+ expect(result.content).toBe('\t* item');
287
+ expect(result.linesRetabbed).toBe(1);
288
+ });
289
+ it('converts 4 spaces to 2 tabs for - item', () => {
290
+ const result = retabListIndentation(' - item');
291
+ expect(result.content).toBe('\t\t- item');
292
+ expect(result.linesRetabbed).toBe(1);
293
+ });
294
+ it('converts 6 spaces to 3 tabs for + item', () => {
295
+ const result = retabListIndentation(' + item');
296
+ expect(result.content).toBe('\t\t\t+ item');
297
+ expect(result.linesRetabbed).toBe(1);
298
+ });
299
+ it('works for numbered lists', () => {
300
+ const result = retabListIndentation(' 1. item');
301
+ expect(result.content).toBe('\t1. item');
302
+ expect(result.linesRetabbed).toBe(1);
303
+ });
304
+ it('works for checkbox tasks', () => {
305
+ const result = retabListIndentation(' * [x] done');
306
+ expect(result.content).toBe('\t* [x] done');
307
+ expect(result.linesRetabbed).toBe(1);
308
+ });
309
+ it('handles odd spaces (3) with floor(3/2)=1 tab', () => {
310
+ const result = retabListIndentation(' * item');
311
+ expect(result.content).toBe('\t* item');
312
+ expect(result.linesRetabbed).toBe(1);
313
+ });
314
+ it('does NOT convert 1 space (spaceCount < 2)', () => {
315
+ const result = retabListIndentation(' * item');
316
+ expect(result.content).toBe(' * item');
317
+ expect(result.linesRetabbed).toBe(0);
318
+ });
319
+ it('does NOT convert plain text with leading spaces', () => {
320
+ const result = retabListIndentation(' some plain text');
321
+ expect(result.content).toBe(' some plain text');
322
+ expect(result.linesRetabbed).toBe(0);
323
+ });
324
+ it('does NOT convert lines starting with tabs (already tabbed)', () => {
325
+ const result = retabListIndentation('\t* already tabbed');
326
+ expect(result.content).toBe('\t* already tabbed');
327
+ expect(result.linesRetabbed).toBe(0);
328
+ });
329
+ it('preserves lines with no leading spaces', () => {
330
+ const result = retabListIndentation('* top level item');
331
+ expect(result.content).toBe('* top level item');
332
+ expect(result.linesRetabbed).toBe(0);
333
+ });
334
+ it('handles multi-line content, only retabbing list lines', () => {
335
+ const input = [
336
+ '# Heading',
337
+ ' * nested item',
338
+ 'Some text',
339
+ ' - deep item',
340
+ ' plain text not a list',
341
+ ].join('\n');
342
+ const result = retabListIndentation(input);
343
+ const expected = [
344
+ '# Heading',
345
+ '\t* nested item',
346
+ 'Some text',
347
+ '\t\t- deep item',
348
+ ' plain text not a list',
349
+ ].join('\n');
350
+ expect(result.content).toBe(expected);
351
+ expect(result.linesRetabbed).toBe(2);
352
+ });
353
+ it('returns correct linesRetabbed count', () => {
354
+ const input = [
355
+ ' * one',
356
+ ' - two',
357
+ '* three',
358
+ ' + four',
359
+ ].join('\n');
360
+ const result = retabListIndentation(input);
361
+ expect(result.linesRetabbed).toBe(3);
362
+ });
363
+ });
364
+ describe('extractAttachmentReferences', () => {
365
+ it('extracts a single image reference', () => {
366
+ expect(extractAttachmentReferences('![image](path.png)')).toEqual(['path.png']);
367
+ });
368
+ it('extracts multiple references', () => {
369
+ const text = '![a](one.png) some text ![b](two.jpg)';
370
+ expect(extractAttachmentReferences(text)).toEqual(['one.png', 'two.jpg']);
371
+ });
372
+ it('deduplicates identical references', () => {
373
+ const text = '![a](same.png) and ![b](same.png)';
374
+ expect(extractAttachmentReferences(text)).toEqual(['same.png']);
375
+ });
376
+ it('returns empty array for no references', () => {
377
+ expect(extractAttachmentReferences('no images here')).toEqual([]);
378
+ expect(extractAttachmentReferences('')).toEqual([]);
379
+ });
380
+ it('handles alt text with spaces and folder paths', () => {
381
+ const text = '![alt text with spaces](folder/file.jpg)';
382
+ expect(extractAttachmentReferences(text)).toEqual(['folder/file.jpg']);
383
+ });
384
+ });
385
+ describe('getRemovedAttachmentReferences', () => {
386
+ it('returns refs present in before but not in after', () => {
387
+ const before = '![a](one.png) ![b](two.png)';
388
+ const after = '![a](one.png)';
389
+ expect(getRemovedAttachmentReferences(before, after)).toEqual(['two.png']);
390
+ });
391
+ it('returns empty when no refs removed', () => {
392
+ const before = '![a](one.png)';
393
+ const after = '![a](one.png) ![b](two.png)';
394
+ expect(getRemovedAttachmentReferences(before, after)).toEqual([]);
395
+ });
396
+ it('returns empty when before has no refs', () => {
397
+ const before = 'no images';
398
+ const after = '![a](one.png)';
399
+ expect(getRemovedAttachmentReferences(before, after)).toEqual([]);
400
+ });
401
+ it('works with multiple removals', () => {
402
+ const before = '![a](one.png) ![b](two.png) ![c](three.png)';
403
+ const after = '![b](two.png)';
404
+ const removed = getRemovedAttachmentReferences(before, after);
405
+ expect(removed).toContain('one.png');
406
+ expect(removed).toContain('three.png');
407
+ expect(removed).not.toContain('two.png');
408
+ expect(removed).toHaveLength(2);
409
+ });
410
+ });
411
+ describe('buildLineWindow', () => {
412
+ const sampleLines = ['line1', 'line2', 'line3', 'line4', 'line5'];
413
+ it('returns full content with defaults', () => {
414
+ const result = buildLineWindow(sampleLines, { defaultLimit: 100, maxLimit: 200 });
415
+ expect(result.lineCount).toBe(5);
416
+ expect(result.rangeStartLine).toBe(1);
417
+ expect(result.rangeEndLine).toBe(5);
418
+ expect(result.rangeLineCount).toBe(5);
419
+ expect(result.returnedLineCount).toBe(5);
420
+ expect(result.content).toBe('line1\nline2\nline3\nline4\nline5');
421
+ expect(result.hasMore).toBe(false);
422
+ expect(result.nextCursor).toBeNull();
423
+ });
424
+ it('selects a range with startLine/endLine (1-indexed)', () => {
425
+ const result = buildLineWindow(sampleLines, {
426
+ startLine: 2,
427
+ endLine: 4,
428
+ defaultLimit: 100,
429
+ maxLimit: 200,
430
+ });
431
+ expect(result.rangeStartLine).toBe(2);
432
+ expect(result.rangeEndLine).toBe(4);
433
+ expect(result.rangeLineCount).toBe(3);
434
+ expect(result.content).toBe('line2\nline3\nline4');
435
+ });
436
+ it('caps output with limit', () => {
437
+ const result = buildLineWindow(sampleLines, {
438
+ defaultLimit: 2,
439
+ maxLimit: 200,
440
+ });
441
+ expect(result.returnedLineCount).toBe(2);
442
+ expect(result.content).toBe('line1\nline2');
443
+ expect(result.hasMore).toBe(true);
444
+ });
445
+ it('skips lines with offset', () => {
446
+ const result = buildLineWindow(sampleLines, {
447
+ offset: 2,
448
+ defaultLimit: 100,
449
+ maxLimit: 200,
450
+ });
451
+ expect(result.offset).toBe(2);
452
+ expect(result.returnedLineCount).toBe(3);
453
+ expect(result.content).toBe('line3\nline4\nline5');
454
+ });
455
+ it('cursor acts as offset', () => {
456
+ const result = buildLineWindow(sampleLines, {
457
+ cursor: '3',
458
+ offset: 0,
459
+ defaultLimit: 100,
460
+ maxLimit: 200,
461
+ });
462
+ expect(result.offset).toBe(3);
463
+ expect(result.returnedLineCount).toBe(2);
464
+ expect(result.content).toBe('line4\nline5');
465
+ });
466
+ it('hasMore=true when more lines available', () => {
467
+ const result = buildLineWindow(sampleLines, {
468
+ limit: 3,
469
+ defaultLimit: 100,
470
+ maxLimit: 200,
471
+ });
472
+ expect(result.hasMore).toBe(true);
473
+ expect(result.returnedLineCount).toBe(3);
474
+ });
475
+ it('nextCursor is string of next offset', () => {
476
+ const result = buildLineWindow(sampleLines, {
477
+ limit: 2,
478
+ defaultLimit: 100,
479
+ maxLimit: 200,
480
+ });
481
+ expect(result.nextCursor).toBe('2');
482
+ });
483
+ it('hasMore=false and nextCursor=null at end', () => {
484
+ const result = buildLineWindow(sampleLines, {
485
+ defaultLimit: 100,
486
+ maxLimit: 200,
487
+ });
488
+ expect(result.hasMore).toBe(false);
489
+ expect(result.nextCursor).toBeNull();
490
+ });
491
+ it('lines array has correct 1-indexed line numbers', () => {
492
+ const result = buildLineWindow(sampleLines, {
493
+ startLine: 2,
494
+ endLine: 4,
495
+ defaultLimit: 100,
496
+ maxLimit: 200,
497
+ });
498
+ expect(result.lines).toEqual([
499
+ { line: 2, lineIndex: 1, content: 'line2' },
500
+ { line: 3, lineIndex: 2, content: 'line3' },
501
+ { line: 4, lineIndex: 3, content: 'line4' },
502
+ ]);
503
+ });
504
+ it('handles empty content', () => {
505
+ const result = buildLineWindow([], { defaultLimit: 100, maxLimit: 200 });
506
+ expect(result.lineCount).toBe(0);
507
+ expect(result.rangeLineCount).toBe(0);
508
+ expect(result.returnedLineCount).toBe(0);
509
+ expect(result.content).toBe('');
510
+ expect(result.hasMore).toBe(false);
511
+ expect(result.nextCursor).toBeNull();
512
+ expect(result.lines).toEqual([]);
513
+ });
514
+ });
515
+ describe('normalizeDateToken', () => {
516
+ it('normalizes "2024-01-15" to "20240115"', () => {
517
+ expect(normalizeDateToken('2024-01-15')).toBe('20240115');
518
+ });
519
+ it('passes through "20240115" unchanged', () => {
520
+ expect(normalizeDateToken('20240115')).toBe('20240115');
521
+ });
522
+ it('returns null for non-8-digit result', () => {
523
+ expect(normalizeDateToken('2024')).toBeNull();
524
+ expect(normalizeDateToken('abc')).toBeNull();
525
+ expect(normalizeDateToken('123456789')).toBeNull();
526
+ });
527
+ it('returns null for undefined/empty', () => {
528
+ expect(normalizeDateToken(undefined)).toBeNull();
529
+ expect(normalizeDateToken('')).toBeNull();
530
+ });
531
+ });
532
+ describe('noteMatchScore', () => {
533
+ it('returns 1.0 for exact id match', () => {
534
+ const note = { id: 'abc-123', title: 'Something', filename: 'something.md' };
535
+ expect(noteMatchScore(note, 'abc-123', null)).toBe(1.0);
536
+ });
537
+ it('returns 0.99 for exact filename match', () => {
538
+ const note = { id: 'xyz', title: 'Something', filename: 'notes/my-note.md' };
539
+ expect(noteMatchScore(note, 'notes/my-note.md', null)).toBe(0.99);
540
+ });
541
+ it('returns 0.97 for exact basename match', () => {
542
+ const note = { id: 'xyz', title: 'Something Else', filename: 'folder/my-note.md' };
543
+ expect(noteMatchScore(note, 'my-note', null)).toBe(0.97);
544
+ });
545
+ it('returns 0.96 for exact title match', () => {
546
+ const note = { id: 'xyz', title: 'My Note Title', filename: 'folder/different.md' };
547
+ expect(noteMatchScore(note, 'My Note Title', null)).toBe(0.96);
548
+ });
549
+ it('returns 0.95 for date token match', () => {
550
+ const note = { id: 'xyz', title: 'Daily', filename: 'cal.md', date: '2024-01-15' };
551
+ const queryDateToken = normalizeDateToken('2024-01-15');
552
+ expect(noteMatchScore(note, '2024-01-15', queryDateToken)).toBe(0.95);
553
+ });
554
+ it('returns 0.9 for title starts with query', () => {
555
+ const note = { id: 'xyz', title: 'Meeting notes for project X', filename: 'other.md' };
556
+ expect(noteMatchScore(note, 'meeting notes', null)).toBe(0.9);
557
+ });
558
+ it('returns 0.88 for basename starts with query', () => {
559
+ const note = { id: 'xyz', title: 'Something Else', filename: 'folder/meeting-recap.md' };
560
+ expect(noteMatchScore(note, 'meeting', null)).toBe(0.88);
561
+ });
562
+ it('returns 0.83 for filename contains query', () => {
563
+ const note = { id: 'xyz', title: 'Unrelated', filename: 'projects/quarterly-review.md' };
564
+ expect(noteMatchScore(note, 'quarterly-review.md', null)).toBe(0.83);
565
+ });
566
+ it('returns 0.76 for combined title+filename contains query', () => {
567
+ const note = { id: 'xyz', title: 'Project', filename: 'folder/notes.md' };
568
+ // The query must span title and filename combined: "project folder/notes.md"
569
+ // actually let's test with something that only matches across the combination
570
+ expect(noteMatchScore(note, 'project folder', null)).toBe(0.76);
571
+ });
572
+ it('returns 0 for no match', () => {
573
+ const note = { id: 'xyz', title: 'Something', filename: 'folder/note.md' };
574
+ expect(noteMatchScore(note, 'completely-unrelated-query', null)).toBe(0);
575
+ });
576
+ });
577
+ describe('findParagraphBounds', () => {
578
+ it('handles single paragraph (no blank lines)', () => {
579
+ const lines = ['line one', 'line two', 'line three'];
580
+ expect(findParagraphBounds(lines, 1)).toEqual({ startIndex: 0, endIndex: 2 });
581
+ });
582
+ it('handles paragraph bounded by blanks', () => {
583
+ const lines = ['first para', '', 'second', 'para', '', 'third para'];
584
+ expect(findParagraphBounds(lines, 2)).toEqual({ startIndex: 2, endIndex: 3 });
585
+ expect(findParagraphBounds(lines, 3)).toEqual({ startIndex: 2, endIndex: 3 });
586
+ });
587
+ it('handles first paragraph (starts at line 0)', () => {
588
+ const lines = ['first', 'paragraph', '', 'second'];
589
+ expect(findParagraphBounds(lines, 0)).toEqual({ startIndex: 0, endIndex: 1 });
590
+ expect(findParagraphBounds(lines, 1)).toEqual({ startIndex: 0, endIndex: 1 });
591
+ });
592
+ it('handles last paragraph (extends to end)', () => {
593
+ const lines = ['first', '', 'last', 'paragraph'];
594
+ expect(findParagraphBounds(lines, 2)).toEqual({ startIndex: 2, endIndex: 3 });
595
+ expect(findParagraphBounds(lines, 3)).toEqual({ startIndex: 2, endIndex: 3 });
596
+ });
597
+ });
598
+ //# sourceMappingURL=notes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.test.js","sourceRoot":"","sources":["../../src/tools/notes.test.ts"],"names":[],"mappings":"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"}