@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.
- package/dist/noteplan/file-writer.d.ts.map +1 -1
- package/dist/noteplan/file-writer.js +73 -16
- package/dist/noteplan/file-writer.js.map +1 -1
- package/dist/noteplan/file-writer.test.d.ts +2 -0
- package/dist/noteplan/file-writer.test.d.ts.map +1 -0
- package/dist/noteplan/file-writer.test.js +892 -0
- package/dist/noteplan/file-writer.test.js.map +1 -0
- package/dist/noteplan/filter-store.d.ts.map +1 -1
- package/dist/noteplan/filter-store.js +13 -1
- package/dist/noteplan/filter-store.js.map +1 -1
- package/dist/noteplan/frontmatter-parser.d.ts +10 -1
- package/dist/noteplan/frontmatter-parser.d.ts.map +1 -1
- package/dist/noteplan/frontmatter-parser.js +66 -10
- package/dist/noteplan/frontmatter-parser.js.map +1 -1
- package/dist/noteplan/frontmatter-parser.test.js +484 -1
- package/dist/noteplan/frontmatter-parser.test.js.map +1 -1
- package/dist/noteplan/markdown-parser.d.ts +6 -1
- package/dist/noteplan/markdown-parser.d.ts.map +1 -1
- package/dist/noteplan/markdown-parser.js +21 -44
- package/dist/noteplan/markdown-parser.js.map +1 -1
- package/dist/noteplan/markdown-parser.test.d.ts +2 -0
- package/dist/noteplan/markdown-parser.test.d.ts.map +1 -0
- package/dist/noteplan/markdown-parser.test.js +653 -0
- package/dist/noteplan/markdown-parser.test.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +405 -205
- package/dist/server.js.map +1 -1
- package/dist/tools/attachments.d.ts +151 -0
- package/dist/tools/attachments.d.ts.map +1 -0
- package/dist/tools/attachments.js +421 -0
- package/dist/tools/attachments.js.map +1 -0
- package/dist/tools/attachments.test.d.ts +2 -0
- package/dist/tools/attachments.test.d.ts.map +1 -0
- package/dist/tools/attachments.test.js +561 -0
- package/dist/tools/attachments.test.js.map +1 -0
- package/dist/tools/calendar.d.ts +5 -5
- package/dist/tools/notes.d.ts +67 -26
- package/dist/tools/notes.d.ts.map +1 -1
- package/dist/tools/notes.js +124 -33
- package/dist/tools/notes.js.map +1 -1
- package/dist/tools/notes.test.d.ts +2 -0
- package/dist/tools/notes.test.d.ts.map +1 -0
- package/dist/tools/notes.test.js +598 -0
- package/dist/tools/notes.test.js.map +1 -0
- package/dist/tools/reminders.d.ts +4 -4
- package/dist/tools/tasks.d.ts +10 -10
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +14 -27
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/templates.d.ts +69 -0
- package/dist/tools/templates.d.ts.map +1 -0
- package/dist/tools/templates.js +145 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/tools/templates.test.d.ts +2 -0
- package/dist/tools/templates.test.d.ts.map +1 -0
- package/dist/tools/templates.test.js +48 -0
- package/dist/tools/templates.test.js.map +1 -0
- package/dist/tools/ui.d.ts +2 -0
- package/dist/tools/ui.d.ts.map +1 -1
- package/dist/tools/ui.js +24 -0
- package/dist/tools/ui.js.map +1 -1
- package/dist/utils/applescript.d.ts.map +1 -1
- package/dist/utils/applescript.js +21 -0
- package/dist/utils/applescript.js.map +1 -1
- package/dist/utils/confirmation-tokens.test.d.ts +2 -0
- package/dist/utils/confirmation-tokens.test.d.ts.map +1 -0
- package/dist/utils/confirmation-tokens.test.js +159 -0
- package/dist/utils/confirmation-tokens.test.js.map +1 -0
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -1
- package/dist/utils/version.js +4 -0
- package/dist/utils/version.js.map +1 -1
- 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: 
|
|
96
|
+
* Files: 
|
|
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 ``;
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.test.d.ts","sourceRoot":"","sources":["../../src/tools/attachments.test.ts"],"names":[],"mappings":""}
|