omnifocus-mcp-server 1.0.0
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/LICENSE +21 -0
- package/README.md +165 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +20 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/omnifocus/cache.d.ts +26 -0
- package/dist/omnifocus/cache.d.ts.map +1 -0
- package/dist/omnifocus/cache.js +68 -0
- package/dist/omnifocus/cache.js.map +1 -0
- package/dist/omnifocus/client.d.ts +84 -0
- package/dist/omnifocus/client.d.ts.map +1 -0
- package/dist/omnifocus/client.js +340 -0
- package/dist/omnifocus/client.js.map +1 -0
- package/dist/omnifocus/executor.d.ts +11 -0
- package/dist/omnifocus/executor.d.ts.map +1 -0
- package/dist/omnifocus/executor.js +62 -0
- package/dist/omnifocus/executor.js.map +1 -0
- package/dist/omnifocus/scripts/database.d.ts +6 -0
- package/dist/omnifocus/scripts/database.d.ts.map +1 -0
- package/dist/omnifocus/scripts/database.js +161 -0
- package/dist/omnifocus/scripts/database.js.map +1 -0
- package/dist/omnifocus/scripts/folders.d.ts +7 -0
- package/dist/omnifocus/scripts/folders.d.ts.map +1 -0
- package/dist/omnifocus/scripts/folders.js +73 -0
- package/dist/omnifocus/scripts/folders.js.map +1 -0
- package/dist/omnifocus/scripts/perspectives.d.ts +4 -0
- package/dist/omnifocus/scripts/perspectives.d.ts.map +1 -0
- package/dist/omnifocus/scripts/perspectives.js +62 -0
- package/dist/omnifocus/scripts/perspectives.js.map +1 -0
- package/dist/omnifocus/scripts/projects.d.ts +13 -0
- package/dist/omnifocus/scripts/projects.d.ts.map +1 -0
- package/dist/omnifocus/scripts/projects.js +235 -0
- package/dist/omnifocus/scripts/projects.js.map +1 -0
- package/dist/omnifocus/scripts/tags.d.ts +7 -0
- package/dist/omnifocus/scripts/tags.d.ts.map +1 -0
- package/dist/omnifocus/scripts/tags.js +91 -0
- package/dist/omnifocus/scripts/tags.js.map +1 -0
- package/dist/omnifocus/scripts/tasks.d.ts +23 -0
- package/dist/omnifocus/scripts/tasks.d.ts.map +1 -0
- package/dist/omnifocus/scripts/tasks.js +560 -0
- package/dist/omnifocus/scripts/tasks.js.map +1 -0
- package/dist/omnifocus/serializers.d.ts +16 -0
- package/dist/omnifocus/serializers.d.ts.map +1 -0
- package/dist/omnifocus/serializers.js +181 -0
- package/dist/omnifocus/serializers.js.map +1 -0
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +49 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +4 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +48 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +20 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/database.d.ts +4 -0
- package/dist/tools/database.d.ts.map +1 -0
- package/dist/tools/database.js +60 -0
- package/dist/tools/database.js.map +1 -0
- package/dist/tools/folders.d.ts +4 -0
- package/dist/tools/folders.d.ts.map +1 -0
- package/dist/tools/folders.js +67 -0
- package/dist/tools/folders.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/perspectives.d.ts +4 -0
- package/dist/tools/perspectives.d.ts.map +1 -0
- package/dist/tools/perspectives.js +30 -0
- package/dist/tools/perspectives.js.map +1 -0
- package/dist/tools/projects.d.ts +4 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +175 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/tags.d.ts +4 -0
- package/dist/tools/tags.d.ts.map +1 -0
- package/dist/tools/tags.js +70 -0
- package/dist/tools/tags.js.map +1 -0
- package/dist/tools/tasks.d.ts +4 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +356 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types/omnifocus.d.ts +313 -0
- package/dist/types/omnifocus.d.ts.map +1 -0
- package/dist/types/omnifocus.js +3 -0
- package/dist/types/omnifocus.js.map +1 -0
- package/dist/utils/dates.d.ts +23 -0
- package/dist/utils/dates.d.ts.map +1 -0
- package/dist/utils/dates.js +44 -0
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/errors.d.ts +25 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +76 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +30 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
import { serializeTaskFn, serializeTaskWithChildrenFn, serializeTaskNotificationFn, serializeProjectFn } from "../serializers.js";
|
|
2
|
+
import { validateDateArgs } from "../../utils/dates.js";
|
|
3
|
+
// Shared filter logic used by both buildListTasksScript and buildGetTaskCountScript
|
|
4
|
+
// Single-pass filter: all conditions checked in one pass to avoid intermediate array allocations
|
|
5
|
+
const taskFilterLogicFn = `
|
|
6
|
+
var source;
|
|
7
|
+
if (args.inInbox) {
|
|
8
|
+
source = inbox;
|
|
9
|
+
} else {
|
|
10
|
+
source = flattenedTasks;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Pre-compute date thresholds outside the loop
|
|
14
|
+
var _dueAfter = args.dueAfter ? new Date(args.dueAfter) : null;
|
|
15
|
+
var _dueBefore = args.dueBefore ? new Date(args.dueBefore) : null;
|
|
16
|
+
var _deferAfter = args.deferAfter ? new Date(args.deferAfter) : null;
|
|
17
|
+
var _deferBefore = args.deferBefore ? new Date(args.deferBefore) : null;
|
|
18
|
+
var _searchQuery = args.search ? args.search.toLowerCase() : null;
|
|
19
|
+
|
|
20
|
+
var tasks = source.filter(function(t) {
|
|
21
|
+
// Filter by taskStatus
|
|
22
|
+
if (args.taskStatus === "available") {
|
|
23
|
+
if (t.taskStatus !== Task.Status.Available) return false;
|
|
24
|
+
} else if (args.taskStatus === "remaining") {
|
|
25
|
+
if (t.taskStatus !== Task.Status.Available && t.taskStatus !== Task.Status.Blocked) return false;
|
|
26
|
+
} else if (args.taskStatus === "completed") {
|
|
27
|
+
if (t.taskStatus !== Task.Status.Completed) return false;
|
|
28
|
+
} else if (args.taskStatus === "dropped") {
|
|
29
|
+
if (t.taskStatus !== Task.Status.Dropped) return false;
|
|
30
|
+
} else if (args.completed === true) {
|
|
31
|
+
if (t.taskStatus !== Task.Status.Completed) return false;
|
|
32
|
+
} else if (args.completed === false) {
|
|
33
|
+
if (t.taskStatus === Task.Status.Completed || t.taskStatus === Task.Status.Dropped) return false;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Filter by flagged
|
|
37
|
+
if (args.flagged === true && !t.flagged) return false;
|
|
38
|
+
if (args.flagged === false && t.flagged) return false;
|
|
39
|
+
|
|
40
|
+
// Filter by available
|
|
41
|
+
if (args.available === true && t.taskStatus !== Task.Status.Available) return false;
|
|
42
|
+
|
|
43
|
+
// Filter by project ID
|
|
44
|
+
if (args.projectId) {
|
|
45
|
+
if (!t.containingProject || t.containingProject.id.primaryKey !== args.projectId) return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Filter by project name
|
|
49
|
+
if (args.projectName) {
|
|
50
|
+
if (!t.containingProject || t.containingProject.name !== args.projectName) return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Filter by tag names
|
|
54
|
+
if (args.tagNames && args.tagNames.length > 0) {
|
|
55
|
+
var taskTagNames = t.tags.map(function(tg) { return tg.name; });
|
|
56
|
+
for (var i = 0; i < args.tagNames.length; i++) {
|
|
57
|
+
if (taskTagNames.indexOf(args.tagNames[i]) === -1) return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Filter by due date range
|
|
62
|
+
if (_dueAfter && (!t.dueDate || t.dueDate < _dueAfter)) return false;
|
|
63
|
+
if (_dueBefore && (!t.dueDate || t.dueDate > _dueBefore)) return false;
|
|
64
|
+
|
|
65
|
+
// Filter by defer date range
|
|
66
|
+
if (_deferAfter && (!t.deferDate || t.deferDate < _deferAfter)) return false;
|
|
67
|
+
if (_deferBefore && (!t.deferDate || t.deferDate > _deferBefore)) return false;
|
|
68
|
+
|
|
69
|
+
// Filter by search query
|
|
70
|
+
if (_searchQuery) {
|
|
71
|
+
if (t.name.toLowerCase().indexOf(_searchQuery) === -1 && (t.note || "").toLowerCase().indexOf(_searchQuery) === -1) return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return true;
|
|
75
|
+
});`;
|
|
76
|
+
export function buildListTasksScript(args) {
|
|
77
|
+
const argsJson = JSON.stringify(args);
|
|
78
|
+
return `(() => {
|
|
79
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
80
|
+
${serializeTaskFn}
|
|
81
|
+
${taskFilterLogicFn}
|
|
82
|
+
|
|
83
|
+
// Pagination
|
|
84
|
+
var offset = args.offset || 0;
|
|
85
|
+
var limit = args.limit || 100;
|
|
86
|
+
tasks = tasks.slice(offset, offset + limit);
|
|
87
|
+
|
|
88
|
+
return JSON.stringify(tasks.map(serializeTask));
|
|
89
|
+
})()`;
|
|
90
|
+
}
|
|
91
|
+
export function buildGetTaskCountScript(args) {
|
|
92
|
+
const argsJson = JSON.stringify(args);
|
|
93
|
+
return `(() => {
|
|
94
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
95
|
+
${taskFilterLogicFn}
|
|
96
|
+
|
|
97
|
+
return JSON.stringify({ count: tasks.length });
|
|
98
|
+
})()`;
|
|
99
|
+
}
|
|
100
|
+
export function buildGetTaskScript(args) {
|
|
101
|
+
const normalized = typeof args === "string" ? { id: args } : args;
|
|
102
|
+
const argsJson = JSON.stringify(normalized);
|
|
103
|
+
if (normalized.includeChildren) {
|
|
104
|
+
return `(() => {
|
|
105
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
106
|
+
${serializeTaskFn}
|
|
107
|
+
${serializeTaskWithChildrenFn}
|
|
108
|
+
|
|
109
|
+
var task = byId(flattenedTasks, args.id);
|
|
110
|
+
if (!task) {
|
|
111
|
+
throw new Error("Task not found: " + args.id);
|
|
112
|
+
}
|
|
113
|
+
return JSON.stringify(serializeTaskWithChildren(task, 0, args.maxDepth || 0));
|
|
114
|
+
})()`;
|
|
115
|
+
}
|
|
116
|
+
return `(() => {
|
|
117
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
118
|
+
${serializeTaskFn}
|
|
119
|
+
|
|
120
|
+
var task = byId(flattenedTasks, args.id);
|
|
121
|
+
if (!task) {
|
|
122
|
+
throw new Error("Task not found: " + args.id);
|
|
123
|
+
}
|
|
124
|
+
return JSON.stringify(serializeTask(task));
|
|
125
|
+
})()`;
|
|
126
|
+
}
|
|
127
|
+
export function buildCreateTaskScript(args) {
|
|
128
|
+
validateDateArgs(args, ["deferDate", "dueDate"]);
|
|
129
|
+
const argsJson = JSON.stringify(args);
|
|
130
|
+
return `(() => {
|
|
131
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
132
|
+
${serializeTaskFn}
|
|
133
|
+
|
|
134
|
+
var task = new Task(args.name, inbox.ending);
|
|
135
|
+
|
|
136
|
+
if (args.note !== undefined) task.note = args.note;
|
|
137
|
+
if (args.flagged !== undefined) task.flagged = args.flagged;
|
|
138
|
+
if (args.deferDate) task.deferDate = new Date(args.deferDate);
|
|
139
|
+
if (args.dueDate) task.dueDate = new Date(args.dueDate);
|
|
140
|
+
if (args.estimatedMinutes !== undefined) task.estimatedMinutes = args.estimatedMinutes;
|
|
141
|
+
if (args.completedByChildren !== undefined) task.completedByChildren = args.completedByChildren;
|
|
142
|
+
|
|
143
|
+
if (args.repetitionRule) {
|
|
144
|
+
var methodMap = { "fixed": Task.RepetitionMethod.Fixed, "startAfterCompletion": Task.RepetitionMethod.StartAfterCompletion, "dueAfterCompletion": Task.RepetitionMethod.DueAfterCompletion };
|
|
145
|
+
task.repetitionRule = new Task.RepetitionRule(args.repetitionRule.ruleString, methodMap[args.repetitionRule.method] || Task.RepetitionMethod.Fixed);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (args.projectId) {
|
|
149
|
+
var project = byId(flattenedProjects, args.projectId);
|
|
150
|
+
if (!project) throw new Error("Project not found: " + args.projectId);
|
|
151
|
+
moveTasks([task], project.ending);
|
|
152
|
+
} else if (args.projectName) {
|
|
153
|
+
var projects = flattenedProjects.filter(function(p) { return p.name === args.projectName; });
|
|
154
|
+
if (projects.length === 0) throw new Error("Project not found: " + args.projectName);
|
|
155
|
+
moveTasks([task], projects[0].ending);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (args.tags && args.tags.length > 0) {
|
|
159
|
+
args.tags.forEach(function(tagName) {
|
|
160
|
+
var matches = flattenedTags.filter(function(t) { return t.name === tagName; });
|
|
161
|
+
if (matches.length > 0) {
|
|
162
|
+
task.addTag(matches[0]);
|
|
163
|
+
} else {
|
|
164
|
+
var newTag = new Tag(tagName);
|
|
165
|
+
tags.push(newTag);
|
|
166
|
+
task.addTag(newTag);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return JSON.stringify(serializeTask(task));
|
|
172
|
+
})()`;
|
|
173
|
+
}
|
|
174
|
+
export function buildUpdateTaskScript(args) {
|
|
175
|
+
validateDateArgs(args, ["deferDate", "dueDate"]);
|
|
176
|
+
const argsJson = JSON.stringify(args);
|
|
177
|
+
return `(() => {
|
|
178
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
179
|
+
${serializeTaskFn}
|
|
180
|
+
|
|
181
|
+
var task = byId(flattenedTasks, args.id);
|
|
182
|
+
if (!task) throw new Error("Task not found: " + args.id);
|
|
183
|
+
|
|
184
|
+
if (args.name !== undefined) task.name = args.name;
|
|
185
|
+
if (args.note !== undefined) task.note = args.note;
|
|
186
|
+
if (args.flagged !== undefined) task.flagged = args.flagged;
|
|
187
|
+
if (args.deferDate !== undefined) task.deferDate = args.deferDate ? new Date(args.deferDate) : null;
|
|
188
|
+
if (args.dueDate !== undefined) task.dueDate = args.dueDate ? new Date(args.dueDate) : null;
|
|
189
|
+
if (args.estimatedMinutes !== undefined) task.estimatedMinutes = args.estimatedMinutes;
|
|
190
|
+
if (args.sequential !== undefined) task.sequential = args.sequential;
|
|
191
|
+
if (args.completedByChildren !== undefined) task.completedByChildren = args.completedByChildren;
|
|
192
|
+
|
|
193
|
+
if (args.repetitionRule !== undefined) {
|
|
194
|
+
if (args.repetitionRule === null) {
|
|
195
|
+
task.repetitionRule = null;
|
|
196
|
+
} else {
|
|
197
|
+
var methodMap = { "fixed": Task.RepetitionMethod.Fixed, "startAfterCompletion": Task.RepetitionMethod.StartAfterCompletion, "dueAfterCompletion": Task.RepetitionMethod.DueAfterCompletion };
|
|
198
|
+
task.repetitionRule = new Task.RepetitionRule(args.repetitionRule.ruleString, methodMap[args.repetitionRule.method] || Task.RepetitionMethod.Fixed);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return JSON.stringify(serializeTask(task));
|
|
203
|
+
})()`;
|
|
204
|
+
}
|
|
205
|
+
export function buildCompleteTaskScript(id) {
|
|
206
|
+
const argsJson = JSON.stringify({ id });
|
|
207
|
+
return `(() => {
|
|
208
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
209
|
+
${serializeTaskFn}
|
|
210
|
+
|
|
211
|
+
var task = byId(flattenedTasks, args.id);
|
|
212
|
+
if (!task) throw new Error("Task not found: " + args.id);
|
|
213
|
+
task.markComplete();
|
|
214
|
+
return JSON.stringify(serializeTask(task));
|
|
215
|
+
})()`;
|
|
216
|
+
}
|
|
217
|
+
export function buildUncompleteTaskScript(id) {
|
|
218
|
+
const argsJson = JSON.stringify({ id });
|
|
219
|
+
return `(() => {
|
|
220
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
221
|
+
${serializeTaskFn}
|
|
222
|
+
|
|
223
|
+
var task = byId(flattenedTasks, args.id);
|
|
224
|
+
if (!task) throw new Error("Task not found: " + args.id);
|
|
225
|
+
task.markIncomplete();
|
|
226
|
+
return JSON.stringify(serializeTask(task));
|
|
227
|
+
})()`;
|
|
228
|
+
}
|
|
229
|
+
export function buildDropTaskScript(id) {
|
|
230
|
+
const argsJson = JSON.stringify({ id });
|
|
231
|
+
return `(() => {
|
|
232
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
233
|
+
${serializeTaskFn}
|
|
234
|
+
|
|
235
|
+
var task = byId(flattenedTasks, args.id);
|
|
236
|
+
if (!task) throw new Error("Task not found: " + args.id);
|
|
237
|
+
task.drop(false);
|
|
238
|
+
return JSON.stringify(serializeTask(task));
|
|
239
|
+
})()`;
|
|
240
|
+
}
|
|
241
|
+
export function buildDeleteTaskScript(id) {
|
|
242
|
+
const argsJson = JSON.stringify({ id });
|
|
243
|
+
return `(() => {
|
|
244
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
245
|
+
|
|
246
|
+
var task = byId(flattenedTasks, args.id);
|
|
247
|
+
if (!task) throw new Error("Task not found: " + args.id);
|
|
248
|
+
deleteObject(task);
|
|
249
|
+
return JSON.stringify({ deleted: true, id: args.id });
|
|
250
|
+
})()`;
|
|
251
|
+
}
|
|
252
|
+
export function buildMoveTasksScript(args) {
|
|
253
|
+
const argsJson = JSON.stringify(args);
|
|
254
|
+
return `(() => {
|
|
255
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
256
|
+
${serializeTaskFn}
|
|
257
|
+
|
|
258
|
+
var tasks = args.taskIds.map(function(id) {
|
|
259
|
+
var t = byId(flattenedTasks, id);
|
|
260
|
+
if (!t) throw new Error("Task not found: " + id);
|
|
261
|
+
return t;
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
var destination;
|
|
265
|
+
if (args.parentTaskId) {
|
|
266
|
+
var parentTask = byId(flattenedTasks, args.parentTaskId);
|
|
267
|
+
if (!parentTask) throw new Error("Parent task not found: " + args.parentTaskId);
|
|
268
|
+
destination = parentTask.ending;
|
|
269
|
+
} else if (args.projectId) {
|
|
270
|
+
var project = byId(flattenedProjects, args.projectId);
|
|
271
|
+
if (!project) throw new Error("Project not found: " + args.projectId);
|
|
272
|
+
destination = project.ending;
|
|
273
|
+
} else if (args.projectName) {
|
|
274
|
+
var projects = flattenedProjects.filter(function(p) { return p.name === args.projectName; });
|
|
275
|
+
if (projects.length === 0) throw new Error("Project not found: " + args.projectName);
|
|
276
|
+
destination = projects[0].ending;
|
|
277
|
+
} else {
|
|
278
|
+
destination = inbox.ending;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
moveTasks(tasks, destination);
|
|
282
|
+
return JSON.stringify(tasks.map(serializeTask));
|
|
283
|
+
})()`;
|
|
284
|
+
}
|
|
285
|
+
export function buildDuplicateTasksScript(args) {
|
|
286
|
+
const argsJson = JSON.stringify(args);
|
|
287
|
+
return `(() => {
|
|
288
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
289
|
+
${serializeTaskFn}
|
|
290
|
+
|
|
291
|
+
var tasks = args.taskIds.map(function(id) {
|
|
292
|
+
var t = byId(flattenedTasks, id);
|
|
293
|
+
if (!t) throw new Error("Task not found: " + id);
|
|
294
|
+
return t;
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
var destination;
|
|
298
|
+
if (args.projectId) {
|
|
299
|
+
var project = byId(flattenedProjects, args.projectId);
|
|
300
|
+
if (!project) throw new Error("Project not found: " + args.projectId);
|
|
301
|
+
destination = project.ending;
|
|
302
|
+
} else if (args.projectName) {
|
|
303
|
+
var projects = flattenedProjects.filter(function(p) { return p.name === args.projectName; });
|
|
304
|
+
if (projects.length === 0) throw new Error("Project not found: " + args.projectName);
|
|
305
|
+
destination = projects[0].ending;
|
|
306
|
+
} else {
|
|
307
|
+
destination = inbox.ending;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
var duplicated = duplicateTasks(tasks, destination);
|
|
311
|
+
return JSON.stringify(duplicated.map(serializeTask));
|
|
312
|
+
})()`;
|
|
313
|
+
}
|
|
314
|
+
export function buildSetTaskTagsScript(args) {
|
|
315
|
+
const argsJson = JSON.stringify(args);
|
|
316
|
+
return `(() => {
|
|
317
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
318
|
+
${serializeTaskFn}
|
|
319
|
+
|
|
320
|
+
var task = byId(flattenedTasks, args.taskId);
|
|
321
|
+
if (!task) throw new Error("Task not found: " + args.taskId);
|
|
322
|
+
|
|
323
|
+
var tagMap = {};
|
|
324
|
+
flattenedTags.forEach(function(t) { tagMap[t.name] = t; });
|
|
325
|
+
|
|
326
|
+
function findOrCreateTag(name) {
|
|
327
|
+
if (tagMap[name]) return tagMap[name];
|
|
328
|
+
var newTag = new Tag(name);
|
|
329
|
+
tagMap[name] = newTag;
|
|
330
|
+
return newTag;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
if (args.mode === "replace") {
|
|
334
|
+
task.clearTags();
|
|
335
|
+
args.tagNames.forEach(function(name) {
|
|
336
|
+
task.addTag(findOrCreateTag(name));
|
|
337
|
+
});
|
|
338
|
+
} else if (args.mode === "add") {
|
|
339
|
+
args.tagNames.forEach(function(name) {
|
|
340
|
+
task.addTag(findOrCreateTag(name));
|
|
341
|
+
});
|
|
342
|
+
} else if (args.mode === "remove") {
|
|
343
|
+
args.tagNames.forEach(function(name) {
|
|
344
|
+
if (tagMap[name]) task.removeTag(tagMap[name]);
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
return JSON.stringify(serializeTask(task));
|
|
349
|
+
})()`;
|
|
350
|
+
}
|
|
351
|
+
export function buildAddTaskNotificationScript(args) {
|
|
352
|
+
validateDateArgs(args, ["absoluteDate"]);
|
|
353
|
+
const argsJson = JSON.stringify(args);
|
|
354
|
+
return `(() => {
|
|
355
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
356
|
+
${serializeTaskFn}
|
|
357
|
+
|
|
358
|
+
var task = byId(flattenedTasks, args.taskId);
|
|
359
|
+
if (!task) throw new Error("Task not found: " + args.taskId);
|
|
360
|
+
|
|
361
|
+
if (args.type === "absolute") {
|
|
362
|
+
if (!args.absoluteDate) throw new Error("absoluteDate is required for absolute notifications");
|
|
363
|
+
task.addNotification(new Date(args.absoluteDate));
|
|
364
|
+
} else if (args.type === "dueRelative") {
|
|
365
|
+
if (args.relativeOffset === undefined) throw new Error("relativeOffset is required for dueRelative notifications");
|
|
366
|
+
task.addNotification(args.relativeOffset);
|
|
367
|
+
} else if (args.type === "deferRelative") {
|
|
368
|
+
throw new Error("deferRelative notifications are not supported by the OmniFocus Omni Automation API");
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return JSON.stringify(serializeTask(task));
|
|
372
|
+
})()`;
|
|
373
|
+
}
|
|
374
|
+
export function buildAppendTaskNoteScript(taskId, text) {
|
|
375
|
+
const argsJson = JSON.stringify({ taskId, text });
|
|
376
|
+
return `(() => {
|
|
377
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
378
|
+
${serializeTaskFn}
|
|
379
|
+
|
|
380
|
+
var task = byId(flattenedTasks, args.taskId);
|
|
381
|
+
if (!task) throw new Error("Task not found: " + args.taskId);
|
|
382
|
+
task.appendStringToNote(args.text);
|
|
383
|
+
return JSON.stringify(serializeTask(task));
|
|
384
|
+
})()`;
|
|
385
|
+
}
|
|
386
|
+
export function buildConvertTaskToProjectScript(taskId) {
|
|
387
|
+
const argsJson = JSON.stringify({ taskId });
|
|
388
|
+
return `(() => {
|
|
389
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
390
|
+
${serializeProjectFn}
|
|
391
|
+
|
|
392
|
+
var task = byId(flattenedTasks, args.taskId);
|
|
393
|
+
if (!task) throw new Error("Task not found: " + args.taskId);
|
|
394
|
+
var projects = convertTasksToProjects([task], library.ending);
|
|
395
|
+
if (projects.length === 0) throw new Error("Failed to convert task to project");
|
|
396
|
+
return JSON.stringify(serializeProject(projects[0]));
|
|
397
|
+
})()`;
|
|
398
|
+
}
|
|
399
|
+
export function buildGetTodayCompletedTasksScript() {
|
|
400
|
+
return `(() => {
|
|
401
|
+
${serializeTaskFn}
|
|
402
|
+
|
|
403
|
+
var now = new Date();
|
|
404
|
+
var startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0);
|
|
405
|
+
var tasks = flattenedTasks.filter(function(t) {
|
|
406
|
+
return t.taskStatus === Task.Status.Completed && t.completionDate && t.completionDate >= startOfDay;
|
|
407
|
+
});
|
|
408
|
+
return JSON.stringify(tasks.map(serializeTask));
|
|
409
|
+
})()`;
|
|
410
|
+
}
|
|
411
|
+
export function buildListTaskNotificationsScript(taskId) {
|
|
412
|
+
const argsJson = JSON.stringify({ taskId });
|
|
413
|
+
return `(() => {
|
|
414
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
415
|
+
${serializeTaskNotificationFn}
|
|
416
|
+
|
|
417
|
+
var task = byId(flattenedTasks, args.taskId);
|
|
418
|
+
if (!task) throw new Error("Task not found: " + args.taskId);
|
|
419
|
+
|
|
420
|
+
return JSON.stringify(task.notifications.map(serializeTaskNotification));
|
|
421
|
+
})()`;
|
|
422
|
+
}
|
|
423
|
+
export function buildRemoveTaskNotificationScript(taskId, notificationId) {
|
|
424
|
+
const argsJson = JSON.stringify({ taskId, notificationId });
|
|
425
|
+
return `(() => {
|
|
426
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
427
|
+
|
|
428
|
+
var task = byId(flattenedTasks, args.taskId);
|
|
429
|
+
if (!task) throw new Error("Task not found: " + args.taskId);
|
|
430
|
+
|
|
431
|
+
var notif = null;
|
|
432
|
+
for (var i = 0; i < task.notifications.length; i++) {
|
|
433
|
+
if (task.notifications[i].id.primaryKey === args.notificationId) {
|
|
434
|
+
notif = task.notifications[i];
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
if (!notif) throw new Error("Notification not found: " + args.notificationId);
|
|
439
|
+
|
|
440
|
+
task.removeNotification(notif);
|
|
441
|
+
return JSON.stringify({ removed: true, taskId: args.taskId, notificationId: args.notificationId });
|
|
442
|
+
})()`;
|
|
443
|
+
}
|
|
444
|
+
export function buildBatchCreateTasksScript(args) {
|
|
445
|
+
function validateBatchTaskDates(tasks) {
|
|
446
|
+
for (const task of tasks) {
|
|
447
|
+
validateDateArgs(task, ["deferDate", "dueDate"]);
|
|
448
|
+
if (Array.isArray(task.children)) {
|
|
449
|
+
validateBatchTaskDates(task.children);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
validateBatchTaskDates(args.tasks);
|
|
454
|
+
const argsJson = JSON.stringify(args);
|
|
455
|
+
return `(() => {
|
|
456
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
457
|
+
${serializeTaskFn}
|
|
458
|
+
|
|
459
|
+
var tagMap = {};
|
|
460
|
+
flattenedTags.forEach(function(t) { tagMap[t.name] = t; });
|
|
461
|
+
|
|
462
|
+
function findOrCreateTag(name) {
|
|
463
|
+
if (tagMap[name]) return tagMap[name];
|
|
464
|
+
var newTag = new Tag(name);
|
|
465
|
+
tagMap[name] = newTag;
|
|
466
|
+
return newTag;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
function createTaskFromItem(item, parentLocation) {
|
|
470
|
+
var task = new Task(item.name, parentLocation);
|
|
471
|
+
|
|
472
|
+
if (item.note !== undefined) task.note = item.note;
|
|
473
|
+
if (item.flagged !== undefined) task.flagged = item.flagged;
|
|
474
|
+
if (item.deferDate) task.deferDate = new Date(item.deferDate);
|
|
475
|
+
if (item.dueDate) task.dueDate = new Date(item.dueDate);
|
|
476
|
+
if (item.estimatedMinutes !== undefined) task.estimatedMinutes = item.estimatedMinutes;
|
|
477
|
+
if (item.completedByChildren !== undefined) task.completedByChildren = item.completedByChildren;
|
|
478
|
+
|
|
479
|
+
if (item.repetitionRule) {
|
|
480
|
+
var methodMap = { "fixed": Task.RepetitionMethod.Fixed, "startAfterCompletion": Task.RepetitionMethod.StartAfterCompletion, "dueAfterCompletion": Task.RepetitionMethod.DueAfterCompletion };
|
|
481
|
+
task.repetitionRule = new Task.RepetitionRule(item.repetitionRule.ruleString, methodMap[item.repetitionRule.method] || Task.RepetitionMethod.Fixed);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if (item.tags && item.tags.length > 0) {
|
|
485
|
+
item.tags.forEach(function(tagName) { task.addTag(findOrCreateTag(tagName)); });
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (item.children && item.children.length > 0) {
|
|
489
|
+
item.children.forEach(function(child) {
|
|
490
|
+
createTaskFromItem(child, task.ending);
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
return task;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
var destination;
|
|
498
|
+
if (args.parentTaskId) {
|
|
499
|
+
var parentTask = byId(flattenedTasks, args.parentTaskId);
|
|
500
|
+
if (!parentTask) throw new Error("Parent task not found: " + args.parentTaskId);
|
|
501
|
+
destination = parentTask.ending;
|
|
502
|
+
} else if (args.projectId) {
|
|
503
|
+
var project = byId(flattenedProjects, args.projectId);
|
|
504
|
+
if (!project) throw new Error("Project not found: " + args.projectId);
|
|
505
|
+
destination = project.ending;
|
|
506
|
+
} else if (args.projectName) {
|
|
507
|
+
var projects = flattenedProjects.filter(function(p) { return p.name === args.projectName; });
|
|
508
|
+
if (projects.length === 0) throw new Error("Project not found: " + args.projectName);
|
|
509
|
+
destination = projects[0].ending;
|
|
510
|
+
} else {
|
|
511
|
+
destination = inbox.ending;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
var created = args.tasks.map(function(item) {
|
|
515
|
+
return createTaskFromItem(item, destination);
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
return JSON.stringify(created.map(serializeTask));
|
|
519
|
+
})()`;
|
|
520
|
+
}
|
|
521
|
+
export function buildBatchDeleteTasksScript(args) {
|
|
522
|
+
const argsJson = JSON.stringify(args);
|
|
523
|
+
return `(() => {
|
|
524
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
525
|
+
// Phase 1: validate all IDs before mutating
|
|
526
|
+
var tasksToDelete = args.taskIds.map(function(id) {
|
|
527
|
+
var task = byId(flattenedTasks, id);
|
|
528
|
+
if (!task) throw new Error("Task not found: " + id);
|
|
529
|
+
return task;
|
|
530
|
+
});
|
|
531
|
+
// Phase 2: apply mutations
|
|
532
|
+
var results = [];
|
|
533
|
+
tasksToDelete.forEach(function(task, i) {
|
|
534
|
+
deleteObject(task);
|
|
535
|
+
results.push({ deleted: true, id: args.taskIds[i] });
|
|
536
|
+
});
|
|
537
|
+
return JSON.stringify(results);
|
|
538
|
+
})()`;
|
|
539
|
+
}
|
|
540
|
+
export function buildBatchCompleteTasksScript(args) {
|
|
541
|
+
const argsJson = JSON.stringify(args);
|
|
542
|
+
return `(() => {
|
|
543
|
+
var args = JSON.parse(${JSON.stringify(argsJson)});
|
|
544
|
+
${serializeTaskFn}
|
|
545
|
+
// Phase 1: validate all IDs before mutating
|
|
546
|
+
var tasksToComplete = args.taskIds.map(function(id) {
|
|
547
|
+
var task = byId(flattenedTasks, id);
|
|
548
|
+
if (!task) throw new Error("Task not found: " + id);
|
|
549
|
+
return task;
|
|
550
|
+
});
|
|
551
|
+
// Phase 2: apply mutations
|
|
552
|
+
var results = [];
|
|
553
|
+
tasksToComplete.forEach(function(task) {
|
|
554
|
+
task.markComplete();
|
|
555
|
+
results.push(serializeTask(task));
|
|
556
|
+
});
|
|
557
|
+
return JSON.stringify(results);
|
|
558
|
+
})()`;
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/omnifocus/scripts/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared OmniJS serialization functions as string templates.
|
|
3
|
+
* These are embedded directly in OmniJS scripts to convert OmniFocus objects to JSON.
|
|
4
|
+
*
|
|
5
|
+
* Maps are hoisted outside serializer functions to avoid re-allocation per call.
|
|
6
|
+
*/
|
|
7
|
+
export declare const serializeTaskFn = "\nvar _taskMethodMap = {};\n_taskMethodMap[Task.RepetitionMethod.Fixed] = \"fixed\";\n_taskMethodMap[Task.RepetitionMethod.StartAfterCompletion] = \"startAfterCompletion\";\n_taskMethodMap[Task.RepetitionMethod.DueAfterCompletion] = \"dueAfterCompletion\";\n\nfunction serializeTask(task) {\n var rr = null;\n if (task.repetitionRule) {\n rr = {\n ruleString: task.repetitionRule.ruleString,\n method: _taskMethodMap[task.repetitionRule.method] || \"fixed\"\n };\n }\n var cp = task.containingProject;\n return {\n id: task.id.primaryKey,\n name: task.name,\n note: task.note,\n url: \"omnifocus:///task/\" + task.id.primaryKey,\n flagged: task.flagged,\n completed: task.taskStatus === Task.Status.Completed,\n dropped: task.taskStatus === Task.Status.Dropped,\n deferDate: task.deferDate ? task.deferDate.toISOString() : null,\n dueDate: task.dueDate ? task.dueDate.toISOString() : null,\n completionDate: task.completionDate ? task.completionDate.toISOString() : null,\n droppedDate: task.droppedDate ? task.droppedDate.toISOString() : null,\n added: task.added ? task.added.toISOString() : null,\n modified: task.modified ? task.modified.toISOString() : null,\n effectiveDueDate: task.effectiveDueDate ? task.effectiveDueDate.toISOString() : null,\n effectiveDeferDate: task.effectiveDeferDate ? task.effectiveDeferDate.toISOString() : null,\n effectiveFlagged: task.effectiveFlagged,\n estimatedMinutes: task.estimatedMinutes,\n containingProjectId: cp ? cp.id.primaryKey : null,\n containingProjectName: cp ? cp.name : null,\n parentTaskId: task.parent ? (task.parent.id ? task.parent.id.primaryKey : null) : null,\n tags: task.tags.map(function(t) { return { id: t.id.primaryKey, name: t.name }; }),\n hasChildren: task.hasChildren,\n sequential: task.sequential,\n completedByChildren: task.completedByChildren,\n inInbox: task.inInbox,\n repetitionRule: rr\n };\n}";
|
|
8
|
+
export declare const serializeTaskWithChildrenFn = "\nfunction serializeTaskWithChildren(task, depth, maxDepth) {\n var result = serializeTask(task);\n result.children = [];\n if (task.hasChildren && (maxDepth === 0 || depth < maxDepth)) {\n var kids = task.children;\n for (var i = 0; i < kids.length; i++) {\n result.children.push(serializeTaskWithChildren(kids[i], depth + 1, maxDepth));\n }\n }\n return result;\n}";
|
|
9
|
+
export declare const serializeProjectFn = "\nvar _projectStatusMap = {};\n_projectStatusMap[Project.Status.Active] = \"active\";\n_projectStatusMap[Project.Status.OnHold] = \"onHold\";\n_projectStatusMap[Project.Status.Done] = \"done\";\n_projectStatusMap[Project.Status.Dropped] = \"dropped\";\n\nfunction serializeProject(project) {\n var ri = null;\n if (project.reviewInterval) {\n ri = { steps: project.reviewInterval.steps, unit: project.reviewInterval.unit + \"\" };\n }\n\n var ft = project.flattenedTasks;\n return {\n id: project.id.primaryKey,\n name: project.name,\n note: project.note,\n url: \"omnifocus:///task/\" + project.id.primaryKey,\n status: _projectStatusMap[project.status] || \"active\",\n flagged: project.flagged,\n completed: project.status === Project.Status.Done,\n deferDate: project.deferDate ? project.deferDate.toISOString() : null,\n dueDate: project.dueDate ? project.dueDate.toISOString() : null,\n completionDate: project.completionDate ? project.completionDate.toISOString() : null,\n droppedDate: project.droppedDate ? project.droppedDate.toISOString() : null,\n added: project.task.added ? project.task.added.toISOString() : null,\n modified: project.task.modified ? project.task.modified.toISOString() : null,\n estimatedMinutes: project.estimatedMinutes,\n containingFolderId: project.parentFolder ? project.parentFolder.id.primaryKey : null,\n containingFolderName: project.parentFolder ? project.parentFolder.name : null,\n tags: project.task.tags.map(function(t) { return { id: t.id.primaryKey, name: t.name }; }),\n sequential: project.sequential,\n singleActionList: project.containsSingletonActions,\n completedByChildren: project.completedByChildren,\n taskCount: ft.length,\n remainingTaskCount: ft.filter(function(t) { return t.taskStatus === Task.Status.Available || t.taskStatus === Task.Status.Blocked; }).length,\n lastReviewDate: project.lastReviewDate ? project.lastReviewDate.toISOString() : null,\n nextReviewDate: project.nextReviewDate ? project.nextReviewDate.toISOString() : null,\n reviewInterval: ri\n };\n}";
|
|
10
|
+
export declare const serializeFolderFn = "\nfunction serializeFolder(folder) {\n var statusVal = \"active\";\n if (folder.status === Folder.Status.Dropped) statusVal = \"dropped\";\n return {\n id: folder.id.primaryKey,\n name: folder.name,\n url: \"omnifocus:///folder/\" + folder.id.primaryKey,\n status: statusVal,\n parentFolderId: folder.parent && folder.parent.constructor === Folder ? folder.parent.id.primaryKey : null,\n childFolderIds: folder.folders.map(function(f) { return f.id.primaryKey; }),\n projectIds: folder.projects.map(function(p) { return p.id.primaryKey; }),\n projectCount: folder.flattenedProjects.length,\n folderCount: folder.folders.length\n };\n}";
|
|
11
|
+
export declare const serializeFolderWithChildrenFn = "\nfunction serializeFolderWithChildren(folder, depth, maxDepth) {\n var result = serializeFolder(folder);\n result.childFolders = [];\n result.projects = folder.projects.map(function(p) { return serializeProject(p); });\n if (maxDepth === 0 || depth < maxDepth) {\n result.childFolders = folder.folders.map(function(f) { return serializeFolderWithChildren(f, depth + 1, maxDepth); });\n }\n return result;\n}";
|
|
12
|
+
export declare const serializeTagFn = "\nvar _tagStatusMap = {};\n_tagStatusMap[Tag.Status.Active] = \"active\";\n_tagStatusMap[Tag.Status.OnHold] = \"onHold\";\n_tagStatusMap[Tag.Status.Dropped] = \"dropped\";\n\nfunction serializeTag(tag) {\n return {\n id: tag.id.primaryKey,\n name: tag.name,\n url: \"omnifocus:///tag/\" + tag.id.primaryKey,\n status: _tagStatusMap[tag.status] || \"active\",\n parentTagId: tag.parent && tag.parent.constructor === Tag ? tag.parent.id.primaryKey : null,\n childTagIds: tag.children.map(function(c) { return c.id.primaryKey; }),\n allowsNextAction: tag.allowsNextAction,\n availableTaskCount: tag.availableTasks.length,\n remainingTaskCount: tag.remainingTasks.length\n };\n}";
|
|
13
|
+
export declare const serializeTagWithChildrenFn = "\nfunction serializeTagWithChildren(tag, depth, maxDepth) {\n var result = serializeTag(tag);\n result.childTags = [];\n if (maxDepth === 0 || depth < maxDepth) {\n result.childTags = tag.children.map(function(c) { return serializeTagWithChildren(c, depth + 1, maxDepth); });\n }\n return result;\n}";
|
|
14
|
+
export declare const serializePerspectiveFn = "\nfunction serializePerspective(perspective) {\n return {\n id: perspective.id.primaryKey,\n name: perspective.name\n };\n}";
|
|
15
|
+
export declare const serializeTaskNotificationFn = "\nvar _notifKindMap = {};\n_notifKindMap[Task.Notification.Kind.DueRelative] = \"dueRelative\";\n_notifKindMap[Task.Notification.Kind.Absolute] = \"absolute\";\n\nfunction serializeTaskNotification(notif) {\n return {\n id: notif.id.primaryKey,\n kind: _notifKindMap[notif.kind] || \"unknown\",\n absoluteFireDate: notif.absoluteFireDate ? notif.absoluteFireDate.toISOString() : null,\n relativeFireOffset: notif.relativeFireDate !== null ? notif.relativeFireDate : null,\n nextFireDate: notif.nextFireDate ? notif.nextFireDate.toISOString() : null,\n isSnoozed: notif.isSnoozed\n };\n}";
|
|
16
|
+
//# sourceMappingURL=serializers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serializers.d.ts","sourceRoot":"","sources":["../../src/omnifocus/serializers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,eAAe,07DA2C1B,CAAC;AAEH,eAAO,MAAM,2BAA2B,sYAWtC,CAAC;AAEH,eAAO,MAAM,kBAAkB,ukEAyC7B,CAAC;AAEH,eAAO,MAAM,iBAAiB,8pBAe5B,CAAC;AAEH,eAAO,MAAM,6BAA6B,saASxC,CAAC;AAEH,eAAO,MAAM,cAAc,osBAkBzB,CAAC;AAEH,eAAO,MAAM,0BAA0B,wTAQrC,CAAC;AAEH,eAAO,MAAM,sBAAsB,wIAMjC,CAAC;AAEH,eAAO,MAAM,2BAA2B,mmBActC,CAAC"}
|