@shin1ohno/sage 0.1.0 → 0.2.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 +79 -114
- package/dist/config/storage/storage-factory.d.ts +5 -1
- package/dist/config/storage/storage-factory.d.ts.map +1 -1
- package/dist/config/storage/storage-factory.js +12 -19
- package/dist/config/storage/storage-factory.js.map +1 -1
- package/dist/core/sage-core.d.ts +10 -5
- package/dist/core/sage-core.d.ts.map +1 -1
- package/dist/core/sage-core.js +28 -51
- package/dist/core/sage-core.js.map +1 -1
- package/dist/index.js +335 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/apple-reminders.d.ts +49 -0
- package/dist/integrations/apple-reminders.d.ts.map +1 -1
- package/dist/integrations/apple-reminders.js +229 -0
- package/dist/integrations/apple-reminders.js.map +1 -1
- package/dist/integrations/notion-mcp.d.ts +136 -1
- package/dist/integrations/notion-mcp.d.ts.map +1 -1
- package/dist/integrations/notion-mcp.js +449 -1
- package/dist/integrations/notion-mcp.js.map +1 -1
- package/dist/integrations/task-synchronizer.d.ts +124 -0
- package/dist/integrations/task-synchronizer.d.ts.map +1 -0
- package/dist/integrations/task-synchronizer.js +363 -0
- package/dist/integrations/task-synchronizer.js.map +1 -0
- package/dist/integrations/todo-list-manager.d.ts +185 -0
- package/dist/integrations/todo-list-manager.d.ts.map +1 -0
- package/dist/integrations/todo-list-manager.js +581 -0
- package/dist/integrations/todo-list-manager.js.map +1 -0
- package/dist/platform/adapter-factory.d.ts.map +1 -1
- package/dist/platform/adapter-factory.js +4 -8
- package/dist/platform/adapter-factory.js.map +1 -1
- package/dist/platform/adapters/mcp-adapter.js +1 -1
- package/dist/platform/adapters/mcp-adapter.js.map +1 -1
- package/dist/platform/adapters/remote-mcp-adapter.d.ts +34 -0
- package/dist/platform/adapters/remote-mcp-adapter.d.ts.map +1 -0
- package/dist/platform/adapters/remote-mcp-adapter.js +54 -0
- package/dist/platform/adapters/remote-mcp-adapter.js.map +1 -0
- package/dist/platform/detector.d.ts +5 -16
- package/dist/platform/detector.d.ts.map +1 -1
- package/dist/platform/detector.js +52 -108
- package/dist/platform/detector.js.map +1 -1
- package/dist/platform/index.d.ts +0 -2
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/index.js +0 -2
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/types.d.ts +20 -62
- package/dist/platform/types.d.ts.map +1 -1
- package/dist/platform/types.js +6 -11
- package/dist/platform/types.js.map +1 -1
- package/dist/remote/cloud-config.d.ts +139 -0
- package/dist/remote/cloud-config.d.ts.map +1 -0
- package/dist/remote/cloud-config.js +229 -0
- package/dist/remote/cloud-config.js.map +1 -0
- package/dist/remote/hybrid-integration.d.ts +109 -0
- package/dist/remote/hybrid-integration.d.ts.map +1 -0
- package/dist/remote/hybrid-integration.js +230 -0
- package/dist/remote/hybrid-integration.js.map +1 -0
- package/dist/remote/remote-mcp-server.d.ts +244 -0
- package/dist/remote/remote-mcp-server.d.ts.map +1 -0
- package/dist/remote/remote-mcp-server.js +507 -0
- package/dist/remote/remote-mcp-server.js.map +1 -0
- package/dist/utils/priority.d.ts.map +1 -1
- package/dist/utils/priority.js +18 -5
- package/dist/utils/priority.js.map +1 -1
- package/dist/utils/stakeholders.d.ts +4 -0
- package/dist/utils/stakeholders.d.ts.map +1 -1
- package/dist/utils/stakeholders.js +45 -4
- package/dist/utils/stakeholders.js.map +1 -1
- package/dist/utils/task-splitter.d.ts.map +1 -1
- package/dist/utils/task-splitter.js +62 -11
- package/dist/utils/task-splitter.js.map +1 -1
- package/manifest.json +74 -0
- package/package.json +2 -1
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskSynchronizer
|
|
3
|
+
* Multi-source task synchronization and conflict resolution
|
|
4
|
+
* Requirement: 12.5, 12.6
|
|
5
|
+
*/
|
|
6
|
+
import { TodoListManager, } from './todo-list-manager.js';
|
|
7
|
+
/**
|
|
8
|
+
* TaskSynchronizer
|
|
9
|
+
* Handles synchronization of tasks between Apple Reminders and Notion
|
|
10
|
+
*/
|
|
11
|
+
export class TaskSynchronizer {
|
|
12
|
+
todoManager;
|
|
13
|
+
similarityThreshold = 0.85;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.todoManager = new TodoListManager();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Sync all tasks across all sources
|
|
19
|
+
* Requirement: 12.6
|
|
20
|
+
*/
|
|
21
|
+
async syncAllTasks() {
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
const conflicts = [];
|
|
24
|
+
const errors = [];
|
|
25
|
+
let syncedTasks = 0;
|
|
26
|
+
try {
|
|
27
|
+
// Fetch all tasks
|
|
28
|
+
const todos = await this.todoManager.listTodos();
|
|
29
|
+
const totalTasks = todos.length;
|
|
30
|
+
// Detect duplicates
|
|
31
|
+
const duplicates = this.detectDuplicatesInList(todos);
|
|
32
|
+
// Process each duplicate group
|
|
33
|
+
for (const duplicate of duplicates) {
|
|
34
|
+
try {
|
|
35
|
+
// Check for conflicts between duplicate tasks
|
|
36
|
+
const taskConflicts = this.detectConflicts(duplicate.tasks);
|
|
37
|
+
conflicts.push(...taskConflicts);
|
|
38
|
+
// Mark as synced
|
|
39
|
+
syncedTasks += duplicate.tasks.length;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
errors.push({
|
|
43
|
+
taskId: duplicate.tasks[0].id,
|
|
44
|
+
source: duplicate.tasks[0].source,
|
|
45
|
+
error: error.message,
|
|
46
|
+
recoverable: true,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Sync unique tasks
|
|
51
|
+
const uniqueTasks = todos.filter((todo) => !duplicates.some((d) => d.tasks.some((t) => t.id === todo.id)));
|
|
52
|
+
syncedTasks += uniqueTasks.length;
|
|
53
|
+
return {
|
|
54
|
+
totalTasks,
|
|
55
|
+
syncedTasks,
|
|
56
|
+
conflicts,
|
|
57
|
+
errors,
|
|
58
|
+
duration: Date.now() - startTime,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
totalTasks: 0,
|
|
64
|
+
syncedTasks: 0,
|
|
65
|
+
conflicts,
|
|
66
|
+
errors: [
|
|
67
|
+
{
|
|
68
|
+
taskId: 'all',
|
|
69
|
+
source: 'manual',
|
|
70
|
+
error: error.message,
|
|
71
|
+
recoverable: false,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
duration: Date.now() - startTime,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Detect duplicates in a list of tasks
|
|
80
|
+
* Requirement: 12.5
|
|
81
|
+
*/
|
|
82
|
+
detectDuplicatesInList(tasks) {
|
|
83
|
+
const duplicates = [];
|
|
84
|
+
const processed = new Set();
|
|
85
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
86
|
+
if (processed.has(tasks[i].id))
|
|
87
|
+
continue;
|
|
88
|
+
const matchingTasks = [tasks[i]];
|
|
89
|
+
for (let j = i + 1; j < tasks.length; j++) {
|
|
90
|
+
if (processed.has(tasks[j].id))
|
|
91
|
+
continue;
|
|
92
|
+
const similarity = this.calculateSimilarity(tasks[i].title, tasks[j].title);
|
|
93
|
+
if (similarity >= this.similarityThreshold) {
|
|
94
|
+
matchingTasks.push(tasks[j]);
|
|
95
|
+
processed.add(tasks[j].id);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (matchingTasks.length > 1) {
|
|
99
|
+
processed.add(tasks[i].id);
|
|
100
|
+
const avgSimilarity = matchingTasks.length > 2
|
|
101
|
+
? this.calculateGroupSimilarity(matchingTasks)
|
|
102
|
+
: this.calculateSimilarity(matchingTasks[0].title, matchingTasks[1].title);
|
|
103
|
+
duplicates.push({
|
|
104
|
+
tasks: matchingTasks,
|
|
105
|
+
similarity: avgSimilarity,
|
|
106
|
+
suggestedMerge: this.createSuggestedMerge(matchingTasks),
|
|
107
|
+
confidence: this.determineConfidence(avgSimilarity),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return duplicates;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Detect duplicates across all sources
|
|
115
|
+
*/
|
|
116
|
+
async detectDuplicates() {
|
|
117
|
+
const todos = await this.todoManager.listTodos();
|
|
118
|
+
return this.detectDuplicatesInList(todos);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Calculate similarity between two strings
|
|
122
|
+
* Uses Levenshtein distance normalized to 0-1 range
|
|
123
|
+
*/
|
|
124
|
+
calculateSimilarity(str1, str2) {
|
|
125
|
+
const s1 = str1.toLowerCase().trim();
|
|
126
|
+
const s2 = str2.toLowerCase().trim();
|
|
127
|
+
if (s1 === s2)
|
|
128
|
+
return 1.0;
|
|
129
|
+
const maxLen = Math.max(s1.length, s2.length);
|
|
130
|
+
if (maxLen === 0)
|
|
131
|
+
return 1.0;
|
|
132
|
+
const distance = this.levenshteinDistance(s1, s2);
|
|
133
|
+
return 1 - distance / maxLen;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Calculate Levenshtein distance between two strings
|
|
137
|
+
*/
|
|
138
|
+
levenshteinDistance(str1, str2) {
|
|
139
|
+
const m = str1.length;
|
|
140
|
+
const n = str2.length;
|
|
141
|
+
const dp = Array(m + 1)
|
|
142
|
+
.fill(null)
|
|
143
|
+
.map(() => Array(n + 1).fill(0));
|
|
144
|
+
for (let i = 0; i <= m; i++)
|
|
145
|
+
dp[i][0] = i;
|
|
146
|
+
for (let j = 0; j <= n; j++)
|
|
147
|
+
dp[0][j] = j;
|
|
148
|
+
for (let i = 1; i <= m; i++) {
|
|
149
|
+
for (let j = 1; j <= n; j++) {
|
|
150
|
+
if (str1[i - 1] === str2[j - 1]) {
|
|
151
|
+
dp[i][j] = dp[i - 1][j - 1];
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
dp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return dp[m][n];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Calculate average similarity for a group of tasks
|
|
162
|
+
*/
|
|
163
|
+
calculateGroupSimilarity(tasks) {
|
|
164
|
+
let totalSimilarity = 0;
|
|
165
|
+
let comparisons = 0;
|
|
166
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
167
|
+
for (let j = i + 1; j < tasks.length; j++) {
|
|
168
|
+
totalSimilarity += this.calculateSimilarity(tasks[i].title, tasks[j].title);
|
|
169
|
+
comparisons++;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return comparisons > 0 ? totalSimilarity / comparisons : 0;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Determine confidence level based on similarity
|
|
176
|
+
*/
|
|
177
|
+
determineConfidence(similarity) {
|
|
178
|
+
if (similarity >= 0.95)
|
|
179
|
+
return 'high';
|
|
180
|
+
if (similarity >= 0.85)
|
|
181
|
+
return 'medium';
|
|
182
|
+
return 'low';
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a suggested merge from multiple tasks
|
|
186
|
+
*/
|
|
187
|
+
createSuggestedMerge(tasks) {
|
|
188
|
+
// Sort by update time to get the most recent
|
|
189
|
+
const sortedByUpdate = [...tasks].sort((a, b) => new Date(b.updatedDate).getTime() - new Date(a.updatedDate).getTime());
|
|
190
|
+
// Sort by creation time to get the earliest
|
|
191
|
+
const sortedByCreate = [...tasks].sort((a, b) => new Date(a.createdDate).getTime() - new Date(b.createdDate).getTime());
|
|
192
|
+
// Use the highest priority
|
|
193
|
+
const priorities = ['P0', 'P1', 'P2', 'P3'];
|
|
194
|
+
const highestPriority = tasks.reduce((highest, task) => {
|
|
195
|
+
const currentIdx = priorities.indexOf(task.priority);
|
|
196
|
+
const highestIdx = priorities.indexOf(highest);
|
|
197
|
+
return currentIdx < highestIdx ? task.priority : highest;
|
|
198
|
+
}, 'P3');
|
|
199
|
+
// Use the latest status
|
|
200
|
+
const latestStatus = sortedByUpdate[0].status;
|
|
201
|
+
// Combine all tags
|
|
202
|
+
const allTags = [...new Set(tasks.flatMap((t) => t.tags))];
|
|
203
|
+
// Use earliest due date
|
|
204
|
+
const dueDates = tasks.filter((t) => t.dueDate).map((t) => new Date(t.dueDate).getTime());
|
|
205
|
+
const earliestDueDate = dueDates.length > 0 ? new Date(Math.min(...dueDates)).toISOString() : undefined;
|
|
206
|
+
// Combine stakeholders
|
|
207
|
+
const allStakeholders = [...new Set(tasks.flatMap((t) => t.stakeholders || []))];
|
|
208
|
+
// Use longest description
|
|
209
|
+
const descriptions = tasks.filter((t) => t.description).map((t) => t.description);
|
|
210
|
+
const longestDescription = descriptions.length > 0 ? descriptions.reduce((a, b) => (a.length > b.length ? a : b)) : undefined;
|
|
211
|
+
// Use the first task's source and ID as the base
|
|
212
|
+
const baseTask = sortedByCreate[0];
|
|
213
|
+
return {
|
|
214
|
+
id: `merged-${baseTask.id}`,
|
|
215
|
+
title: baseTask.title, // Use the original title
|
|
216
|
+
description: longestDescription,
|
|
217
|
+
priority: highestPriority,
|
|
218
|
+
status: latestStatus,
|
|
219
|
+
dueDate: earliestDueDate,
|
|
220
|
+
createdDate: sortedByCreate[0].createdDate,
|
|
221
|
+
updatedDate: sortedByUpdate[0].updatedDate,
|
|
222
|
+
source: baseTask.source,
|
|
223
|
+
sourceId: baseTask.sourceId,
|
|
224
|
+
tags: allTags,
|
|
225
|
+
estimatedMinutes: tasks.find((t) => t.estimatedMinutes)?.estimatedMinutes,
|
|
226
|
+
stakeholders: allStakeholders.length > 0 ? allStakeholders : undefined,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Merge duplicate tasks
|
|
231
|
+
* Requirement: 12.5
|
|
232
|
+
*/
|
|
233
|
+
async mergeDuplicates(duplicates) {
|
|
234
|
+
if (duplicates.length === 0) {
|
|
235
|
+
return {
|
|
236
|
+
success: false,
|
|
237
|
+
mergedTask: {},
|
|
238
|
+
removedTasks: [],
|
|
239
|
+
error: 'No duplicates to merge',
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
try {
|
|
243
|
+
const duplicate = duplicates[0];
|
|
244
|
+
const mergedTask = duplicate.suggestedMerge;
|
|
245
|
+
// Get IDs of tasks to be removed (all except the merged one's base)
|
|
246
|
+
const removedTasks = duplicate.tasks.slice(1).map((t) => t.id);
|
|
247
|
+
// TODO: Actually remove duplicates from sources
|
|
248
|
+
// This would require implementing delete operations in Apple Reminders and Notion
|
|
249
|
+
return {
|
|
250
|
+
success: true,
|
|
251
|
+
mergedTask,
|
|
252
|
+
removedTasks,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
return {
|
|
257
|
+
success: false,
|
|
258
|
+
mergedTask: {},
|
|
259
|
+
removedTasks: [],
|
|
260
|
+
error: error.message,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Detect conflicts between tasks
|
|
266
|
+
*/
|
|
267
|
+
detectConflicts(tasks) {
|
|
268
|
+
const conflicts = [];
|
|
269
|
+
if (tasks.length < 2)
|
|
270
|
+
return conflicts;
|
|
271
|
+
// Compare first two tasks for common conflict fields
|
|
272
|
+
const task1 = tasks[0];
|
|
273
|
+
const task2 = tasks[1];
|
|
274
|
+
// Status conflict
|
|
275
|
+
if (task1.status !== task2.status) {
|
|
276
|
+
conflicts.push({
|
|
277
|
+
field: 'status',
|
|
278
|
+
appleRemindersValue: task1.source === 'apple_reminders' ? task1.status : task2.status,
|
|
279
|
+
notionValue: task1.source === 'notion' ? task1.status : task2.status,
|
|
280
|
+
resolvedValue: this.resolveStatusConflict(task1, task2),
|
|
281
|
+
resolution: this.determineResolution(task1, task2),
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
// Priority conflict
|
|
285
|
+
if (task1.priority !== task2.priority) {
|
|
286
|
+
conflicts.push({
|
|
287
|
+
field: 'priority',
|
|
288
|
+
appleRemindersValue: task1.source === 'apple_reminders' ? task1.priority : task2.priority,
|
|
289
|
+
notionValue: task1.source === 'notion' ? task1.priority : task2.priority,
|
|
290
|
+
resolvedValue: this.resolvePriorityConflict(task1, task2),
|
|
291
|
+
resolution: this.determineResolution(task1, task2),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
return conflicts;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Resolve status conflict (use most recently updated)
|
|
298
|
+
*/
|
|
299
|
+
resolveStatusConflict(task1, task2) {
|
|
300
|
+
const date1 = new Date(task1.updatedDate).getTime();
|
|
301
|
+
const date2 = new Date(task2.updatedDate).getTime();
|
|
302
|
+
return date1 >= date2 ? task1.status : task2.status;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Resolve priority conflict (use highest priority)
|
|
306
|
+
*/
|
|
307
|
+
resolvePriorityConflict(task1, task2) {
|
|
308
|
+
const priorities = ['P0', 'P1', 'P2', 'P3'];
|
|
309
|
+
const idx1 = priorities.indexOf(task1.priority);
|
|
310
|
+
const idx2 = priorities.indexOf(task2.priority);
|
|
311
|
+
return idx1 <= idx2 ? task1.priority : task2.priority;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Determine which source wins for conflict resolution
|
|
315
|
+
*/
|
|
316
|
+
determineResolution(task1, task2) {
|
|
317
|
+
const date1 = new Date(task1.updatedDate).getTime();
|
|
318
|
+
const date2 = new Date(task2.updatedDate).getTime();
|
|
319
|
+
if (date1 >= date2) {
|
|
320
|
+
return task1.source === 'apple_reminders' ? 'apple_reminders' : 'notion';
|
|
321
|
+
}
|
|
322
|
+
return task2.source === 'apple_reminders' ? 'apple_reminders' : 'notion';
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Resolve conflicts
|
|
326
|
+
* Requirement: 12.6
|
|
327
|
+
*/
|
|
328
|
+
async resolveConflicts(conflicts) {
|
|
329
|
+
return conflicts.map((conflict) => {
|
|
330
|
+
let resolvedValue;
|
|
331
|
+
switch (conflict.field) {
|
|
332
|
+
case 'status':
|
|
333
|
+
// Use the specified resolution's value
|
|
334
|
+
resolvedValue =
|
|
335
|
+
conflict.resolution === 'apple_reminders'
|
|
336
|
+
? conflict.appleRemindersValue
|
|
337
|
+
: conflict.notionValue;
|
|
338
|
+
break;
|
|
339
|
+
case 'priority':
|
|
340
|
+
// Use higher priority
|
|
341
|
+
const priorities = ['P0', 'P1', 'P2', 'P3'];
|
|
342
|
+
const arIdx = priorities.indexOf(conflict.appleRemindersValue);
|
|
343
|
+
const nIdx = priorities.indexOf(conflict.notionValue);
|
|
344
|
+
resolvedValue = arIdx <= nIdx ? conflict.appleRemindersValue : conflict.notionValue;
|
|
345
|
+
break;
|
|
346
|
+
default:
|
|
347
|
+
// Default to the specified resolution
|
|
348
|
+
resolvedValue =
|
|
349
|
+
conflict.resolution === 'apple_reminders'
|
|
350
|
+
? conflict.appleRemindersValue
|
|
351
|
+
: conflict.notionValue;
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
field: conflict.field,
|
|
355
|
+
appleRemindersValue: conflict.appleRemindersValue,
|
|
356
|
+
notionValue: conflict.notionValue,
|
|
357
|
+
resolvedValue,
|
|
358
|
+
resolution: conflict.resolution,
|
|
359
|
+
};
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=task-synchronizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-synchronizer.js","sourceRoot":"","sources":["../../src/integrations/task-synchronizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TodoListManager
|
|
3
|
+
* Unified TODO list management with multi-source integration
|
|
4
|
+
* Requirement: 12.1-12.8
|
|
5
|
+
*/
|
|
6
|
+
import { Priority } from '../types/task.js';
|
|
7
|
+
/**
|
|
8
|
+
* Task source types
|
|
9
|
+
*/
|
|
10
|
+
export type TaskSource = 'apple_reminders' | 'notion' | 'manual';
|
|
11
|
+
/**
|
|
12
|
+
* Extended task status for TODO list management
|
|
13
|
+
*/
|
|
14
|
+
export type TodoStatus = 'not_started' | 'in_progress' | 'completed' | 'cancelled';
|
|
15
|
+
/**
|
|
16
|
+
* Date range filter
|
|
17
|
+
*/
|
|
18
|
+
export interface DateRange {
|
|
19
|
+
start?: string;
|
|
20
|
+
end?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Filter options for TODO list
|
|
24
|
+
*/
|
|
25
|
+
export interface TodoFilter {
|
|
26
|
+
priority?: Priority[];
|
|
27
|
+
status?: TodoStatus[];
|
|
28
|
+
dueDate?: DateRange;
|
|
29
|
+
source?: TaskSource[];
|
|
30
|
+
tags?: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* TODO item structure
|
|
34
|
+
*/
|
|
35
|
+
export interface TodoItem {
|
|
36
|
+
id: string;
|
|
37
|
+
title: string;
|
|
38
|
+
description?: string;
|
|
39
|
+
priority: Priority;
|
|
40
|
+
status: TodoStatus;
|
|
41
|
+
dueDate?: string;
|
|
42
|
+
createdDate: string;
|
|
43
|
+
updatedDate: string;
|
|
44
|
+
source: TaskSource;
|
|
45
|
+
sourceId: string;
|
|
46
|
+
tags: string[];
|
|
47
|
+
estimatedMinutes?: number;
|
|
48
|
+
stakeholders?: string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Task update result
|
|
52
|
+
*/
|
|
53
|
+
export interface UpdateResult {
|
|
54
|
+
success: boolean;
|
|
55
|
+
taskId: string;
|
|
56
|
+
updatedFields: string[];
|
|
57
|
+
syncedSources: TaskSource[];
|
|
58
|
+
error?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Task sync result
|
|
62
|
+
*/
|
|
63
|
+
export interface SyncResult {
|
|
64
|
+
success: boolean;
|
|
65
|
+
taskId: string;
|
|
66
|
+
syncedSources: TaskSource[];
|
|
67
|
+
conflicts?: TaskConflict[];
|
|
68
|
+
error?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Task conflict information
|
|
72
|
+
*/
|
|
73
|
+
export interface TaskConflict {
|
|
74
|
+
field: string;
|
|
75
|
+
appleRemindersValue: unknown;
|
|
76
|
+
notionValue: unknown;
|
|
77
|
+
resolvedValue: unknown;
|
|
78
|
+
resolution: 'apple_reminders' | 'notion' | 'manual';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* TodoListManager configuration
|
|
82
|
+
*/
|
|
83
|
+
export interface TodoListManagerConfig {
|
|
84
|
+
notionDatabaseId?: string;
|
|
85
|
+
appleRemindersDefaultList?: string;
|
|
86
|
+
cacheTimeoutMs?: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* TodoListManager
|
|
90
|
+
* Provides unified TODO list management across Apple Reminders and Notion
|
|
91
|
+
*/
|
|
92
|
+
export declare class TodoListManager {
|
|
93
|
+
private appleReminders;
|
|
94
|
+
private notion;
|
|
95
|
+
private notionClient;
|
|
96
|
+
private cachedTodos;
|
|
97
|
+
private lastFetchTime;
|
|
98
|
+
private cacheTimeout;
|
|
99
|
+
private config;
|
|
100
|
+
constructor(config?: TodoListManagerConfig);
|
|
101
|
+
/**
|
|
102
|
+
* Configure Notion integration
|
|
103
|
+
*/
|
|
104
|
+
configureNotion(databaseId: string): void;
|
|
105
|
+
/**
|
|
106
|
+
* List all todos with optional filtering
|
|
107
|
+
* Requirement: 12.1, 12.2, 12.3, 12.7
|
|
108
|
+
*/
|
|
109
|
+
listTodos(filter?: TodoFilter): Promise<TodoItem[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Get tasks due today
|
|
112
|
+
* Requirement: 12.8
|
|
113
|
+
*/
|
|
114
|
+
getTodaysTasks(): Promise<TodoItem[]>;
|
|
115
|
+
/**
|
|
116
|
+
* Update task status
|
|
117
|
+
* Requirement: 12.5, 12.6
|
|
118
|
+
*/
|
|
119
|
+
updateTaskStatus(taskId: string, status: TodoStatus, source: TaskSource): Promise<UpdateResult>;
|
|
120
|
+
/**
|
|
121
|
+
* Sync task across all sources
|
|
122
|
+
* Requirement: 12.6
|
|
123
|
+
*/
|
|
124
|
+
syncTaskAcrossSources(taskId: string): Promise<SyncResult>;
|
|
125
|
+
/**
|
|
126
|
+
* Filter todos based on criteria
|
|
127
|
+
*/
|
|
128
|
+
filterTodos(todos: TodoItem[], filter: TodoFilter): TodoItem[];
|
|
129
|
+
/**
|
|
130
|
+
* Merge todos from different sources
|
|
131
|
+
*/
|
|
132
|
+
mergeTodosFromSources(reminders: TodoItem[], notionTasks: TodoItem[]): TodoItem[];
|
|
133
|
+
/**
|
|
134
|
+
* Format todo for display
|
|
135
|
+
*/
|
|
136
|
+
formatTodoForDisplay(todo: TodoItem): string;
|
|
137
|
+
/**
|
|
138
|
+
* Fetch all todos from all sources
|
|
139
|
+
*/
|
|
140
|
+
private fetchAllTodos;
|
|
141
|
+
/**
|
|
142
|
+
* Fetch todos from Apple Reminders
|
|
143
|
+
* Uses AppleScript to query existing reminders
|
|
144
|
+
*/
|
|
145
|
+
private fetchFromAppleReminders;
|
|
146
|
+
/**
|
|
147
|
+
* Map Apple Reminders priority to internal priority
|
|
148
|
+
*/
|
|
149
|
+
private mapAppleRemindersPriority;
|
|
150
|
+
/**
|
|
151
|
+
* Fetch todos from Notion
|
|
152
|
+
* Uses MCP client to query the configured database
|
|
153
|
+
*/
|
|
154
|
+
private fetchFromNotion;
|
|
155
|
+
/**
|
|
156
|
+
* Map Notion priority to internal priority
|
|
157
|
+
*/
|
|
158
|
+
private mapNotionPriority;
|
|
159
|
+
/**
|
|
160
|
+
* Map Notion status to internal status
|
|
161
|
+
*/
|
|
162
|
+
private mapNotionStatus;
|
|
163
|
+
/**
|
|
164
|
+
* Update task in its source
|
|
165
|
+
* Requirement: 12.5
|
|
166
|
+
*/
|
|
167
|
+
private updateInSource;
|
|
168
|
+
/**
|
|
169
|
+
* Map internal status to Notion status format
|
|
170
|
+
*/
|
|
171
|
+
private mapStatusToNotion;
|
|
172
|
+
/**
|
|
173
|
+
* Invalidate cache
|
|
174
|
+
*/
|
|
175
|
+
private invalidateCache;
|
|
176
|
+
/**
|
|
177
|
+
* Get emoji for priority level
|
|
178
|
+
*/
|
|
179
|
+
private getPriorityEmoji;
|
|
180
|
+
/**
|
|
181
|
+
* Get emoji for status
|
|
182
|
+
*/
|
|
183
|
+
private getStatusEmoji;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=todo-list-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todo-list-manager.d.ts","sourceRoot":"","sources":["../../src/integrations/todo-list-manager.ts"],"names":[],"mappings":"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"}
|