@noteplanco/noteplan-mcp 1.1.6 → 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 (73) 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 +66 -10
  14. package/dist/noteplan/frontmatter-parser.js.map +1 -1
  15. package/dist/noteplan/frontmatter-parser.test.js +484 -1
  16. package/dist/noteplan/frontmatter-parser.test.js.map +1 -1
  17. package/dist/noteplan/markdown-parser.d.ts +6 -1
  18. package/dist/noteplan/markdown-parser.d.ts.map +1 -1
  19. package/dist/noteplan/markdown-parser.js +21 -44
  20. package/dist/noteplan/markdown-parser.js.map +1 -1
  21. package/dist/noteplan/markdown-parser.test.d.ts +2 -0
  22. package/dist/noteplan/markdown-parser.test.d.ts.map +1 -0
  23. package/dist/noteplan/markdown-parser.test.js +653 -0
  24. package/dist/noteplan/markdown-parser.test.js.map +1 -0
  25. package/dist/server.d.ts.map +1 -1
  26. package/dist/server.js +405 -205
  27. package/dist/server.js.map +1 -1
  28. package/dist/tools/attachments.d.ts +151 -0
  29. package/dist/tools/attachments.d.ts.map +1 -0
  30. package/dist/tools/attachments.js +421 -0
  31. package/dist/tools/attachments.js.map +1 -0
  32. package/dist/tools/attachments.test.d.ts +2 -0
  33. package/dist/tools/attachments.test.d.ts.map +1 -0
  34. package/dist/tools/attachments.test.js +561 -0
  35. package/dist/tools/attachments.test.js.map +1 -0
  36. package/dist/tools/calendar.d.ts +5 -5
  37. package/dist/tools/notes.d.ts +67 -26
  38. package/dist/tools/notes.d.ts.map +1 -1
  39. package/dist/tools/notes.js +124 -33
  40. package/dist/tools/notes.js.map +1 -1
  41. package/dist/tools/notes.test.d.ts +2 -0
  42. package/dist/tools/notes.test.d.ts.map +1 -0
  43. package/dist/tools/notes.test.js +598 -0
  44. package/dist/tools/notes.test.js.map +1 -0
  45. package/dist/tools/reminders.d.ts +4 -4
  46. package/dist/tools/tasks.d.ts +10 -10
  47. package/dist/tools/tasks.d.ts.map +1 -1
  48. package/dist/tools/tasks.js +14 -27
  49. package/dist/tools/tasks.js.map +1 -1
  50. package/dist/tools/templates.d.ts +69 -0
  51. package/dist/tools/templates.d.ts.map +1 -0
  52. package/dist/tools/templates.js +145 -0
  53. package/dist/tools/templates.js.map +1 -0
  54. package/dist/tools/templates.test.d.ts +2 -0
  55. package/dist/tools/templates.test.d.ts.map +1 -0
  56. package/dist/tools/templates.test.js +48 -0
  57. package/dist/tools/templates.test.js.map +1 -0
  58. package/dist/tools/ui.d.ts +2 -0
  59. package/dist/tools/ui.d.ts.map +1 -1
  60. package/dist/tools/ui.js +24 -0
  61. package/dist/tools/ui.js.map +1 -1
  62. package/dist/utils/applescript.d.ts.map +1 -1
  63. package/dist/utils/applescript.js +21 -0
  64. package/dist/utils/applescript.js.map +1 -1
  65. package/dist/utils/confirmation-tokens.test.d.ts +2 -0
  66. package/dist/utils/confirmation-tokens.test.d.ts.map +1 -0
  67. package/dist/utils/confirmation-tokens.test.js +159 -0
  68. package/dist/utils/confirmation-tokens.test.js.map +1 -0
  69. package/dist/utils/version.d.ts +2 -0
  70. package/dist/utils/version.d.ts.map +1 -1
  71. package/dist/utils/version.js +4 -0
  72. package/dist/utils/version.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1,561 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import * as path from 'path';
