@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.
- package/README.md +257 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/noteplan/embeddings.d.ts +170 -0
- package/dist/noteplan/embeddings.d.ts.map +1 -0
- package/dist/noteplan/embeddings.js +684 -0
- package/dist/noteplan/embeddings.js.map +1 -0
- package/dist/noteplan/file-reader.d.ts +77 -0
- package/dist/noteplan/file-reader.d.ts.map +1 -0
- package/dist/noteplan/file-reader.js +488 -0
- package/dist/noteplan/file-reader.js.map +1 -0
- package/dist/noteplan/file-writer.d.ts +108 -0
- package/dist/noteplan/file-writer.d.ts.map +1 -0
- package/dist/noteplan/file-writer.js +621 -0
- package/dist/noteplan/file-writer.js.map +1 -0
- package/dist/noteplan/filter-store.d.ts +28 -0
- package/dist/noteplan/filter-store.d.ts.map +1 -0
- package/dist/noteplan/filter-store.js +180 -0
- package/dist/noteplan/filter-store.js.map +1 -0
- package/dist/noteplan/frontmatter-parser.d.ts +45 -0
- package/dist/noteplan/frontmatter-parser.d.ts.map +1 -0
- package/dist/noteplan/frontmatter-parser.js +259 -0
- package/dist/noteplan/frontmatter-parser.js.map +1 -0
- package/dist/noteplan/fuzzy-search.d.ts +7 -0
- package/dist/noteplan/fuzzy-search.d.ts.map +1 -0
- package/dist/noteplan/fuzzy-search.js +66 -0
- package/dist/noteplan/fuzzy-search.js.map +1 -0
- package/dist/noteplan/markdown-parser.d.ts +87 -0
- package/dist/noteplan/markdown-parser.d.ts.map +1 -0
- package/dist/noteplan/markdown-parser.js +519 -0
- package/dist/noteplan/markdown-parser.js.map +1 -0
- package/dist/noteplan/preferences.d.ts +44 -0
- package/dist/noteplan/preferences.d.ts.map +1 -0
- package/dist/noteplan/preferences.js +156 -0
- package/dist/noteplan/preferences.js.map +1 -0
- package/dist/noteplan/ripgrep-search.d.ts +29 -0
- package/dist/noteplan/ripgrep-search.d.ts.map +1 -0
- package/dist/noteplan/ripgrep-search.js +110 -0
- package/dist/noteplan/ripgrep-search.js.map +1 -0
- package/dist/noteplan/sqlite-reader.d.ts +77 -0
- package/dist/noteplan/sqlite-reader.d.ts.map +1 -0
- package/dist/noteplan/sqlite-reader.js +605 -0
- package/dist/noteplan/sqlite-reader.js.map +1 -0
- package/dist/noteplan/sqlite-writer.d.ts +63 -0
- package/dist/noteplan/sqlite-writer.d.ts.map +1 -0
- package/dist/noteplan/sqlite-writer.js +574 -0
- package/dist/noteplan/sqlite-writer.js.map +1 -0
- package/dist/noteplan/types.d.ts +97 -0
- package/dist/noteplan/types.d.ts.map +1 -0
- package/dist/noteplan/types.js +33 -0
- package/dist/noteplan/types.js.map +1 -0
- package/dist/noteplan/unified-store.d.ts +289 -0
- package/dist/noteplan/unified-store.d.ts.map +1 -0
- package/dist/noteplan/unified-store.js +1308 -0
- package/dist/noteplan/unified-store.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2468 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/calendar.d.ts +311 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +504 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/embeddings.d.ts +244 -0
- package/dist/tools/embeddings.d.ts.map +1 -0
- package/dist/tools/embeddings.js +226 -0
- package/dist/tools/embeddings.js.map +1 -0
- package/dist/tools/events.d.ts +176 -0
- package/dist/tools/events.d.ts.map +1 -0
- package/dist/tools/events.js +326 -0
- package/dist/tools/events.js.map +1 -0
- package/dist/tools/filters.d.ts +205 -0
- package/dist/tools/filters.d.ts.map +1 -0
- package/dist/tools/filters.js +347 -0
- package/dist/tools/filters.js.map +1 -0
- package/dist/tools/memory.d.ts +6 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +161 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/notes.d.ts +1221 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +1868 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/plugins.d.ts +140 -0
- package/dist/tools/plugins.d.ts.map +1 -0
- package/dist/tools/plugins.js +782 -0
- package/dist/tools/plugins.js.map +1 -0
- package/dist/tools/reminders.d.ts +207 -0
- package/dist/tools/reminders.d.ts.map +1 -0
- package/dist/tools/reminders.js +323 -0
- package/dist/tools/reminders.js.map +1 -0
- package/dist/tools/search.d.ts +58 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +373 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/spaces.d.ts +484 -0
- package/dist/tools/spaces.d.ts.map +1 -0
- package/dist/tools/spaces.js +870 -0
- package/dist/tools/spaces.js.map +1 -0
- package/dist/tools/tasks.d.ts +313 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +690 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/themes.d.ts +91 -0
- package/dist/tools/themes.d.ts.map +1 -0
- package/dist/tools/themes.js +294 -0
- package/dist/tools/themes.js.map +1 -0
- package/dist/tools/ui.d.ts +89 -0
- package/dist/tools/ui.d.ts.map +1 -0
- package/dist/tools/ui.js +137 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/utils/applescript.d.ts +5 -0
- package/dist/utils/applescript.d.ts.map +1 -0
- package/dist/utils/applescript.js +27 -0
- package/dist/utils/applescript.js.map +1 -0
- package/dist/utils/confirmation-tokens.d.ts +19 -0
- package/dist/utils/confirmation-tokens.d.ts.map +1 -0
- package/dist/utils/confirmation-tokens.js +58 -0
- package/dist/utils/confirmation-tokens.js.map +1 -0
- package/dist/utils/date-filters.d.ts +15 -0
- package/dist/utils/date-filters.d.ts.map +1 -0
- package/dist/utils/date-filters.js +129 -0
- package/dist/utils/date-filters.js.map +1 -0
- package/dist/utils/date-utils.d.ts +113 -0
- package/dist/utils/date-utils.d.ts.map +1 -0
- package/dist/utils/date-utils.js +341 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/dist/utils/folder-matcher.d.ts +14 -0
- package/dist/utils/folder-matcher.d.ts.map +1 -0
- package/dist/utils/folder-matcher.js +191 -0
- package/dist/utils/folder-matcher.js.map +1 -0
- package/dist/utils/version.d.ts +10 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +88 -0
- package/dist/utils/version.js.map +1 -0
- package/docs/plugin-api/Calendar.md +448 -0
- package/docs/plugin-api/CalendarItem.md +198 -0
- package/docs/plugin-api/Clipboard.md +101 -0
- package/docs/plugin-api/CommandBar.md +251 -0
- package/docs/plugin-api/DataStore.md +700 -0
- package/docs/plugin-api/Editor.md +982 -0
- package/docs/plugin-api/HTMLView.md +337 -0
- package/docs/plugin-api/NoteObject.md +588 -0
- package/docs/plugin-api/NotePlan.md +398 -0
- package/docs/plugin-api/ParagraphObject.md +242 -0
- package/docs/plugin-api/RangeObject.md +56 -0
- package/docs/plugin-api/getting-started.md +545 -0
- package/docs/plugin-api/plugin-api-condensed.md +526 -0
- package/docs/plugin-api/plugin.json +26 -0
- package/docs/plugin-api/script.js +542 -0
- package/package.json +60 -0
- package/scripts/calendar-helper +0 -0
- 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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"}
|