@batalabs/virlow-mcp-core 3.101.0 → 3.102.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/dist/todos.js ADDED
@@ -0,0 +1,380 @@
1
+ import { bytesToBase64, decryptNoteFields, encryptNoteFields } from '@batalabs/virlow-crypto';
2
+ import { REPEATS, SMART_LISTS, TODO_LIST_NOTE_TYPE, TODO_NOTE_TYPE, completedTasks, dayKey, listKey, newId, nextRepeat, openTasks, parseDetails, parseListMeta, serializeDetails, serializeListMeta, } from './todo-format.js';
3
+ /**
4
+ * The to-do list over the API, for the MCP tools.
5
+ *
6
+ * Tasks and lists are notes the API never lists with the rest (types `todo`
7
+ * and `todolist`), encrypted like any note: the text and every detail are in
8
+ * the ciphertext, and the server sees only whether a task is done and, through
9
+ * a reminder, when to send one. The format is todo-format.ts, shared with the
10
+ * web app and mirrored by iOS, so a task written here reads the same there.
11
+ *
12
+ * Nothing is cached: a to-do list is small, and the apps change it all the
13
+ * time, so every call reads the current state.
14
+ */
15
+ /** Smart list names as a tool takes them. */
16
+ const SMART_ALIASES = {
17
+ my_day: 'myday',
18
+ myday: 'myday',
19
+ 'my day': 'myday',
20
+ important: 'important',
21
+ planned: 'planned',
22
+ tasks: 'tasks',
23
+ };
24
+ const DAY = /^\d{4}-\d{2}-\d{2}$/;
25
+ const HEX = /^#[0-9a-f]{6}$/i;
26
+ const NOTE_PREVIEW = 200;
27
+ export class TodoService {
28
+ api;
29
+ vault;
30
+ now;
31
+ constructor(api, vault,
32
+ /** The clock, for "today" and reminder checks. Tests pass a fixed one. */
33
+ now = () => new Date()) {
34
+ this.api = api;
35
+ this.vault = vault;
36
+ this.now = now;
37
+ }
38
+ today() {
39
+ return dayKey(this.now());
40
+ }
41
+ /** The key, or the vault's own "ask the user to unlock" error. */
42
+ key() {
43
+ return this.vault.session.key;
44
+ }
45
+ // MARK: Reading
46
+ async fetchAll(type) {
47
+ const rows = [];
48
+ for (let page = 1;; page++) {
49
+ const result = await this.api.listNotes({ type, deleted: false, limit: 50, page });
50
+ rows.push(...result.notes);
51
+ if (page >= result.pagination.pages || result.notes.length === 0)
52
+ break;
53
+ }
54
+ // Filtered here too: an API that predates the type ignores the filter.
55
+ return rows.filter((row) => row.type === type && row.deleted !== true);
56
+ }
57
+ async decrypt(key, row) {
58
+ if (!row.encryptedTitle)
59
+ return { title: row.title, content: row.content === '[ENCRYPTED]' ? '' : row.content };
60
+ try {
61
+ return await decryptNoteFields(key, row.encryptedTitle, row.encryptedContent ?? '', row.iv ?? '');
62
+ }
63
+ catch {
64
+ // A row that will not open (another key, a damaged write) is left out
65
+ // rather than failing the whole list.
66
+ return null;
67
+ }
68
+ }
69
+ async load() {
70
+ const key = this.key();
71
+ const [taskRows, listRows] = await Promise.all([this.fetchAll(TODO_NOTE_TYPE), this.fetchAll(TODO_LIST_NOTE_TYPE)]);
72
+ const tasks = [];
73
+ for (const row of taskRows) {
74
+ const opened = await this.decrypt(key, row);
75
+ if (!opened)
76
+ continue;
77
+ tasks.push({
78
+ id: row.id,
79
+ title: opened.title,
80
+ details: parseDetails(opened.content),
81
+ done: row.archived === true,
82
+ createdAt: row.createdAt,
83
+ updatedAt: row.updatedAt,
84
+ });
85
+ }
86
+ const lists = [];
87
+ for (const row of listRows) {
88
+ const opened = await this.decrypt(key, row);
89
+ if (!opened)
90
+ continue;
91
+ lists.push({ id: row.id, name: opened.title, meta: parseListMeta(opened.content), createdAt: row.createdAt });
92
+ }
93
+ lists.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
94
+ return { tasks, lists };
95
+ }
96
+ /** A list by id or name (case-insensitive). Never guesses between two
97
+ * lists with one name, and never makes one up. */
98
+ resolveList(lists, ref) {
99
+ const byId = lists.find((l) => l.id === ref);
100
+ if (byId)
101
+ return byId;
102
+ const wanted = ref.trim().toLowerCase();
103
+ const named = lists.filter((l) => l.name.trim().toLowerCase() === wanted);
104
+ if (named.length === 1)
105
+ return named[0];
106
+ if (named.length > 1) {
107
+ throw new Error(`More than one list is called "${ref}". Use its id: ${named.map((l) => l.id).join(', ')}.`);
108
+ }
109
+ const known = lists.length ? lists.map((l) => `"${l.name}"`).join(', ') : 'none yet';
110
+ throw new Error(`No to-do list called "${ref}". The person's lists: ${known}. ` +
111
+ 'Use one of those, leave list out for Tasks, or call create_todo_list if they asked for a new one.');
112
+ }
113
+ scopeOf(lists, ref) {
114
+ if (ref === undefined || ref.trim() === '')
115
+ return null;
116
+ const smart = SMART_ALIASES[ref.trim().toLowerCase()];
117
+ if (smart)
118
+ return smart;
119
+ return listKey(this.resolveList(lists, ref).id);
120
+ }
121
+ listName(lists, id) {
122
+ if (id === null)
123
+ return 'Tasks';
124
+ return lists.find((l) => l.id === id)?.name ?? 'Tasks';
125
+ }
126
+ describe(task, lists) {
127
+ const d = task.details;
128
+ const today = this.today();
129
+ const parts = [`list: ${this.listName(lists, d.list)}`];
130
+ if (d.due)
131
+ parts.push(`due ${d.due}${!task.done && d.due < today ? ' (overdue)' : ''}`);
132
+ if (d.myDay === today)
133
+ parts.push('in My Day');
134
+ if (d.important)
135
+ parts.push('important');
136
+ if (d.repeat)
137
+ parts.push(`repeats ${d.repeat}`);
138
+ if (d.remindAt)
139
+ parts.push(`remind at ${d.remindAt}`);
140
+ if (task.done && d.completedAt)
141
+ parts.push(`completed ${d.completedAt}`);
142
+ const lines = [`- [${task.done ? 'x' : ' '}] ${task.title} (id: ${task.id})`, ` ${parts.join(' · ')}`];
143
+ if (d.steps.length) {
144
+ const done = d.steps.filter((s) => s.done).length;
145
+ const steps = d.steps.map((s) => `[${s.done ? 'x' : ' '}] ${s.text} (id: ${s.id})`).join('; ');
146
+ lines.push(` steps ${done} of ${d.steps.length}: ${steps}`);
147
+ }
148
+ if (d.note.trim()) {
149
+ const note = d.note.trim().replace(/\s+/g, ' ');
150
+ lines.push(` note: ${note.length > NOTE_PREVIEW ? `${note.slice(0, NOTE_PREVIEW)}…` : note}`);
151
+ }
152
+ return lines.join('\n');
153
+ }
154
+ async listTodos(args) {
155
+ const { tasks, lists } = await this.load();
156
+ const today = this.today();
157
+ const scope = this.scopeOf(lists, args.list);
158
+ const query = args.query?.trim().toLowerCase();
159
+ const matches = (t) => !query || t.title.toLowerCase().includes(query) || t.details.note.toLowerCase().includes(query);
160
+ const open = scope
161
+ ? openTasks(tasks, scope, today)
162
+ : tasks.filter((t) => !t.done).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
163
+ const done = args.include_completed
164
+ ? scope
165
+ ? completedTasks(tasks, scope, today)
166
+ : tasks
167
+ .filter((t) => t.done)
168
+ .sort((a, b) => (b.details.completedAt ?? b.updatedAt).localeCompare(a.details.completedAt ?? a.updatedAt))
169
+ : [];
170
+ const shown = [...open.filter(matches), ...done.filter(matches)];
171
+ const where = scope ? this.scopeName(lists, scope) : 'every list';
172
+ if (shown.length === 0) {
173
+ return query
174
+ ? `No to-dos in ${where} match "${args.query}".`
175
+ : `No ${args.include_completed ? '' : 'open '}to-dos in ${where}.`;
176
+ }
177
+ const head = `${open.filter(matches).length} open${args.include_completed ? `, ${done.filter(matches).length} completed` : ''} in ${where} (today is ${today}):`;
178
+ return [head, ...shown.map((t) => this.describe(t, lists))].join('\n');
179
+ }
180
+ scopeName(lists, scope) {
181
+ const smart = SMART_LISTS.find((s) => s.id === scope);
182
+ if (smart)
183
+ return smart.label;
184
+ return this.listName(lists, scope.slice(5));
185
+ }
186
+ async listLists() {
187
+ const { tasks, lists } = await this.load();
188
+ const today = this.today();
189
+ const lines = SMART_LISTS.map((s) => `- ${s.label} (${s.id === 'myday' ? 'my_day' : s.id}): ${openTasks(tasks, s.id, today).length} open`);
190
+ lines.push(...lists.map((l) => `- ${l.meta.emoji ? `${l.meta.emoji} ` : ''}${l.name} (id: ${l.id}): ${openTasks(tasks, listKey(l.id), today).length} open`));
191
+ return [`Smart lists, then the person's own lists (today is ${today}):`, ...lines].join('\n');
192
+ }
193
+ // MARK: Writing
194
+ validDay(value, field) {
195
+ if (!DAY.test(value) || Number.isNaN(new Date(`${value}T00:00:00`).getTime())) {
196
+ throw new Error(`${field} must be a day as YYYY-MM-DD, got "${value}".`);
197
+ }
198
+ return value;
199
+ }
200
+ validRemind(value) {
201
+ const at = new Date(value);
202
+ if (Number.isNaN(at.getTime()))
203
+ throw new Error(`remind_at must be an ISO 8601 date and time, got "${value}".`);
204
+ if (at.getTime() <= this.now().getTime())
205
+ throw new Error(`remind_at must be in the future, got ${value}.`);
206
+ return at;
207
+ }
208
+ async encrypted(title, content) {
209
+ const key = this.key();
210
+ const salt = bytesToBase64(crypto.getRandomValues(new Uint8Array(32)));
211
+ const { encryptedTitle, encryptedContent, iv } = await encryptNoteFields(key, title, content);
212
+ return { title: '[ENCRYPTED]', content: '[ENCRYPTED]', encryptedTitle, encryptedContent, iv, salt };
213
+ }
214
+ async createTask(text, details) {
215
+ return this.api.createNote({ ...(await this.encrypted(text, serializeDetails(details))), type: TODO_NOTE_TYPE, folderId: null });
216
+ }
217
+ async channels() {
218
+ try {
219
+ const integrations = await this.api.integrations();
220
+ return integrations.slack.connected ? ['email', 'slack'] : ['email'];
221
+ }
222
+ catch {
223
+ return ['email'];
224
+ }
225
+ }
226
+ /** Cancels the task's pending reminders. */
227
+ async clearReminders(noteId) {
228
+ const reminders = await this.api.listReminders(noteId);
229
+ for (const r of reminders) {
230
+ if (r.status === 'pending')
231
+ await this.api.deleteReminder(r.id);
232
+ }
233
+ }
234
+ /** No label: the email only says there is a reminder, since the text is encrypted. */
235
+ async createReminder(noteId, at) {
236
+ await this.api.createReminder({ noteId, remindAt: at.toISOString(), label: null, channels: await this.channels() });
237
+ }
238
+ async addTodo(args) {
239
+ const text = args.text?.trim();
240
+ if (!text)
241
+ throw new Error('text is required.');
242
+ if (args.repeat !== undefined && !REPEATS.includes(args.repeat)) {
243
+ throw new Error(`repeat must be one of ${REPEATS.join(', ')}.`);
244
+ }
245
+ const remindAt = args.remind_at !== undefined ? this.validRemind(args.remind_at) : null;
246
+ const { lists } = await this.load();
247
+ const today = this.today();
248
+ const details = parseDetails('');
249
+ if (args.list !== undefined && args.list.trim() !== '')
250
+ details.list = this.resolveList(lists, args.list).id;
251
+ if (args.due !== undefined)
252
+ details.due = this.validDay(args.due, 'due');
253
+ if (args.my_day)
254
+ details.myDay = today;
255
+ if (args.important)
256
+ details.important = true;
257
+ if (args.note)
258
+ details.note = args.note;
259
+ if (args.steps)
260
+ details.steps = args.steps.map((s) => s.trim()).filter(Boolean).map((s) => ({ id: newId(), text: s, done: false }));
261
+ if (args.repeat) {
262
+ details.repeat = args.repeat;
263
+ // A repeat needs a day to count from, as in the apps.
264
+ details.due ??= today;
265
+ }
266
+ if (remindAt)
267
+ details.remindAt = remindAt.toISOString();
268
+ const row = await this.createTask(text, details);
269
+ if (remindAt)
270
+ await this.createReminder(row.id, remindAt);
271
+ const task = { id: row.id, title: text, details, done: false, createdAt: row.createdAt, updatedAt: row.updatedAt };
272
+ return `Added to-do (id: ${row.id}).\n${this.describe(task, lists)}`;
273
+ }
274
+ async updateTodo(args) {
275
+ const { tasks, lists } = await this.load();
276
+ const task = tasks.find((t) => t.id === args.id);
277
+ if (!task)
278
+ throw new Error(`No to-do with id ${args.id}. Call list_todos to find it.`);
279
+ const today = this.today();
280
+ const details = { ...task.details, steps: task.details.steps.map((s) => ({ ...s })) };
281
+ let text = task.title;
282
+ if (args.text !== undefined) {
283
+ if (!args.text.trim())
284
+ throw new Error('text cannot be empty.');
285
+ text = args.text.trim();
286
+ }
287
+ if (args.due !== undefined)
288
+ details.due = args.due === null ? null : this.validDay(args.due, 'due');
289
+ if (args.my_day !== undefined)
290
+ details.myDay = args.my_day ? today : null;
291
+ if (args.important !== undefined)
292
+ details.important = args.important;
293
+ if (args.note !== undefined)
294
+ details.note = args.note;
295
+ if (args.list !== undefined)
296
+ details.list = args.list === null || args.list.trim() === '' ? null : this.resolveList(lists, args.list).id;
297
+ if (args.repeat !== undefined) {
298
+ if (args.repeat !== null && !REPEATS.includes(args.repeat))
299
+ throw new Error(`repeat must be one of ${REPEATS.join(', ')}.`);
300
+ details.repeat = args.repeat;
301
+ if (args.repeat)
302
+ details.due ??= today;
303
+ }
304
+ if (args.add_steps) {
305
+ details.steps.push(...args.add_steps.map((s) => s.trim()).filter(Boolean).map((s) => ({ id: newId(), text: s, done: false })));
306
+ }
307
+ if (args.complete_steps) {
308
+ for (const ref of args.complete_steps) {
309
+ const step = details.steps.find((s) => s.id === ref) ?? details.steps.find((s) => s.text.trim() === ref.trim());
310
+ if (!step) {
311
+ const known = details.steps.map((s) => `"${s.text}"`).join(', ') || 'none';
312
+ throw new Error(`No step "${ref}" on this to-do. Its steps: ${known}.`);
313
+ }
314
+ step.done = true;
315
+ }
316
+ }
317
+ // The reminder: a new time replaces any pending one; null cancels it.
318
+ let remindAt;
319
+ if (args.remind_at !== undefined) {
320
+ remindAt = args.remind_at === null ? null : this.validRemind(args.remind_at);
321
+ details.remindAt = remindAt ? remindAt.toISOString() : null;
322
+ }
323
+ const completing = args.done === true && !task.done;
324
+ const reopening = args.done === false && task.done;
325
+ if (completing)
326
+ details.completedAt = this.now().toISOString();
327
+ if (reopening)
328
+ details.completedAt = null;
329
+ const done = completing ? true : reopening ? false : task.done;
330
+ const body = await this.encrypted(text, serializeDetails(details));
331
+ if (completing || reopening)
332
+ body.archived = done;
333
+ await this.api.updateNote(task.id, body);
334
+ if (remindAt !== undefined) {
335
+ await this.clearReminders(task.id);
336
+ if (remindAt)
337
+ await this.createReminder(task.id, remindAt);
338
+ }
339
+ const lines = [];
340
+ if (completing) {
341
+ // A done task needs no reminder.
342
+ await this.clearReminders(task.id);
343
+ const next = nextRepeat({ ...task, title: text, details }, today);
344
+ if (next) {
345
+ const at = next.remindAt ? new Date(next.remindAt) : null;
346
+ const future = at !== null && at.getTime() > this.now().getTime();
347
+ const nextDetails = { ...next, remindAt: future ? next.remindAt : null };
348
+ const row = await this.createTask(text, nextDetails);
349
+ if (future)
350
+ await this.createReminder(row.id, at);
351
+ lines.push(`It repeats ${next.repeat}: the next one (id: ${row.id}) is due ${next.due}.`);
352
+ }
353
+ }
354
+ const updated = { ...task, title: text, details, done };
355
+ return [`Updated to-do.`, this.describe(updated, lists), ...lines].join('\n');
356
+ }
357
+ async createList(args) {
358
+ const name = args.name?.trim();
359
+ if (!name)
360
+ throw new Error('name is required.');
361
+ if (args.color !== undefined && !HEX.test(args.color))
362
+ throw new Error(`color must be a hex color like #5c7fb5, got "${args.color}".`);
363
+ const { lists } = await this.load();
364
+ if (lists.some((l) => l.name.trim().toLowerCase() === name.toLowerCase())) {
365
+ throw new Error(`There is already a list called "${name}".`);
366
+ }
367
+ const meta = parseListMeta('');
368
+ if (args.color)
369
+ meta.color = args.color.toLowerCase();
370
+ if (args.emoji?.trim())
371
+ meta.emoji = args.emoji.trim();
372
+ const row = await this.api.createNote({
373
+ ...(await this.encrypted(name, serializeListMeta(meta))),
374
+ type: TODO_LIST_NOTE_TYPE,
375
+ folderId: null,
376
+ });
377
+ return `Created the list "${name}" (id: ${row.id}).`;
378
+ }
379
+ }
380
+ //# sourceMappingURL=todos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todos.js","sourceRoot":"","sources":["../src/todos.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,11 @@ export declare const TOOL_ANNOTATIONS: {
47
47
  readonly move_attachment: VirlowToolAnnotations;
