@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,421 @@
1
+ // Attachment operations for NotePlan notes
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import { z } from 'zod';
5
+ import * as store from '../noteplan/unified-store.js';
6
+ import { getNotePlanPath } from '../noteplan/file-reader.js';
7
+ // ── Constants (mirrors FileAttachments.swift) ──
8
+ const ATTACHMENT_SUFFIX = '_attachments';
9
+ const IMAGE_EXTENSIONS = new Set([
10
+ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff', 'tif', 'webp', 'heic', 'heif',
11
+ ]);
12
+ // ── Schema ──
13
+ export const attachmentsSchema = z.object({
14
+ action: z.enum(['add', 'list', 'get', 'move']).describe('Action to perform'),
15
+ // Note targeting (same pattern as other tools)
16
+ id: z.string().optional().describe('Note ID'),
17
+ filename: z.string().optional().describe('Note filename/path'),
18
+ title: z.string().optional().describe('Note title (fuzzy matched)'),
19
+ date: z.string().optional().describe('Calendar note date (YYYYMMDD or YYYY-MM-DD)'),
20
+ query: z.string().optional().describe('Search query to find the note'),
21
+ space: z.string().optional().describe('Space name or ID'),
22
+ // Add action params
23
+ data: z.string().optional().describe('Base64-encoded file data — required for add'),
24
+ attachmentFilename: z.string().optional().describe('Filename for the attachment (e.g. "photo.png") — required for add and get'),
25
+ mimeType: z.string().optional().describe('MIME type hint (e.g. "image/png") — used by add'),
26
+ insertLink: z.boolean().optional().default(false).describe('Insert a markdown link into the note — used by add (default: false). The AI should usually place links itself via noteplan_edit_content for precise positioning.'),
27
+ // Move action params
28
+ destinationId: z.string().optional().describe('Destination note ID — used by move'),
29
+ destinationFilename: z.string().optional().describe('Destination note filename — used by move'),
30
+ destinationTitle: z.string().optional().describe('Destination note title — used by move'),
31
+ destinationDate: z.string().optional().describe('Destination calendar note date — used by move'),
32
+ // Get action params
33
+ includeData: z.boolean().optional().default(false).describe('Include base64 data in response — used by get'),
34
+ maxDataSize: z.number().optional().describe('Max base64 data size in bytes — used by get. Images are downscaled to fit. Omit for full size.'),
35
+ });
36
+ // ── Helpers (mirrors FileAttachments.swift patterns) ──
37
+ /**
38
+ * Sanitize filename by removing markdown-conflicting characters.
39
+ * Mirrors FileAttachments.cleanImageNameFromMarkdownConflicts()
40
+ */
41
+ function cleanFilename(name) {
42
+ return name.replace(/[()[\]!]/g, '');
43
+ }
44
+ /**
45
+ * Get the note name (filename without extension) for building the attachments folder name.
46
+ * Mirrors: noteUrl.deletingPathExtension().lastPathComponent
47
+ */
48
+ function getNoteBaseName(noteFilename) {
49
+ const basename = path.basename(noteFilename);
50
+ const ext = path.extname(basename);
51
+ return ext ? basename.slice(0, -ext.length) : basename;
52
+ }
53
+ /**
54
+ * Get the absolute path to a note's attachments folder.
55
+ * Pattern: {noteDir}/{noteName}_attachments/
56
+ */
57
+ function getAttachmentsFolderPath(noteFilename) {
58
+ const notePlanPath = getNotePlanPath();
59
+ const fullNotePath = path.isAbsolute(noteFilename)
60
+ ? noteFilename
61
+ : path.join(notePlanPath, noteFilename);
62
+ const noteDir = path.dirname(fullNotePath);
63
+ const noteName = getNoteBaseName(fullNotePath);
64
+ return path.join(noteDir, `${noteName}${ATTACHMENT_SUFFIX}`);
65
+ }
66
+ /**
67
+ * Get the relative markdown link path for an attachment.
68
+ * Mirrors: url.pathComponents.suffix(2).joined(separator: "/")
69
+ * Returns: "noteName_attachments/filename.png"
70
+ */
71
+ function getRelativeAttachmentPath(noteFilename, attachmentFilename) {
72
+ const noteName = getNoteBaseName(noteFilename);
73
+ return `${noteName}${ATTACHMENT_SUFFIX}/${attachmentFilename}`;
74
+ }
75
+ /**
76
+ * Percent-encode special characters in paths for markdown links.
77
+ * Mirrors: FileAttachments.encoded()
78
+ */
79
+ function encodePath(filePath) {
80
+ return filePath
81
+ .replace(/%/g, '%25')
82
+ .replace(/\(/g, '%28')
83
+ .replace(/\)/g, '%29')
84
+ .replace(/ /g, '%20');
85
+ }
86
+ /**
87
+ * Check if a file is an image based on extension.
88
+ */
89
+ function isImageFile(filename) {
90
+ const ext = path.extname(filename).toLowerCase().replace('.', '');
91
+ return IMAGE_EXTENSIONS.has(ext);
92
+ }
93
+ /**
94
+ * Generate the markdown link for an attachment.
95
+ * Images: ![image](relativePath)
96
+ * Files: ![file](relativePath)
97
+ */
98
+ function toMarkdownLink(noteFilename, attachmentFilename) {
99
+ const relativePath = getRelativeAttachmentPath(noteFilename, attachmentFilename);
100
+ const encoded = encodePath(relativePath);
101
+ const alt = isImageFile(attachmentFilename) ? 'image' : 'file';
102
+ return `![${alt}](${encoded})`;
103
+ }
104
+ /**
105
+ * Ensure path is inside the NotePlan root directory.
106
+ */
107
+ function ensureInsideRoot(targetPath) {
108
+ const notePlanPath = getNotePlanPath();
109
+ const resolvedPath = path.resolve(targetPath);
110
+ const resolvedRoot = path.resolve(notePlanPath);
111
+ return resolvedPath.startsWith(`${resolvedRoot}${path.sep}`);
112
+ }
113
+ // ── Note resolution (shared pattern with other tools) ──
114
+ function resolveNoteForAttachment(params) {
115
+ const { id, filename, title, date, query, space } = params;
116
+ if (id?.trim()) {
117
+ const note = store.getNote({ id: id.trim(), space: space?.trim() })
118
+ ?? store.getNote({ filename: id.trim(), space: space?.trim() });
119
+ return { note, error: note ? undefined : `Note not found: ${id}` };
120
+ }
121
+ if (filename?.trim()) {
122
+ const note = store.getNote({ filename: filename.trim(), space: space?.trim() });
123
+ return { note, error: note ? undefined : `Note not found: ${filename}` };
124
+ }
125
+ if (date?.trim()) {
126
+ const note = store.getNote({ date: date.trim(), space: space?.trim() });
127
+ return { note, error: note ? undefined : `Calendar note not found for date: ${date}` };
128
+ }
129
+ const textQuery = title?.trim() || query?.trim();
130
+ if (textQuery) {
131
+ const note = store.getNote({ title: textQuery, space: space?.trim() });
132
+ if (note) {
133
+ return { note };
134
+ }
135
+ return { note: null, error: `No note found matching: ${textQuery}` };
136
+ }
137
+ return { note: null, error: 'Provide id, filename, title, date, or query to identify the note' };
138
+ }
139
+ // ── Actions ──
140
+ /**
141
+ * Add an attachment to a note.
142
+ * - Decodes base64 data
143
+ * - Creates the _attachments folder if needed
144
+ * - Writes the file
145
+ * - Returns the markdown link for the AI to place where it wants
146
+ */
147
+ export function addAttachment(params) {
148
+ const { data, attachmentFilename } = params;
149
+ if (!data) {
150
+ return { success: false, error: 'data (base64-encoded file content) is required for add' };
151
+ }
152
+ if (!attachmentFilename) {
153
+ return { success: false, error: 'attachmentFilename is required for add' };
154
+ }
155
+ const { note, error } = resolveNoteForAttachment(params);
156
+ if (!note) {
157
+ return { success: false, error: error || 'Note not found' };
158
+ }
159
+ if (note.source === 'space') {
160
+ return { success: false, error: 'Attachments are not supported for Space notes (no local filesystem path)' };
161
+ }
162
+ const cleanName = cleanFilename(attachmentFilename);
163
+ if (!cleanName || cleanName.trim().length === 0) {
164
+ return { success: false, error: 'Invalid attachment filename after sanitization' };
165
+ }
166
+ const attachmentsFolder = getAttachmentsFolderPath(note.filename);
167
+ const attachmentPath = path.join(attachmentsFolder, cleanName);
168
+ if (!ensureInsideRoot(attachmentPath)) {
169
+ return { success: false, error: 'Attachment path escapes NotePlan directory' };
170
+ }
171
+ let buffer;
172
+ try {
173
+ buffer = Buffer.from(data, 'base64');
174
+ }
175
+ catch {
176
+ return { success: false, error: 'Invalid base64 data' };
177
+ }
178
+ if (buffer.length === 0) {
179
+ return { success: false, error: 'Decoded attachment data is empty' };
180
+ }
181
+ if (!fs.existsSync(attachmentsFolder)) {
182
+ fs.mkdirSync(attachmentsFolder, { recursive: true });
183
+ }
184
+ fs.writeFileSync(attachmentPath, buffer);
185
+ const markdownLink = toMarkdownLink(note.filename, cleanName);
186
+ // Only insert link if explicitly requested (default: false)
187
+ if (params.insertLink === true) {
188
+ const notePlanPath = getNotePlanPath();
189
+ const fullNotePath = path.join(notePlanPath, note.filename);
190
+ const content = fs.readFileSync(fullNotePath, 'utf-8');
191
+ // Simple append at end
192
+ const newContent = content.endsWith('\n')
193
+ ? content + markdownLink + '\n'
194
+ : content + '\n' + markdownLink + '\n';
195
+ fs.writeFileSync(fullNotePath, newContent, 'utf-8');
196
+ }
197
+ return {
198
+ success: true,
199
+ attachmentPath: getRelativeAttachmentPath(note.filename, cleanName),
200
+ markdownLink,
201
+ noteFilename: note.filename,
202
+ noteTitle: note.title,
203
+ fileSize: buffer.length,
204
+ isImage: isImageFile(cleanName),
205
+ linkInserted: params.insertLink === true,
206
+ hint: params.insertLink === true
207
+ ? undefined
208
+ : 'Use noteplan_edit_content to place the markdownLink where you want it in the note.',
209
+ };
210
+ }
211
+ /**
212
+ * List attachments for a note.
213
+ */
214
+ export function listAttachments(params) {
215
+ const { note, error } = resolveNoteForAttachment(params);
216
+ if (!note) {
217
+ return { success: false, error: error || 'Note not found' };
218
+ }
219
+ if (note.source === 'space') {
220
+ return { success: false, error: 'Attachments are not supported for Space notes' };
221
+ }
222
+ const attachmentsFolder = getAttachmentsFolderPath(note.filename);
223
+ if (!fs.existsSync(attachmentsFolder)) {
224
+ return {
225
+ success: true,
226
+ noteFilename: note.filename,
227
+ noteTitle: note.title,
228
+ attachmentsFolder: getRelativeAttachmentPath(note.filename, '').slice(0, -1),
229
+ count: 0,
230
+ attachments: [],
231
+ };
232
+ }
233
+ const entries = fs.readdirSync(attachmentsFolder, { withFileTypes: true });
234
+ const attachments = entries
235
+ .filter((e) => e.isFile() && !e.name.startsWith('.'))
236
+ .map((e) => {
237
+ const filePath = path.join(attachmentsFolder, e.name);
238
+ const stats = fs.statSync(filePath);
239
+ return {
240
+ filename: e.name,
241
+ relativePath: getRelativeAttachmentPath(note.filename, e.name),
242
+ markdownLink: toMarkdownLink(note.filename, e.name),
243
+ isImage: isImageFile(e.name),
244
+ size: stats.size,
245
+ modifiedAt: stats.mtime.toISOString(),
246
+ };
247
+ })
248
+ .sort((a, b) => a.filename.localeCompare(b.filename));
249
+ return {
250
+ success: true,
251
+ noteFilename: note.filename,
252
+ noteTitle: note.title,
253
+ attachmentsFolder: getRelativeAttachmentPath(note.filename, '').slice(0, -1),
254
+ count: attachments.length,
255
+ attachments,
256
+ };
257
+ }
258
+ /**
259
+ * Get a specific attachment's metadata and optionally its base64 data.
260
+ */
261
+ export function getAttachment(params) {
262
+ const attachmentName = params.attachmentFilename;
263
+ if (!attachmentName) {
264
+ return { success: false, error: 'attachmentFilename is required for get' };
265
+ }
266
+ const { note, error } = resolveNoteForAttachment(params);
267
+ if (!note) {
268
+ return { success: false, error: error || 'Note not found' };
269
+ }
270
+ if (note.source === 'space') {
271
+ return { success: false, error: 'Attachments are not supported for Space notes' };
272
+ }
273
+ const attachmentsFolder = getAttachmentsFolderPath(note.filename);
274
+ const filePath = path.join(attachmentsFolder, cleanFilename(attachmentName));
275
+ if (!ensureInsideRoot(filePath)) {
276
+ return { success: false, error: 'Attachment path escapes NotePlan directory' };
277
+ }
278
+ if (!fs.existsSync(filePath)) {
279
+ return { success: false, error: `Attachment not found: ${attachmentName}` };
280
+ }
281
+ const stats = fs.statSync(filePath);
282
+ const ext = path.extname(filePath).toLowerCase().replace('.', '');
283
+ const mimeMap = {
284
+ png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',
285
+ gif: 'image/gif', webp: 'image/webp', heic: 'image/heic',
286
+ pdf: 'application/pdf', mp3: 'audio/mpeg', mp4: 'video/mp4',
287
+ txt: 'text/plain', csv: 'text/csv', json: 'application/json',
288
+ };
289
+ const result = {
290
+ success: true,
291
+ filename: path.basename(filePath),
292
+ relativePath: getRelativeAttachmentPath(note.filename, path.basename(filePath)),
293
+ markdownLink: toMarkdownLink(note.filename, path.basename(filePath)),
294
+ isImage: isImageFile(filePath),
295
+ mimeType: mimeMap[ext] || 'application/octet-stream',
296
+ size: stats.size,
297
+ modifiedAt: stats.mtime.toISOString(),
298
+ noteFilename: note.filename,
299
+ noteTitle: note.title,
300
+ };
301
+ if (params.includeData) {
302
+ const fileData = fs.readFileSync(filePath);
303
+ const maxSize = params.maxDataSize;
304
+ if (maxSize && isImageFile(filePath) && fileData.length > maxSize) {
305
+ // Return a size warning instead of truncated data
306
+ result.data = null;
307
+ result.dataTruncated = true;
308
+ result.originalSize = fileData.length;
309
+ result.hint = `Image is ${fileData.length} bytes (${Math.round(fileData.length / 1024)}KB). Base64 would be ~${Math.round(fileData.length * 1.37 / 1024)}KB. Consider using a smaller maxDataSize or accessing the file directly.`;
310
+ }
311
+ else {
312
+ result.data = fileData.toString('base64');
313
+ }
314
+ }
315
+ return result;
316
+ }
317
+ /**
318
+ * Move an attachment from one note to another.
319
+ * - Moves the file on disk
320
+ * - Removes the old markdown link from the source note
321
+ * - Returns the new markdown link for the AI to place in the destination note
322
+ */
323
+ export function moveAttachment(params) {
324
+ const attachmentName = params.attachmentFilename;
325
+ if (!attachmentName) {
326
+ return { success: false, error: 'attachmentFilename is required for move' };
327
+ }
328
+ // Resolve source note
329
+ const { note: sourceNote, error: srcError } = resolveNoteForAttachment(params);
330
+ if (!sourceNote) {
331
+ return { success: false, error: srcError || 'Source note not found' };
332
+ }
333
+ if (sourceNote.source === 'space') {
334
+ return { success: false, error: 'Attachments are not supported for Space notes' };
335
+ }
336
+ // Resolve destination note
337
+ const { note: destNote, error: destError } = resolveNoteForAttachment({
338
+ id: params.destinationId,
339
+ filename: params.destinationFilename,
340
+ title: params.destinationTitle,
341
+ date: params.destinationDate,
342
+ space: params.space,
343
+ });
344
+ if (!destNote) {
345
+ return { success: false, error: destError || 'Destination note not found. Provide destinationId, destinationFilename, destinationTitle, or destinationDate.' };
346
+ }
347
+ if (destNote.source === 'space') {
348
+ return { success: false, error: 'Attachments are not supported for Space destination notes' };
349
+ }
350
+ // Resolve source file path
351
+ const cleanName = cleanFilename(attachmentName);
352
+ const srcFolder = getAttachmentsFolderPath(sourceNote.filename);
353
+ const srcPath = path.join(srcFolder, cleanName);
354
+ if (!ensureInsideRoot(srcPath)) {
355
+ return { success: false, error: 'Source attachment path escapes NotePlan directory' };
356
+ }
357
+ if (!fs.existsSync(srcPath)) {
358
+ return { success: false, error: `Attachment not found in source note: ${attachmentName}` };
359
+ }
360
+ // Resolve destination file path
361
+ const destFolder = getAttachmentsFolderPath(destNote.filename);
362
+ const destPath = path.join(destFolder, cleanName);
363
+ if (!ensureInsideRoot(destPath)) {
364
+ return { success: false, error: 'Destination attachment path escapes NotePlan directory' };
365
+ }
366
+ // Create destination folder if needed
367
+ if (!fs.existsSync(destFolder)) {
368
+ fs.mkdirSync(destFolder, { recursive: true });
369
+ }
370
+ // Move the file (with fallback for sandboxed filesystems)
371
+ try {
372
+ fs.renameSync(srcPath, destPath);
373
+ }
374
+ catch (error) {
375
+ const code = error.code;
376
+ if (code === 'EPERM' || code === 'EXDEV') {
377
+ fs.copyFileSync(srcPath, destPath);
378
+ fs.unlinkSync(srcPath);
379
+ }
380
+ else {
381
+ throw error;
382
+ }
383
+ }
384
+ // Remove the old markdown link from the source note content
385
+ const notePlanPath = getNotePlanPath();
386
+ const srcNotePath = path.join(notePlanPath, sourceNote.filename);
387
+ const srcContent = fs.readFileSync(srcNotePath, 'utf-8');
388
+ const oldLink = toMarkdownLink(sourceNote.filename, cleanName);
389
+ const oldLinkEncoded = toMarkdownLink(sourceNote.filename, attachmentName); // try original name too
390
+ let newSrcContent = srcContent;
391
+ // Remove the line containing the old link (try both clean and original names)
392
+ for (const link of [oldLink, oldLinkEncoded]) {
393
+ newSrcContent = newSrcContent
394
+ .split('\n')
395
+ .filter((line) => !line.includes(link))
396
+ .join('\n');
397
+ }
398
+ if (newSrcContent !== srcContent) {
399
+ fs.writeFileSync(srcNotePath, newSrcContent, 'utf-8');
400
+ }
401
+ // Clean up empty source attachments folder
402
+ try {
403
+ const remaining = fs.readdirSync(srcFolder).filter((f) => !f.startsWith('.'));
404
+ if (remaining.length === 0) {
405
+ fs.rmdirSync(srcFolder);
406
+ }
407
+ }
408
+ catch { /* ignore cleanup errors */ }
409
+ const newMarkdownLink = toMarkdownLink(destNote.filename, cleanName);
410
+ return {
411
+ success: true,
412
+ movedFrom: getRelativeAttachmentPath(sourceNote.filename, cleanName),
413
+ movedTo: getRelativeAttachmentPath(destNote.filename, cleanName),
414
+ markdownLink: newMarkdownLink,
415
+ sourceNote: { filename: sourceNote.filename, title: sourceNote.title },
416
+ destinationNote: { filename: destNote.filename, title: destNote.title },
417
+ oldLinkRemoved: newSrcContent !== srcContent,
418
+ hint: 'Use noteplan_edit_content to place the markdownLink in the destination note.',
419
+ };
420
+ }
421
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/tools/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=attachments.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.test.d.ts","sourceRoot":"","sources":["../../src/tools/attachments.test.ts"],"names":[],"mappings":""}