@noteplanco/noteplan-mcp 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +257 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +8 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/noteplan/embeddings.d.ts +170 -0
  7. package/dist/noteplan/embeddings.d.ts.map +1 -0
  8. package/dist/noteplan/embeddings.js +684 -0
  9. package/dist/noteplan/embeddings.js.map +1 -0
  10. package/dist/noteplan/file-reader.d.ts +77 -0
  11. package/dist/noteplan/file-reader.d.ts.map +1 -0
  12. package/dist/noteplan/file-reader.js +488 -0
  13. package/dist/noteplan/file-reader.js.map +1 -0
  14. package/dist/noteplan/file-writer.d.ts +108 -0
  15. package/dist/noteplan/file-writer.d.ts.map +1 -0
  16. package/dist/noteplan/file-writer.js +621 -0
  17. package/dist/noteplan/file-writer.js.map +1 -0
  18. package/dist/noteplan/filter-store.d.ts +28 -0
  19. package/dist/noteplan/filter-store.d.ts.map +1 -0
  20. package/dist/noteplan/filter-store.js +180 -0
  21. package/dist/noteplan/filter-store.js.map +1 -0
  22. package/dist/noteplan/frontmatter-parser.d.ts +45 -0
  23. package/dist/noteplan/frontmatter-parser.d.ts.map +1 -0
  24. package/dist/noteplan/frontmatter-parser.js +259 -0
  25. package/dist/noteplan/frontmatter-parser.js.map +1 -0
  26. package/dist/noteplan/fuzzy-search.d.ts +7 -0
  27. package/dist/noteplan/fuzzy-search.d.ts.map +1 -0
  28. package/dist/noteplan/fuzzy-search.js +66 -0
  29. package/dist/noteplan/fuzzy-search.js.map +1 -0
  30. package/dist/noteplan/markdown-parser.d.ts +87 -0
  31. package/dist/noteplan/markdown-parser.d.ts.map +1 -0
  32. package/dist/noteplan/markdown-parser.js +519 -0
  33. package/dist/noteplan/markdown-parser.js.map +1 -0
  34. package/dist/noteplan/preferences.d.ts +44 -0
  35. package/dist/noteplan/preferences.d.ts.map +1 -0
  36. package/dist/noteplan/preferences.js +156 -0
  37. package/dist/noteplan/preferences.js.map +1 -0
  38. package/dist/noteplan/ripgrep-search.d.ts +29 -0
  39. package/dist/noteplan/ripgrep-search.d.ts.map +1 -0
  40. package/dist/noteplan/ripgrep-search.js +110 -0
  41. package/dist/noteplan/ripgrep-search.js.map +1 -0
  42. package/dist/noteplan/sqlite-reader.d.ts +77 -0
  43. package/dist/noteplan/sqlite-reader.d.ts.map +1 -0
  44. package/dist/noteplan/sqlite-reader.js +605 -0
  45. package/dist/noteplan/sqlite-reader.js.map +1 -0
  46. package/dist/noteplan/sqlite-writer.d.ts +63 -0
  47. package/dist/noteplan/sqlite-writer.d.ts.map +1 -0
  48. package/dist/noteplan/sqlite-writer.js +574 -0
  49. package/dist/noteplan/sqlite-writer.js.map +1 -0
  50. package/dist/noteplan/types.d.ts +97 -0
  51. package/dist/noteplan/types.d.ts.map +1 -0
  52. package/dist/noteplan/types.js +33 -0
  53. package/dist/noteplan/types.js.map +1 -0
  54. package/dist/noteplan/unified-store.d.ts +289 -0
  55. package/dist/noteplan/unified-store.d.ts.map +1 -0
  56. package/dist/noteplan/unified-store.js +1308 -0
  57. package/dist/noteplan/unified-store.js.map +1 -0
  58. package/dist/server.d.ts +4 -0
  59. package/dist/server.d.ts.map +1 -0
  60. package/dist/server.js +2468 -0
  61. package/dist/server.js.map +1 -0
  62. package/dist/tools/calendar.d.ts +311 -0
  63. package/dist/tools/calendar.d.ts.map +1 -0
  64. package/dist/tools/calendar.js +504 -0
  65. package/dist/tools/calendar.js.map +1 -0
  66. package/dist/tools/embeddings.d.ts +244 -0
  67. package/dist/tools/embeddings.d.ts.map +1 -0
  68. package/dist/tools/embeddings.js +226 -0
  69. package/dist/tools/embeddings.js.map +1 -0
  70. package/dist/tools/events.d.ts +176 -0
  71. package/dist/tools/events.d.ts.map +1 -0
  72. package/dist/tools/events.js +326 -0
  73. package/dist/tools/events.js.map +1 -0
  74. package/dist/tools/filters.d.ts +205 -0
  75. package/dist/tools/filters.d.ts.map +1 -0
  76. package/dist/tools/filters.js +347 -0
  77. package/dist/tools/filters.js.map +1 -0
  78. package/dist/tools/memory.d.ts +6 -0
  79. package/dist/tools/memory.d.ts.map +1 -0
  80. package/dist/tools/memory.js +161 -0
  81. package/dist/tools/memory.js.map +1 -0
  82. package/dist/tools/notes.d.ts +1221 -0
  83. package/dist/tools/notes.d.ts.map +1 -0
  84. package/dist/tools/notes.js +1868 -0
  85. package/dist/tools/notes.js.map +1 -0
  86. package/dist/tools/plugins.d.ts +140 -0
  87. package/dist/tools/plugins.d.ts.map +1 -0
  88. package/dist/tools/plugins.js +782 -0
  89. package/dist/tools/plugins.js.map +1 -0
  90. package/dist/tools/reminders.d.ts +207 -0
  91. package/dist/tools/reminders.d.ts.map +1 -0
  92. package/dist/tools/reminders.js +323 -0
  93. package/dist/tools/reminders.js.map +1 -0
  94. package/dist/tools/search.d.ts +58 -0
  95. package/dist/tools/search.d.ts.map +1 -0
  96. package/dist/tools/search.js +373 -0
  97. package/dist/tools/search.js.map +1 -0
  98. package/dist/tools/spaces.d.ts +484 -0
  99. package/dist/tools/spaces.d.ts.map +1 -0
  100. package/dist/tools/spaces.js +870 -0
  101. package/dist/tools/spaces.js.map +1 -0
  102. package/dist/tools/tasks.d.ts +313 -0
  103. package/dist/tools/tasks.d.ts.map +1 -0
  104. package/dist/tools/tasks.js +690 -0
  105. package/dist/tools/tasks.js.map +1 -0
  106. package/dist/tools/themes.d.ts +91 -0
  107. package/dist/tools/themes.d.ts.map +1 -0
  108. package/dist/tools/themes.js +294 -0
  109. package/dist/tools/themes.js.map +1 -0
  110. package/dist/tools/ui.d.ts +89 -0
  111. package/dist/tools/ui.d.ts.map +1 -0
  112. package/dist/tools/ui.js +137 -0
  113. package/dist/tools/ui.js.map +1 -0
  114. package/dist/utils/applescript.d.ts +5 -0
  115. package/dist/utils/applescript.d.ts.map +1 -0
  116. package/dist/utils/applescript.js +27 -0
  117. package/dist/utils/applescript.js.map +1 -0
  118. package/dist/utils/confirmation-tokens.d.ts +19 -0
  119. package/dist/utils/confirmation-tokens.d.ts.map +1 -0
  120. package/dist/utils/confirmation-tokens.js +58 -0
  121. package/dist/utils/confirmation-tokens.js.map +1 -0
  122. package/dist/utils/date-filters.d.ts +15 -0
  123. package/dist/utils/date-filters.d.ts.map +1 -0
  124. package/dist/utils/date-filters.js +129 -0
  125. package/dist/utils/date-filters.js.map +1 -0
  126. package/dist/utils/date-utils.d.ts +113 -0
  127. package/dist/utils/date-utils.d.ts.map +1 -0
  128. package/dist/utils/date-utils.js +341 -0
  129. package/dist/utils/date-utils.js.map +1 -0
  130. package/dist/utils/folder-matcher.d.ts +14 -0
  131. package/dist/utils/folder-matcher.d.ts.map +1 -0
  132. package/dist/utils/folder-matcher.js +191 -0
  133. package/dist/utils/folder-matcher.js.map +1 -0
  134. package/dist/utils/version.d.ts +10 -0
  135. package/dist/utils/version.d.ts.map +1 -0
  136. package/dist/utils/version.js +88 -0
  137. package/dist/utils/version.js.map +1 -0
  138. package/docs/plugin-api/Calendar.md +448 -0
  139. package/docs/plugin-api/CalendarItem.md +198 -0
  140. package/docs/plugin-api/Clipboard.md +101 -0
  141. package/docs/plugin-api/CommandBar.md +251 -0
  142. package/docs/plugin-api/DataStore.md +700 -0
  143. package/docs/plugin-api/Editor.md +982 -0
  144. package/docs/plugin-api/HTMLView.md +337 -0
  145. package/docs/plugin-api/NoteObject.md +588 -0
  146. package/docs/plugin-api/NotePlan.md +398 -0
  147. package/docs/plugin-api/ParagraphObject.md +242 -0
  148. package/docs/plugin-api/RangeObject.md +56 -0
  149. package/docs/plugin-api/getting-started.md +545 -0
  150. package/docs/plugin-api/plugin-api-condensed.md +526 -0
  151. package/docs/plugin-api/plugin.json +26 -0
  152. package/docs/plugin-api/script.js +542 -0
  153. package/package.json +60 -0
  154. package/scripts/calendar-helper +0 -0
  155. package/scripts/reminders-helper +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-writer.d.ts","sourceRoot":"","sources":["../../src/noteplan/sqlite-writer.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAqMD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAW,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAyBR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAW,GACnB,MAAM,CAyDR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA4BzE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CA4B5E;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,eAAe,CA4C9F;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAoBpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,mBAAmB,CAAC,EAAE,MAAM,GAC3B,eAAe,CAmBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA2CxF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,eAAe,CAqDhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA2DtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAuEtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAGjD"}
