@j0hanz/todokit-mcp 1.0.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 (70) hide show
  1. package/README.md +61 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +30 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/errors.d.ts +19 -0
  7. package/dist/lib/errors.d.ts.map +1 -0
  8. package/dist/lib/errors.js +44 -0
  9. package/dist/lib/errors.js.map +1 -0
  10. package/dist/lib/match.d.ts +47 -0
  11. package/dist/lib/match.d.ts.map +1 -0
  12. package/dist/lib/match.js +8 -0
  13. package/dist/lib/match.js.map +1 -0
  14. package/dist/lib/resolve.js +83 -0
  15. package/dist/lib/resolve.js.map +1 -0
  16. package/dist/lib/storage.d.ts +16 -0
  17. package/dist/lib/storage.d.ts.map +1 -0
  18. package/dist/lib/storage.js +363 -0
  19. package/dist/lib/storage.js.map +1 -0
  20. package/dist/lib/storage_filters.d.ts +12 -0
  21. package/dist/lib/storage_filters.d.ts.map +1 -0
  22. package/dist/lib/storage_filters.js +70 -0
  23. package/dist/lib/storage_filters.js.map +1 -0
  24. package/dist/lib/tool_response.d.ts +5 -0
  25. package/dist/lib/tool_response.d.ts.map +1 -0
  26. package/dist/lib/tool_response.js +7 -0
  27. package/dist/lib/tool_response.js.map +1 -0
  28. package/dist/lib/types.d.ts +72 -0
  29. package/dist/lib/types.d.ts.map +1 -0
  30. package/dist/lib/types.js +16 -0
  31. package/dist/lib/types.js.map +1 -0
  32. package/dist/schemas/inputs.d.ts +170 -0
  33. package/dist/schemas/inputs.d.ts.map +1 -0
  34. package/dist/schemas/inputs.js +163 -0
  35. package/dist/schemas/inputs.js.map +1 -0
  36. package/dist/schemas/iso_date.js +20 -0
  37. package/dist/schemas/iso_date.js.map +1 -0
  38. package/dist/schemas/outputs.d.ts +30 -0
  39. package/dist/schemas/outputs.d.ts.map +1 -0
  40. package/dist/schemas/outputs.js +9 -0
  41. package/dist/schemas/outputs.js.map +1 -0
  42. package/dist/tools/add_todo.d.ts +3 -0
  43. package/dist/tools/add_todo.d.ts.map +1 -0
  44. package/dist/tools/add_todo.js +34 -0
  45. package/dist/tools/add_todo.js.map +1 -0
  46. package/dist/tools/add_todos.d.ts +3 -0
  47. package/dist/tools/add_todos.d.ts.map +1 -0
  48. package/dist/tools/add_todos.js +34 -0
  49. package/dist/tools/add_todos.js.map +1 -0
  50. package/dist/tools/complete_todo.d.ts +3 -0
  51. package/dist/tools/complete_todo.d.ts.map +1 -0
  52. package/dist/tools/complete_todo.js +65 -0
  53. package/dist/tools/complete_todo.js.map +1 -0
  54. package/dist/tools/delete_todo.d.ts +3 -0
  55. package/dist/tools/delete_todo.d.ts.map +1 -0
  56. package/dist/tools/delete_todo.js +95 -0
  57. package/dist/tools/delete_todo.js.map +1 -0
  58. package/dist/tools/index.d.ts +3 -0
  59. package/dist/tools/index.d.ts.map +1 -0
  60. package/dist/tools/index.js +15 -0
  61. package/dist/tools/index.js.map +1 -0
  62. package/dist/tools/list_todos.d.ts +3 -0
  63. package/dist/tools/list_todos.d.ts.map +1 -0
  64. package/dist/tools/list_todos.js +157 -0
  65. package/dist/tools/list_todos.js.map +1 -0
  66. package/dist/tools/update_todo.d.ts +3 -0
  67. package/dist/tools/update_todo.d.ts.map +1 -0
  68. package/dist/tools/update_todo.js +90 -0
  69. package/dist/tools/update_todo.js.map +1 -0
  70. package/package.json +72 -0