3
+ // ── Mocks ──
4
+ vi.mock('fs', () => ({
5
+ existsSync: vi.fn(),
6
+ mkdirSync: vi.fn(),
7
+ writeFileSync: vi.fn(),
8
+ readFileSync: vi.fn(),
9
+ readdirSync: vi.fn(),
10
+ statSync: vi.fn(),
11
+ renameSync: vi.fn(),
12
+ copyFileSync: vi.fn(),
13
+ unlinkSync: vi.fn(),
14
+ rmdirSync: vi.fn(),
15
+ }));
16
+ vi.mock('../noteplan/unified-store.js', () => ({
17
+ getNote: vi.fn(),
18
+ }));
19
+ vi.mock('../noteplan/file-reader.js', () => ({
20
+ getNotePlanPath: vi.fn(),
21
+ }));
22
+ import * as fs from 'fs';
23
+ import { getNote } from '../noteplan/unified-store.js';
24
+ import { getNotePlanPath } from '../noteplan/file-reader.js';
25
+ import { addAttachment, listAttachments, getAttachment, moveAttachment, attachmentsSchema, } from './attachments.js';
26
+ // ── Helpers ──
27
+ const NP_PATH = '/np';
28
+ function mockNote(overrides = {}) {
29
+ return {
30
+ id: '1',
31
+ title: 'Test Note',
32
+ filename: 'Notes/Test Note.md',
33
+ content: '# Test\n',
34
+ type: 'note',
35
+ source: 'local',
36
+ ...overrides,
37
+ };
38
+ }
39
+ const validBase64 = Buffer.from('hello world').toString('base64'); // 'aGVsbG8gd29ybGQ='
40
+ // ── Setup ──
41
+ beforeEach(() => {
42
+ vi.resetAllMocks();
43
+ vi.mocked(getNotePlanPath).mockReturnValue(NP_PATH);
44
+ });
45
+ // ── Schema ──
46
+ describe('attachmentsSchema', () => {
47
+ it('accepts valid input with all fields', () => {
48
+ const result = attachmentsSchema.safeParse({
49
+ action: 'add',
50
+ id: '1',
51
+ data: validBase64,
52
+ attachmentFilename: 'photo.png',
53
+ });
54
+ expect(result.success).toBe(true);
55
+ });
56
+ it('rejects invalid action', () => {
57
+ const result = attachmentsSchema.safeParse({ action: 'delete' });
58
+ expect(result.success).toBe(false);
59
+ });
60
+ });
61
+ // ── addAttachment ──
62
+ describe('addAttachment', () => {
63
+ const baseParams = {
64
+ action: 'add',
65
+ id: '1',
66
+ attachmentFilename: 'photo.png',
67
+ data: validBase64,
68
+ insertLink: false,
69
+ includeData: false,
70
+ };
71
+ it('returns error when data is missing', () => {
72
+ const result = addAttachment({ ...baseParams, data: undefined });
73
+ expect(result.success).toBe(false);
74
+ expect(result.error).toMatch(/data.*required/i);
75
+ });
76
+ it('returns error when attachmentFilename is missing', () => {
77
+ const result = addAttachment({ ...baseParams, attachmentFilename: undefined });
78
+ expect(result.success).toBe(false);
79
+ expect(result.error).toMatch(/attachmentFilename.*required/i);
80
+ });
81
+ it('returns error when note not found', () => {
82
+ vi.mocked(getNote).mockReturnValue(null);
83
+ const result = addAttachment(baseParams);
84
+ expect(result.success).toBe(false);
85
+ expect(result.error).toMatch(/not found/i);
86
+ });
87
+ it('returns error for space notes', () => {
88
+ vi.mocked(getNote).mockReturnValue(mockNote({ source: 'space' }));
89
+ const result = addAttachment(baseParams);
90
+ expect(result.success).toBe(false);
91
+ expect(result.error).toMatch(/space/i);
92
+ });
93
+ it('returns error when filename sanitizes to empty', () => {
94
+ vi.mocked(getNote).mockReturnValue(mockNote());
95
+ const result = addAttachment({ ...baseParams, attachmentFilename: '()[]!' });
96
+ expect(result.success).toBe(false);
97
+ expect(result.error).toMatch(/invalid.*filename/i);
98
+ });
99
+ it('returns error for empty base64 (zero-length buffer)', () => {
100
+ vi.mocked(getNote).mockReturnValue(mockNote());
101
+ vi.mocked(fs.existsSync).mockReturnValue(true);
102
+ // Use padding-only base64 that decodes to zero bytes
103
+ // Note: An empty string '' is falsy and caught by the !data check first,
104
+ // so we use a whitespace-only string that passes truthiness but decodes to empty
105
+ const result = addAttachment({ ...baseParams, data: ' ' });
106
+ expect(result.success).toBe(false);
107
+ expect(result.error).toMatch(/empty/i);
108
+ });
109
+ it('successfully writes attachment and returns correct markdownLink', () => {
110
+ const note = mockNote();
111
+ vi.mocked(getNote).mockReturnValue(note);
112
+ vi.mocked(fs.existsSync).mockReturnValue(true);
113
+ const result = addAttachment(baseParams);
114
+ expect(result.success).toBe(true);
115
+ expect(result).toHaveProperty('markdownLink');
116
+ expect(result.markdownLink).toBe('![image](Test%20Note_attachments/photo.png)');
117
+ expect(result).toHaveProperty('fileSize');
118
+ expect(result.isImage).toBe(true);
119
+ expect(result.noteFilename).toBe('Notes/Test Note.md');
120
+ expect(fs.writeFileSync).toHaveBeenCalled();
121
+ });
122
+ it('creates the _attachments folder if it does not exist', () => {
123
+ const note = mockNote();
124
+ vi.mocked(getNote).mockReturnValue(note);
125
+ vi.mocked(fs.existsSync).mockReturnValue(false);
126
+ addAttachment(baseParams);
127
+ expect(fs.mkdirSync).toHaveBeenCalledWith(path.join(NP_PATH, 'Notes', 'Test Note_attachments'), { recursive: true });
128
+ });
129
+ it('does NOT create folder when it already exists', () => {
130
+ const note = mockNote();
131
+ vi.mocked(getNote).mockReturnValue(note);
132
+ vi.mocked(fs.existsSync).mockReturnValue(true);
133
+ addAttachment(baseParams);
134
+ expect(fs.mkdirSync).not.toHaveBeenCalled();
135
+ });
136
+ it('generates correct image markdown link for png/jpg', () => {
137
+ const note = mockNote();
138
+ vi.mocked(getNote).mockReturnValue(note);
139
+ vi.mocked(fs.existsSync).mockReturnValue(true);
140
+ for (const ext of ['png', 'jpg', 'jpeg', 'gif', 'webp', 'heic']) {
141
+ const result = addAttachment({ ...baseParams, attachmentFilename: `photo.${ext}` });
142
+ expect(result.markdownLink).toMatch(/^!\[image\]/);
143
+ expect(result.isImage).toBe(true);
144
+ }
145
+ });
146
+ it('generates correct file markdown link for pdf/txt', () => {
147
+ const note = mockNote();
148
+ vi.mocked(getNote).mockReturnValue(note);
149
+ vi.mocked(fs.existsSync).mockReturnValue(true);
150
+ for (const ext of ['pdf', 'txt', 'csv', 'mp3']) {
151
+ const result = addAttachment({ ...baseParams, attachmentFilename: `doc.${ext}` });
152
+ expect(result.markdownLink).toMatch(/^!\[file\]/);
153
+ expect(result.isImage).toBe(false);
154
+ }
155
+ });
156
+ it('insertLink=false (default) does NOT modify note content', () => {
157
+ const note = mockNote();
158
+ vi.mocked(getNote).mockReturnValue(note);
159
+ vi.mocked(fs.existsSync).mockReturnValue(true);
160
+ const result = addAttachment({ ...baseParams, insertLink: false });
161
+ expect(result.success).toBe(true);
162
+ expect(result.linkInserted).toBe(false);
163
+ // writeFileSync should be called once (for the attachment), not for the note
164
+ expect(vi.mocked(fs.writeFileSync).mock.calls.length).toBe(1);
165
+ });
166
+ it('insertLink=true appends link to note', () => {
167
+ const note = mockNote({ content: '# Test\n' });
168
+ vi.mocked(getNote).mockReturnValue(note);
169
+ vi.mocked(fs.existsSync).mockReturnValue(true);
170
+ vi.mocked(fs.readFileSync).mockReturnValue('# Test\n');
171
+ const result = addAttachment({ ...baseParams, insertLink: true });
172
+ expect(result.success).toBe(true);
173
+ expect(result.linkInserted).toBe(true);
174
+ // writeFileSync should be called twice: once for attachment, once for note
175
+ expect(vi.mocked(fs.writeFileSync).mock.calls.length).toBe(2);
176
+ const noteWriteCall = vi.mocked(fs.writeFileSync).mock.calls[1];
177
+ const writtenContent = noteWriteCall[1];
178
+ expect(writtenContent).toContain('![image](Test%20Note_attachments/photo.png)');
179
+ });
180
+ it('cleans markdown-conflicting characters from filename', () => {
181
+ const note = mockNote();
182
+ vi.mocked(getNote).mockReturnValue(note);
183
+ vi.mocked(fs.existsSync).mockReturnValue(true);
184
+ const result = addAttachment({
185
+ ...baseParams,
186
+ attachmentFilename: 'photo (1) [copy]!.png',
187
+ });
188
+ expect(result.success).toBe(true);
189
+ // Cleaned name should have removed ()[]!
190
+ expect(result.markdownLink).toBe('![image](Test%20Note_attachments/photo%201%20copy.png)');
191
+ expect(result.attachmentPath).toBe('Test Note_attachments/photo 1 copy.png');
192
+ });
193
+ it('percent-encodes special characters in the markdown link path', () => {
194
+ const note = mockNote({ filename: 'Notes/My (Special) Note.md' });
195
+ vi.mocked(getNote).mockReturnValue(note);
196
+ vi.mocked(fs.existsSync).mockReturnValue(true);
197
+ const result = addAttachment({ ...baseParams, attachmentFilename: 'file name.png' });
198
+ expect(result.success).toBe(true);
199
+ // Note name has special chars that get encoded in the path
200
+ // "My (Special) Note_attachments/file name.png"
201
+ // After encoding: "My%20%28Special%29%20Note_attachments/file%20name.png"
202
+ expect(result.markdownLink).toBe('![image](My%20%28Special%29%20Note_attachments/file%20name.png)');
203
+ });
204
+ });
205
+ // ── listAttachments ──
206
+ describe('listAttachments', () => {
207
+ const baseParams = {
208
+ action: 'list',
209
+ id: '1',
210
+ insertLink: false,
211
+ includeData: false,
212
+ };
213
+ it('returns error when note not found', () => {
214
+ vi.mocked(getNote).mockReturnValue(null);
215
+ const result = listAttachments(baseParams);
216
+ expect(result.success).toBe(false);
217
+ expect(result.error).toMatch(/not found/i);
218
+ });
219
+ it('returns empty list when _attachments folder does not exist', () => {
220
+ vi.mocked(getNote).mockReturnValue(mockNote());
221
+ vi.mocked(fs.existsSync).mockReturnValue(false);
222
+ const result = listAttachments(baseParams);
223
+ expect(result.success).toBe(true);
224
+ expect(result.count).toBe(0);
225
+ expect(result.attachments).toEqual([]);
226
+ });
227
+ it('lists attachments with correct metadata', () => {
228
+ const note = mockNote();
229
+ vi.mocked(getNote).mockReturnValue(note);
230
+ vi.mocked(fs.existsSync).mockReturnValue(true);
231
+ const mockDate = new Date('2024-01-15T10:30:00Z');
232
+ vi.mocked(fs.readdirSync).mockReturnValue([
233
+ { name: 'photo.png', isFile: () => true },
234
+ { name: 'doc.pdf', isFile: () => true },
235
+ ]);
236
+ vi.mocked(fs.statSync).mockReturnValue({
237
+ size: 1024,
238
+ mtime: mockDate,
239
+ });
240
+ const result = listAttachments(baseParams);
241
+ expect(result.success).toBe(true);
242
+ expect(result.count).toBe(2);
243
+ expect(result.noteFilename).toBe('Notes/Test Note.md');
244
+ expect(result.noteTitle).toBe('Test Note');
245
+ const attachments = result.attachments;
246
+ // sorted alphabetically: doc.pdf < photo.png
247
+ expect(attachments[0].filename).toBe('doc.pdf');
248
+ expect(attachments[0].isImage).toBe(false);
249
+ expect(attachments[0].markdownLink).toBe('![file](Test%20Note_attachments/doc.pdf)');
250
+ expect(attachments[0].size).toBe(1024);
251
+ expect(attachments[0].modifiedAt).toBe(mockDate.toISOString());
252
+ expect(attachments[1].filename).toBe('photo.png');
253
+ expect(attachments[1].isImage).toBe(true);
254
+ expect(attachments[1].markdownLink).toBe('![image](Test%20Note_attachments/photo.png)');
255
+ });
256
+ it('skips hidden files (starting with .)', () => {
257
+ const note = mockNote();
258
+ vi.mocked(getNote).mockReturnValue(note);
259
+ vi.mocked(fs.existsSync).mockReturnValue(true);
260
+ vi.mocked(fs.readdirSync).mockReturnValue([
261
+ { name: '.DS_Store', isFile: () => true },
262
+ { name: '.hidden', isFile: () => true },
263
+ { name: 'visible.png', isFile: () => true },
264
+ ]);
265
+ vi.mocked(fs.statSync).mockReturnValue({
266
+ size: 100,
267
+ mtime: new Date(),
268
+ });
269
+ const result = listAttachments(baseParams);
270
+ expect(result.success).toBe(true);
271
+ expect(result.count).toBe(1);
272
+ expect(result.attachments[0].filename).toBe('visible.png');
273
+ });
274
+ it('skips directories', () => {
275
+ const note = mockNote();
276
+ vi.mocked(getNote).mockReturnValue(note);
277
+ vi.mocked(fs.existsSync).mockReturnValue(true);
278
+ vi.mocked(fs.readdirSync).mockReturnValue([
279
+ { name: 'subfolder', isFile: () => false },
280
+ { name: 'photo.png', isFile: () => true },
281
+ ]);
282
+ vi.mocked(fs.statSync).mockReturnValue({
283
+ size: 100,
284
+ mtime: new Date(),
285
+ });
286
+ const result = listAttachments(baseParams);
287
+ expect(result.success).toBe(true);
288
+ expect(result.count).toBe(1);
289
+ });
290
+ });
291
+ // ── getAttachment ──
292
+ describe('getAttachment', () => {
293
+ const baseParams = {
294
+ action: 'get',
295
+ id: '1',
296
+ attachmentFilename: 'photo.png',
297
+ insertLink: false,
298
+ includeData: false,
299
+ };
300
+ it('returns error when attachmentFilename is missing', () => {
301
+ const result = getAttachment({ ...baseParams, attachmentFilename: undefined });
302
+ expect(result.success).toBe(false);
303
+ expect(result.error).toMatch(/attachmentFilename.*required/i);
304
+ });
305
+ it('returns error when note not found', () => {
306
+ vi.mocked(getNote).mockReturnValue(null);
307
+ const result = getAttachment(baseParams);
308
+ expect(result.success).toBe(false);
309
+ expect(result.error).toMatch(/not found/i);
310
+ });
311
+ it('returns error when attachment file does not exist', () => {
312
+ vi.mocked(getNote).mockReturnValue(mockNote());
313
+ vi.mocked(fs.existsSync).mockReturnValue(false);
314
+ const result = getAttachment(baseParams);
315
+ expect(result.success).toBe(false);
316
+ expect(result.error).toMatch(/not found/i);
317
+ });
318
+ it('returns metadata without data when includeData is false', () => {
319
+ const note = mockNote();
320
+ vi.mocked(getNote).mockReturnValue(note);
321
+ vi.mocked(fs.existsSync).mockReturnValue(true);
322
+ vi.mocked(fs.statSync).mockReturnValue({
323
+ size: 2048,
324
+ mtime: new Date('2024-06-01T12:00:00Z'),
325
+ });
326
+ const result = getAttachment({ ...baseParams, includeData: false });
327
+ expect(result.success).toBe(true);
328
+ expect(result.filename).toBe('photo.png');
329
+ expect(result.isImage).toBe(true);
330
+ expect(result.mimeType).toBe('image/png');
331
+ expect(result.size).toBe(2048);
332
+ expect(result.markdownLink).toBe('![image](Test%20Note_attachments/photo.png)');
333
+ expect(result).not.toHaveProperty('data');
334
+ });
335
+ it('returns base64 data when includeData is true', () => {
336
+ const note = mockNote();
337
+ vi.mocked(getNote).mockReturnValue(note);
338
+ vi.mocked(fs.existsSync).mockReturnValue(true);
339
+ vi.mocked(fs.statSync).mockReturnValue({
340
+ size: 100,
341
+ mtime: new Date('2024-06-01T12:00:00Z'),
342
+ });
343
+ const fileBuffer = Buffer.from('file content');
344
+ vi.mocked(fs.readFileSync).mockReturnValue(fileBuffer);
345
+ const result = getAttachment({ ...baseParams, includeData: true });
346
+ expect(result.success).toBe(true);
347
+ expect(result.data).toBe(fileBuffer.toString('base64'));
348
+ });
349
+ it('respects maxDataSize - returns dataTruncated=true for large images', () => {
350
+ const note = mockNote();
351
+ vi.mocked(getNote).mockReturnValue(note);
352
+ vi.mocked(fs.existsSync).mockReturnValue(true);
353
+ vi.mocked(fs.statSync).mockReturnValue({
354
+ size: 5000,
355
+ mtime: new Date('2024-06-01T12:00:00Z'),
356
+ });
357
+ // Create a buffer larger than maxDataSize
358
+ const largeBuffer = Buffer.alloc(5000, 'x');
359
+ vi.mocked(fs.readFileSync).mockReturnValue(largeBuffer);
360
+ const result = getAttachment({
361
+ ...baseParams,
362
+ includeData: true,
363
+ maxDataSize: 1000,
364
+ });
365
+ expect(result.success).toBe(true);
366
+ expect(result.data).toBeNull();
367
+ expect(result.dataTruncated).toBe(true);
368
+ expect(result.originalSize).toBe(5000);
369
+ expect(result.hint).toBeDefined();
370
+ });
371
+ it('does NOT truncate non-image files even if over maxDataSize', () => {
372
+ const note = mockNote();
373
+ vi.mocked(getNote).mockReturnValue(note);
374
+ vi.mocked(fs.existsSync).mockReturnValue(true);
375
+ vi.mocked(fs.statSync).mockReturnValue({
376
+ size: 5000,
377
+ mtime: new Date('2024-06-01T12:00:00Z'),
378
+ });
379
+ const largeBuffer = Buffer.alloc(5000, 'x');
380
+ vi.mocked(fs.readFileSync).mockReturnValue(largeBuffer);
381
+ const result = getAttachment({
382
+ ...baseParams,
383
+ attachmentFilename: 'doc.pdf',
384
+ includeData: true,
385
+ maxDataSize: 1000,
386
+ });
387
+ expect(result.success).toBe(true);
388
+ expect(result.data).toBe(largeBuffer.toString('base64'));
389
+ expect(result.dataTruncated).toBeUndefined();
390
+ });
391
+ it('returns correct MIME type mapping', () => {
392
+ const note = mockNote();
393
+ vi.mocked(getNote).mockReturnValue(note);
394
+ vi.mocked(fs.existsSync).mockReturnValue(true);
395
+ vi.mocked(fs.statSync).mockReturnValue({
396
+ size: 100,
397
+ mtime: new Date(),
398
+ });
399
+ const mimeTests = [
400
+ ['photo.png', 'image/png'],
401
+ ['photo.jpg', 'image/jpeg'],
402
+ ['photo.jpeg', 'image/jpeg'],
403
+ ['photo.gif', 'image/gif'],
404
+ ['photo.webp', 'image/webp'],
405
+ ['photo.heic', 'image/heic'],
406
+ ['doc.pdf', 'application/pdf'],
407
+ ['song.mp3', 'audio/mpeg'],
408
+ ['video.mp4', 'video/mp4'],
409
+ ['notes.txt', 'text/plain'],
410
+ ['data.csv', 'text/csv'],
411
+ ['config.json', 'application/json'],
412
+ ['unknown.xyz', 'application/octet-stream'],
413
+ ];
414
+ for (const [filename, expectedMime] of mimeTests) {
415
+ const result = getAttachment({
416
+ ...baseParams,
417
+ attachmentFilename: filename,
418
+ includeData: false,
419
+ });
420
+ expect(result.mimeType).toBe(expectedMime);
421
+ }
422
+ });
423
+ });
424
+ // ── moveAttachment ──
425
+ describe('moveAttachment', () => {
426
+ const sourceNote = mockNote({
427
+ id: '1',
428
+ title: 'Source Note',
429
+ filename: 'Notes/Source Note.md',
430
+ content: '# Source\n![image](Source%20Note_attachments/photo.png)\n',
431
+ });
432
+ const destNote = mockNote({
433
+ id: '2',
434
+ title: 'Dest Note',
435
+ filename: 'Notes/Dest Note.md',
436
+ content: '# Dest\n',
437
+ });
438
+ const baseParams = {
439
+ action: 'move',
440
+ id: '1',
441
+ attachmentFilename: 'photo.png',
442
+ destinationId: '2',
443
+ insertLink: false,
444
+ includeData: false,
445
+ };
446
+ it('returns error when attachmentFilename is missing', () => {
447
+ const result = moveAttachment({ ...baseParams, attachmentFilename: undefined });
448
+ expect(result.success).toBe(false);
449
+ expect(result.error).toMatch(/attachmentFilename.*required/i);
450
+ });
451
+ it('returns error when source note not found', () => {
452
+ vi.mocked(getNote).mockReturnValue(null);
453
+ const result = moveAttachment(baseParams);
454
+ expect(result.success).toBe(false);
455
+ expect(result.error).toMatch(/not found/i);
456
+ });
457
+ it('returns error when destination note not found', () => {
458
+ // First call for source returns note, second call for destination returns null
459
+ vi.mocked(getNote)
460
+ .mockReturnValueOnce(sourceNote)
461
+ .mockReturnValueOnce(null);
462
+ const result = moveAttachment(baseParams);
463
+ expect(result.success).toBe(false);
464
+ expect(result.error).toMatch(/not found/i);
465
+ });
466
+ it('returns error when attachment file does not exist at source', () => {
467
+ vi.mocked(getNote)
468
+ .mockReturnValueOnce(sourceNote)
469
+ .mockReturnValueOnce(destNote);
470
+ vi.mocked(fs.existsSync).mockReturnValue(false);
471
+ const result = moveAttachment(baseParams);
472
+ expect(result.success).toBe(false);
473
+ expect(result.error).toMatch(/not found.*source/i);
474
+ });
475
+ it('successfully moves file and returns new markdownLink', () => {
476
+ vi.mocked(getNote)
477
+ .mockReturnValueOnce(sourceNote)
478
+ .mockReturnValueOnce(destNote);
479
+ vi.mocked(fs.existsSync).mockReturnValue(true);
480
+ vi.mocked(fs.readFileSync).mockReturnValue('# Source\n![image](Source%20Note_attachments/photo.png)\n');
481
+ vi.mocked(fs.readdirSync).mockReturnValue([]);
482
+ const result = moveAttachment(baseParams);
483
+ expect(result.success).toBe(true);
484
+ expect(result.markdownLink).toBe('![image](Dest%20Note_attachments/photo.png)');
485
+ expect(result).toHaveProperty('movedFrom', 'Source Note_attachments/photo.png');
486
+ expect(result).toHaveProperty('movedTo', 'Dest Note_attachments/photo.png');
487
+ expect(fs.renameSync).toHaveBeenCalled();
488
+ });
489
+ it('removes old markdown link from source note content', () => {
490
+ vi.mocked(getNote)
491
+ .mockReturnValueOnce(sourceNote)
492
+ .mockReturnValueOnce(destNote);
493
+ vi.mocked(fs.existsSync).mockReturnValue(true);
494
+ vi.mocked(fs.readFileSync).mockReturnValue('# Source\n![image](Source%20Note_attachments/photo.png)\nMore text\n');
495
+ vi.mocked(fs.readdirSync).mockReturnValue([]);
496
+ const result = moveAttachment(baseParams);
497
+ expect(result.success).toBe(true);
498
+ expect(result.oldLinkRemoved).toBe(true);
499
+ // Check that writeFileSync was called for the source note with link removed
500
+ const writeCall = vi.mocked(fs.writeFileSync).mock.calls.find((call) => call[0] === path.join(NP_PATH, 'Notes/Source Note.md'));
501
+ expect(writeCall).toBeDefined();
502
+ const writtenContent = writeCall[1];
503
+ expect(writtenContent).not.toContain('![image](Source%20Note_attachments/photo.png)');
504
+ expect(writtenContent).toContain('More text');
505
+ });
506
+ it('creates destination folder if needed', () => {
507
+ vi.mocked(getNote)
508
+ .mockReturnValueOnce(sourceNote)
509
+ .mockReturnValueOnce(destNote);
510
+ // Source file exists, dest folder does not
511
+ vi.mocked(fs.existsSync).mockImplementation((p) => {
512
+ const s = String(p);
513
+ if (s.includes('Dest Note_attachments'))
514
+ return false;
515
+ return true;
516
+ });
517
+ vi.mocked(fs.readFileSync).mockReturnValue('# Source\n');
518
+ vi.mocked(fs.readdirSync).mockReturnValue([]);
519
+ moveAttachment(baseParams);
520
+ expect(fs.mkdirSync).toHaveBeenCalledWith(path.join(NP_PATH, 'Notes', 'Dest Note_attachments'), { recursive: true });
521
+ });
522
+ it('cleans up empty source folder after move', () => {
523
+ vi.mocked(getNote)
524
+ .mockReturnValueOnce(sourceNote)
525
+ .mockReturnValueOnce(destNote);
526
+ vi.mocked(fs.existsSync).mockReturnValue(true);
527
+ vi.mocked(fs.readFileSync).mockReturnValue('# Source\n');
528
+ // Empty remaining files after move
529
+ vi.mocked(fs.readdirSync).mockReturnValue([]);
530
+ moveAttachment(baseParams);
531
+ expect(fs.rmdirSync).toHaveBeenCalledWith(path.join(NP_PATH, 'Notes', 'Source Note_attachments'));
532
+ });
533
+ it('does NOT remove source folder when other files remain', () => {
534
+ vi.mocked(getNote)
535
+ .mockReturnValueOnce(sourceNote)
536
+ .mockReturnValueOnce(destNote);
537
+ vi.mocked(fs.existsSync).mockReturnValue(true);
538
+ vi.mocked(fs.readFileSync).mockReturnValue('# Source\n');
539
+ // Other files remain
540
+ vi.mocked(fs.readdirSync).mockReturnValue(['other.png']);
541
+ moveAttachment(baseParams);
542
+ expect(fs.rmdirSync).not.toHaveBeenCalled();
543
+ });
544
+ it('falls back to copy+unlink when renameSync throws EXDEV', () => {
545
+ vi.mocked(getNote)
546
+ .mockReturnValueOnce(sourceNote)
547
+ .mockReturnValueOnce(destNote);
548
+ vi.mocked(fs.existsSync).mockReturnValue(true);
549
+ vi.mocked(fs.readFileSync).mockReturnValue('# Source\n');
550
+ vi.mocked(fs.readdirSync).mockReturnValue([]);
551
+ const exdevError = Object.assign(new Error('EXDEV'), { code: 'EXDEV' });
552
+ vi.mocked(fs.renameSync).mockImplementation(() => {
553
+ throw exdevError;
554
+ });
555
+ const result = moveAttachment(baseParams);
556
+ expect(result.success).toBe(true);
557
+ expect(fs.copyFileSync).toHaveBeenCalled();
558
+ expect(fs.unlinkSync).toHaveBeenCalled();
559
+ });
560
+ });
561
+ //# sourceMappingURL=attachments.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.test.js","sourceRoot":"","sources":["../../src/tools/attachments.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,cAAc;AAEd,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;CACnB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;CACjB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AAEJ,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EACL,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,gBAAgB;AAEhB,MAAM,OAAO,GAAG,KAAK,CAAC;AAEtB,SAAS,QAAQ,CAAC,YAOb,EAAE;IACL,OAAO;QACL,EAAE,EAAE,GAAG;QACP,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,oBAAoB;QAC9B,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,MAAe;QACrB,MAAM,EAAE,OAAgB;QACxB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB;AAExF,cAAc;AAEd,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,eAAe;AAEf,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC;YACzC,MAAM,EAAE,KAAK;YACb,EAAE,EAAE,GAAG;YACP,IAAI,EAAE,WAAW;YACjB,kBAAkB,EAAE,WAAW;SAChC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,sBAAsB;AAEtB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,UAAU,GAAwC;QACtD,MAAM,EAAE,KAAc;QACtB,EAAE,EAAE,GAAG;QACP,kBAAkB,EAAE,WAAW;QAC/B,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAQ,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAS,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAS,CAAC,CAAC;QACtD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,qDAAqD;QACrD,yEAAyE;QACzE,iFAAiF;QACjF,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAEzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEhD,aAAa,CAAC,UAAU,CAAC,CAAC;QAE1B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,uBAAuB,CAAC,EACpD,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,aAAa,CAAC,UAAU,CAAC,CAAC;QAE1B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;YAChE,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,SAAS,GAAG,EAAE,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,OAAO,GAAG,EAAE,EAAE,CAAC,CAAC;YAClF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,6EAA6E;QAC7E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,2EAA2E;QAC3E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAW,CAAC;QAClD,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,6CAA6C,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,GAAG,UAAU;YACb,kBAAkB,EAAE,uBAAuB;SAC5C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,yCAAyC;QACzC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,4BAA4B,EAAE,CAAC,CAAC;QAClE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,CAAC,CAAC;QAErF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,2DAA2D;QAC3D,gDAAgD;QAChD,0EAA0E;QAC1E,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAC9B,iEAAiE,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wBAAwB;AAExB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,UAAU,GAA0C;QACxD,MAAM,EAAE,MAAe;QACvB,EAAE,EAAE,GAAG;QACP,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAS,CAAC,CAAC;QACtD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAClD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC;YACxC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAS;YAChD,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAS;SAC/C,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,QAAQ;SACT,CAAC,CAAC;QAEV,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAoB,CAAC;QAChD,6CAA6C;QAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACrF,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAE/D,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC;YACxC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAS;YAChD,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAS;YAC9C,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAS;SACnD,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,IAAI,IAAI,EAAE;SACX,CAAC,CAAC;QAEV,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAE,MAAM,CAAC,WAAqB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC;YACxC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAS;YACjD,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,EAAS;SACjD,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,IAAI,IAAI,EAAE;SACX,CAAC,CAAC;QAEV,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAE3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,sBAAsB;AAEtB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,UAAU,GAAwC;QACtD,MAAM,EAAE,KAAc;QACtB,EAAE,EAAE,GAAG;QACP,kBAAkB,EAAE,WAAW;QAC/B,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,QAAQ,EAAS,CAAC,CAAC;QACtD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;SACjC,CAAC,CAAC;QAEV,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;SACjC,CAAC,CAAC;QACV,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,aAAa,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;SACjC,CAAC,CAAC;QACV,0CAA0C;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,GAAG,UAAU;YACb,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,IAAI,CAAC,sBAAsB,CAAC;SACjC,CAAC,CAAC;QACV,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,aAAa,CAAC;YAC3B,GAAG,UAAU;YACb,kBAAkB,EAAE,SAAS;YAC7B,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QAChD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,IAAI,IAAI,EAAE;SACX,CAAC,CAAC;QAEV,MAAM,SAAS,GAAuB;YACpC,CAAC,WAAW,EAAE,WAAW,CAAC;YAC1B,CAAC,WAAW,EAAE,YAAY,CAAC;YAC3B,CAAC,YAAY,EAAE,YAAY,CAAC;YAC5B,CAAC,WAAW,EAAE,WAAW,CAAC;YAC1B,CAAC,YAAY,EAAE,YAAY,CAAC;YAC5B,CAAC,YAAY,EAAE,YAAY,CAAC;YAC5B,CAAC,SAAS,EAAE,iBAAiB,CAAC;YAC9B,CAAC,UAAU,EAAE,YAAY,CAAC;YAC1B,CAAC,WAAW,EAAE,WAAW,CAAC;YAC1B,CAAC,WAAW,EAAE,YAAY,CAAC;YAC3B,CAAC,UAAU,EAAE,UAAU,CAAC;YACxB,CAAC,aAAa,EAAE,kBAAkB,CAAC;YACnC,CAAC,aAAa,EAAE,0BAA0B,CAAC;SAC5C,CAAC;QAEF,KAAK,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,aAAa,CAAC;gBAC3B,GAAG,UAAU;gBACb,kBAAkB,EAAE,QAAQ;gBAC5B,WAAW,EAAE,KAAK;aACnB,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,uBAAuB;AAEvB,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,UAAU,GAAG,QAAQ,CAAC;QAC1B,EAAE,EAAE,GAAG;QACP,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,sBAAsB;QAChC,OAAO,EAAE,2DAA2D;KACrE,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC;QACxB,EAAE,EAAE,GAAG;QACP,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,oBAAoB;QAC9B,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAyC;QACvD,MAAM,EAAE,MAAe;QACvB,EAAE,EAAE,GAAG;QACP,kBAAkB,EAAE,WAAW;QAC/B,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,KAAK;QACjB,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,+EAA+E;QAC/E,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,QAAe,CAAC,CAAC;QACxC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,QAAe,CAAC,CAAC;QACxC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CACxC,2DAA2D,CAC5D,CAAC;QACF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,mCAAmC,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;QAC5E,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,QAAe,CAAC,CAAC;QACxC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CACxC,sEAAsE,CACvE,CAAC;QACF,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE9C,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,4EAA4E;QAC5E,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAC3D,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,sBAAsB,CAAC,CACjE,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,cAAc,GAAG,SAAU,CAAC,CAAC,CAAW,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC;QACtF,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,QAAe,CAAC,CAAC;QACxC,2CAA2C;QAC3C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAM,EAAE,EAAE;YACrD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACzD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE9C,cAAc,CAAC,UAAU,CAAC,CAAC;QAE3B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,uBAAuB,CAAC,EACpD,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,QAAe,CAAC,CAAC;QACxC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACzD,mCAAmC;QACnC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE9C,cAAc,CAAC,UAAU,CAAC,CAAC;QAE3B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,yBAAyB,CAAC,CACvD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,QAAe,CAAC,CAAC;QACxC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACzD,qBAAqB;QACrB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,WAAW,CAAQ,CAAC,CAAC;QAEhE,cAAc,CAAC,UAAU,CAAC,CAAC;QAE3B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aACf,mBAAmB,CAAC,UAAiB,CAAC;aACtC,mBAAmB,CAAC,QAAe,CAAC,CAAC;QACxC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACzD,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC/C,MAAM,UAAU,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAE1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -11,8 +11,8 @@ export declare const addToTodaySchema: z.ZodObject<{
11
11
  position: z.ZodDefault<z.ZodOptional<z.ZodEnum<["start", "end"]>>>;