48
48
  readonly delete_attachment: VirlowToolAnnotations;
49
49
  readonly restore_attachment: VirlowToolAnnotations;
50
+ readonly list_todos: VirlowToolAnnotations;
51
+ readonly list_todo_lists: VirlowToolAnnotations;
52
+ readonly add_todo: VirlowToolAnnotations;
53
+ readonly update_todo: VirlowToolAnnotations;
54
+ readonly create_todo_list: VirlowToolAnnotations;
50
55
  };
51
56
  export type ToolName = keyof typeof TOOL_ANNOTATIONS;
52
57
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tool-annotations.d.ts","sourceRoot":"","sources":["../src/tool-annotations.ts"],"names":[],"mappings":"AA6CA;8DAC8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CACxB;AAuBD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgD6B,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,qBAAqB,CAK1G;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAM9F,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,qBAAqB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAgBxF"}
1
+ {"version":3,"file":"tool-annotations.d.ts","sourceRoot":"","sources":["../src/tool-annotations.ts"],"names":[],"mappings":"AA+CA;8DAC8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CACxB;AAuBD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuD6B,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,qBAAqB,CAK1G;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAM9F,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,EACd,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,qBAAqB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAgBxF"}
@@ -36,6 +36,8 @@
36
36
  * - unlock and lock change session state, not data, so neither is read-only
