@doist/todoist-ai 4.17.2 → 4.17.4
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/index.js +2 -2
- package/dist/main.js +1 -1
- package/dist/{mcp-server-BSQxi0xQ.js → mcp-server-Dmes0pXt.js} +287 -284
- package/dist/tool-helpers.d.ts.map +1 -1
- package/dist/utils/output-schemas.d.ts.map +1 -1
- package/dist/utils/priorities.d.ts +1 -0
- package/dist/utils/priorities.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -110,8 +110,20 @@ function Oe(e) {
|
|
|
110
110
|
const t = Math.floor(e / 60), o = e % 60;
|
|
111
111
|
return t === 0 ? `${o}m` : o === 0 ? `${t}h` : `${t}h${o}m`;
|
|
112
112
|
}
|
|
113
|
+
const _e = ["p1", "p2", "p3", "p4"], ge = s.enum(_e, {
|
|
114
|
+
description: "Task priority: p1 (highest), p2 (high), p3 (medium), p4 (lowest/default)"
|
|
115
|
+
});
|
|
116
|
+
function Te(e) {
|
|
117
|
+
return { p1: 4, p2: 3, p3: 2, p4: 1 }[e];
|
|
118
|
+
}
|
|
119
|
+
function Ne(e) {
|
|
120
|
+
return { 1: "P1", 2: "P2", 3: "P3", 4: "P4" }[e] || "";
|
|
121
|
+
}
|
|
122
|
+
function Me(e) {
|
|
123
|
+
return { 4: 1, 3: 2, 2: 3, 1: 4 }[e] || e;
|
|
124
|
+
}
|
|
113
125
|
const A = /* @__PURE__ */ new Map(), R = /* @__PURE__ */ new Map(), G = 300 * 1e3;
|
|
114
|
-
class
|
|
126
|
+
class Fe {
|
|
115
127
|
/**
|
|
116
128
|
* Resolve a user name or ID to a user ID by looking up collaborators across all shared projects.
|
|
117
129
|
* Supports exact name matches, partial matches, and email matches.
|
|
@@ -216,15 +228,15 @@ class _e {
|
|
|
216
228
|
A.clear(), R.clear();
|
|
217
229
|
}
|
|
218
230
|
}
|
|
219
|
-
const _ = new
|
|
220
|
-
async function
|
|
231
|
+
const _ = new Fe();
|
|
232
|
+
async function Re(e, t) {
|
|
221
233
|
return _.resolveUser(e, t);
|
|
222
234
|
}
|
|
223
|
-
const
|
|
235
|
+
const ye = ["assigned", "unassignedOrMe", "all"];
|
|
224
236
|
async function Q(e, t) {
|
|
225
237
|
if (!t)
|
|
226
238
|
return;
|
|
227
|
-
const o = await
|
|
239
|
+
const o = await Re(e, t);
|
|
228
240
|
if (!o)
|
|
229
241
|
throw new Error(
|
|
230
242
|
`Could not find user: "${t}". Make sure the user is a collaborator on a shared project.`
|
|
@@ -234,7 +246,7 @@ async function Q(e, t) {
|
|
|
234
246
|
function K(e, t) {
|
|
235
247
|
return t.length === 0 ? e : e.length === 0 ? t : `${e} & ${t}`;
|
|
236
248
|
}
|
|
237
|
-
function
|
|
249
|
+
function Le({
|
|
238
250
|
resolvedAssigneeId: e,
|
|
239
251
|
assigneeEmail: t,
|
|
240
252
|
responsibleUserFiltering: o = "unassignedOrMe"
|
|
@@ -252,7 +264,7 @@ function ce({
|
|
|
252
264
|
function B(e) {
|
|
253
265
|
return "inboxProject" in e;
|
|
254
266
|
}
|
|
255
|
-
function
|
|
267
|
+
function Be(e, t, o, n) {
|
|
256
268
|
const r = [t, o, n].filter(Boolean);
|
|
257
269
|
if (r.length > 1)
|
|
258
270
|
throw new Error(
|
|
@@ -275,7 +287,7 @@ function O(e) {
|
|
|
275
287
|
dueDate: e.due?.date,
|
|
276
288
|
recurring: e.due?.isRecurring && e.due.string ? e.due.string : !1,
|
|
277
289
|
deadlineDate: e.deadline?.date,
|
|
278
|
-
priority: e.priority,
|
|
290
|
+
priority: Me(e.priority),
|
|
279
291
|
projectId: e.projectId,
|
|
280
292
|
sectionId: e.sectionId ?? void 0,
|
|
281
293
|
parentId: e.parentId ?? void 0,
|
|
@@ -287,7 +299,7 @@ function O(e) {
|
|
|
287
299
|
completedAt: e.completedAt ?? void 0
|
|
288
300
|
};
|
|
289
301
|
}
|
|
290
|
-
function
|
|
302
|
+
function Ie(e) {
|
|
291
303
|
return {
|
|
292
304
|
id: e.id,
|
|
293
305
|
name: e.name,
|
|
@@ -323,7 +335,7 @@ function ee(e) {
|
|
|
323
335
|
} : void 0
|
|
324
336
|
};
|
|
325
337
|
}
|
|
326
|
-
function
|
|
338
|
+
function We(e) {
|
|
327
339
|
return {
|
|
328
340
|
id: e.id ?? void 0,
|
|
329
341
|
objectType: e.objectType,
|
|
@@ -336,7 +348,7 @@ function Re(e) {
|
|
|
336
348
|
extraData: e.extraData ?? void 0
|
|
337
349
|
};
|
|
338
350
|
}
|
|
339
|
-
const
|
|
351
|
+
const Ye = F.object({
|
|
340
352
|
httpStatusCode: F.number(),
|
|
341
353
|
responseData: F.object({
|
|
342
354
|
error: F.string(),
|
|
@@ -354,7 +366,7 @@ async function te({
|
|
|
354
366
|
const { results: r, nextCursor: i } = await e.getTasksByFilter({ query: t, cursor: n, limit: o });
|
|
355
367
|
return { tasks: r.map(O), nextCursor: i };
|
|
356
368
|
} catch (r) {
|
|
357
|
-
const i =
|
|
369
|
+
const i = Ye.safeParse(r);
|
|
358
370
|
if (!i.success)
|
|
359
371
|
throw r;
|
|
360
372
|
const { responseData: c } = i.data;
|
|
@@ -370,7 +382,7 @@ const W = s.object({
|
|
|
370
382
|
dueDate: s.string().optional().describe("The due date of the task (ISO 8601 format)."),
|
|
371
383
|
recurring: s.union([s.boolean(), s.string()]).describe("Whether the task is recurring, or the recurrence string."),
|
|
372
384
|
deadlineDate: s.string().optional().describe("The deadline date of the task (ISO 8601 format)."),
|
|
373
|
-
priority: s.number().describe("The priority level (1-4, where
|
|
385
|
+
priority: s.number().describe("The priority level (1-4, where 4 is highest priority and 1 is lowest)."),
|
|
374
386
|
projectId: s.string().describe("The ID of the project this task belongs to."),
|
|
375
387
|
sectionId: s.string().optional().describe("The ID of the section this task belongs to."),
|
|
376
388
|
parentId: s.string().optional().describe("The ID of the parent task (for subtasks)."),
|
|
@@ -392,7 +404,7 @@ const W = s.object({
|
|
|
392
404
|
}), oe = s.object({
|
|
393
405
|
id: s.string().describe("The unique ID of the section."),
|
|
394
406
|
name: s.string().describe("The name of the section.")
|
|
395
|
-
}),
|
|
407
|
+
}), ze = s.object({
|
|
396
408
|
resourceType: s.string().describe("The type of resource (file, url, image, etc)."),
|
|
397
409
|
fileName: s.string().optional().describe("The name of the file."),
|
|
398
410
|
fileSize: s.number().optional().describe("The size of the file in bytes."),
|
|
@@ -412,8 +424,8 @@ const W = s.object({
|
|
|
412
424
|
content: s.string().describe("The content of the comment."),
|
|
413
425
|
postedAt: s.string().describe("When the comment was posted (ISO 8601 format)."),
|
|
414
426
|
postedUid: s.string().optional().describe("The UID of the user who posted this comment."),
|
|
415
|
-
fileAttachment:
|
|
416
|
-
}),
|
|
427
|
+
fileAttachment: ze.optional().describe("File attachment information, if any.")
|
|
428
|
+
}), Ke = s.object({
|
|
417
429
|
id: s.string().optional().describe("The unique ID of the activity event."),
|
|
418
430
|
objectType: s.string().describe("The type of object this event relates to (task, project, etc)."),
|
|
419
431
|
objectId: s.string().describe("The ID of the object this event relates to."),
|
|
@@ -423,11 +435,11 @@ const W = s.object({
|
|
|
423
435
|
parentItemId: s.string().optional().describe("The ID of the parent item."),
|
|
424
436
|
initiatorId: s.string().optional().describe("The ID of the user who initiated this event."),
|
|
425
437
|
extraData: s.record(s.unknown()).optional().describe("Additional event data.")
|
|
426
|
-
}),
|
|
438
|
+
}), He = s.object({
|
|
427
439
|
id: s.string().describe("The unique ID of the user."),
|
|
428
440
|
name: s.string().describe("The full name of the user."),
|
|
429
441
|
email: s.string().describe("The email address of the user.")
|
|
430
|
-
}),
|
|
442
|
+
}), Ve = s.object({
|
|
431
443
|
item: s.string().describe("The item that failed (usually an ID or identifier)."),
|
|
432
444
|
error: s.string().describe("The error message."),
|
|
433
445
|
code: s.string().optional().describe("The error code, if available.")
|
|
@@ -463,23 +475,23 @@ const W = s.object({
|
|
|
463
475
|
// OpenAI MCP tools
|
|
464
476
|
SEARCH: "search",
|
|
465
477
|
FETCH: "fetch"
|
|
466
|
-
},
|
|
478
|
+
}, Ge = s.object({
|
|
467
479
|
taskId: s.string().optional().describe("The ID of the task to comment on."),
|
|
468
480
|
projectId: s.string().optional().describe(
|
|
469
481
|
'The ID of the project to comment on. Project ID should be an ID string, or the text "inbox", for inbox tasks.'
|
|
470
482
|
),
|
|
471
483
|
content: s.string().min(1).describe("The content of the comment.")
|
|
472
|
-
}),
|
|
473
|
-
comments: s.array(
|
|
474
|
-
},
|
|
484
|
+
}), qe = {
|
|
485
|
+
comments: s.array(Ge).min(1).describe("The array of comments to add.")
|
|
486
|
+
}, Je = {
|
|
475
487
|
comments: s.array(ne).describe("The created comments."),
|
|
476
488
|
totalCount: s.number().describe("The total number of comments created."),
|
|
477
489
|
addedCommentIds: s.array(s.string()).describe("The IDs of the added comments.")
|
|
478
|
-
},
|
|
490
|
+
}, Xe = {
|
|
479
491
|
name: g.ADD_COMMENTS,
|
|
480
492
|
description: "Add multiple comments to tasks or projects. Each comment must specify either taskId or projectId.",
|
|
481
|
-
parameters:
|
|
482
|
-
outputSchema:
|
|
493
|
+
parameters: qe,
|
|
494
|
+
outputSchema: Je,
|
|
483
495
|
async execute(e, t) {
|
|
484
496
|
const { comments: o } = e;
|
|
485
497
|
for (const [l, u] of o.entries()) {
|
|
@@ -500,7 +512,7 @@ const W = s.object({
|
|
|
500
512
|
});
|
|
501
513
|
}), a = (await Promise.all(i)).map(ee);
|
|
502
514
|
return {
|
|
503
|
-
textContent:
|
|
515
|
+
textContent: Ze({ comments: a }),
|
|
504
516
|
structuredContent: {
|
|
505
517
|
comments: a,
|
|
506
518
|
totalCount: a.length,
|
|
@@ -509,7 +521,7 @@ const W = s.object({
|
|
|
509
521
|
};
|
|
510
522
|
}
|
|
511
523
|
};
|
|
512
|
-
function
|
|
524
|
+
function Ze({ comments: e }) {
|
|
513
525
|
const t = e.filter((i) => i.taskId).length, o = e.filter((i) => i.projectId).length, n = [];
|
|
514
526
|
if (t > 0) {
|
|
515
527
|
const i = t > 1 ? "comments" : "comment";
|
|
@@ -521,23 +533,23 @@ function qe({ comments: e }) {
|
|
|
521
533
|
}
|
|
522
534
|
return n.length > 0 ? `Added ${n.join(" and ")}` : "No comments added";
|
|
523
535
|
}
|
|
524
|
-
const
|
|
536
|
+
const Qe = s.object({
|
|
525
537
|
name: s.string().min(1).describe("The name of the project."),
|
|
526
538
|
parentId: s.string().optional().describe("The ID of the parent project. If provided, creates this as a sub-project."),
|
|
527
539
|
isFavorite: s.boolean().optional().describe("Whether the project is a favorite. Defaults to false."),
|
|
528
540
|
viewStyle: s.enum(["list", "board", "calendar"]).optional().describe('The project view style. Defaults to "list".')
|
|
529
|
-
}),
|
|
530
|
-
projects: s.array(
|
|
531
|
-
},
|
|
541
|
+
}), et = {
|
|
542
|
+
projects: s.array(Qe).min(1).describe("The array of projects to add.")
|
|
543
|
+
}, tt = {
|
|
532
544
|
projects: s.array(se).describe("The created projects."),
|
|
533
545
|
totalCount: s.number().describe("The total number of projects created.")
|
|
534
|
-
},
|
|
546
|
+
}, st = {
|
|
535
547
|
name: g.ADD_PROJECTS,
|
|
536
548
|
description: "Add one or more new projects.",
|
|
537
|
-
parameters:
|
|
538
|
-
outputSchema:
|
|
549
|
+
parameters: et,
|
|
550
|
+
outputSchema: tt,
|
|
539
551
|
async execute({ projects: e }, t) {
|
|
540
|
-
const o = await Promise.all(e.map((i) => t.addProject(i))), n =
|
|
552
|
+
const o = await Promise.all(e.map((i) => t.addProject(i))), n = ot({ projects: o }), r = o.map((i) => ({
|
|
541
553
|
...i,
|
|
542
554
|
parentId: "parentId" in i ? i.parentId ?? void 0 : void 0,
|
|
543
555
|
inboxProject: "inboxProject" in i ? i.inboxProject : !1
|
|
@@ -551,27 +563,27 @@ const Je = s.object({
|
|
|
551
563
|
};
|
|
552
564
|
}
|
|
553
565
|
};
|
|
554
|
-
function
|
|
566
|
+
function ot({ projects: e }) {
|
|
555
567
|
const t = e.length, o = e.map((r) => `• ${r.name} (id=${r.id})`).join(`
|
|
556
568
|
`);
|
|
557
569
|
return `Added ${t} project${t === 1 ? "" : "s"}:
|
|
558
570
|
${o}`;
|
|
559
571
|
}
|
|
560
|
-
const
|
|
572
|
+
const nt = s.object({
|
|
561
573
|
name: s.string().min(1).describe("The name of the section."),
|
|
562
574
|
projectId: s.string().min(1).describe(
|
|
563
575
|
'The ID of the project to add the section to. Project ID should be an ID string, or the text "inbox", for inbox tasks.'
|
|
564
576
|
)
|
|
565
|
-
}),
|
|
566
|
-
sections: s.array(
|
|
567
|
-
},
|
|
577
|
+
}), rt = {
|
|
578
|
+
sections: s.array(nt).min(1).describe("The array of sections to add.")
|
|
579
|
+
}, it = {
|
|
568
580
|
sections: s.array(oe).describe("The created sections."),
|
|
569
581
|
totalCount: s.number().describe("The total number of sections created.")
|
|
570
|
-
},
|
|
582
|
+
}, at = {
|
|
571
583
|
name: g.ADD_SECTIONS,
|
|
572
584
|
description: "Add one or more new sections to projects.",
|
|
573
|
-
parameters:
|
|
574
|
-
outputSchema:
|
|
585
|
+
parameters: rt,
|
|
586
|
+
outputSchema: it,
|
|
575
587
|
async execute({ sections: e }, t) {
|
|
576
588
|
const n = e.some((a) => a.projectId === "inbox") ? await t.getUser() : null, r = e.map((a) => ({
|
|
577
589
|
...a,
|
|
@@ -580,7 +592,7 @@ const tt = s.object({
|
|
|
580
592
|
r.map((a) => t.addSection(a))
|
|
581
593
|
);
|
|
582
594
|
return {
|
|
583
|
-
textContent:
|
|
595
|
+
textContent: ct({ sections: i }),
|
|
584
596
|
structuredContent: {
|
|
585
597
|
sections: i,
|
|
586
598
|
totalCount: i.length
|
|
@@ -588,7 +600,7 @@ const tt = s.object({
|
|
|
588
600
|
};
|
|
589
601
|
}
|
|
590
602
|
};
|
|
591
|
-
function
|
|
603
|
+
function ct({ sections: e }) {
|
|
592
604
|
const t = e.length, o = e.map((r) => `• ${r.name} (id=${r.id}, projectId=${r.projectId})`).join(`
|
|
593
605
|
`);
|
|
594
606
|
return `Added ${t} section${t === 1 ? "" : "s"}:
|
|
@@ -603,7 +615,7 @@ const L = {
|
|
|
603
615
|
PROJECT_NOT_FOUND: "PROJECT_NOT_FOUND",
|
|
604
616
|
TASK_NOT_FOUND: "TASK_NOT_FOUND"
|
|
605
617
|
};
|
|
606
|
-
class
|
|
618
|
+
class dt {
|
|
607
619
|
/**
|
|
608
620
|
* Validate a single assignment operation
|
|
609
621
|
*/
|
|
@@ -812,16 +824,7 @@ class it {
|
|
|
812
824
|
};
|
|
813
825
|
}
|
|
814
826
|
}
|
|
815
|
-
const re = new
|
|
816
|
-
description: "Task priority: p1 (highest), p2 (high), p3 (medium), p4 (lowest/default)"
|
|
817
|
-
});
|
|
818
|
-
function Ie(e) {
|
|
819
|
-
return { p1: 4, p2: 3, p3: 2, p4: 1 }[e];
|
|
820
|
-
}
|
|
821
|
-
function ct(e) {
|
|
822
|
-
return { 4: "P1", 3: "P2", 2: "P3", 1: "P4" }[e] || "";
|
|
823
|
-
}
|
|
824
|
-
const $ = {
|
|
827
|
+
const re = new dt(), $ = {
|
|
825
828
|
/** Default limit for task listings */
|
|
826
829
|
TASKS_DEFAULT: 10,
|
|
827
830
|
/** Maximum limit for task search and list operations */
|
|
@@ -848,7 +851,7 @@ const $ = {
|
|
|
848
851
|
/** Maximum number of failures to show in detailed error messages */
|
|
849
852
|
MAX_FAILURES_SHOWN: 3
|
|
850
853
|
};
|
|
851
|
-
function
|
|
854
|
+
function lt(e = /* @__PURE__ */ new Date()) {
|
|
852
855
|
return e.toISOString().split("T")[0] ?? "";
|
|
853
856
|
}
|
|
854
857
|
function ke(e, t, o = {}) {
|
|
@@ -866,7 +869,7 @@ ${u}${p}.`);
|
|
|
866
869
|
return c.join(`
|
|
867
870
|
`);
|
|
868
871
|
}
|
|
869
|
-
function
|
|
872
|
+
function ut(e) {
|
|
870
873
|
const { action: t, success: o, total: n, successItems: r, failures: i } = e, c = [], a = `${t}: ${o}/${n} successful.`;
|
|
871
874
|
if (c.push(a), r?.length && r.length <= 5 && c.push(`Completed:
|
|
872
875
|
${r.map((d) => ` ${d}`).join(`
|
|
@@ -881,16 +884,16 @@ ${i.slice(0, q.MAX_FAILURES_SHOWN).map((u) => ` ${u.item} (Error: ${u.error}$
|
|
|
881
884
|
return c.join(`
|
|
882
885
|
`);
|
|
883
886
|
}
|
|
884
|
-
function
|
|
885
|
-
const t = e.content || e.title || "Untitled", o = e.dueDate ? ` • due ${e.dueDate}` : "", n = e.priority ? ` • ${
|
|
887
|
+
function pt(e) {
|
|
888
|
+
const t = e.content || e.title || "Untitled", o = e.dueDate ? ` • due ${e.dueDate}` : "", n = e.priority ? ` • ${Ne(e.priority)}` : "", r = e.projectName ? ` • ${e.projectName}` : "", i = e.id ? ` • id=${e.id}` : "";
|
|
886
889
|
return ` ${t}${o}${n}${r}${i}`;
|
|
887
890
|
}
|
|
888
|
-
function
|
|
891
|
+
function ht(e) {
|
|
889
892
|
const t = e.inboxProject ? " • Inbox" : "", o = e.isFavorite ? " • ⭐" : "", n = e.isShared ? " • Shared" : "", r = e.viewStyle && e.viewStyle !== "list" ? ` • ${e.viewStyle}` : "", i = ` • id=${e.id}`;
|
|
890
893
|
return ` ${e.name}${t}${o}${n}${r}${i}`;
|
|
891
894
|
}
|
|
892
895
|
function H(e, t = 5) {
|
|
893
|
-
const n = e.slice(0, t).map(
|
|
896
|
+
const n = e.slice(0, t).map(pt).join(`
|
|
894
897
|
`);
|
|
895
898
|
if (e.length > t) {
|
|
896
899
|
const r = e.length - t;
|
|
@@ -920,14 +923,14 @@ function we(e, t) {
|
|
|
920
923
|
${o.map((r) => `- ${r}`).join(`
|
|
921
924
|
`)}`;
|
|
922
925
|
}
|
|
923
|
-
const
|
|
926
|
+
const mt = s.object({
|
|
924
927
|
content: s.string().min(1).describe(
|
|
925
928
|
'The task name/title. Should be concise and actionable (e.g., "Review PR #123", "Call dentist"). For longer content, use the description field instead. Supports Markdown.'
|
|
926
929
|
),
|
|
927
930
|
description: s.string().optional().describe(
|
|
928
931
|
"Additional details, notes, or context for the task. Use this for longer content rather than putting it in the task name. Supports Markdown."
|
|
929
932
|
),
|
|
930
|
-
priority:
|
|
933
|
+
priority: ge.optional().describe(
|
|
931
934
|
"The priority of the task: p1 (highest), p2 (high), p3 (medium), p4 (lowest/default)."
|
|
932
935
|
),
|
|
933
936
|
dueString: s.string().optional().describe("The due date for the task, in natural language."),
|
|
@@ -946,20 +949,20 @@ const ht = s.object({
|
|
|
946
949
|
responsibleUser: s.string().optional().describe(
|
|
947
950
|
"Assign task to this user. Can be a user ID, name, or email address. User must be a collaborator on the target project."
|
|
948
951
|
)
|
|
949
|
-
}),
|
|
950
|
-
tasks: s.array(
|
|
951
|
-
},
|
|
952
|
+
}), ft = {
|
|
953
|
+
tasks: s.array(mt).min(1).describe("The array of tasks to add.")
|
|
954
|
+
}, bt = {
|
|
952
955
|
tasks: s.array(W).describe("The created tasks."),
|
|
953
956
|
totalCount: s.number().describe("The total number of tasks created.")
|
|
954
|
-
},
|
|
957
|
+
}, gt = {
|
|
955
958
|
name: g.ADD_TASKS,
|
|
956
959
|
description: "Add one or more tasks to a project, section, or parent. Supports assignment to project collaborators.",
|
|
957
|
-
parameters:
|
|
958
|
-
outputSchema:
|
|
960
|
+
parameters: ft,
|
|
961
|
+
outputSchema: bt,
|
|
959
962
|
async execute({ tasks: e }, t) {
|
|
960
|
-
const o = e.map((c) =>
|
|
963
|
+
const o = e.map((c) => Tt(c, t)), r = (await Promise.all(o)).map(O);
|
|
961
964
|
return {
|
|
962
|
-
textContent:
|
|
965
|
+
textContent: yt({
|
|
963
966
|
tasks: r,
|
|
964
967
|
args: { tasks: e }
|
|
965
968
|
}),
|
|
@@ -970,7 +973,7 @@ const ht = s.object({
|
|
|
970
973
|
};
|
|
971
974
|
}
|
|
972
975
|
};
|
|
973
|
-
async function
|
|
976
|
+
async function Tt(e, t) {
|
|
974
977
|
const {
|
|
975
978
|
duration: o,
|
|
976
979
|
projectId: n,
|
|
@@ -992,7 +995,7 @@ async function gt(e, t) {
|
|
|
992
995
|
labels: d,
|
|
993
996
|
deadlineDate: l
|
|
994
997
|
};
|
|
995
|
-
if (a && (b.priority =
|
|
998
|
+
if (a && (b.priority = Te(a)), c && !p && !r && !i)
|
|
996
999
|
throw new Error(
|
|
997
1000
|
`Task "${e.content}": Cannot assign tasks without specifying project context. Please specify a projectId, sectionId, or parentId.`
|
|
998
1001
|
);
|
|
@@ -1038,7 +1041,7 @@ async function gt(e, t) {
|
|
|
1038
1041
|
}
|
|
1039
1042
|
return await t.addTask(b);
|
|
1040
1043
|
}
|
|
1041
|
-
function
|
|
1044
|
+
function yt({
|
|
1042
1045
|
tasks: e,
|
|
1043
1046
|
args: t
|
|
1044
1047
|
}) {
|
|
@@ -1055,19 +1058,19 @@ function Tt({
|
|
|
1055
1058
|
showDetails: !0
|
|
1056
1059
|
});
|
|
1057
1060
|
}
|
|
1058
|
-
const
|
|
1061
|
+
const It = {
|
|
1059
1062
|
ids: s.array(s.string().min(1)).min(1).describe("The IDs of the tasks to complete.")
|
|
1060
|
-
},
|
|
1063
|
+
}, kt = {
|
|
1061
1064
|
completed: s.array(s.string()).describe("The IDs of successfully completed tasks."),
|
|
1062
|
-
failures: s.array(
|
|
1065
|
+
failures: s.array(Ve).describe("Failed task completions with error details."),
|
|
1063
1066
|
totalRequested: s.number().describe("The total number of tasks requested to complete."),
|
|
1064
1067
|
successCount: s.number().describe("The number of successfully completed tasks."),
|
|
1065
1068
|
failureCount: s.number().describe("The number of failed task completions.")
|
|
1066
|
-
},
|
|
1069
|
+
}, wt = {
|
|
1067
1070
|
name: g.COMPLETE_TASKS,
|
|
1068
1071
|
description: "Complete one or more tasks by their IDs.",
|
|
1069
|
-
parameters:
|
|
1070
|
-
outputSchema:
|
|
1072
|
+
parameters: It,
|
|
1073
|
+
outputSchema: kt,
|
|
1071
1074
|
async execute(e, t) {
|
|
1072
1075
|
const o = [], n = [];
|
|
1073
1076
|
for (const i of e.ids)
|
|
@@ -1081,7 +1084,7 @@ const yt = {
|
|
|
1081
1084
|
});
|
|
1082
1085
|
}
|
|
1083
1086
|
return {
|
|
1084
|
-
textContent:
|
|
1087
|
+
textContent: jt({
|
|
1085
1088
|
completed: o,
|
|
1086
1089
|
failures: n,
|
|
1087
1090
|
args: e
|
|
@@ -1096,12 +1099,12 @@ const yt = {
|
|
|
1096
1099
|
};
|
|
1097
1100
|
}
|
|
1098
1101
|
};
|
|
1099
|
-
function
|
|
1102
|
+
function jt({
|
|
1100
1103
|
completed: e,
|
|
1101
1104
|
failures: t,
|
|
1102
1105
|
args: o
|
|
1103
1106
|
}) {
|
|
1104
|
-
return
|
|
1107
|
+
return ut({
|
|
1105
1108
|
action: "Completed tasks",
|
|
1106
1109
|
success: e.length,
|
|
1107
1110
|
total: o.ids.length,
|
|
@@ -1109,20 +1112,20 @@ function wt({
|
|
|
1109
1112
|
failures: t
|
|
1110
1113
|
});
|
|
1111
1114
|
}
|
|
1112
|
-
const
|
|
1115
|
+
const vt = {
|
|
1113
1116
|
type: s.enum(["project", "section", "task", "comment"]).describe("The type of entity to delete."),
|
|
1114
1117
|
id: s.string().min(1).describe("The ID of the entity to delete.")
|
|
1115
|
-
},
|
|
1118
|
+
}, Ct = {
|
|
1116
1119
|
deletedEntity: s.object({
|
|
1117
1120
|
type: s.enum(["project", "section", "task", "comment"]).describe("The type of deleted entity."),
|
|
1118
1121
|
id: s.string().describe("The ID of the deleted entity.")
|
|
1119
1122
|
}).describe("Information about the deleted entity."),
|
|
1120
1123
|
success: s.boolean().describe("Whether the deletion was successful.")
|
|
1121
|
-
},
|
|
1124
|
+
}, St = {
|
|
1122
1125
|
name: g.DELETE_OBJECT,
|
|
1123
1126
|
description: "Delete a project, section, task, or comment by its ID.",
|
|
1124
|
-
parameters:
|
|
1125
|
-
outputSchema:
|
|
1127
|
+
parameters: vt,
|
|
1128
|
+
outputSchema: Ct,
|
|
1126
1129
|
async execute(e, t) {
|
|
1127
1130
|
switch (e.type) {
|
|
1128
1131
|
case "project":
|
|
@@ -1146,21 +1149,21 @@ const jt = {
|
|
|
1146
1149
|
}
|
|
1147
1150
|
};
|
|
1148
1151
|
}
|
|
1149
|
-
},
|
|
1152
|
+
}, $t = {
|
|
1150
1153
|
id: s.string().min(1).describe(
|
|
1151
1154
|
'A unique identifier for the document in the format "task:{id}" or "project:{id}".'
|
|
1152
1155
|
)
|
|
1153
|
-
},
|
|
1156
|
+
}, Dt = {
|
|
1154
1157
|
id: s.string().describe("The ID of the fetched document."),
|
|
1155
1158
|
title: s.string().describe("The title of the document."),
|
|
1156
1159
|
text: s.string().describe("The text content of the document."),
|
|
1157
1160
|
url: s.string().describe("The URL of the document."),
|
|
1158
1161
|
metadata: s.record(s.unknown()).optional().describe("Additional metadata about the document.")
|
|
1159
|
-
},
|
|
1162
|
+
}, xt = {
|
|
1160
1163
|
name: g.FETCH,
|
|
1161
1164
|
description: 'Fetch the full contents of a task or project by its ID. The ID should be in the format "task:{id}" or "project:{id}".',
|
|
1162
|
-
parameters:
|
|
1163
|
-
outputSchema:
|
|
1165
|
+
parameters: $t,
|
|
1166
|
+
outputSchema: Dt,
|
|
1164
1167
|
async execute(e, t) {
|
|
1165
1168
|
const { id: o } = e, [n, r] = o.split(":", 2);
|
|
1166
1169
|
if (!r || n !== "task" && n !== "project")
|
|
@@ -1193,7 +1196,7 @@ Labels: ${a.labels.join(", ")}`), i = {
|
|
|
1193
1196
|
}
|
|
1194
1197
|
};
|
|
1195
1198
|
} else {
|
|
1196
|
-
const c = await t.getProject(r), a =
|
|
1199
|
+
const c = await t.getProject(r), a = Ie(c), d = [a.name];
|
|
1197
1200
|
a.isShared && d.push(`
|
|
1198
1201
|
|
|
1199
1202
|
Shared project`), a.isFavorite && d.push(`
|
|
@@ -1214,7 +1217,7 @@ Favorite: Yes`), i = {
|
|
|
1214
1217
|
}
|
|
1215
1218
|
return { textContent: JSON.stringify(i) };
|
|
1216
1219
|
}
|
|
1217
|
-
},
|
|
1220
|
+
}, At = {
|
|
1218
1221
|
objectType: s.enum(["task", "project", "comment"]).optional().describe("Type of object to filter by."),
|
|
1219
1222
|
objectId: s.string().optional().describe("Filter by specific object ID (task, project, or comment)."),
|
|
1220
1223
|
eventType: s.enum([
|
|
@@ -1233,26 +1236,26 @@ Favorite: Yes`), i = {
|
|
|
1233
1236
|
initiatorId: s.string().optional().describe("Filter by the user ID who initiated the event."),
|
|
1234
1237
|
limit: s.number().int().min(1).max($.ACTIVITY_MAX).default($.ACTIVITY_DEFAULT).describe("Maximum number of activity events to return."),
|
|
1235
1238
|
cursor: s.string().optional().describe("Pagination cursor for retrieving the next page of results.")
|
|
1236
|
-
},
|
|
1237
|
-
events: s.array(
|
|
1239
|
+
}, Ut = {
|
|
1240
|
+
events: s.array(Ke).describe("The activity events."),
|
|
1238
1241
|
nextCursor: s.string().optional().describe("Cursor for the next page of results."),
|
|
1239
1242
|
totalCount: s.number().describe("The total number of events in this page."),
|
|
1240
1243
|
hasMore: s.boolean().describe("Whether there are more results available."),
|
|
1241
1244
|
appliedFilters: s.record(s.unknown()).describe("The filters that were applied to the search.")
|
|
1242
|
-
},
|
|
1245
|
+
}, Pt = {
|
|
1243
1246
|
name: g.FIND_ACTIVITY,
|
|
1244
1247
|
description: "Retrieve recent activity logs to monitor and audit changes in Todoist. Shows events from all users by default (use initiatorId to filter by specific user). Track task completions, updates, deletions, project changes, and more with flexible filtering. Note: Date-based filtering is not supported by the Todoist API.",
|
|
1245
|
-
parameters:
|
|
1246
|
-
outputSchema:
|
|
1248
|
+
parameters: At,
|
|
1249
|
+
outputSchema: Ut,
|
|
1247
1250
|
async execute(e, t) {
|
|
1248
1251
|
const { objectType: o, objectId: n, eventType: r, projectId: i, taskId: c, initiatorId: a, limit: d, cursor: l } = e, u = {
|
|
1249
1252
|
limit: d,
|
|
1250
1253
|
cursor: l ?? null
|
|
1251
1254
|
};
|
|
1252
1255
|
o && (u.objectType = o), n && n !== "remove" && (u.objectId = n), r && (u.eventType = r), i && (u.parentProjectId = i), c && (u.parentItemId = c), a && (u.initiatorId = a);
|
|
1253
|
-
const { results: p, nextCursor: b } = await t.getActivityLogs(u), m = p.map(
|
|
1256
|
+
const { results: p, nextCursor: b } = await t.getActivityLogs(u), m = p.map(We);
|
|
1254
1257
|
return {
|
|
1255
|
-
textContent:
|
|
1258
|
+
textContent: Et({ events: m, args: e, nextCursor: b }),
|
|
1256
1259
|
structuredContent: {
|
|
1257
1260
|
events: m,
|
|
1258
1261
|
nextCursor: b ?? void 0,
|
|
@@ -1263,7 +1266,7 @@ Favorite: Yes`), i = {
|
|
|
1263
1266
|
};
|
|
1264
1267
|
}
|
|
1265
1268
|
};
|
|
1266
|
-
function
|
|
1269
|
+
function Et({
|
|
1267
1270
|
events: e,
|
|
1268
1271
|
args: t,
|
|
1269
1272
|
nextCursor: o
|
|
@@ -1284,12 +1287,12 @@ function Pt({
|
|
|
1284
1287
|
limit: t.limit,
|
|
1285
1288
|
nextCursor: o ?? void 0,
|
|
1286
1289
|
filterHints: i,
|
|
1287
|
-
previewLines:
|
|
1290
|
+
previewLines: Ot(e, Math.min(e.length, t.limit)),
|
|
1288
1291
|
zeroReasonHints: c
|
|
1289
1292
|
});
|
|
1290
1293
|
}
|
|
1291
|
-
function
|
|
1292
|
-
const n = e.slice(0, t).map(
|
|
1294
|
+
function Ot(e, t = 10) {
|
|
1295
|
+
const n = e.slice(0, t).map(_t).join(`
|
|
1293
1296
|
`);
|
|
1294
1297
|
if (e.length > t) {
|
|
1295
1298
|
const r = e.length - t;
|
|
@@ -1298,8 +1301,8 @@ function Et(e, t = 10) {
|
|
|
1298
1301
|
}
|
|
1299
1302
|
return n;
|
|
1300
1303
|
}
|
|
1301
|
-
function
|
|
1302
|
-
const t =
|
|
1304
|
+
function _t(e) {
|
|
1305
|
+
const t = Nt(e.eventDate), o = `${e.eventType} ${e.objectType}`;
|
|
1303
1306
|
let n = "";
|
|
1304
1307
|
if (e.extraData) {
|
|
1305
1308
|
const a = e.extraData.content || e.extraData.name || e.extraData.last_content;
|
|
@@ -1308,7 +1311,7 @@ function Ot(e) {
|
|
|
1308
1311
|
const r = e.objectId ? ` • id=${e.objectId}` : "", i = e.initiatorId ? ` • by=${e.initiatorId}` : " • system", c = e.parentProjectId ? ` • project=${e.parentProjectId}` : "";
|
|
1309
1312
|
return ` [${t}] ${o}${n}${r}${i}${c}`;
|
|
1310
1313
|
}
|
|
1311
|
-
function
|
|
1314
|
+
function Nt(e) {
|
|
1312
1315
|
try {
|
|
1313
1316
|
const t = new Date(e), o = t.toLocaleDateString("en-US", { month: "short", timeZone: "UTC" }), n = t.toLocaleDateString("en-US", { day: "numeric", timeZone: "UTC" }), r = t.toLocaleTimeString("en-US", {
|
|
1314
1317
|
hour: "2-digit",
|
|
@@ -1321,7 +1324,7 @@ function _t(e) {
|
|
|
1321
1324
|
return e;
|
|
1322
1325
|
}
|
|
1323
1326
|
}
|
|
1324
|
-
const
|
|
1327
|
+
const Mt = {
|
|
1325
1328
|
taskId: s.string().optional().describe("Find comments for a specific task."),
|
|
1326
1329
|
projectId: s.string().optional().describe(
|
|
1327
1330
|
'Find comments for a specific project. Project ID should be an ID string, or the text "inbox", for inbox tasks.'
|
|
@@ -1329,15 +1332,15 @@ const Nt = {
|
|
|
1329
1332
|
commentId: s.string().optional().describe("Get a specific comment by ID."),
|
|
1330
1333
|
cursor: s.string().optional().describe("Pagination cursor for retrieving more results."),
|
|
1331
1334
|
limit: s.number().int().min(1).max($.COMMENTS_MAX).optional().describe("Maximum number of comments to return")
|
|
1332
|
-
},
|
|
1335
|
+
}, Ft = {
|
|
1333
1336
|
comments: s.array(ne).describe("The found comments."),
|
|
1334
1337
|
nextCursor: s.string().optional().describe("Cursor for the next page of results."),
|
|
1335
1338
|
totalCount: s.number().describe("The total number of comments in this page.")
|
|
1336
|
-
},
|
|
1339
|
+
}, Rt = {
|
|
1337
1340
|
name: g.FIND_COMMENTS,
|
|
1338
1341
|
description: "Find comments by task, project, or get a specific comment by ID. Exactly one of taskId, projectId, or commentId must be provided.",
|
|
1339
|
-
parameters:
|
|
1340
|
-
outputSchema:
|
|
1342
|
+
parameters: Mt,
|
|
1343
|
+
outputSchema: Ft,
|
|
1341
1344
|
async execute(e, t) {
|
|
1342
1345
|
const o = [e.taskId, e.projectId, e.commentId].filter(Boolean);
|
|
1343
1346
|
if (o.length === 0)
|
|
@@ -1368,7 +1371,7 @@ const Nt = {
|
|
|
1368
1371
|
throw new Error("Invalid state: no search parameter provided");
|
|
1369
1372
|
const a = c.map(ee);
|
|
1370
1373
|
return {
|
|
1371
|
-
textContent:
|
|
1374
|
+
textContent: Lt({
|
|
1372
1375
|
comments: a,
|
|
1373
1376
|
searchType: e.commentId ? "single" : e.taskId ? "task" : "project",
|
|
1374
1377
|
searchId: e.commentId || e.taskId || e.projectId || "",
|
|
@@ -1386,7 +1389,7 @@ const Nt = {
|
|
|
1386
1389
|
};
|
|
1387
1390
|
}
|
|
1388
1391
|
};
|
|
1389
|
-
function
|
|
1392
|
+
function Lt({
|
|
1390
1393
|
comments: e,
|
|
1391
1394
|
searchType: t,
|
|
1392
1395
|
searchId: o,
|
|
@@ -1412,9 +1415,9 @@ ${c}`;
|
|
|
1412
1415
|
}
|
|
1413
1416
|
return i;
|
|
1414
1417
|
}
|
|
1415
|
-
const
|
|
1418
|
+
const Bt = ["and", "or"], ie = {
|
|
1416
1419
|
labels: s.string().array().optional().describe("The labels to filter the tasks by"),
|
|
1417
|
-
labelsOperator: s.enum(
|
|
1420
|
+
labelsOperator: s.enum(Bt).optional().describe(
|
|
1418
1421
|
'The operator to use when filtering by labels. This will dictate whether a task has all labels, or some of them. Default is "or".'
|
|
1419
1422
|
)
|
|
1420
1423
|
};
|
|
@@ -1423,7 +1426,7 @@ function ae(e = [], t = "or") {
|
|
|
1423
1426
|
const o = t === "and" ? " & " : " | ";
|
|
1424
1427
|
return `(${e.map((i) => i.startsWith("@") ? i : `@${i}`).join(` ${o} `)})`;
|
|
1425
1428
|
}
|
|
1426
|
-
const
|
|
1429
|
+
const Wt = {
|
|
1427
1430
|
getBy: s.enum(["completion", "due"]).default("completion").describe(
|
|
1428
1431
|
'The method to use to get the tasks: "completion" to get tasks by completion date (ie, when the task was actually completed), "due" to get tasks by due date (ie, when the task was due to be completed by).'
|
|
1429
1432
|
),
|
|
@@ -1443,17 +1446,17 @@ const Bt = {
|
|
|
1443
1446
|
"The cursor to get the next page of tasks (cursor is obtained from the previous call to this tool, with the same parameters)."
|
|
1444
1447
|
),
|
|
1445
1448
|
...ie
|
|
1446
|
-
},
|
|
1449
|
+
}, Yt = {
|
|
1447
1450
|
tasks: s.array(W).describe("The found completed tasks."),
|
|
1448
1451
|
nextCursor: s.string().optional().describe("Cursor for the next page of results."),
|
|
1449
1452
|
totalCount: s.number().describe("The total number of tasks in this page."),
|
|
1450
1453
|
hasMore: s.boolean().describe("Whether there are more results available."),
|
|
1451
1454
|
appliedFilters: s.record(s.unknown()).describe("The filters that were applied to the search.")
|
|
1452
|
-
},
|
|
1455
|
+
}, zt = {
|
|
1453
1456
|
name: g.FIND_COMPLETED_TASKS,
|
|
1454
1457
|
description: "Get completed tasks (includes all collaborators by default—use responsibleUser to narrow).",
|
|
1455
|
-
parameters:
|
|
1456
|
-
outputSchema:
|
|
1458
|
+
parameters: Wt,
|
|
1459
|
+
outputSchema: Yt,
|
|
1457
1460
|
async execute(e, t) {
|
|
1458
1461
|
const { getBy: o, labels: n, labelsOperator: r, since: i, until: c, responsibleUser: a, projectId: d, ...l } = e, u = await Q(t, a), p = u?.email;
|
|
1459
1462
|
let m = ae(n, r);
|
|
@@ -1472,7 +1475,7 @@ const Bt = {
|
|
|
1472
1475
|
...m ? { filterQuery: m, filterLang: "en" } : {}
|
|
1473
1476
|
}), f = C.map(O);
|
|
1474
1477
|
return {
|
|
1475
|
-
textContent:
|
|
1478
|
+
textContent: Kt({
|
|
1476
1479
|
tasks: f,
|
|
1477
1480
|
args: e,
|
|
1478
1481
|
nextCursor: v,
|
|
@@ -1488,7 +1491,7 @@ const Bt = {
|
|
|
1488
1491
|
};
|
|
1489
1492
|
}
|
|
1490
1493
|
};
|
|
1491
|
-
function
|
|
1494
|
+
function Kt({
|
|
1492
1495
|
tasks: e,
|
|
1493
1496
|
args: t,
|
|
1494
1497
|
nextCursor: o,
|
|
@@ -1514,13 +1517,13 @@ function zt({
|
|
|
1514
1517
|
zeroReasonHints: a
|
|
1515
1518
|
});
|
|
1516
1519
|
}
|
|
1517
|
-
const { FIND_PROJECTS:
|
|
1520
|
+
const { FIND_PROJECTS: Ht, ADD_TASKS: je, UPDATE_TASKS: ve } = g, Vt = {
|
|
1518
1521
|
projectId: s.string().min(1).describe("The ID of the project to search for collaborators in."),
|
|
1519
1522
|
searchTerm: s.string().optional().describe(
|
|
1520
1523
|
"Search for a collaborator by name or email (partial and case insensitive match). If omitted, all collaborators in the project are returned."
|
|
1521
1524
|
)
|
|
1522
|
-
},
|
|
1523
|
-
collaborators: s.array(
|
|
1525
|
+
}, Gt = {
|
|
1526
|
+
collaborators: s.array(He).describe("The found collaborators."),
|
|
1524
1527
|
projectInfo: s.object({
|
|
1525
1528
|
id: s.string().describe("The project ID."),
|
|
1526
1529
|
name: s.string().describe("The project name."),
|
|
@@ -1529,11 +1532,11 @@ const { FIND_PROJECTS: Kt, ADD_TASKS: je, UPDATE_TASKS: ve } = g, Ht = {
|
|
|
1529
1532
|
totalCount: s.number().describe("The total number of collaborators found."),
|
|
1530
1533
|
totalAvailable: s.number().optional().describe("The total number of available collaborators in the project."),
|
|
1531
1534
|
appliedFilters: s.record(s.unknown()).describe("The filters that were applied to the search.")
|
|
1532
|
-
},
|
|
1535
|
+
}, qt = {
|
|
1533
1536
|
name: g.FIND_PROJECT_COLLABORATORS,
|
|
1534
1537
|
description: "Search for collaborators by name or other criteria in a project.",
|
|
1535
|
-
parameters:
|
|
1536
|
-
outputSchema:
|
|
1538
|
+
parameters: Vt,
|
|
1539
|
+
outputSchema: Gt,
|
|
1537
1540
|
async execute(e, t) {
|
|
1538
1541
|
const { projectId: o, searchTerm: n } = e;
|
|
1539
1542
|
let r = o, i;
|
|
@@ -1591,7 +1594,7 @@ const { FIND_PROJECTS: Kt, ADD_TASKS: je, UPDATE_TASKS: ve } = g, Ht = {
|
|
|
1591
1594
|
);
|
|
1592
1595
|
}
|
|
1593
1596
|
return {
|
|
1594
|
-
textContent:
|
|
1597
|
+
textContent: Jt({
|
|
1595
1598
|
collaborators: a,
|
|
1596
1599
|
projectName: r,
|
|
1597
1600
|
searchTerm: n,
|
|
@@ -1611,7 +1614,7 @@ const { FIND_PROJECTS: Kt, ADD_TASKS: je, UPDATE_TASKS: ve } = g, Ht = {
|
|
|
1611
1614
|
};
|
|
1612
1615
|
}
|
|
1613
1616
|
};
|
|
1614
|
-
function
|
|
1617
|
+
function Jt({
|
|
1615
1618
|
collaborators: e,
|
|
1616
1619
|
projectName: t,
|
|
1617
1620
|
searchTerm: o,
|
|
@@ -1627,7 +1630,7 @@ function qt({
|
|
|
1627
1630
|
const a = [];
|
|
1628
1631
|
e.length === 0 && (o ? (a.push(`No collaborators match "${o}"`), a.push("Try a broader search term or check spelling"), n > 0 && a.push(`${n} collaborators available without filter`)) : (a.push("Project has no collaborators"), a.push("Share the project to add collaborators")));
|
|
1629
1632
|
const d = [];
|
|
1630
|
-
return e.length > 0 ? (d.push(`Use ${je} with responsibleUser to assign new tasks`), d.push(`Use ${ve} with responsibleUser to reassign existing tasks`), d.push("Use collaborator names, emails, or IDs for assignments")) : (d.push(`Use ${
|
|
1633
|
+
return e.length > 0 ? (d.push(`Use ${je} with responsibleUser to assign new tasks`), d.push(`Use ${ve} with responsibleUser to reassign existing tasks`), d.push("Use collaborator names, emails, or IDs for assignments")) : (d.push(`Use ${Ht} to find other projects`), o && n > 0 && d.push("Try searching without filters to see all collaborators")), N({
|
|
1631
1634
|
subject: r,
|
|
1632
1635
|
count: e.length,
|
|
1633
1636
|
filterHints: i,
|
|
@@ -1637,7 +1640,7 @@ function qt({
|
|
|
1637
1640
|
nextSteps: d
|
|
1638
1641
|
});
|
|
1639
1642
|
}
|
|
1640
|
-
const { ADD_PROJECTS:
|
|
1643
|
+
const { ADD_PROJECTS: Xt } = g, Zt = {
|
|
1641
1644
|
search: s.string().optional().describe(
|
|
1642
1645
|
"Search for a project by name (partial and case insensitive match). If omitted, all projects are returned."
|
|
1643
1646
|
),
|
|
@@ -1645,24 +1648,24 @@ const { ADD_PROJECTS: Jt } = g, Xt = {
|
|
|
1645
1648
|
cursor: s.string().optional().describe(
|
|
1646
1649
|
"The cursor to get the next page of projects (cursor is obtained from the previous call to this tool, with the same parameters)."
|
|
1647
1650
|
)
|
|
1648
|
-
},
|
|
1651
|
+
}, Qt = {
|
|
1649
1652
|
projects: s.array(se).describe("The found projects."),
|
|
1650
1653
|
nextCursor: s.string().optional().describe("Cursor for the next page of results."),
|
|
1651
1654
|
totalCount: s.number().describe("The total number of projects in this page."),
|
|
1652
1655
|
hasMore: s.boolean().describe("Whether there are more results available."),
|
|
1653
1656
|
appliedFilters: s.record(s.unknown()).describe("The filters that were applied to the search.")
|
|
1654
|
-
},
|
|
1657
|
+
}, es = {
|
|
1655
1658
|
name: g.FIND_PROJECTS,
|
|
1656
1659
|
description: "List all projects or search for projects by name. If search parameter is omitted, all projects are returned.",
|
|
1657
|
-
parameters:
|
|
1658
|
-
outputSchema:
|
|
1660
|
+
parameters: Zt,
|
|
1661
|
+
outputSchema: Qt,
|
|
1659
1662
|
async execute(e, t) {
|
|
1660
1663
|
const { results: o, nextCursor: n } = await t.getProjects({
|
|
1661
1664
|
limit: e.limit,
|
|
1662
1665
|
cursor: e.cursor ?? null
|
|
1663
|
-
}), r = e.search ? e.search.toLowerCase() : void 0, c = (r ? o.filter((a) => a.name.toLowerCase().includes(r)) : o).map(
|
|
1666
|
+
}), r = e.search ? e.search.toLowerCase() : void 0, c = (r ? o.filter((a) => a.name.toLowerCase().includes(r)) : o).map(Ie);
|
|
1664
1667
|
return {
|
|
1665
|
-
textContent:
|
|
1668
|
+
textContent: ts({ projects: c, args: e, nextCursor: n }),
|
|
1666
1669
|
structuredContent: {
|
|
1667
1670
|
projects: c,
|
|
1668
1671
|
nextCursor: n ?? void 0,
|
|
@@ -1673,17 +1676,17 @@ const { ADD_PROJECTS: Jt } = g, Xt = {
|
|
|
1673
1676
|
};
|
|
1674
1677
|
}
|
|
1675
1678
|
};
|
|
1676
|
-
function
|
|
1679
|
+
function ts({
|
|
1677
1680
|
projects: e,
|
|
1678
1681
|
args: t,
|
|
1679
1682
|
nextCursor: o
|
|
1680
1683
|
}) {
|
|
1681
1684
|
const n = t.search ? `Projects matching "${t.search}"` : "Projects", r = [];
|
|
1682
1685
|
t.search && r.push(`search: "${t.search}"`);
|
|
1683
|
-
const i = 10, a = e.slice(0, i).map(
|
|
1686
|
+
const i = 10, a = e.slice(0, i).map(ht).join(`
|
|
1684
1687
|
`), d = e.length - i, l = d > 0 ? `${a}
|
|
1685
1688
|
…and ${d} more` : a, u = [];
|
|
1686
|
-
return e.length === 0 && (t.search ? (u.push("Try broader search terms"), u.push("Check spelling"), u.push("Remove search to see all projects")) : (u.push("No projects created yet"), u.push(`Use ${
|
|
1689
|
+
return e.length === 0 && (t.search ? (u.push("Try broader search terms"), u.push("Check spelling"), u.push("Remove search to see all projects")) : (u.push("No projects created yet"), u.push(`Use ${Xt} to create a project`))), N({
|
|
1687
1690
|
subject: n,
|
|
1688
1691
|
count: e.length,
|
|
1689
1692
|
limit: t.limit,
|
|
@@ -1693,28 +1696,28 @@ function es({
|
|
|
1693
1696
|
zeroReasonHints: u
|
|
1694
1697
|
});
|
|
1695
1698
|
}
|
|
1696
|
-
const { ADD_SECTIONS:
|
|
1699
|
+
const { ADD_SECTIONS: ss } = g, os = {
|
|
1697
1700
|
projectId: s.string().min(1).describe(
|
|
1698
1701
|
'The ID of the project to search sections in. Project ID should be an ID string, or the text "inbox", for inbox tasks.'
|
|
1699
1702
|
),
|
|
1700
1703
|
search: s.string().optional().describe(
|
|
1701
1704
|
"Search for a section by name (partial and case insensitive match). If omitted, all sections in the project are returned."
|
|
1702
1705
|
)
|
|
1703
|
-
},
|
|
1706
|
+
}, ns = {
|
|
1704
1707
|
sections: s.array(oe).describe("The found sections."),
|
|
1705
1708
|
totalCount: s.number().describe("The total number of sections found."),
|
|
1706
1709
|
appliedFilters: s.record(s.unknown()).describe("The filters that were applied to the search.")
|
|
1707
|
-
},
|
|
1710
|
+
}, rs = {
|
|
1708
1711
|
name: g.FIND_SECTIONS,
|
|
1709
1712
|
description: "Search for sections by name or other criteria in a project.",
|
|
1710
|
-
parameters:
|
|
1711
|
-
outputSchema:
|
|
1713
|
+
parameters: os,
|
|
1714
|
+
outputSchema: ns,
|
|
1712
1715
|
async execute(e, t) {
|
|
1713
1716
|
const o = e.projectId === "inbox" ? (await t.getUser()).inboxProjectId : e.projectId, { results: n } = await t.getSections({
|
|
1714
1717
|
projectId: o
|
|
1715
1718
|
}), r = e.search ? e.search.toLowerCase() : void 0, c = (r ? n.filter((d) => d.name.toLowerCase().includes(r)) : n).map(({ id: d, name: l }) => ({ id: d, name: l }));
|
|
1716
1719
|
return {
|
|
1717
|
-
textContent:
|
|
1720
|
+
textContent: is({
|
|
1718
1721
|
sections: c,
|
|
1719
1722
|
projectId: e.projectId,
|
|
1720
1723
|
search: e.search
|
|
@@ -1727,13 +1730,13 @@ const { ADD_SECTIONS: ts } = g, ss = {
|
|
|
1727
1730
|
};
|
|
1728
1731
|
}
|
|
1729
1732
|
};
|
|
1730
|
-
function
|
|
1733
|
+
function is({
|
|
1731
1734
|
sections: e,
|
|
1732
1735
|
projectId: t,
|
|
1733
1736
|
search: o
|
|
1734
1737
|
}) {
|
|
1735
1738
|
const n = [];
|
|
1736
|
-
o ? (n.push("Try broader search terms"), n.push("Check spelling"), n.push("Remove search to see all sections")) : (n.push("Project has no sections yet"), n.push(`Use ${
|
|
1739
|
+
o ? (n.push("Try broader search terms"), n.push("Check spelling"), n.push("Remove search to see all sections")) : (n.push("Project has no sections yet"), n.push(`Use ${ss} to create sections`));
|
|
1737
1740
|
const r = o ? `Sections in project ${t} matching "${o}"` : `Sections in project ${t}`, i = e.length > 0 ? e.map((c) => ` ${c.name} • id=${c.id}`).join(`
|
|
1738
1741
|
`) : void 0;
|
|
1739
1742
|
return N({
|
|
@@ -1743,7 +1746,7 @@ function rs({
|
|
|
1743
1746
|
zeroReasonHints: n
|
|
1744
1747
|
});
|
|
1745
1748
|
}
|
|
1746
|
-
const { FIND_COMPLETED_TASKS: de, ADD_TASKS: le } = g,
|
|
1749
|
+
const { FIND_COMPLETED_TASKS: de, ADD_TASKS: le } = g, as = {
|
|
1747
1750
|
searchText: s.string().optional().describe("The text to search for in tasks."),
|
|
1748
1751
|
projectId: s.string().optional().describe(
|
|
1749
1752
|
'Find tasks in this project. Project ID should be an ID string, or the text "inbox", for inbox tasks.'
|
|
@@ -1751,7 +1754,7 @@ const { FIND_COMPLETED_TASKS: de, ADD_TASKS: le } = g, is = {
|
|
|
1751
1754
|
sectionId: s.string().optional().describe("Find tasks in this section."),
|
|
1752
1755
|
parentId: s.string().optional().describe("Find subtasks of this parent task."),
|
|
1753
1756
|
responsibleUser: s.string().optional().describe("Find tasks assigned to this user. Can be a user ID, name, or email address."),
|
|
1754
|
-
responsibleUserFiltering: s.enum(
|
|
1757
|
+
responsibleUserFiltering: s.enum(ye).optional().describe(
|
|
1755
1758
|
'How to filter by responsible user when responsibleUser is not provided. "assigned" = only tasks assigned to others; "unassignedOrMe" = only unassigned tasks or tasks assigned to me; "all" = all tasks regardless of assignment. Default value will be `unassignedOrMe`.'
|
|
1756
1759
|
),
|
|
1757
1760
|
limit: s.number().int().min(1).max($.TASKS_MAX).default($.TASKS_DEFAULT).describe("The maximum number of tasks to return."),
|
|
@@ -1759,17 +1762,17 @@ const { FIND_COMPLETED_TASKS: de, ADD_TASKS: le } = g, is = {
|
|
|
1759
1762
|
"The cursor to get the next page of tasks (cursor is obtained from the previous call to this tool, with the same parameters)."
|
|
1760
1763
|
),
|
|
1761
1764
|
...ie
|
|
1762
|
-
},
|
|
1765
|
+
}, cs = {
|
|
1763
1766
|
tasks: s.array(W).describe("The found tasks."),
|
|
1764
1767
|
nextCursor: s.string().optional().describe("Cursor for the next page of results."),
|
|
1765
1768
|
totalCount: s.number().describe("The total number of tasks in this page."),
|
|
1766
1769
|
hasMore: s.boolean().describe("Whether there are more results available."),
|
|
1767
1770
|
appliedFilters: s.record(s.unknown()).describe("The filters that were applied to the search.")
|
|
1768
|
-
},
|
|
1771
|
+
}, ds = {
|
|
1769
1772
|
name: g.FIND_TASKS,
|
|
1770
1773
|
description: "Find tasks by text search, or by project/section/parent container/responsible user. At least one filter must be provided.",
|
|
1771
|
-
parameters:
|
|
1772
|
-
outputSchema:
|
|
1774
|
+
parameters: as,
|
|
1775
|
+
outputSchema: cs,
|
|
1773
1776
|
async execute(e, t) {
|
|
1774
1777
|
const {
|
|
1775
1778
|
searchText: o,
|
|
@@ -1881,7 +1884,7 @@ const { FIND_COMPLETED_TASKS: de, ADD_TASKS: le } = g, is = {
|
|
|
1881
1884
|
};
|
|
1882
1885
|
}
|
|
1883
1886
|
};
|
|
1884
|
-
function
|
|
1887
|
+
function ls(e) {
|
|
1885
1888
|
if (e.projectId) {
|
|
1886
1889
|
const t = [
|
|
1887
1890
|
e.searchText ? "No tasks in project match search" : "Project has no tasks yet"
|
|
@@ -1916,7 +1919,7 @@ function J({
|
|
|
1916
1919
|
const d = t.labels.map((l) => `@${l}`).join(t.labelsOperator === "and" ? " & " : " | ");
|
|
1917
1920
|
c.push(`labels: ${d}`);
|
|
1918
1921
|
}
|
|
1919
|
-
e.length === 0 && a.push(...
|
|
1922
|
+
e.length === 0 && a.push(...ls(t));
|
|
1920
1923
|
} else {
|
|
1921
1924
|
const d = r || t.responsibleUser, l = [];
|
|
1922
1925
|
if (t.searchText && l.push(`"${t.searchText}"`), t.responsibleUser && l.push(`assigned to ${d}`), t.labels && t.labels.length > 0) {
|
|
@@ -1945,7 +1948,7 @@ function J({
|
|
|
1945
1948
|
zeroReasonHints: a
|
|
1946
1949
|
});
|
|
1947
1950
|
}
|
|
1948
|
-
const
|
|
1951
|
+
const us = {
|
|
1949
1952
|
startDate: s.string().regex(/^(\d{4}-\d{2}-\d{2}|today)$/).optional().describe("The start date to get the tasks for. Format: YYYY-MM-DD or 'today'."),
|
|
1950
1953
|
overdueOption: s.enum(["overdue-only", "include-overdue", "exclude-overdue"]).optional().describe(
|
|
1951
1954
|
"How to handle overdue tasks. 'overdue-only' to get only overdue tasks, 'include-overdue' to include overdue tasks along with tasks for the specified date(s), and 'exclude-overdue' to exclude overdue tasks. Default is 'include-overdue'."
|
|
@@ -1958,21 +1961,21 @@ const ls = {
|
|
|
1958
1961
|
"The cursor to get the next page of tasks (cursor is obtained from the previous call to this tool, with the same parameters)."
|
|
1959
1962
|
),
|
|
1960
1963
|
responsibleUser: s.string().optional().describe("Find tasks assigned to this user. Can be a user ID, name, or email address."),
|
|
1961
|
-
responsibleUserFiltering: s.enum(
|
|
1964
|
+
responsibleUserFiltering: s.enum(ye).optional().describe(
|
|
1962
1965
|
'How to filter by responsible user when responsibleUser is not provided. "assigned" = only tasks assigned to others; "unassignedOrMe" = only unassigned tasks or tasks assigned to me; "all" = all tasks regardless of assignment. Default is "unassignedOrMe".'
|
|
1963
1966
|
),
|
|
1964
1967
|
...ie
|
|
1965
|
-
},
|
|
1968
|
+
}, ps = {
|
|
1966
1969
|
tasks: s.array(W).describe("The found tasks."),
|
|
1967
1970
|
nextCursor: s.string().optional().describe("Cursor for the next page of results."),
|
|
1968
1971
|
totalCount: s.number().describe("The total number of tasks in this page."),
|
|
1969
1972
|
hasMore: s.boolean().describe("Whether there are more results available."),
|
|
1970
1973
|
appliedFilters: s.record(s.unknown()).describe("The filters that were applied to the search.")
|
|
1971
|
-
},
|
|
1974
|
+
}, hs = {
|
|
1972
1975
|
name: g.FIND_TASKS_BY_DATE,
|
|
1973
1976
|
description: "Get tasks by date range. Use startDate 'today' to get today's tasks including overdue items, or provide a specific date/date range.",
|
|
1974
|
-
parameters:
|
|
1975
|
-
outputSchema:
|
|
1977
|
+
parameters: us,
|
|
1978
|
+
outputSchema: ps,
|
|
1976
1979
|
async execute(e, t) {
|
|
1977
1980
|
if (!e.startDate && e.overdueOption !== "overdue-only")
|
|
1978
1981
|
throw new Error(
|
|
@@ -1990,7 +1993,7 @@ const ls = {
|
|
|
1990
1993
|
}
|
|
1991
1994
|
const c = ae(e.labels, e.labelsOperator);
|
|
1992
1995
|
c.length > 0 && (i = K(i, `(${c})`));
|
|
1993
|
-
const a =
|
|
1996
|
+
const a = Le({
|
|
1994
1997
|
resolvedAssigneeId: n,
|
|
1995
1998
|
assigneeEmail: r,
|
|
1996
1999
|
responsibleUserFiltering: e.responsibleUserFiltering
|
|
@@ -2003,7 +2006,7 @@ const ls = {
|
|
|
2003
2006
|
limit: e.limit
|
|
2004
2007
|
});
|
|
2005
2008
|
return {
|
|
2006
|
-
textContent:
|
|
2009
|
+
textContent: ms({ tasks: d, args: e, nextCursor: l, assigneeEmail: r }),
|
|
2007
2010
|
structuredContent: {
|
|
2008
2011
|
tasks: d,
|
|
2009
2012
|
nextCursor: l ?? void 0,
|
|
@@ -2014,7 +2017,7 @@ const ls = {
|
|
|
2014
2017
|
};
|
|
2015
2018
|
}
|
|
2016
2019
|
};
|
|
2017
|
-
function
|
|
2020
|
+
function ms({
|
|
2018
2021
|
tasks: e,
|
|
2019
2022
|
args: t,
|
|
2020
2023
|
nextCursor: o,
|
|
@@ -2029,7 +2032,7 @@ function hs({
|
|
|
2029
2032
|
`today${a}${t.daysCount > 1 ? ` + ${t.daysCount - 1} more days` : ""}`
|
|
2030
2033
|
);
|
|
2031
2034
|
} else if (t.startDate) {
|
|
2032
|
-
const a = t.daysCount > 1 ? ` to ${
|
|
2035
|
+
const a = t.daysCount > 1 ? ` to ${lt(fe(t.startDate, t.daysCount))}` : "";
|
|
2033
2036
|
r.push(`${t.startDate}${a}`);
|
|
2034
2037
|
}
|
|
2035
2038
|
if (t.labels && t.labels.length > 0) {
|
|
@@ -2064,11 +2067,11 @@ function hs({
|
|
|
2064
2067
|
zeroReasonHints: c
|
|
2065
2068
|
});
|
|
2066
2069
|
}
|
|
2067
|
-
const
|
|
2070
|
+
const fs = {
|
|
2068
2071
|
projectId: s.string().min(1).optional().describe(
|
|
2069
2072
|
"Optional project ID. If provided, shows detailed overview of that project. If omitted, shows overview of all projects."
|
|
2070
2073
|
)
|
|
2071
|
-
},
|
|
2074
|
+
}, bs = {
|
|
2072
2075
|
type: s.enum(["account_overview", "project_overview"]).describe("The type of overview returned."),
|
|
2073
2076
|
totalProjects: s.number().optional().describe("Total number of projects (account overview only)."),
|
|
2074
2077
|
totalTasks: s.number().optional().describe("Total number of tasks."),
|
|
@@ -2089,7 +2092,7 @@ const ms = {
|
|
|
2089
2092
|
tasks: s.array(s.any()).optional().describe("List of tasks (project overview only)."),
|
|
2090
2093
|
stats: s.any().optional().describe("Statistics object (project overview only).")
|
|
2091
2094
|
};
|
|
2092
|
-
function
|
|
2095
|
+
function gs(e) {
|
|
2093
2096
|
const t = {};
|
|
2094
2097
|
for (const r of e)
|
|
2095
2098
|
t[r.id] = {
|
|
@@ -2114,7 +2117,7 @@ function bs(e) {
|
|
|
2114
2117
|
}
|
|
2115
2118
|
return n(o), o;
|
|
2116
2119
|
}
|
|
2117
|
-
async function
|
|
2120
|
+
async function Ts(e, t) {
|
|
2118
2121
|
const o = {};
|
|
2119
2122
|
return await Promise.all(
|
|
2120
2123
|
t.map(async (n) => {
|
|
@@ -2167,7 +2170,7 @@ function Se(e, t) {
|
|
|
2167
2170
|
children: e.children.map((o) => Se(o, t))
|
|
2168
2171
|
};
|
|
2169
2172
|
}
|
|
2170
|
-
async function
|
|
2173
|
+
async function ys(e, t) {
|
|
2171
2174
|
let o = [], n;
|
|
2172
2175
|
do {
|
|
2173
2176
|
const { results: r, nextCursor: i } = await e.getTasks({
|
|
@@ -2179,12 +2182,12 @@ async function Ts(e, t) {
|
|
|
2179
2182
|
} while (n);
|
|
2180
2183
|
return o;
|
|
2181
2184
|
}
|
|
2182
|
-
async function
|
|
2185
|
+
async function Is(e, t) {
|
|
2183
2186
|
const { results: o } = await e.getSections({ projectId: t });
|
|
2184
2187
|
return o;
|
|
2185
2188
|
}
|
|
2186
|
-
async function
|
|
2187
|
-
const { results: t } = await e.getProjects({}), o = t.find((p) => B(p) && p.inboxProject === !0), n = t.filter((p) => !B(p) || p.inboxProject !== !0), r =
|
|
2189
|
+
async function ks(e) {
|
|
2190
|
+
const { results: t } = await e.getProjects({}), o = t.find((p) => B(p) && p.inboxProject === !0), n = t.filter((p) => !B(p) || p.inboxProject !== !0), r = gs(n), i = t.map((p) => p.id), c = await Ts(e, i), a = ["# Personal Projects", ""];
|
|
2188
2191
|
if (o) {
|
|
2189
2192
|
a.push(`- Inbox Project: ${o.name} (id=${o.id})`);
|
|
2190
2193
|
for (const p of c[o.id] || [])
|
|
@@ -2221,8 +2224,8 @@ async function Is(e) {
|
|
|
2221
2224
|
};
|
|
2222
2225
|
return { textContent: l, structuredContent: u };
|
|
2223
2226
|
}
|
|
2224
|
-
async function
|
|
2225
|
-
const o = await e.getProject(t), n = await
|
|
2227
|
+
async function ws(e, t) {
|
|
2228
|
+
const o = await e.getProject(t), n = await Is(e, t), r = await ys(e, t), i = {};
|
|
2226
2229
|
for (const u of n)
|
|
2227
2230
|
i[u.id] = [];
|
|
2228
2231
|
const c = [];
|
|
@@ -2263,21 +2266,21 @@ async function ks(e, t) {
|
|
|
2263
2266
|
};
|
|
2264
2267
|
return { textContent: d, structuredContent: l };
|
|
2265
2268
|
}
|
|
2266
|
-
const
|
|
2269
|
+
const js = {
|
|
2267
2270
|
name: g.GET_OVERVIEW,
|
|
2268
2271
|
description: "Get a Markdown overview. If no projectId is provided, shows all projects with hierarchy and sections (useful for navigation). If projectId is provided, shows detailed overview of that specific project including all tasks grouped by sections.",
|
|
2269
|
-
parameters:
|
|
2270
|
-
outputSchema:
|
|
2272
|
+
parameters: fs,
|
|
2273
|
+
outputSchema: bs,
|
|
2271
2274
|
async execute(e, t) {
|
|
2272
|
-
const o = e.projectId ? await
|
|
2275
|
+
const o = e.projectId ? await ws(t, e.projectId) : await ks(t);
|
|
2273
2276
|
return {
|
|
2274
2277
|
textContent: o.textContent,
|
|
2275
2278
|
structuredContent: o.structuredContent
|
|
2276
2279
|
};
|
|
2277
2280
|
}
|
|
2278
|
-
}, { FIND_TASKS:
|
|
2281
|
+
}, { FIND_TASKS: vs, FIND_PROJECT_COLLABORATORS: pe, UPDATE_TASKS: Cs } = g, Ss = 50, $s = {
|
|
2279
2282
|
operation: s.enum(["assign", "unassign", "reassign"]).describe("The assignment operation to perform."),
|
|
2280
|
-
taskIds: s.array(s.string()).min(1).max(
|
|
2283
|
+
taskIds: s.array(s.string()).min(1).max(Ss).describe("The IDs of the tasks to operate on (max 50)."),
|
|
2281
2284
|
responsibleUser: s.string().optional().describe(
|
|
2282
2285
|
"The user to assign tasks to. Can be user ID, name, or email. Required for assign and reassign operations."
|
|
2283
2286
|
),
|
|
@@ -2285,7 +2288,7 @@ const ws = {
|
|
|
2285
2288
|
"For reassign operations: the current assignee to reassign from. Can be user ID, name, or email. Optional - if not provided, reassigns from any current assignee."
|
|
2286
2289
|
),
|
|
2287
2290
|
dryRun: s.boolean().optional().default(!1).describe("If true, validates operations without executing them.")
|
|
2288
|
-
},
|
|
2291
|
+
}, Ds = {
|
|
2289
2292
|
results: s.array(
|
|
2290
2293
|
s.object({
|
|
2291
2294
|
taskId: s.string().describe("The ID of the task."),
|
|
@@ -2301,11 +2304,11 @@ const ws = {
|
|
|
2301
2304
|
failed: s.number().describe("Number of failed operations."),
|
|
2302
2305
|
dryRun: s.boolean().describe("Whether this was a dry run.")
|
|
2303
2306
|
}).optional().describe("Summary of the operation.")
|
|
2304
|
-
},
|
|
2307
|
+
}, xs = {
|
|
2305
2308
|
name: g.MANAGE_ASSIGNMENTS,
|
|
2306
2309
|
description: "Bulk assignment operations for multiple tasks. Supports assign, unassign, and reassign operations with atomic rollback on failures.",
|
|
2307
|
-
parameters:
|
|
2308
|
-
outputSchema:
|
|
2310
|
+
parameters: $s,
|
|
2311
|
+
outputSchema: Ds,
|
|
2309
2312
|
async execute(e, t) {
|
|
2310
2313
|
const { operation: o, taskIds: n, responsibleUser: r, fromAssigneeUser: i, dryRun: c } = e;
|
|
2311
2314
|
if ((o === "assign" || o === "reassign") && !r)
|
|
@@ -2531,8 +2534,8 @@ function Y({
|
|
|
2531
2534
|
`;
|
|
2532
2535
|
}
|
|
2533
2536
|
return !o && n.length > 0 ? (a += `**Next steps:**
|
|
2534
|
-
`, a += `• Use ${
|
|
2535
|
-
`, a += `• Use ${
|
|
2537
|
+
`, a += `• Use ${vs} with responsibleUser to see ${e === "unassign" ? "unassigned" : "newly assigned"} tasks
|
|
2538
|
+
`, a += `• Use ${Cs} for individual assignment changes
|
|
2536
2539
|
`, r.length > 0 && (a += `• Check failed tasks and use ${pe} to verify collaborator access
|
|
2537
2540
|
`)) : o ? (a += `**To execute:**
|
|
2538
2541
|
`, a += `• Remove dryRun parameter and run again to execute changes
|
|
@@ -2544,9 +2547,9 @@ function Y({
|
|
|
2544
2547
|
`, a += `• Use dryRun=true to validate before executing
|
|
2545
2548
|
`), a;
|
|
2546
2549
|
}
|
|
2547
|
-
const
|
|
2550
|
+
const As = {
|
|
2548
2551
|
query: s.string().min(1).describe("The search query string to find tasks and projects.")
|
|
2549
|
-
},
|
|
2552
|
+
}, Us = {
|
|
2550
2553
|
results: s.array(
|
|
2551
2554
|
s.object({
|
|
2552
2555
|
id: s.string().describe("The ID of the result."),
|
|
@@ -2555,11 +2558,11 @@ const xs = {
|
|
|
2555
2558
|
})
|
|
2556
2559
|
).describe("The search results."),
|
|
2557
2560
|
totalCount: s.number().describe("Total number of results found.")
|
|
2558
|
-
},
|
|
2561
|
+
}, Ps = {
|
|
2559
2562
|
name: g.SEARCH,
|
|
2560
2563
|
description: "Search across tasks and projects in Todoist. Returns a list of relevant results with IDs, titles, and URLs.",
|
|
2561
|
-
parameters:
|
|
2562
|
-
outputSchema:
|
|
2564
|
+
parameters: As,
|
|
2565
|
+
outputSchema: Us,
|
|
2563
2566
|
async execute(e, t) {
|
|
2564
2567
|
const { query: o } = e, [n, r] = await Promise.all([
|
|
2565
2568
|
te({
|
|
@@ -2589,27 +2592,27 @@ const xs = {
|
|
|
2589
2592
|
structuredContent: { results: a, totalCount: a.length }
|
|
2590
2593
|
};
|
|
2591
2594
|
}
|
|
2592
|
-
},
|
|
2595
|
+
}, Es = s.object({
|
|
2593
2596
|
id: s.string().min(1).describe("The ID of the comment to update."),
|
|
2594
2597
|
content: s.string().min(1).describe("The new content for the comment.")
|
|
2595
|
-
}),
|
|
2596
|
-
comments: s.array(
|
|
2597
|
-
},
|
|
2598
|
+
}), Os = {
|
|
2599
|
+
comments: s.array(Es).min(1).describe("The comments to update.")
|
|
2600
|
+
}, _s = {
|
|
2598
2601
|
comments: s.array(ne).describe("The updated comments."),
|
|
2599
2602
|
totalCount: s.number().describe("The total number of comments updated."),
|
|
2600
2603
|
updatedCommentIds: s.array(s.string()).describe("The IDs of the updated comments."),
|
|
2601
2604
|
appliedOperations: s.object({
|
|
2602
2605
|
updateCount: s.number().describe("The number of comments updated.")
|
|
2603
2606
|
}).describe("Summary of operations performed.")
|
|
2604
|
-
},
|
|
2607
|
+
}, Ns = {
|
|
2605
2608
|
name: g.UPDATE_COMMENTS,
|
|
2606
2609
|
description: "Update multiple existing comments with new content.",
|
|
2607
|
-
parameters:
|
|
2608
|
-
outputSchema:
|
|
2610
|
+
parameters: Os,
|
|
2611
|
+
outputSchema: _s,
|
|
2609
2612
|
async execute(e, t) {
|
|
2610
2613
|
const { comments: o } = e, n = o.map(async (a) => await t.updateComment(a.id, { content: a.content })), i = (await Promise.all(n)).map(ee);
|
|
2611
2614
|
return {
|
|
2612
|
-
textContent:
|
|
2615
|
+
textContent: Ms({
|
|
2613
2616
|
comments: i
|
|
2614
2617
|
}),
|
|
2615
2618
|
structuredContent: {
|
|
@@ -2623,7 +2626,7 @@ const xs = {
|
|
|
2623
2626
|
};
|
|
2624
2627
|
}
|
|
2625
2628
|
};
|
|
2626
|
-
function
|
|
2629
|
+
function Ms({ comments: e }) {
|
|
2627
2630
|
const t = e.filter((i) => i.taskId).length, o = e.filter((i) => i.projectId).length, n = [];
|
|
2628
2631
|
if (t > 0) {
|
|
2629
2632
|
const i = t > 1 ? "comments" : "comment";
|
|
@@ -2635,14 +2638,14 @@ function Ns({ comments: e }) {
|
|
|
2635
2638
|
}
|
|
2636
2639
|
return n.length > 0 ? `Updated ${n.join(" and ")}` : "No comments updated";
|
|
2637
2640
|
}
|
|
2638
|
-
const
|
|
2641
|
+
const Fs = s.object({
|
|
2639
2642
|
id: s.string().min(1).describe("The ID of the project to update."),
|
|
2640
2643
|
name: s.string().min(1).optional().describe("The new name of the project."),
|
|
2641
2644
|
isFavorite: s.boolean().optional().describe("Whether the project is a favorite."),
|
|
2642
2645
|
viewStyle: s.enum(["list", "board", "calendar"]).optional().describe("The project view style.")
|
|
2643
|
-
}),
|
|
2644
|
-
projects: s.array(
|
|
2645
|
-
},
|
|
2646
|
+
}), Rs = {
|
|
2647
|
+
projects: s.array(Fs).min(1).describe("The projects to update.")
|
|
2648
|
+
}, Ls = {
|
|
2646
2649
|
projects: s.array(se).describe("The updated projects."),
|
|
2647
2650
|
totalCount: s.number().describe("The total number of projects updated."),
|
|
2648
2651
|
updatedProjectIds: s.array(s.string()).describe("The IDs of the updated projects."),
|
|
@@ -2650,14 +2653,14 @@ const Ms = s.object({
|
|
|
2650
2653
|
updateCount: s.number().describe("The number of projects actually updated."),
|
|
2651
2654
|
skippedCount: s.number().describe("The number of projects skipped (no changes).")
|
|
2652
2655
|
}).describe("Summary of operations performed.")
|
|
2653
|
-
},
|
|
2656
|
+
}, Bs = {
|
|
2654
2657
|
name: g.UPDATE_PROJECTS,
|
|
2655
2658
|
description: "Update multiple existing projects with new values.",
|
|
2656
|
-
parameters:
|
|
2657
|
-
outputSchema:
|
|
2659
|
+
parameters: Rs,
|
|
2660
|
+
outputSchema: Ls,
|
|
2658
2661
|
async execute(e, t) {
|
|
2659
2662
|
const { projects: o } = e, n = o.map(async (c) => {
|
|
2660
|
-
if (!
|
|
2663
|
+
if (!Ys(c))
|
|
2661
2664
|
return;
|
|
2662
2665
|
const { id: a, ...d } = c;
|
|
2663
2666
|
return await t.updateProject(a, d);
|
|
@@ -2669,7 +2672,7 @@ const Ms = s.object({
|
|
|
2669
2672
|
inboxProject: "inboxProject" in c ? c.inboxProject : !1
|
|
2670
2673
|
}));
|
|
2671
2674
|
return {
|
|
2672
|
-
textContent:
|
|
2675
|
+
textContent: Ws({
|
|
2673
2676
|
projects: r,
|
|
2674
2677
|
args: e
|
|
2675
2678
|
}),
|
|
@@ -2685,7 +2688,7 @@ const Ms = s.object({
|
|
|
2685
2688
|
};
|
|
2686
2689
|
}
|
|
2687
2690
|
};
|
|
2688
|
-
function
|
|
2691
|
+
function Ws({
|
|
2689
2692
|
projects: e,
|
|
2690
2693
|
args: t
|
|
2691
2694
|
}) {
|
|
@@ -2695,29 +2698,29 @@ function Bs({
|
|
|
2695
2698
|
return r > 0 && (a += ` (${r} skipped - no changes)`), i > 0 && (a += `:
|
|
2696
2699
|
${c}`), a;
|
|
2697
2700
|
}
|
|
2698
|
-
function
|
|
2701
|
+
function Ys({ id: e, ...t }) {
|
|
2699
2702
|
return Object.keys(t).length > 0;
|
|
2700
2703
|
}
|
|
2701
|
-
const
|
|
2704
|
+
const zs = s.object({
|
|
2702
2705
|
id: s.string().min(1).describe("The ID of the section to update."),
|
|
2703
2706
|
name: s.string().min(1).describe("The new name of the section.")
|
|
2704
|
-
}),
|
|
2705
|
-
sections: s.array(
|
|
2706
|
-
},
|
|
2707
|
+
}), Ks = {
|
|
2708
|
+
sections: s.array(zs).min(1).describe("The sections to update.")
|
|
2709
|
+
}, Hs = {
|
|
2707
2710
|
sections: s.array(oe).describe("The updated sections."),
|
|
2708
2711
|
totalCount: s.number().describe("The total number of sections updated."),
|
|
2709
2712
|
updatedSectionIds: s.array(s.string()).describe("The IDs of the updated sections.")
|
|
2710
|
-
},
|
|
2713
|
+
}, Vs = {
|
|
2711
2714
|
name: g.UPDATE_SECTIONS,
|
|
2712
2715
|
description: "Update multiple existing sections with new values.",
|
|
2713
|
-
parameters:
|
|
2714
|
-
outputSchema:
|
|
2716
|
+
parameters: Ks,
|
|
2717
|
+
outputSchema: Hs,
|
|
2715
2718
|
async execute({ sections: e }, t) {
|
|
2716
2719
|
const o = await Promise.all(
|
|
2717
2720
|
e.map((r) => t.updateSection(r.id, { name: r.name }))
|
|
2718
2721
|
);
|
|
2719
2722
|
return {
|
|
2720
|
-
textContent:
|
|
2723
|
+
textContent: Gs({
|
|
2721
2724
|
sections: o
|
|
2722
2725
|
}),
|
|
2723
2726
|
structuredContent: {
|
|
@@ -2728,13 +2731,13 @@ const Ys = s.object({
|
|
|
2728
2731
|
};
|
|
2729
2732
|
}
|
|
2730
2733
|
};
|
|
2731
|
-
function
|
|
2734
|
+
function Gs({ sections: e }) {
|
|
2732
2735
|
const t = e.length, o = e.map((r) => `• ${r.name} (id=${r.id}, projectId=${r.projectId})`).join(`
|
|
2733
2736
|
`);
|
|
2734
2737
|
return `Updated ${t} section${t === 1 ? "" : "s"}:
|
|
2735
2738
|
${o}`;
|
|
2736
2739
|
}
|
|
2737
|
-
const
|
|
2740
|
+
const qs = s.object({
|
|
2738
2741
|
id: s.string().min(1).describe("The ID of the task to update."),
|
|
2739
2742
|
content: s.string().optional().describe(
|
|
2740
2743
|
'The new task name/title. Should be concise and actionable (e.g., "Review PR #123", "Call dentist"). For longer content, use the description field instead. Supports Markdown.'
|
|
@@ -2748,7 +2751,7 @@ const Gs = s.object({
|
|
|
2748
2751
|
sectionId: s.string().optional().describe("The new section ID for the task."),
|
|
2749
2752
|
parentId: s.string().optional().describe("The new parent task ID (for subtasks)."),
|
|
2750
2753
|
order: s.number().optional().describe("The new order of the task within its parent/section."),
|
|
2751
|
-
priority:
|
|
2754
|
+
priority: ge.optional().describe(
|
|
2752
2755
|
"The new priority of the task: p1 (highest), p2 (high), p3 (medium), p4 (lowest/default)."
|
|
2753
2756
|
),
|
|
2754
2757
|
dueString: s.string().optional().describe("The new due date for the task, in natural language (e.g., 'tomorrow at 5pm')."),
|
|
@@ -2762,9 +2765,9 @@ const Gs = s.object({
|
|
|
2762
2765
|
'Change task assignment. Use "unassign" to remove assignment. Can be user ID, name, or email. User must be a project collaborator.'
|
|
2763
2766
|
),
|
|
2764
2767
|
labels: s.array(s.string()).optional().describe("The new labels for the task. Replaces all existing labels.")
|
|
2765
|
-
}),
|
|
2766
|
-
tasks: s.array(
|
|
2767
|
-
},
|
|
2768
|
+
}), Js = {
|
|
2769
|
+
tasks: s.array(qs).min(1).describe("The tasks to update.")
|
|
2770
|
+
}, Xs = {
|
|
2768
2771
|
tasks: s.array(W).describe("The updated tasks."),
|
|
2769
2772
|
totalCount: s.number().describe("The total number of tasks updated."),
|
|
2770
2773
|
updatedTaskIds: s.array(s.string()).describe("The IDs of the updated tasks."),
|
|
@@ -2772,14 +2775,14 @@ const Gs = s.object({
|
|
|
2772
2775
|
updateCount: s.number().describe("The number of tasks actually updated."),
|
|
2773
2776
|
skippedCount: s.number().describe("The number of tasks skipped (no changes).")
|
|
2774
2777
|
}).describe("Summary of operations performed.")
|
|
2775
|
-
},
|
|
2778
|
+
}, Zs = {
|
|
2776
2779
|
name: g.UPDATE_TASKS,
|
|
2777
2780
|
description: "Update existing tasks including content, dates, priorities, and assignments.",
|
|
2778
|
-
parameters:
|
|
2779
|
-
outputSchema:
|
|
2781
|
+
parameters: Js,
|
|
2782
|
+
outputSchema: Xs,
|
|
2780
2783
|
async execute(e, t) {
|
|
2781
2784
|
const { tasks: o } = e, n = o.map(async (a) => {
|
|
2782
|
-
if (!
|
|
2785
|
+
if (!eo(a))
|
|
2783
2786
|
return;
|
|
2784
2787
|
const {
|
|
2785
2788
|
id: d,
|
|
@@ -2799,7 +2802,7 @@ const Gs = s.object({
|
|
|
2799
2802
|
...D,
|
|
2800
2803
|
...k !== void 0 && { labels: k }
|
|
2801
2804
|
};
|
|
2802
|
-
if (y && (h.priority =
|
|
2805
|
+
if (y && (h.priority = Te(y)), w !== void 0 && (w === null || w === "remove" ? h = { ...h, deadlineDate: null } : h = { ...h, deadlineDate: w }), b)
|
|
2803
2806
|
try {
|
|
2804
2807
|
const { minutes: v } = be(b);
|
|
2805
2808
|
h = {
|
|
@@ -2829,13 +2832,13 @@ const Gs = s.object({
|
|
|
2829
2832
|
}
|
|
2830
2833
|
if (!P && !u && !p)
|
|
2831
2834
|
return await t.updateTask(d, h);
|
|
2832
|
-
const T =
|
|
2835
|
+
const T = Be(d, P, u, p), C = await t.moveTask(d, T);
|
|
2833
2836
|
return Object.keys(h).length > 0 ? await t.updateTask(d, h) : C;
|
|
2834
2837
|
}), r = (await Promise.all(n)).filter(
|
|
2835
2838
|
(a) => a !== void 0
|
|
2836
2839
|
), i = r.map(O);
|
|
2837
2840
|
return {
|
|
2838
|
-
textContent:
|
|
2841
|
+
textContent: Qs({
|
|
2839
2842
|
tasks: i,
|
|
2840
2843
|
args: e
|
|
2841
2844
|
}),
|
|
@@ -2851,7 +2854,7 @@ const Gs = s.object({
|
|
|
2851
2854
|
};
|
|
2852
2855
|
}
|
|
2853
2856
|
};
|
|
2854
|
-
function
|
|
2857
|
+
function Qs({
|
|
2855
2858
|
tasks: e,
|
|
2856
2859
|
args: t
|
|
2857
2860
|
}) {
|
|
@@ -2862,10 +2865,10 @@ function Zs({
|
|
|
2862
2865
|
showDetails: e.length <= 5
|
|
2863
2866
|
});
|
|
2864
2867
|
}
|
|
2865
|
-
function
|
|
2868
|
+
function eo({ id: e, ...t }) {
|
|
2866
2869
|
return Object.keys(t).length > 0;
|
|
2867
2870
|
}
|
|
2868
|
-
const
|
|
2871
|
+
const to = {}, so = {
|
|
2869
2872
|
type: s.literal("user_info").describe("The type of the response."),
|
|
2870
2873
|
userId: s.string().describe("The user ID."),
|
|
2871
2874
|
fullName: s.string().describe("The full name of the user."),
|
|
@@ -2882,28 +2885,28 @@ const eo = {}, to = {
|
|
|
2882
2885
|
email: s.string().describe("The email address of the user."),
|
|
2883
2886
|
plan: s.enum(["Todoist Free", "Todoist Pro", "Todoist Business"]).describe("The user plan.")
|
|
2884
2887
|
};
|
|
2885
|
-
function
|
|
2888
|
+
function oo(e) {
|
|
2886
2889
|
return e.businessAccountId ? "Todoist Business" : e.isPremium ? "Todoist Pro" : "Todoist Free";
|
|
2887
2890
|
}
|
|
2888
|
-
function
|
|
2891
|
+
function no(e, t) {
|
|
2889
2892
|
const n = ((e.getDay() || 7) - t + 7) % 7, r = new Date(e);
|
|
2890
2893
|
return r.setDate(e.getDate() - n), r;
|
|
2891
2894
|
}
|
|
2892
|
-
function
|
|
2895
|
+
function ro(e) {
|
|
2893
2896
|
const t = new Date(e);
|
|
2894
2897
|
return t.setDate(e.getDate() + 6), t;
|
|
2895
2898
|
}
|
|
2896
|
-
function
|
|
2899
|
+
function io(e) {
|
|
2897
2900
|
const t = new Date(e.getFullYear(), 0, 1), o = (e.getTime() - t.getTime()) / 864e5;
|
|
2898
2901
|
return Math.ceil((o + t.getDay() + 1) / 7);
|
|
2899
2902
|
}
|
|
2900
|
-
function
|
|
2903
|
+
function ao(e) {
|
|
2901
2904
|
return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][e === 7 ? 0 : e] ?? "Unknown";
|
|
2902
2905
|
}
|
|
2903
2906
|
function z(e) {
|
|
2904
2907
|
return e.toISOString().split("T")[0] ?? "";
|
|
2905
2908
|
}
|
|
2906
|
-
function
|
|
2909
|
+
function co(e) {
|
|
2907
2910
|
try {
|
|
2908
2911
|
return new Intl.DateTimeFormat("en-US", { timeZone: e }), !0;
|
|
2909
2912
|
} catch {
|
|
@@ -2911,9 +2914,9 @@ function ao(e) {
|
|
|
2911
2914
|
}
|
|
2912
2915
|
}
|
|
2913
2916
|
function $e(e) {
|
|
2914
|
-
return
|
|
2917
|
+
return co(e) ? e : "UTC";
|
|
2915
2918
|
}
|
|
2916
|
-
function
|
|
2919
|
+
function lo(e, t) {
|
|
2917
2920
|
const o = $e(t);
|
|
2918
2921
|
return e.toLocaleString("en-US", {
|
|
2919
2922
|
timeZone: o,
|
|
@@ -2926,8 +2929,8 @@ function co(e, t) {
|
|
|
2926
2929
|
hour12: !1
|
|
2927
2930
|
});
|
|
2928
2931
|
}
|
|
2929
|
-
async function
|
|
2930
|
-
const t = await e.getUser(), o = t.tzInfo?.timezone ?? "UTC", n = $e(o), r = /* @__PURE__ */ new Date(), i =
|
|
2932
|
+
async function uo(e) {
|
|
2933
|
+
const t = await e.getUser(), o = t.tzInfo?.timezone ?? "UTC", n = $e(o), r = /* @__PURE__ */ new Date(), i = lo(r, n), c = t.startDay ?? 1, a = ao(c), d = oo(t), l = new Date(r.toLocaleString("en-US", { timeZone: n })), u = no(l, c), p = ro(u), b = io(l), y = [
|
|
2931
2934
|
"# User Information",
|
|
2932
2935
|
"",
|
|
2933
2936
|
`**User ID:** ${t.id}`,
|
|
@@ -2969,19 +2972,19 @@ async function lo(e) {
|
|
|
2969
2972
|
};
|
|
2970
2973
|
return { textContent: y, structuredContent: k };
|
|
2971
2974
|
}
|
|
2972
|
-
const
|
|
2975
|
+
const po = {
|
|
2973
2976
|
name: g.USER_INFO,
|
|
2974
2977
|
description: "Get comprehensive user information including user ID, full name, email, timezone with current local time, week start day preferences, current week dates, daily/weekly goal progress, and user plan (Free/Pro/Business).",
|
|
2975
|
-
parameters:
|
|
2976
|
-
outputSchema:
|
|
2978
|
+
parameters: to,
|
|
2979
|
+
outputSchema: so,
|
|
2977
2980
|
async execute(e, t) {
|
|
2978
|
-
const o = await
|
|
2981
|
+
const o = await uo(t);
|
|
2979
2982
|
return {
|
|
2980
2983
|
textContent: o.textContent,
|
|
2981
2984
|
structuredContent: o.structuredContent
|
|
2982
2985
|
};
|
|
2983
2986
|
}
|
|
2984
|
-
},
|
|
2987
|
+
}, ho = `
|
|
2985
2988
|
## Todoist Task and Project Management Tools
|
|
2986
2989
|
|
|
2987
2990
|
You have access to comprehensive Todoist management tools for personal productivity and team collaboration. Use these tools to help users manage tasks, projects, sections, comments, and assignments effectively.
|
|
@@ -3049,41 +3052,41 @@ You have access to comprehensive Todoist management tools for personal productiv
|
|
|
3049
3052
|
|
|
3050
3053
|
Always provide clear, actionable task titles and descriptions. Use the overview tools to give users context about their workload and project status.
|
|
3051
3054
|
`;
|
|
3052
|
-
function
|
|
3055
|
+
function yo({ todoistApiKey: e, baseUrl: t }) {
|
|
3053
3056
|
const o = new xe(
|
|
3054
3057
|
{ name: "todoist-mcp-server", version: "0.1.0" },
|
|
3055
3058
|
{
|
|
3056
3059
|
capabilities: {
|
|
3057
3060
|
tools: { listChanged: !0 }
|
|
3058
3061
|
},
|
|
3059
|
-
instructions:
|
|
3062
|
+
instructions: ho
|
|
3060
3063
|
}
|
|
3061
3064
|
), n = new De(e, t);
|
|
3062
|
-
return I(
|
|
3065
|
+
return I(gt, o, n), I(wt, o, n), I(Zs, o, n), I(ds, o, n), I(hs, o, n), I(zt, o, n), I(st, o, n), I(Bs, o, n), I(es, o, n), I(at, o, n), I(Vs, o, n), I(rs, o, n), I(Xe, o, n), I(Rt, o, n), I(Ns, o, n), I(Pt, o, n), I(js, o, n), I(St, o, n), I(po, o, n), I(qt, o, n), I(xs, o, n), I(Ps, o, n), I(xt, o, n), o;
|
|
3063
3066
|
}
|
|
3064
3067
|
export {
|
|
3065
|
-
|
|
3066
|
-
|
|
3067
|
-
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3075
|
-
|
|
3076
|
-
|
|
3077
|
-
|
|
3078
|
-
|
|
3079
|
-
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3087
|
-
|
|
3088
|
-
|
|
3068
|
+
qt as a,
|
|
3069
|
+
js as b,
|
|
3070
|
+
Pt as c,
|
|
3071
|
+
St as d,
|
|
3072
|
+
Rt as e,
|
|
3073
|
+
xt as f,
|
|
3074
|
+
yo as g,
|
|
3075
|
+
Ns as h,
|
|
3076
|
+
Xe as i,
|
|
3077
|
+
rs as j,
|
|
3078
|
+
Vs as k,
|
|
3079
|
+
at as l,
|
|
3080
|
+
xs as m,
|
|
3081
|
+
es as n,
|
|
3082
|
+
Bs as o,
|
|
3083
|
+
st as p,
|
|
3084
|
+
zt as q,
|
|
3085
|
+
hs as r,
|
|
3086
|
+
Ps as s,
|
|
3087
|
+
ds as t,
|
|
3088
|
+
po as u,
|
|
3089
|
+
Zs as v,
|
|
3090
|
+
wt as w,
|
|
3091
|
+
gt as x
|
|
3089
3092
|
};
|