@@ -0,0 +1,574 @@
1
+ // SQLite writer for space notes
2
+ import { getDatabase, listSpaces } from './sqlite-reader.js';
3
+ import { SQLITE_NOTE_TYPES } from './types.js';
4
+ import { v4 as uuidv4 } from 'uuid';
5
+ const SPACE_TRASH_FOLDER_TITLE = '@Trash';
6
+ /**
7
+ * Generate a unique ID for a new note
8
+ */
9
+ function generateNoteId() {
10
+ return uuidv4();
11
+ }
12
+ /**
13
+ * NotePlan's SQLite.swift Date parser expects UTC timestamps without timezone suffix:
14
+ * yyyy-MM-dd'T'HH:mm:ss.SSS
15
+ */
16
+ function currentSqliteTimestamp() {
17
+ return new Date().toISOString().replace('Z', '');
18
+ }
19
+ let mcpChangesTableReady = false;
20
+ function ensureMcpChangesTable(database) {
21
+ if (mcpChangesTableReady)
22
+ return;
23
+ database.prepare(`
24
+ CREATE TABLE IF NOT EXISTS mcp_changes (
25
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
26
+ note_id TEXT NOT NULL,
27
+ old_parent TEXT
28
+ )
29
+ `).run();
30
+ // Add old_parent column if upgrading from older schema
31
+ try {
32
+ database.prepare(`ALTER TABLE mcp_changes ADD COLUMN old_parent TEXT`).run();
33
+ }
34
+ catch {
35
+ // Column already exists
36
+ }
37
+ mcpChangesTableReady = true;
38
+ }
39
+ function queueMcpChange(database, noteId, oldParent) {
40
+ ensureMcpChangesTable(database);
41
+ database.prepare('INSERT INTO mcp_changes (note_id, old_parent) VALUES (?, ?)').run(noteId, oldParent ?? null);
42
+ }
43
+ function getSpaceNode(identifier) {
44
+ const database = getDatabase();
45
+ if (!database) {
46
+ throw new Error('Space database not available');
47
+ }
48
+ const row = database
49
+ .prepare(`
50
+ SELECT id, filename, parent, is_dir, title
51
+ FROM notes
52
+ WHERE id = ? OR filename = ?
53
+ `)
54
+ .get(identifier, identifier);
55
+ if (!row) {
56
+ throw new Error(`Note not found: ${identifier}`);
57
+ }
58
+ return row;
59
+ }
60
+ function findRootSpaceIdForNode(database, nodeId) {
61
+ const row = database
62
+ .prepare(`
63
+ WITH RECURSIVE parent_chain AS (
64
+ SELECT id, parent, note_type FROM notes WHERE id = ?
65
+ UNION ALL
66
+ SELECT n.id, n.parent, n.note_type FROM notes n
67
+ INNER JOIN parent_chain pc ON n.id = pc.parent
68
+ )
69
+ SELECT id FROM parent_chain WHERE note_type = ? LIMIT 1
70
+ `)
71
+ .get(nodeId, SQLITE_NOTE_TYPES.TEAMSPACE);
72
+ if (!row?.id) {
73
+ throw new Error('Could not resolve parent space for note');
74
+ }
75
+ return row.id;
76
+ }
77
+ function validateDestinationFolder(database, destinationParentId, expectedSpaceId) {
78
+ const destination = database
79
+ .prepare(`
80
+ SELECT id, is_dir
81
+ FROM notes
82
+ WHERE id = ?
83
+ `)
84
+ .get(destinationParentId);
85
+ if (!destination) {
86
+ throw new Error(`Destination folder not found: ${destinationParentId}`);
87
+ }
88
+ if (destination.is_dir !== 1) {
89
+ throw new Error(`Destination is not a folder: ${destinationParentId}`);
90
+ }
91
+ const destinationSpaceId = findRootSpaceIdForNode(database, destinationParentId);
92
+ if (destinationSpaceId !== expectedSpaceId) {
93
+ throw new Error('Destination folder must be in the same space');
94
+ }
95
+ }
96
+ function isDescendantFolder(database, potentialChildId, ancestorId) {
97
+ const row = database
98
+ .prepare(`
99
+ WITH RECURSIVE parent_chain AS (
100
+ SELECT id, parent FROM notes WHERE id = ?
101
+ UNION ALL
102
+ SELECT n.id, n.parent FROM notes n
103
+ INNER JOIN parent_chain pc ON n.id = pc.parent
104
+ )
105
+ SELECT 1 AS found
106
+ FROM parent_chain
107
+ WHERE id = ?
108
+ LIMIT 1
109
+ `)
110
+ .get(potentialChildId, ancestorId);
111
+ return Boolean(row?.found);
112
+ }
113
+ function ensureSpaceTrashFolder(spaceId) {
114
+ const database = getDatabase();
115
+ if (!database) {
116
+ throw new Error('Space database not available');
117
+ }
118
+ const existing = database
119
+ .prepare(`
120
+ SELECT id
121
+ FROM notes
122
+ WHERE is_dir = 1
123
+ AND parent = ?
124
+ AND lower(title) = lower(?)
125
+ LIMIT 1
126
+ `)
127
+ .get(spaceId, SPACE_TRASH_FOLDER_TITLE);
128
+ if (existing?.id)
129
+ return existing.id;
130
+ const folderId = generateNoteId();
131
+ const filename = `%%NotePlanCloud%%/${spaceId}/${folderId}`;
132
+ const now = currentSqliteTimestamp();
133
+ database
134
+ .prepare(`
135
+ INSERT INTO notes (id, content, note_type, title, filename, parent, is_dir, created_at, modified_at)
136
+ VALUES (?, '', ?, ?, ?, ?, 1, ?, ?)
137
+ `)
138
+ .run(folderId, SQLITE_NOTE_TYPES.TEAMSPACE_NOTE, SPACE_TRASH_FOLDER_TITLE, filename, spaceId, now, now);
139
+ queueMcpChange(database, folderId);
140
+ return folderId;
141
+ }
142
+ function isNoteInSpaceTrash(database, noteId) {
143
+ const row = database
144
+ .prepare(`
145
+ WITH RECURSIVE parent_chain AS (
146
+ SELECT id, parent, is_dir, title FROM notes WHERE id = ?
147
+ UNION ALL
148
+ SELECT n.id, n.parent, n.is_dir, n.title FROM notes n
149
+ INNER JOIN parent_chain pc ON n.id = pc.parent
150
+ )
151
+ SELECT id
152
+ FROM parent_chain
153
+ WHERE is_dir = 1 AND lower(title) = lower(?)
154
+ LIMIT 1
155
+ `)
156
+ .get(noteId, SPACE_TRASH_FOLDER_TITLE);
157
+ return Boolean(row?.id);
158
+ }
159
+ /**
160
+ * Create a new note in a space
161
+ */
162
+ export function createSpaceNote(spaceId, title, content = '', parent) {
163
+ const database = getDatabase();
164
+ if (!database) {
165
+ throw new Error('Space database not available');
166
+ }
167
+ const noteId = generateNoteId();
168
+ const filename = `%%NotePlanCloud%%/${spaceId}/${noteId}`;
169
+ const now = currentSqliteTimestamp();
170
+ try {
171
+ database
172
+ .prepare(`
173
+ INSERT INTO notes (id, content, note_type, title, filename, parent, is_dir, created_at, modified_at)
174
+ VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?)
175
+ `)
176
+ .run(noteId, content, SQLITE_NOTE_TYPES.TEAMSPACE_NOTE, title, filename, parent || spaceId, now, now);
177
+ queueMcpChange(database, noteId);
178
+ return filename;
179
+ }
180
+ catch (error) {
181
+ console.error('Error creating space note:', error);
182
+ throw new Error(`Failed to create space note: ${error instanceof Error ? error.message : 'unknown error'}`);
183
+ }
184
+ }
185
+ /**
186
+ * Create a calendar note in a space
187
+ */
188
+ export function createSpaceCalendarNote(spaceId, dateStr, content = '') {
189
+ const database = getDatabase();
190
+ if (!database) {
191
+ throw new Error('Space database not available');
192
+ }
193
+ const noteId = generateNoteId();
194
+ const canonicalFilename = `${dateStr}.md`;
195
+ const now = currentSqliteTimestamp();
196
+ try {
197
+ const existing = database
198
+ .prepare(`
199
+ SELECT id
200
+ FROM notes
201
+ WHERE note_type = ?
202
+ AND is_dir = 0
203
+ AND parent = ?
204
+ AND (filename = ? OR title = ?)
205
+ LIMIT 1
206
+ `)
207
+ .get(SQLITE_NOTE_TYPES.TEAMSPACE_CALENDAR, spaceId, canonicalFilename, dateStr);
208
+ if (existing?.id) {
209
+ return canonicalFilename;
210
+ }
211
+ database
212
+ .prepare(`
213
+ INSERT INTO notes (id, content, note_type, title, filename, parent, is_dir, created_at, modified_at)
214
+ VALUES (?, ?, ?, ?, ?, ?, 0, ?, ?)
215
+ `)
216
+ .run(noteId, content, SQLITE_NOTE_TYPES.TEAMSPACE_CALENDAR, dateStr, canonicalFilename, spaceId, now, now);
217
+ queueMcpChange(database, noteId);
218
+ return canonicalFilename;
219
+ }
220
+ catch (error) {
221
+ console.error('Error creating space calendar note:', error);
222
+ throw new Error(`Failed to create space calendar note: ${error instanceof Error ? error.message : 'unknown error'}`);
223
+ }
224
+ }
225
+ /**
226
+ * Update a space note's content
227
+ */
228
+ export function updateSpaceNote(identifier, content) {
229
+ const database = getDatabase();
230
+ if (!database) {
231
+ throw new Error('Space database not available');
232
+ }
233
+ const node = getSpaceNode(identifier);
234
+ const now = currentSqliteTimestamp();
235
+ try {
236
+ const result = database
237
+ .prepare(`
238
+ UPDATE notes
239
+ SET content = ?, modified_at = ?
240
+ WHERE id = ?
241
+ `)
242
+ .run(content, now, node.id);
243
+ if (result.changes === 0) {
244
+ throw new Error(`Note not found: ${identifier}`);
245
+ }
246
+ queueMcpChange(database, node.id);
247
+ }
248
+ catch (error) {
249
+ console.error('Error updating space note:', error);
250
+ throw new Error(`Failed to update space note: ${error instanceof Error ? error.message : 'unknown error'}`);
251
+ }
252
+ }
253
+ /**
254
+ * Update a space note's title
255
+ */
256
+ export function updateSpaceNoteTitle(identifier, title) {
257
+ const database = getDatabase();
258
+ if (!database) {
259
+ throw new Error('Space database not available');
260
+ }
261
+ const node = getSpaceNode(identifier);
262
+ const now = currentSqliteTimestamp();
263
+ try {
264
+ const result = database
265
+ .prepare(`
266
+ UPDATE notes
267
+ SET title = ?, modified_at = ?
268
+ WHERE id = ?
269
+ `)
270
+ .run(title, now, node.id);
271
+ if (result.changes === 0) {
272
+ throw new Error(`Note not found: ${identifier}`);
273
+ }
274
+ queueMcpChange(database, node.id);
275
+ }
276
+ catch (error) {
277
+ console.error('Error updating space note title:', error);
278
+ throw new Error(`Failed to update space note title: ${error instanceof Error ? error.message : 'unknown error'}`);
279
+ }
280
+ }
281
+ /**
282
+ * Move a space note to another folder in the same space
283
+ */
284
+ export function moveSpaceNote(identifier, destinationParentId) {
285
+ const database = getDatabase();
286
+ if (!database) {
287
+ throw new Error('Space database not available');
288
+ }
289
+ const node = getSpaceNode(identifier);
290
+ if (node.is_dir === 1) {
291
+ throw new Error('Moving folders is not supported by this operation');
292
+ }
293
+ const spaceId = findRootSpaceIdForNode(database, node.id);
294
+ validateDestinationFolder(database, destinationParentId, spaceId);
295
+ if (node.parent === destinationParentId) {
296
+ throw new Error('Note is already in the destination folder');
297
+ }
298
+ const now = currentSqliteTimestamp();
299
+ try {
300
+ const result = database
301
+ .prepare(`
302
+ UPDATE notes
303
+ SET parent = ?, modified_at = ?
304
+ WHERE id = ?
305
+ `)
306
+ .run(destinationParentId, now, node.id);
307
+ if (result.changes === 0) {
308
+ throw new Error(`Note not found: ${identifier}`);
309
+ }
310
+ queueMcpChange(database, node.id, node.parent ?? undefined);
311
+ return {
312
+ noteId: node.id,
313
+ previousParent: node.parent,
314
+ destinationParentId,
315
+ };
316
+ }
317
+ catch (error) {
318
+ console.error('Error moving space note:', error);
319
+ throw new Error(`Failed to move space note: ${error instanceof Error ? error.message : 'unknown error'}`);
320
+ }
321
+ }
322
+ /**
323
+ * Delete a space note by moving it into the space @Trash folder
324
+ */
325
+ export function deleteSpaceNote(identifier) {
326
+ const database = getDatabase();
327
+ if (!database) {
328
+ throw new Error('Space database not available');
329
+ }
330
+ const node = getSpaceNode(identifier);
331
+ if (node.is_dir === 1) {
332
+ throw new Error('Deleting folders is not supported by this operation');
333
+ }
334
+ const spaceId = findRootSpaceIdForNode(database, node.id);
335
+ const trashFolderId = ensureSpaceTrashFolder(spaceId);
336
+ const moveResult = moveSpaceNote(identifier, trashFolderId);
337
+ return {
338
+ ...moveResult,
339
+ spaceId,
340
+ trashFolderId,
341
+ };
342
+ }
343
+ /**
344
+ * Restore a space note from @Trash
345
+ */
346
+ export function restoreSpaceNote(identifier, destinationParentId) {
347
+ const database = getDatabase();
348
+ if (!database) {
349
+ throw new Error('Space database not available');
350
+ }
351
+ const node = getSpaceNode(identifier);
352
+ if (node.is_dir === 1) {
353
+ throw new Error('Restoring folders is not supported by this operation');
354
+ }
355
+ if (!isNoteInSpaceTrash(database, node.id)) {
356
+ throw new Error('Note is not in TeamSpace @Trash');
357
+ }
358
+ const spaceId = findRootSpaceIdForNode(database, node.id);
359
+ const targetParentId = destinationParentId && destinationParentId.trim().length > 0
360
+ ? destinationParentId.trim()
361
+ : spaceId;
362
+ return moveSpaceNote(identifier, targetParentId);
363
+ }
364
+ /**
365
+ * Create a folder in a space
366
+ */
367
+ export function createSpaceFolder(spaceId, name, parent) {
368
+ const database = getDatabase();
369
+ if (!database) {
370
+ throw new Error('Space database not available');
371
+ }
372
+ const normalizedName = name.trim();
373
+ if (!normalizedName) {
374
+ throw new Error('Folder name is required');
375
+ }
376
+ if (normalizedName.includes('/')) {
377
+ throw new Error('Folder name must not contain "/"');
378
+ }
379
+ const parentId = parent?.trim() || spaceId;
380
+ validateDestinationFolder(database, parentId, spaceId);
381
+ const folderId = generateNoteId();
382
+ const filename = `%%NotePlanCloud%%/${spaceId}/${folderId}`;
383
+ const now = currentSqliteTimestamp();
384
+ try {
385
+ database
386
+ .prepare(`
387
+ INSERT INTO notes (id, content, note_type, title, filename, parent, is_dir, created_at, modified_at)
388
+ VALUES (?, '', ?, ?, ?, ?, 1, ?, ?)
389
+ `).run(folderId, SQLITE_NOTE_TYPES.TEAMSPACE_NOTE, normalizedName, filename, parentId || null, now, now);
390
+ queueMcpChange(database, folderId);
391
+ return folderId;
392
+ }
393
+ catch (error) {
394
+ console.error('Error creating space folder:', error);
395
+ throw new Error(`Failed to create space folder: ${error instanceof Error ? error.message : 'unknown error'}`);
396
+ }
397
+ }
398
+ /**
399
+ * Move a space folder to another folder in the same space
400
+ */
401
+ export function moveSpaceFolder(identifier, destinationParentId) {
402
+ const database = getDatabase();
403
+ if (!database) {
404
+ throw new Error('Space database not available');
405
+ }
406
+ const node = getSpaceNode(identifier);
407
+ if (node.is_dir !== 1) {
408
+ throw new Error('Only folders can be moved with this operation');
409
+ }
410
+ const spaceId = findRootSpaceIdForNode(database, node.id);
411
+ if (node.id === spaceId) {
412
+ throw new Error('Space root cannot be moved');
413
+ }
414
+ validateDestinationFolder(database, destinationParentId, spaceId);
415
+ if (destinationParentId === node.id) {
416
+ throw new Error('Destination folder cannot be the same as source folder');
417
+ }
418
+ if (node.parent === destinationParentId) {
419
+ throw new Error('Folder is already in the destination folder');
420
+ }
421
+ if (isDescendantFolder(database, destinationParentId, node.id)) {
422
+ throw new Error('Cannot move a folder into one of its descendants');
423
+ }
424
+ const now = currentSqliteTimestamp();
425
+ try {
426
+ const result = database
427
+ .prepare(`
428
+ UPDATE notes
429
+ SET parent = ?, modified_at = ?
430
+ WHERE id = ?
431
+ `)
432
+ .run(destinationParentId, now, node.id);
433
+ if (result.changes === 0) {
434
+ throw new Error(`Folder not found: ${identifier}`);
435
+ }
436
+ queueMcpChange(database, node.id, node.parent ?? undefined);
437
+ return {
438
+ noteId: node.id,
439
+ previousParent: node.parent,
440
+ destinationParentId,
441
+ };
442
+ }
443
+ catch (error) {
444
+ console.error('Error moving space folder:', error);
445
+ throw new Error(`Failed to move space folder: ${error instanceof Error ? error.message : 'unknown error'}`);
446
+ }
447
+ }
448
+ /**
449
+ * Delete a space folder by moving it into the space @Trash folder
450
+ */
451
+ export function deleteSpaceFolder(identifier) {
452
+ const database = getDatabase();
453
+ if (!database) {
454
+ throw new Error('Space database not available');
455
+ }
456
+ const node = getSpaceNode(identifier);
457
+ if (node.is_dir !== 1) {
458
+ throw new Error('Only folders can be deleted with this operation');
459
+ }
460
+ const spaceId = findRootSpaceIdForNode(database, node.id);
461
+ if (node.id === spaceId) {
462
+ throw new Error('Space root cannot be deleted');
463
+ }
464
+ // Prevent deleting the @Trash folder itself
465
+ if (node.title?.toLowerCase() === SPACE_TRASH_FOLDER_TITLE.toLowerCase() && node.parent === spaceId) {
466
+ throw new Error('Cannot delete the @Trash folder');
467
+ }
468
+ const trashFolderId = ensureSpaceTrashFolder(spaceId);
469
+ // Prevent moving trash into itself
470
+ if (node.id === trashFolderId) {
471
+ throw new Error('Cannot delete the @Trash folder');
472
+ }
473
+ if (isDescendantFolder(database, node.id, trashFolderId)) {
474
+ throw new Error('Folder is already in @Trash');
475
+ }
476
+ const now = currentSqliteTimestamp();
477
+ try {
478
+ const result = database
479
+ .prepare(`
480
+ UPDATE notes
481
+ SET parent = ?, modified_at = ?
482
+ WHERE id = ?
483
+ `)
484
+ .run(trashFolderId, now, node.id);
485
+ if (result.changes === 0) {
486
+ throw new Error(`Folder not found: ${identifier}`);
487
+ }
488
+ queueMcpChange(database, node.id, node.parent ?? undefined);
489
+ return {
490
+ noteId: node.id,
491
+ previousParent: node.parent,
492
+ destinationParentId: trashFolderId,
493
+ spaceId,
494
+ trashFolderId,
495
+ };
496
+ }
497
+ catch (error) {
498
+ console.error('Error deleting space folder:', error);
499
+ throw new Error(`Failed to delete space folder: ${error instanceof Error ? error.message : 'unknown error'}`);
500
+ }
501
+ }
502
+ /**
503
+ * Rename a space folder in place
504
+ */
505
+ export function renameSpaceFolder(identifier, title) {
506
+ const database = getDatabase();
507
+ if (!database) {
508
+ throw new Error('Space database not available');
509
+ }
510
+ const node = getSpaceNode(identifier);
511
+ if (node.is_dir !== 1) {
512
+ throw new Error('Only folders can be renamed with this operation');
513
+ }
514
+ const spaceId = findRootSpaceIdForNode(database, node.id);
515
+ if (node.id === spaceId) {
516
+ throw new Error('Space root cannot be renamed');
517
+ }
518
+ const normalizedTitle = title.trim();
519
+ if (!normalizedTitle) {
520
+ throw new Error('Folder title is required');
521
+ }
522
+ if (normalizedTitle.includes('/')) {
523
+ throw new Error('Folder title must not contain "/"');
524
+ }
525
+ const currentTitle = node.title?.trim() || '';
526
+ if (currentTitle === normalizedTitle) {
527
+ throw new Error('New folder title matches current title');
528
+ }
529
+ const duplicate = database
530
+ .prepare(`
531
+ SELECT id
532
+ FROM notes
533
+ WHERE is_dir = 1
534
+ AND parent IS ?
535
+ AND lower(title) = lower(?)
536
+ AND id != ?
537
+ LIMIT 1
538
+ `)
539
+ .get(node.parent, normalizedTitle, node.id);
540
+ if (duplicate?.id) {
541
+ throw new Error('A sibling folder with this title already exists');
542
+ }
543
+ const now = currentSqliteTimestamp();
544
+ try {
545
+ const result = database
546
+ .prepare(`
547
+ UPDATE notes
548
+ SET title = ?, modified_at = ?
549
+ WHERE id = ?
550
+ `)
551
+ .run(normalizedTitle, now, node.id);
552
+ if (result.changes === 0) {
553
+ throw new Error(`Folder not found: ${identifier}`);
554
+ }
555
+ queueMcpChange(database, node.id);
556
+ return {
557
+ folderId: node.id,
558
+ previousTitle: currentTitle,
559
+ title: normalizedTitle,
560
+ };
561
+ }
562
+ catch (error) {
563
+ console.error('Error renaming space folder:', error);
564
+ throw new Error(`Failed to rename space folder: ${error instanceof Error ? error.message : 'unknown error'}`);
565
+ }
566
+ }
567
+ /**
568
+ * Get the default space ID (first one found)
569
+ */
570
+ export function getDefaultSpaceId() {
571
+ const spaces = listSpaces();
572
+ return spaces.length > 0 ? spaces[0].id : null;
573
+ }
574
+ //# sourceMappingURL=sqlite-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-writer.js","sourceRoot":"","sources":["../../src/noteplan/sqlite-writer.ts"],"names":[],"mappings":"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"}