37
37
  * and neither is destructive. lock only discards this session's in-memory
38
38
  * key and caches; nothing stored is touched and unlock restores access.
39
+ * - update_todo is destructive: new text, a note or a list replaces what was
40
+ * there. add_todo and create_todo_list only add.
39
41
  * - read_attachment depends on the host. Without file access it only returns
40
42
  * the file. With it (local CLI, desktop app) `save_to` writes to the user's
41
43
  * disk and `overwrite: true` replaces an existing file, so it is a
@@ -105,6 +107,12 @@ export const TOOL_ANNOTATIONS = {
105
107
  move_attachment: destructive('Move an attachment'),
106
108
  delete_attachment: destructive('Delete an attachment'),
107
109
  restore_attachment: additive('Restore an attachment'),
110
+ // to-do
111
+ list_todos: read('List to-dos'),
112
+ list_todo_lists: read('List to-do lists'),
113
+ add_todo: additive('Add a to-do'),
114
+ update_todo: destructive('Update a to-do'),
115
+ create_todo_list: additive('Create a to-do list'),
108
116
  };
109
117
  /**
110
118
  * A tool's annotations for this host. Only read_attachment varies: with file
@@ -1 +1 @@
1
- {"version":3,"file":"tool-annotations.js","sourceRoot":"","sources":["../src/tool-annotations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-annotations.js","sourceRoot":"","sources":["../src/tool-annotations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAY,SAAS,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAe,KAAK,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA6B/D;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,iEAAiE;IACjE,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;OAMG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,CAAC;IAC7D,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAgED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,CA2BnE;AAoTD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAgCvE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,GACvD,WAAW,CAi7Cb;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,GACvD,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA+CzC"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAY,SAAS,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAe,KAAK,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA+B/D;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,KAAK,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,iEAAiE;IACjE,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;OAMG;IACH,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,CAAC;IAC7D,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAgED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,OAAO,GAAG,MAAM,CA+BnE;AAoTD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAgCvE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,GACvD,WAAW,CAkkDb;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,kBAAkB,GAAG;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;CAAE,GACvD,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA+CzC"}
package/dist/tools.js CHANGED
@@ -26,6 +26,8 @@ import { memoriesAllowed, requireMemoriesSetting } from './memories-enabled.js';
26
26
  import { capturePausedReason } from './memory-pause.js';
27
27
  import { ENTITY_KINDS, entityKey, entityKinds, findEntity } from './memory-graph.js';
28
28
  import { AttachmentsService } from './attachments.js';
29
+ import { TodoService } from './todos.js';
30
+ import { REPEATS } from './todo-format.js';
29
31
  import { requireLocalAbsolutePath } from './local-paths.js';
30
32
  import { toolConfig } from './tool-annotations.js';
31
33
  import { CONTEXT_CARD_FACTS, WIDGET_MIME_TYPE, WIDGET_RESOURCES, resourceMeta, readWidget, } from './widgets.js';
@@ -132,7 +134,9 @@ export function serverInstructions(memoriesEnabled) {
132
134
  const notes = 'NOTES: note content is HTML, never Markdown; wrap paragraphs in <p>. Never use em-dashes. ' +
133
135
  'If a tool reports the vault is locked, call unlock, tell the user to finish in the browser, ' +
134
136
  'and confirm with status before retrying.';
135
- return (memoriesEnabled ? memory : '') + notes;
137
+ const todos = ' TO-DO: the user\'s tasks (My Day, Important, Planned, Tasks and their own lists) are read with ' +
138
+ 'list_todos and changed with add_todo and update_todo; mark one done with update_todo done:true.';
139
+ return (memoriesEnabled ? memory : '') + notes + todos;
136
140
  }
137
141
  /** The same rule attached to the field itself, for clients that surface
138
142
  * parameter descriptions but truncate long tool descriptions. */