@@ -0,0 +1,363 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, mkdtemp, readFile, rename, rm, stat, writeFile, } from 'node:fs/promises';
3
+ import { basename, dirname, join, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { createErrorResponse } from './errors.js';
6
+ import { resolveTodoTargetFromTodos, unwrapResolution, } from './resolve.js';
7
+ import { filterTodos, normalizeTags, } from './storage_filters.js';
8
+ import { TodosSchema } from './types.js';
9
+ export { normalizeTags };
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const DEFAULT_TODO_FILE = join(__dirname, '../../todos.json');
12
+ const FILE_TIMEOUT_MS = 5000;
13
+ const FILE_ENCODING = 'utf-8';
14
+ const TEMP_DIR_PREFIX = '.tmp-';
15
+ function withTimeout(promise, timeoutMs, label) {
16
+ let timer;
17
+ const timeout = new Promise((_, reject) => {
18
+ timer = setTimeout(() => {
19
+ reject(new Error(`${label} timed out after ${String(timeoutMs)}ms`));
20
+ }, timeoutMs);
21
+ });
22
+ return Promise.race([promise, timeout]).finally(() => {
23
+ if (timer) {
24
+ clearTimeout(timer);
25
+ }
26
+ });
27
+ }
28
+ function getTodoFilePath() {
29
+ const override = process.env.TODOKIT_TODO_FILE?.trim();
30
+ if (override) {
31
+ return resolve(override);
32
+ }
33
+ return DEFAULT_TODO_FILE;
34
+ }
35
+ let writeChain = Promise.resolve();
36
+ let cachedTodos = null;
37
+ let cachedMtimeMs = null;
38
+ let cachedPath = null;
39
+ let inFlightRead = null;
40
+ let inFlightPath = null;
41
+ function clearCacheForPath(path) {
42
+ if (cachedPath === path) {
43
+ cachedTodos = null;
44
+ cachedMtimeMs = null;
45
+ }
46
+ }
47
+ function getCachedTodos(path, mtimeMs) {
48
+ if (cachedTodos && cachedPath === path && cachedMtimeMs === mtimeMs) {
49
+ return cachedTodos;
50
+ }
51
+ return null;
52
+ }
53
+ function updateCache(path, todos, mtimeMs) {
54
+ cachedTodos = todos;
55
+ cachedMtimeMs = mtimeMs;
56
+ cachedPath = path;
57
+ }
58
+ function parseTodos(rawJson) {
59
+ const raw = JSON.parse(rawJson);
60
+ const parsed = TodosSchema.safeParse(raw);
61
+ if (!parsed.success) {
62
+ throw new Error(`Invalid todos.json: ${parsed.error.message}`);
63
+ }
64
+ return parsed.data;
65
+ }
66
+ function isFileNotFound(error) {
67
+ if (!error || typeof error !== 'object')
68
+ return false;
69
+ if (!('code' in error))
70
+ return false;
71
+ return error.code === 'ENOENT';
72
+ }
73
+ async function statTodoFile(path) {
74
+ try {
75
+ const stats = await withTimeout(stat(path), FILE_TIMEOUT_MS, 'stat todo file');
76
+ if (!stats.isFile()) {
77
+ throw new Error(`Todo storage path is not a file: ${path}`);
78
+ }
79
+ return stats;
80
+ }
81
+ catch (error) {
82
+ if (isFileNotFound(error)) {
83
+ return null;
84
+ }
85
+ throw error;
86
+ }
87
+ }
88
+ async function readTodosFile(path) {
89
+ const data = await readFile(path, {
90
+ encoding: FILE_ENCODING,
91
+ signal: AbortSignal.timeout(FILE_TIMEOUT_MS),
92
+ });
93
+ return parseTodos(data);
94
+ }
95
+ async function readTodosWithCache(path) {
96
+ try {
97
+ const stats = await statTodoFile(path);
98
+ if (!stats) {
99
+ clearCacheForPath(path);
100
+ return [];
101
+ }
102
+ const cached = getCachedTodos(path, stats.mtimeMs);
103
+ if (cached) {
104
+ return cached;
105
+ }
106
+ const parsed = await readTodosFile(path);
107
+ updateCache(path, parsed, stats.mtimeMs);
108
+ return parsed;
109
+ }
110
+ catch (error) {
111
+ if (isFileNotFound(error)) {
112
+ clearCacheForPath(path);
113
+ return [];
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ async function readTodosFromDisk() {
119
+ const path = getTodoFilePath();
120
+ if (inFlightRead && inFlightPath === path) {
121
+ return inFlightRead;
122
+ }
123
+ const readPromise = readTodosWithCache(path);
124
+ inFlightRead = readPromise;
125
+ inFlightPath = path;
126
+ try {
127
+ return await readPromise;
128
+ }
129
+ finally {
130
+ if (inFlightRead === readPromise) {
131
+ inFlightRead = null;
132
+ inFlightPath = null;
133
+ }
134
+ }
135
+ }
136
+ async function writeFileAtomically(path, data) {
137
+ const targetDir = dirname(path);
138
+ await withTimeout(mkdir(targetDir, { recursive: true }), FILE_TIMEOUT_MS, 'mkdir todo directory');
139
+ const tempDir = await withTimeout(mkdtemp(join(targetDir, TEMP_DIR_PREFIX)), FILE_TIMEOUT_MS, 'mkdtemp todo directory');
140
+ const tempPath = join(tempDir, basename(path));
141
+ try {
142
+ await writeFile(tempPath, data, {
143
+ encoding: FILE_ENCODING,
144
+ signal: AbortSignal.timeout(FILE_TIMEOUT_MS),
145
+ flush: true,
146
+ });
147
+ await withTimeout(rename(tempPath, path), FILE_TIMEOUT_MS, 'rename todo file');
148
+ }
149
+ finally {
150
+ try {
151
+ await withTimeout(rm(tempDir, { recursive: true, force: true }), FILE_TIMEOUT_MS, 'cleanup temp dir');
152
+ }
153
+ catch {
154
+ // Best-effort cleanup of temp artifacts.
155
+ }
156
+ }
157
+ }
158
+ function queueWrite(task) {
159
+ const next = writeChain.then(task, task);
160
+ writeChain = next.then(() => undefined, () => undefined);
161
+ return next;
162
+ }
163
+ async function persistTodos(todos) {
164
+ const path = getTodoFilePath();
165
+ await writeFileAtomically(path, JSON.stringify(todos, null, 2));
166
+ cachedTodos = todos;
167
+ cachedPath = path;
168
+ try {
169
+ const stats = await withTimeout(stat(path), FILE_TIMEOUT_MS, 'stat todo file');
170
+ cachedMtimeMs = stats.mtimeMs;
171
+ }
172
+ catch {
173
+ cachedMtimeMs = null;
174
+ }
175
+ }
176
+ export async function getTodos(filters) {
177
+ await writeChain;
178
+ const todos = await readTodosFromDisk();
179
+ return filters ? filterTodos(todos, filters) : todos;
180
+ }
181
+ export async function addTodo(title, description, priority = 'normal', dueDate, tags = []) {
182
+ const [todo] = await addTodos([
183
+ { title, description, priority, dueDate, tags },
184
+ ]);
185
+ if (!todo) {
186
+ throw new Error('Failed to create todo');
187
+ }
188
+ return todo;
189
+ }
190
+ export async function addTodos(items) {
191
+ return queueWrite(async () => {
192
+ const todos = await readTodosFromDisk();
193
+ const timestamp = new Date().toISOString();
194
+ const newTodos = items.map((item) => ({
195
+ id: randomUUID(),
196
+ title: item.title,
197
+ description: item.description,
198
+ completed: false,
199
+ priority: item.priority ?? 'normal',
200
+ dueDate: item.dueDate,
201
+ tags: normalizeTags(item.tags ?? []),
202
+ createdAt: timestamp,
203
+ updatedAt: timestamp,
204
+ completedAt: undefined,
205
+ }));
206
+ const nextTodos = [...todos, ...newTodos];
207
+ await persistTodos(nextTodos);
208
+ return newTodos;
209
+ });
210
+ }
211
+ function normalizeUpdateTags(updates) {
212
+ const normalizedUpdates = { ...updates };
213
+ if (normalizedUpdates.tags) {
214
+ normalizedUpdates.tags = normalizeTags(normalizedUpdates.tags);
215
+ }
216
+ return normalizedUpdates;
217
+ }
218
+ function resolveCompletedChange(completed, updates, now) {
219
+ return {
220
+ completed,
221
+ completedAt: completed ? (updates.completedAt ?? now) : undefined,
222
+ };
223
+ }
224
+ function resolveCompletedAtChange(completed, updates) {
225
+ return {
226
+ completed,
227
+ completedAt: updates.completedAt,
228
+ };
229
+ }
230
+ function resolveCompletionUpdate(currentTodo, updates, now) {
231
+ const completed = updates.completed ?? currentTodo.completed;
232
+ if (updates.completed !== undefined) {
233
+ return resolveCompletedChange(completed, updates, now);
234
+ }
235
+ if (updates.completedAt !== undefined) {
236
+ return resolveCompletedAtChange(completed, updates);
237
+ }
238
+ return { completed, completedAt: currentTodo.completedAt };
239
+ }
240
+ function buildUpdatedTodo(currentTodo, updates) {
241
+ const now = new Date().toISOString();
242
+ const { completed, completedAt } = resolveCompletionUpdate(currentTodo, updates, now);
243
+ return {
244
+ ...currentTodo,
245
+ ...updates,
246
+ completed,
247
+ completedAt,
248
+ updatedAt: now,
249
+ };
250
+ }
251
+ function updateTodoInList(todos, id, updates) {
252
+ const index = todos.findIndex((todo) => todo.id === id);
253
+ if (index === -1)
254
+ return null;
255
+ const currentTodo = todos[index];
256
+ if (!currentTodo)
257
+ return null;
258
+ const normalizedUpdates = normalizeUpdateTags(updates);
259
+ const updatedTodo = buildUpdatedTodo(currentTodo, normalizedUpdates);
260
+ todos[index] = updatedTodo;
261
+ return updatedTodo;
262
+ }
263
+ function createNotFoundOutcome(id) {
264
+ return {
265
+ kind: 'error',
266
+ response: createErrorResponse('E_NOT_FOUND', `Todo with ID ${id} not found`),
267
+ };
268
+ }
269
+ function findTodoById(todos, id) {
270
+ const match = todos.find((todo) => todo.id === id);
271
+ return match ?? null;
272
+ }
273
+ function getCompletionTimestamp(completed) {
274
+ return completed ? new Date().toISOString() : undefined;
275
+ }
276
+ export async function updateTodo(id, updates) {
277
+ return queueWrite(async () => {
278
+ const todos = await readTodosFromDisk();
279
+ const updatedTodo = updateTodoInList(todos, id, updates);
280
+ if (!updatedTodo)
281
+ return null;
282
+ await persistTodos(todos);
283
+ return updatedTodo;
284
+ });
285
+ }
286
+ export async function deleteTodo(id) {
287
+ return queueWrite(async () => {
288
+ const todos = await readTodosFromDisk();
289
+ const index = todos.findIndex((todo) => todo.id === id);
290
+ if (index === -1)
291
+ return false;
292
+ todos.splice(index, 1);
293
+ await persistTodos(todos);
294
+ return true;
295
+ });
296
+ }
297
+ export async function updateTodoBySelector(input, buildUpdates) {
298
+ return queueWrite(async () => {
299
+ const todos = await readTodosFromDisk();
300
+ const outcome = unwrapResolution(resolveTodoTargetFromTodos(todos, input));
301
+ if (outcome.kind !== 'match')
302
+ return outcome;
303
+ const nextUpdates = buildUpdates(outcome.todo);
304
+ if (!nextUpdates || Object.keys(nextUpdates).length === 0) {
305
+ return { kind: 'no_updates' };
306
+ }
307
+ const updatedTodo = updateTodoInList(todos, outcome.todo.id, nextUpdates);
308
+ if (!updatedTodo) {
309
+ return createNotFoundOutcome(outcome.todo.id);
310
+ }
311
+ await persistTodos(todos);
312
+ return { kind: 'match', todo: updatedTodo };
313
+ });
314
+ }
315
+ export async function deleteTodoBySelector(input) {
316
+ return queueWrite(async () => {
317
+ const todos = await readTodosFromDisk();
318
+ const outcome = unwrapResolution(resolveTodoTargetFromTodos(todos, input));
319
+ if (outcome.kind !== 'match')
320
+ return outcome;
321
+ const index = todos.findIndex((todo) => todo.id === outcome.todo.id);
322
+ if (index === -1) {
323
+ return createNotFoundOutcome(outcome.todo.id);
324
+ }
325
+ const [removed] = todos.splice(index, 1);
326
+ if (!removed) {
327
+ return createNotFoundOutcome(outcome.todo.id);
328
+ }
329
+ await persistTodos(todos);
330
+ return { kind: 'match', todo: removed };
331
+ });
332
+ }
333
+ function completeTodoInList(todos, id, completed) {
334
+ const currentTodo = findTodoById(todos, id);
335
+ if (!currentTodo) {
336
+ return createNotFoundOutcome(id);
337
+ }
338
+ if (currentTodo.completed === completed) {
339
+ return { kind: 'already', todo: currentTodo };
340
+ }
341
+ const updatedTodo = updateTodoInList(todos, id, {
342
+ completed,
343
+ completedAt: getCompletionTimestamp(completed),
344
+ });
345
+ if (!updatedTodo) {
346
+ return createNotFoundOutcome(id);
347
+ }
348
+ return { kind: 'match', todo: updatedTodo };
349
+ }
350
+ export async function completeTodoBySelector(input, completed) {
351
+ return queueWrite(async () => {
352
+ const todos = await readTodosFromDisk();
353
+ const outcome = unwrapResolution(resolveTodoTargetFromTodos(todos, input));
354
+ if (outcome.kind !== 'match')
355
+ return outcome;
356
+ const result = completeTodoInList(todos, outcome.todo.id, completed);
357
+ if (result.kind === 'match') {
358
+ await persistTodos(todos);
359
+ }
360
+ return result;
361
+ });
362
+ }
363
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/lib/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Todo } from './types.js';
2
+ export interface TodoFilters {
3
+ completed?: boolean;
4
+ priority?: 'low' | 'normal' | 'high';
5
+ tag?: string;
6
+ dueBefore?: string;
7
+ dueAfter?: string;
8
+ query?: string;
9
+ }
10
+ export declare function normalizeTags(tags: string[]): string[];
11
+ export declare function filterTodos(todos: Todo[], filters: TodoFilters): Todo[];
12
+ //# sourceMappingURL=storage_filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage_filters.d.ts","sourceRoot":"","sources":["../../src/lib/storage_filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAMtD;AAsED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,CAIvE"}
@@ -0,0 +1,70 @@
1
+ function normalizeTag(tag) {
2
+ return tag.trim().toLowerCase();
3
+ }
4
+ export function normalizeTags(tags) {
5
+ if (tags.length === 0)
6
+ return [];
7
+ const normalized = tags
8
+ .map((tag) => normalizeTag(tag))
9
+ .filter((tag) => tag.length > 0);
10
+ return Array.from(new Set(normalized));
11
+ }
12
+ function matchesQuery(todo, query) {
13
+ const haystack = `${todo.title} ${todo.description ?? ''} ${todo.tags.join(' ')}`.toLowerCase();
14
+ return haystack.includes(query);
15
+ }
16
+ function normalizeQuery(query) {
17
+ const trimmed = query?.trim().toLowerCase();
18
+ return trimmed && trimmed.length > 0 ? trimmed : undefined;
19
+ }
20
+ function normalizeFilters(filters) {
21
+ return {
22
+ completed: filters.completed,
23
+ priority: filters.priority,
24
+ tag: filters.tag ? normalizeTag(filters.tag) : undefined,
25
+ dueBefore: filters.dueBefore,
26
+ dueAfter: filters.dueAfter,
27
+ query: normalizeQuery(filters.query),
28
+ };
29
+ }
30
+ function matchesCompletion(todo, completed) {
31
+ return completed === undefined ? true : todo.completed === completed;
32
+ }
33
+ function matchesPriority(todo, priority) {
34
+ return priority ? todo.priority === priority : true;
35
+ }
36
+ function matchesTag(todo, tag) {
37
+ return tag ? todo.tags.includes(tag) : true;
38
+ }
39
+ function matchesQueryFilter(todo, query) {
40
+ return query ? matchesQuery(todo, query) : true;
41
+ }
42
+ function matchesDueBefore(todo, dueBefore) {
43
+ return dueBefore ? Boolean(todo.dueDate && todo.dueDate < dueBefore) : true;
44
+ }
45
+ function matchesDueAfter(todo, dueAfter) {
46
+ return dueAfter ? Boolean(todo.dueDate && todo.dueDate > dueAfter) : true;
47
+ }
48
+ const MATCHERS = [
49
+ (todo, filters) => matchesCompletion(todo, filters.completed),
50
+ (todo, filters) => matchesPriority(todo, filters.priority),
51
+ (todo, filters) => matchesTag(todo, filters.tag),
52
+ (todo, filters) => matchesQueryFilter(todo, filters.query),
53
+ (todo, filters) => matchesDueBefore(todo, filters.dueBefore),
54
+ (todo, filters) => matchesDueAfter(todo, filters.dueAfter),
55
+ ];
56
+ function todoMatches(todo, filters) {
57
+ for (const check of MATCHERS) {
58
+ if (!check(todo, filters)) {
59
+ return false;
60
+ }
61
+ }
62
+ return true;
63
+ }
64
+ export function filterTodos(todos, filters) {
65
+ if (todos.length === 0)
66
+ return [];
67
+ const normalized = normalizeFilters(filters);
68
+ return todos.filter((todo) => todoMatches(todo, normalized));
69
+ }
70
+ //# sourceMappingURL=storage_filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage_filters.js","sourceRoot":"","sources":["../../src/lib/storage_filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
+ export declare function createToolResponse<T extends Record<string, unknown>>(structuredContent: T): CallToolResult & {
3
+ structuredContent: T;
4
+ };
5
+ //# sourceMappingURL=tool_response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool_response.d.ts","sourceRoot":"","sources":["../../src/lib/tool_response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClE,iBAAiB,EAAE,CAAC,GACnB,cAAc,GAAG;IAAE,iBAAiB,EAAE,CAAC,CAAA;CAAE,CAK3C"}
@@ -0,0 +1,7 @@
1
+ export function createToolResponse(structuredContent) {
2
+ return {
3
+ content: [{ type: 'text', text: JSON.stringify(structuredContent) }],
4
+ structuredContent,
5
+ };
6
+ }
7
+ //# sourceMappingURL=tool_response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool_response.js","sourceRoot":"","sources":["../../src/lib/tool_response.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAChC,iBAAoB;IAEpB,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpE,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { z } from 'zod';
2
+ declare const TodoSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ title: z.ZodString;
5
+ description: z.ZodOptional<z.ZodString>;
6
+ completed: z.ZodBoolean;
7
+ priority: z.ZodDefault<z.ZodEnum<["low", "normal", "high"]>>;
8
+ dueDate: z.ZodOptional<z.ZodString>;
9
+ tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
10
+ createdAt: z.ZodString;
11
+ updatedAt: z.ZodOptional<z.ZodString>;
12
+ completedAt: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ title: string;
15
+ id: string;
16
+ completed: boolean;
17
+ priority: "low" | "normal" | "high";
18
+ tags: string[];
19
+ createdAt: string;
20
+ description?: string | undefined;
21
+ dueDate?: string | undefined;
22
+ updatedAt?: string | undefined;
23
+ completedAt?: string | undefined;
24
+ }, {
25
+ title: string;
26
+ id: string;
27
+ completed: boolean;
28
+ createdAt: string;
29
+ description?: string | undefined;
30
+ priority?: "low" | "normal" | "high" | undefined;
31
+ dueDate?: string | undefined;
32
+ tags?: string[] | undefined;
33
+ updatedAt?: string | undefined;
34
+ completedAt?: string | undefined;
35
+ }>;
36
+ export declare const TodosSchema: z.ZodArray<z.ZodObject<{
37
+ id: z.ZodString;
38
+ title: z.ZodString;
39
+ description: z.ZodOptional<z.ZodString>;
40
+ completed: z.ZodBoolean;
41
+ priority: z.ZodDefault<z.ZodEnum<["low", "normal", "high"]>>;
42
+ dueDate: z.ZodOptional<z.ZodString>;
43
+ tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
44
+ createdAt: z.ZodString;
45
+ updatedAt: z.ZodOptional<z.ZodString>;
46
+ completedAt: z.ZodOptional<z.ZodString>;
47
+ }, "strip", z.ZodTypeAny, {
48
+ title: string;
49
+ id: string;
50
+ completed: boolean;
51
+ priority: "low" | "normal" | "high";
52
+ tags: string[];
53
+ createdAt: string;
54
+ description?: string | undefined;
55
+ dueDate?: string | undefined;
56
+ updatedAt?: string | undefined;
57
+ completedAt?: string | undefined;
58
+ }, {
59
+ title: string;
60
+ id: string;
61
+ completed: boolean;
62
+ createdAt: string;
63
+ description?: string | undefined;
64
+ priority?: "low" | "normal" | "high" | undefined;
65
+ dueDate?: string | undefined;
66
+ tags?: string[] | undefined;
67
+ updatedAt?: string | undefined;
68
+ completedAt?: string | undefined;
69
+ }>, "many">;
70
+ export type Todo = z.infer<typeof TodoSchema>;
71
+ export {};
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWd,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAsB,CAAC;AAE/C,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from 'zod';
2
+ import { IsoDateSchema } from '../schemas/iso_date.js';
3
+ const TodoSchema = z.object({
4
+ id: z.string(),
5
+ title: z.string(),
6
+ description: z.string().optional(),
7
+ completed: z.boolean(),
8
+ priority: z.enum(['low', 'normal', 'high']).default('normal'),
9
+ dueDate: IsoDateSchema.optional(),
10
+ tags: z.array(z.string()).default([]),
11
+ createdAt: z.string(),
12
+ updatedAt: z.string().optional(),
13
+ completedAt: z.string().optional(),
14
+ });
15
+ export const TodosSchema = z.array(TodoSchema);
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC7D,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC"}