12
12
  space: z.ZodOptional<z.ZodString>;
13
13
  }, "strip", z.ZodTypeAny, {
14
- content: string;
15
14
  position: "start" | "end";
15
+ content: string;
16
16
  space?: string | undefined;
17
17
  }, {
18
18
  content: string;
@@ -137,17 +137,17 @@ export declare const getNotesInRangeSchema: z.ZodObject<{
137
137
  period: "today" | "yesterday" | "this-week" | "last-week" | "this-month" | "last-month" | "custom";
138
138
  maxDays: number;
139
139
  space?: string | undefined;
140
- includeContent?: boolean | undefined;
141
140
  cursor?: string | undefined;
141
+ includeContent?: boolean | undefined;
142
142
  startDate?: string | undefined;
143
143
  endDate?: string | undefined;
144
144
  }, {
145
145
  period: "today" | "yesterday" | "this-week" | "last-week" | "this-month" | "last-month" | "custom";
146
146
  space?: string | undefined;
147
147
  limit?: number | undefined;
148
- includeContent?: boolean | undefined;
149
148
  offset?: number | undefined;
150
149
  cursor?: string | undefined;
150
+ includeContent?: boolean | undefined;
151
151
  startDate?: string | undefined;
152
152
  endDate?: string | undefined;
153
153
  maxDays?: number | undefined;
@@ -187,14 +187,14 @@ export declare const getNotesInFolderSchema: z.ZodObject<{
187
187
  folder: string;
188
188
  offset: number;
189
189
  limit?: number | undefined;
190
- includeContent?: boolean | undefined;
191
190
  cursor?: string | undefined;
191
+ includeContent?: boolean | undefined;
192
192
  }, {
193
193
  folder: string;
194
194
  limit?: number | undefined;
195
- includeContent?: boolean | undefined;
196
195
  offset?: number | undefined;
197
196
  cursor?: string | undefined;
197
+ includeContent?: boolean | undefined;
198
198
  }>;
199
199
  /**
200
200
  * Get a periodic note (weekly, monthly, quarterly, yearly)