@@ -1525,6 +1529,89 @@ export function buildServer(opts) {
1525
1529
  await attachments.restore(args.attachment_id);
1526
1530
  return textResult(`restored attachment ${args.attachment_id}`);
1527
1531
  }));
1532
+ // ---------- to-do ----------
1533
+ //
1534
+ // Tasks are not in any folder, so the folder "Expose to MCP" switch does not
1535
+ // apply: they are the user's own list, read and written like the memories
1536
+ // tree once the vault is unlocked. No delete tool, as for notes in the
1537
+ // assistant: a task removed by mistake is a surprise the user has to find.
1538
+ const todos = new TodoService(api, vault);
1539
+ const TODO_PRIVACY = 'Task text and details are end-to-end encrypted; the server only sees whether a task is done and, ' +
1540
+ 'for a reminder, when to send it.';
1541
+ const repeatSchema = z.enum(REPEATS);
1542
+ const daySchema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'a day as YYYY-MM-DD');
1543
+ server.registerTool('list_todos', {
1544
+ ...toolConfig('list_todos'),
1545
+ description: "Read the user's to-do list. `list` is my_day, important, planned, tasks, or one of their own " +
1546
+ 'lists by name or id; leave it out for every open task. Each task comes with its id, list, due ' +
1547
+ 'day, My Day, importance, steps, note, reminder and repeat. ' +
1548
+ TODO_PRIVACY +
1549
+ ' Requires the vault to be unlocked.',
1550
+ inputSchema: {
1551
+ list: z.string().max(200).optional(),
1552
+ include_completed: z.boolean().optional(),
1553
+ query: z.string().max(200).optional(),
1554
+ },
1555
+ }, wrap(async (args) => textResult(await todos.listTodos(args))));
1556
+ server.registerTool('list_todo_lists', {
1557
+ ...toolConfig('list_todo_lists'),
1558
+ description: "The user's to-do lists with how many tasks are open in each: the smart lists (My Day, Important, " +
1559
+ 'Planned, Tasks) and the lists they made. Requires the vault to be unlocked.',
1560
+ inputSchema: {},
1561
+ }, wrap(async () => textResult(await todos.listLists())));
1562
+ server.registerTool('add_todo', {
1563
+ ...toolConfig('add_todo'),
1564
+ description: 'Add a task to the user\'s to-do list. `list` is one of their lists by name or id (leave it out ' +
1565
+ 'for Tasks); an unknown name is an error, not a new list. `due` is a day (YYYY-MM-DD), `my_day` ' +
1566
+ 'puts it in today\'s My Day, `remind_at` (ISO 8601, in the future) emails them, and Slack when ' +
1567
+ 'connected. A repeat without a due day is due today. ' +
1568
+ TODO_PRIVACY +
1569
+ ' Requires the vault to be unlocked.',
1570
+ inputSchema: {
1571
+ text: z.string().min(1).max(500),
1572
+ list: z.string().max(200).optional(),
1573
+ due: daySchema.optional(),
1574
+ my_day: z.boolean().optional(),
1575
+ important: z.boolean().optional(),
1576
+ note: z.string().max(20_000).optional(),
1577
+ steps: z.array(z.string().min(1).max(500)).max(100).optional(),
1578
+ repeat: repeatSchema.optional(),
1579
+ remind_at: z.string().max(64).optional(),
1580
+ },
1581
+ }, wrap(async (args) => textResult(await todos.addTodo({ ...args, repeat: args.repeat }))));
1582
+ server.registerTool('update_todo', {
1583
+ ...toolConfig('update_todo'),
1584
+ description: 'Change a task by id (from list_todos): its text, done, due day, My Day, importance, note, list, ' +
1585
+ 'repeat or reminder; add steps or tick steps off by id or exact text. done:true completes it, ' +
1586
+ 'cancels its reminder and, when it repeats, adds the next one. null clears due, list (back to ' +
1587
+ 'Tasks), repeat or remind_at. ' +
1588
+ TODO_PRIVACY +
1589
+ ' Requires the vault to be unlocked.',
1590
+ inputSchema: {
1591
+ id: z.string().min(1),
1592
+ text: z.string().min(1).max(500).optional(),
1593
+ done: z.boolean().optional(),
1594
+ due: daySchema.nullable().optional(),
1595
+ my_day: z.boolean().optional(),
1596
+ important: z.boolean().optional(),
1597
+ note: z.string().max(20_000).optional(),
1598
+ add_steps: z.array(z.string().min(1).max(500)).max(100).optional(),
1599
+ complete_steps: z.array(z.string().min(1).max(500)).max(100).optional(),
1600
+ list: z.string().max(200).nullable().optional(),
1601
+ repeat: repeatSchema.nullable().optional(),
1602
+ remind_at: z.string().max(64).nullable().optional(),
1603
+ },
1604
+ }, wrap(async (args) => textResult(await todos.updateTodo({ ...args, repeat: args.repeat }))));
1605
+ server.registerTool('create_todo_list', {
1606
+ ...toolConfig('create_todo_list'),
1607
+ description: 'Make a new to-do list when the user asks for one, with an optional emoji and color (#rrggbb). ' +
1608
+ 'Its name is end-to-end encrypted. Requires the vault to be unlocked.',
1609
+ inputSchema: {
1610
+ name: z.string().min(1).max(200),
1611
+ emoji: z.string().max(16).optional(),
1612
+ color: z.string().regex(/^#[0-9a-fA-F]{6}$/, 'a hex color like #5c7fb5').optional(),
1613
+ },
1614
+ }, wrap(async (args) => textResult(await todos.createList(args))));
1528
1615
  return { server, vault };
1529
1616
  }
1530
1617
  /**