@doist/todoist-mcp 12.5.1 → 12.5.3
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 +3 -3
- package/dist/main-http.js +2 -2
- package/dist/main.js +1 -1
- package/dist/{mcp-server-D55mj0Ly.js → mcp-server-9sgQGVw_.js} +668 -724
- package/dist/mcp-server.d.ts +1 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/{require-valid-todoist-token-Cp1WZyMV.js → require-valid-todoist-token-26-h3alF.js} +1 -1
- package/dist/tools/find-activity.d.ts.map +1 -1
- package/dist/tools/find-completed-tasks.d.ts.map +1 -1
- package/dist/tools/find-labels.d.ts.map +1 -1
- package/dist/tools/find-project-collaborators.d.ts.map +1 -1
- package/dist/tools/find-projects.d.ts.map +1 -1
- package/dist/tools/find-sections.d.ts.map +1 -1
- package/dist/tools/find-tasks-by-date.d.ts.map +1 -1
- package/dist/tools/find-tasks.d.ts.map +1 -1
- package/dist/utils/colors.d.ts.map +1 -1
- package/dist/utils/output-schemas.d.ts.map +1 -1
- package/package.json +2 -1
- package/scripts/eval-instructions.ts +415 -0
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import { ResourceTemplate as Ds, McpServer as xs } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
-
import { createHash as
|
|
2
|
+
import { createHash as Rt, randomUUID as Pe } from "node:crypto";
|
|
3
3
|
import { readFileSync as As } from "node:fs";
|
|
4
|
-
import { dirname as Ut, join as
|
|
4
|
+
import { dirname as Ut, join as _e } from "node:path";
|
|
5
5
|
import { fileURLToPath as Es } from "node:url";
|
|
6
6
|
import { registerAppResource as Os, RESOURCE_MIME_TYPE as Lt, registerAppTool as Ps } from "@modelcontextprotocol/ext-apps/server";
|
|
7
|
-
import se, { ZodError as
|
|
8
|
-
import { AsyncLocalStorage as
|
|
7
|
+
import se, { ZodError as _s, z as s } from "zod";
|
|
8
|
+
import { AsyncLocalStorage as Rs } from "node:async_hooks";
|
|
9
9
|
import { createRequire as Us } from "node:module";
|
|
10
|
-
import { TodoistApi as Ls, isWorkspaceProject as ke, isPersonalProject as B, colors as
|
|
10
|
+
import { TodoistApi as Ls, isWorkspaceProject as ke, isPersonalProject as B, colors as Re, LOCATION_TRIGGERS as Nt, REMINDER_TYPES as Ns, createCommand as V, REMINDER_DELIVERY_SERVICES as Ms, HEALTH_STATUSES as Ge, getTaskUrl as Mt, getProjectUrl as Ft, WORKSPACE_ROLES as Fs, WORKSPACE_PLANS as Hs } from "@doist/todoist-sdk";
|
|
11
11
|
import { addDays as Ue, formatISO as lt } from "date-fns";
|
|
12
12
|
const ut = Ut(Es(import.meta.url)), Ws = [
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
_e(ut, "task-list", "index.html"),
|
|
14
|
+
_e(ut, "mcp-apps", "index.html")
|
|
15
15
|
], Bs = `<!doctype html>
|
|
16
16
|
<html>
|
|
17
17
|
<body>
|
|
18
18
|
<p>Task list app is missing. Run "npm run build" to generate it.</p>
|
|
19
19
|
</body>
|
|
20
20
|
</html>`;
|
|
21
|
-
function
|
|
21
|
+
function zs() {
|
|
22
22
|
const e = [];
|
|
23
23
|
for (const t of Ws)
|
|
24
24
|
try {
|
|
@@ -28,7 +28,7 @@ function qs() {
|
|
|
28
28
|
}
|
|
29
29
|
return console.error("Failed to load task list app HTML from any known path:", e), Bs;
|
|
30
30
|
}
|
|
31
|
-
const Ht =
|
|
31
|
+
const Ht = zs(), Ks = Rt("sha256").update(Ht).digest("hex").slice(0, 12), Le = `ui://todoist/task-list@${Ks}`, qs = "ui://todoist/task-list@{hash}", Ne = "Interactive task list widget", Ys = "https://ai.todoist.net", Me = {
|
|
32
32
|
ui: {
|
|
33
33
|
prefersBorder: !0,
|
|
34
34
|
csp: {
|
|
@@ -37,13 +37,13 @@ const Ht = qs(), zs = _t("sha256").update(Ht).digest("hex").slice(0, 12), Le = `
|
|
|
37
37
|
resourceDomains: []
|
|
38
38
|
}
|
|
39
39
|
},
|
|
40
|
-
"openai/widgetDescription":
|
|
40
|
+
"openai/widgetDescription": Ne,
|
|
41
41
|
"openai/widgetPrefersBorder": !0,
|
|
42
42
|
"openai/widgetCSP": {
|
|
43
43
|
connect_domains: [],
|
|
44
44
|
resource_domains: []
|
|
45
45
|
},
|
|
46
|
-
"openai/widgetDomain":
|
|
46
|
+
"openai/widgetDomain": Ys
|
|
47
47
|
};
|
|
48
48
|
function pt(e) {
|
|
49
49
|
return {
|
|
@@ -52,28 +52,28 @@ function pt(e) {
|
|
|
52
52
|
uri: e,
|
|
53
53
|
mimeType: Lt,
|
|
54
54
|
text: Ht,
|
|
55
|
-
_meta:
|
|
55
|
+
_meta: Me
|
|
56
56
|
}
|
|
57
57
|
]
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
function
|
|
60
|
+
function Gs(e) {
|
|
61
61
|
Os(
|
|
62
62
|
e,
|
|
63
63
|
"todoist-task-list",
|
|
64
64
|
Le,
|
|
65
65
|
{
|
|
66
|
-
description:
|
|
67
|
-
_meta:
|
|
66
|
+
description: Ne,
|
|
67
|
+
_meta: Me
|
|
68
68
|
},
|
|
69
69
|
async () => pt(Le)
|
|
70
70
|
), e.registerResource(
|
|
71
71
|
"todoist-task-list-hash-fallback",
|
|
72
|
-
new Ds(
|
|
72
|
+
new Ds(qs, { list: void 0 }),
|
|
73
73
|
{
|
|
74
|
-
description: `${
|
|
74
|
+
description: `${Ne} compatibility fallback`,
|
|
75
75
|
mimeType: Lt,
|
|
76
|
-
_meta:
|
|
76
|
+
_meta: Me
|
|
77
77
|
},
|
|
78
78
|
async (t) => pt(t.toString())
|
|
79
79
|
);
|
|
@@ -111,7 +111,7 @@ function Vs(e) {
|
|
|
111
111
|
"$1: [REDACTED]"
|
|
112
112
|
).replace(/([?&](?:token|api[_-]?key|authorization)=)[^&\s]+/gi, "$1[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g, "[REDACTED]");
|
|
113
113
|
}
|
|
114
|
-
function
|
|
114
|
+
function R(e, t = 220) {
|
|
115
115
|
const r = Vs(e).replace(/\s+/g, " ").trim();
|
|
116
116
|
return r.length <= t ? r : `${r.slice(0, t - 3)}...`;
|
|
117
117
|
}
|
|
@@ -126,13 +126,13 @@ function xe(e) {
|
|
|
126
126
|
if (t?.[1])
|
|
127
127
|
return E(t[1]);
|
|
128
128
|
}
|
|
129
|
-
function
|
|
129
|
+
function G(e) {
|
|
130
130
|
const t = w(e);
|
|
131
131
|
if (t)
|
|
132
|
-
return
|
|
132
|
+
return R(t);
|
|
133
133
|
if (Array.isArray(e)) {
|
|
134
134
|
const n = e.map((a) => J(a) ? w(a.message) || w(a.error) : w(a)).filter((a) => !!a);
|
|
135
|
-
return n.length > 0 ?
|
|
135
|
+
return n.length > 0 ? R(n.slice(0, 2).join("; ")) : void 0;
|
|
136
136
|
}
|
|
137
137
|
if (!J(e))
|
|
138
138
|
return;
|
|
@@ -144,20 +144,20 @@ function K(e) {
|
|
|
144
144
|
w(e.description)
|
|
145
145
|
);
|
|
146
146
|
if (r)
|
|
147
|
-
return
|
|
147
|
+
return R(r);
|
|
148
148
|
const o = [];
|
|
149
149
|
for (const [n, a] of Object.entries(e)) {
|
|
150
150
|
const i = w(a);
|
|
151
151
|
if (i && (o.push(`${n}: ${i}`), o.length >= 2))
|
|
152
152
|
break;
|
|
153
153
|
}
|
|
154
|
-
return o.length > 0 ?
|
|
154
|
+
return o.length > 0 ? R(o.join("; ")) : void 0;
|
|
155
155
|
}
|
|
156
156
|
function Js(e) {
|
|
157
157
|
if (!e)
|
|
158
158
|
return [];
|
|
159
159
|
const t = /* @__PURE__ */ new Set(), r = (i) => {
|
|
160
|
-
i && t.add(
|
|
160
|
+
i && t.add(R(i, 120));
|
|
161
161
|
}, o = L(
|
|
162
162
|
w(e.field),
|
|
163
163
|
w(e.parameter),
|
|
@@ -297,24 +297,24 @@ function Ve(e) {
|
|
|
297
297
|
), d = [
|
|
298
298
|
w(n?.error),
|
|
299
299
|
w(n?.message),
|
|
300
|
-
|
|
300
|
+
G(n?.message),
|
|
301
301
|
w(t?.message),
|
|
302
302
|
w(r?.message),
|
|
303
303
|
e instanceof Error ? e.message : w(e)
|
|
304
|
-
].filter((
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
304
|
+
].filter((h) => !!h), l = d.find((h) => !He(h)) || d[0], u = L(
|
|
305
|
+
G(n?.errorExtra),
|
|
306
|
+
G(n?.error_extra),
|
|
307
|
+
G(n?.details),
|
|
308
|
+
G(n?.errorDetails),
|
|
309
|
+
G(n?.errors),
|
|
310
|
+
G(t?.details)
|
|
311
311
|
), p = Js(n);
|
|
312
312
|
return a !== void 0 || Zs(n) || c !== void 0 || i !== void 0 || (l ? He(l) : !1) ? {
|
|
313
313
|
statusCode: a,
|
|
314
314
|
code: i,
|
|
315
|
-
tag: c ?
|
|
316
|
-
message: l ?
|
|
317
|
-
details: u ?
|
|
315
|
+
tag: c ? R(c, 80) : void 0,
|
|
316
|
+
message: l ? R(l) : void 0,
|
|
317
|
+
details: u ? R(u) : void 0,
|
|
318
318
|
rawText: d,
|
|
319
319
|
fieldHints: p
|
|
320
320
|
} : null;
|
|
@@ -331,19 +331,19 @@ function sr(e) {
|
|
|
331
331
|
`);
|
|
332
332
|
}
|
|
333
333
|
function Bt(e) {
|
|
334
|
-
return e instanceof Error ?
|
|
334
|
+
return e instanceof Error ? R(e.message) : typeof e == "string" ? R(e) : "An unknown error occurred";
|
|
335
335
|
}
|
|
336
336
|
class ve extends Error {
|
|
337
337
|
constructor(t) {
|
|
338
338
|
super(t), this.name = "DueStringParseError";
|
|
339
339
|
}
|
|
340
340
|
}
|
|
341
|
-
class
|
|
341
|
+
class zt extends Error {
|
|
342
342
|
constructor(t) {
|
|
343
343
|
super(t), this.name = "BatchDueStringParseError";
|
|
344
344
|
}
|
|
345
345
|
}
|
|
346
|
-
function
|
|
346
|
+
function z(e) {
|
|
347
347
|
if (e instanceof ve)
|
|
348
348
|
return e.message;
|
|
349
349
|
const t = Ve(e);
|
|
@@ -366,12 +366,12 @@ function rr(e, {
|
|
|
366
366
|
return d !== r.trim() && d ? `Task "${t}" wasn't created because \`dueString\` could not be parsed. Use Todoist recurrence syntax, for example \`${d}\`; don't prefix it with \`recurring\`. Change only \`dueString\` and retry.` : d !== r.trim() ? `Task "${t}" wasn't created because \`dueString\` could not be parsed. Use a complete Todoist recurrence expression; \`recurring\` alone is not valid. Change only \`dueString\` and retry.` : `Task "${t}" wasn't created because \`dueString\` could not be parsed. Change only \`dueString\` and retry.`;
|
|
367
367
|
}
|
|
368
368
|
function or(e) {
|
|
369
|
-
if (e instanceof
|
|
369
|
+
if (e instanceof _s || e instanceof ve || e instanceof zt)
|
|
370
370
|
return e.message;
|
|
371
371
|
const t = Ve(e);
|
|
372
372
|
return t ? sr(t) : Bt(e);
|
|
373
373
|
}
|
|
374
|
-
const nr = "12.5.
|
|
374
|
+
const nr = "12.5.3", ar = {
|
|
375
375
|
version: nr
|
|
376
376
|
}, C = {
|
|
377
377
|
/** Default limit for task listings */
|
|
@@ -407,7 +407,7 @@ const nr = "12.5.1", ar = {
|
|
|
407
407
|
}, fe = {
|
|
408
408
|
/** Maximum number of failures to show in detailed error messages */
|
|
409
409
|
MAX_FAILURES_SHOWN: 3
|
|
410
|
-
},
|
|
410
|
+
}, Kt = {
|
|
411
411
|
/** Maximum tasks accepted by one task create or update operation */
|
|
412
412
|
TASKS_PER_OPERATION: 25
|
|
413
413
|
}, Be = {
|
|
@@ -434,7 +434,7 @@ const nr = "12.5.1", ar = {
|
|
|
434
434
|
*/
|
|
435
435
|
QUEUE_WAIT_MS: 3e4
|
|
436
436
|
};
|
|
437
|
-
function
|
|
437
|
+
function mt(e, { queueTimeoutMs: t = Be.QUEUE_WAIT_MS } = {}) {
|
|
438
438
|
if (!Number.isInteger(e) || e < 1)
|
|
439
439
|
throw new Error(
|
|
440
440
|
`maxConcurrent must be a positive integer, received ${String(e)}`
|
|
@@ -475,41 +475,41 @@ function ht(e, { queueTimeoutMs: t = Be.QUEUE_WAIT_MS } = {}) {
|
|
|
475
475
|
}
|
|
476
476
|
};
|
|
477
477
|
}
|
|
478
|
-
function
|
|
478
|
+
function qt() {
|
|
479
479
|
return {
|
|
480
|
-
moves:
|
|
481
|
-
writes:
|
|
480
|
+
moves: mt(Be.TASK_MOVES),
|
|
481
|
+
writes: mt(Be.WRITES)
|
|
482
482
|
};
|
|
483
483
|
}
|
|
484
|
-
const
|
|
484
|
+
const ht = /* @__PURE__ */ new Map(), Yt = /* @__PURE__ */ new WeakMap();
|
|
485
485
|
let ft;
|
|
486
486
|
function ir() {
|
|
487
|
-
return ft ??=
|
|
487
|
+
return ft ??= qt(), ft;
|
|
488
488
|
}
|
|
489
489
|
function cr(e) {
|
|
490
|
-
return
|
|
490
|
+
return Rt("sha256").update(e).digest("hex");
|
|
491
491
|
}
|
|
492
492
|
function dr(e, t) {
|
|
493
493
|
const r = cr(t);
|
|
494
|
-
let o =
|
|
495
|
-
o || (o =
|
|
494
|
+
let o = ht.get(r);
|
|
495
|
+
o || (o = qt(), ht.set(r, o)), Yt.set(e, o);
|
|
496
496
|
}
|
|
497
|
-
function
|
|
498
|
-
return
|
|
497
|
+
function Gt(e) {
|
|
498
|
+
return Yt.get(e) ?? ir();
|
|
499
499
|
}
|
|
500
500
|
function lr(e) {
|
|
501
|
-
return
|
|
501
|
+
return Gt(e).moves;
|
|
502
502
|
}
|
|
503
503
|
function ur(e) {
|
|
504
|
-
return
|
|
504
|
+
return Gt(e).writes;
|
|
505
505
|
}
|
|
506
|
-
const pr = "todoist-mcp", Je = ar.version, Vt = new
|
|
506
|
+
const pr = "todoist-mcp", Je = ar.version, Vt = new Rs(), bt = Us(import.meta.url);
|
|
507
507
|
let Te;
|
|
508
|
-
const
|
|
509
|
-
const e = bt.resolve("@doist/todoist-sdk"), t =
|
|
508
|
+
const mr = async () => {
|
|
509
|
+
const e = bt.resolve("@doist/todoist-sdk"), t = _e(Ut(e), "transport", "http-dispatcher.js");
|
|
510
510
|
return bt(t);
|
|
511
511
|
};
|
|
512
|
-
let
|
|
512
|
+
let hr = mr;
|
|
513
513
|
function fr() {
|
|
514
514
|
return `${pr}/${Je}`;
|
|
515
515
|
}
|
|
@@ -583,7 +583,7 @@ function Tr(e, t) {
|
|
|
583
583
|
}
|
|
584
584
|
async function kr() {
|
|
585
585
|
if (wr())
|
|
586
|
-
return Te || (Te =
|
|
586
|
+
return Te || (Te = hr().then((e) => e.getDefaultDispatcher()).catch((e) => {
|
|
587
587
|
throw Te = void 0, e;
|
|
588
588
|
})), Te;
|
|
589
589
|
}
|
|
@@ -605,30 +605,30 @@ function Ir(e) {
|
|
|
605
605
|
arrayBuffer: () => e.arrayBuffer()
|
|
606
606
|
};
|
|
607
607
|
}
|
|
608
|
-
function
|
|
608
|
+
function Sr(e = globalThis.fetch, t = {}) {
|
|
609
609
|
const r = e === globalThis.fetch, { enabled: o = !0, platform: n = "mcp", sessionId: a = Pe() } = t;
|
|
610
610
|
return async (i, c = {}) => {
|
|
611
|
-
const { timeout: d, headers: l, signal: u, ...p } = c, { signal:
|
|
611
|
+
const { timeout: d, headers: l, signal: u, ...p } = c, { signal: m, cleanup: h } = Tr(u, d);
|
|
612
612
|
try {
|
|
613
613
|
const y = {
|
|
614
614
|
...p,
|
|
615
|
-
signal:
|
|
615
|
+
signal: m,
|
|
616
616
|
...o ? { headers: yr(l, { platform: n, sessionId: a }) } : l !== void 0 ? { headers: l } : {}
|
|
617
617
|
};
|
|
618
618
|
r && await vr(y);
|
|
619
619
|
const f = await e(i, y);
|
|
620
620
|
return Ir(f);
|
|
621
621
|
} finally {
|
|
622
|
-
|
|
622
|
+
h();
|
|
623
623
|
}
|
|
624
624
|
};
|
|
625
625
|
}
|
|
626
|
-
function
|
|
626
|
+
function jr(e, {
|
|
627
627
|
baseUrl: t,
|
|
628
628
|
tracking: r
|
|
629
629
|
} = {}) {
|
|
630
630
|
const o = new Ls(e, {
|
|
631
|
-
customFetch:
|
|
631
|
+
customFetch: Sr(globalThis.fetch, r),
|
|
632
632
|
...t ? { baseUrl: t } : {}
|
|
633
633
|
});
|
|
634
634
|
return dr(o, e), o;
|
|
@@ -663,7 +663,7 @@ function Pr({
|
|
|
663
663
|
const n = Math.min(t * 2 ** e, r), a = Math.round(o() * n);
|
|
664
664
|
return Math.min(n, Math.max(xr, a));
|
|
665
665
|
}
|
|
666
|
-
function
|
|
666
|
+
function _r(e) {
|
|
667
667
|
return new Promise((t) => setTimeout(t, e));
|
|
668
668
|
}
|
|
669
669
|
async function O(e, t = {}) {
|
|
@@ -675,23 +675,23 @@ async function O(e, t = {}) {
|
|
|
675
675
|
} catch (d) {
|
|
676
676
|
if (i = d, c < r && Or(d)) {
|
|
677
677
|
const l = Pr({ attempt: c, baseDelayMs: o, maxDelayMs: n, random: a });
|
|
678
|
-
await
|
|
678
|
+
await _r(l);
|
|
679
679
|
continue;
|
|
680
680
|
}
|
|
681
681
|
throw d;
|
|
682
682
|
}
|
|
683
683
|
throw i;
|
|
684
684
|
}
|
|
685
|
-
function
|
|
685
|
+
function ze(e) {
|
|
686
686
|
if (e == null)
|
|
687
687
|
return e;
|
|
688
688
|
if (Array.isArray(e))
|
|
689
|
-
return e.map((t) =>
|
|
689
|
+
return e.map((t) => ze(t));
|
|
690
690
|
if (typeof e == "object") {
|
|
691
691
|
const t = {};
|
|
692
692
|
for (const [r, o] of Object.entries(e))
|
|
693
693
|
if (o !== null) {
|
|
694
|
-
const n =
|
|
694
|
+
const n = ze(o);
|
|
695
695
|
if (n !== null && typeof n == "object" && !Array.isArray(n) && Object.keys(n).length === 0)
|
|
696
696
|
continue;
|
|
697
697
|
t[r] = n;
|
|
@@ -769,14 +769,14 @@ const g = {
|
|
|
769
769
|
* Affects: find-project-collaborators, find-completed-tasks
|
|
770
770
|
*/
|
|
771
771
|
STRIP_EMAILS: "strip_emails"
|
|
772
|
-
},
|
|
772
|
+
}, Rr = process.env.USE_STRUCTURED_CONTENT === "true" || process.env.NODE_ENV === "test";
|
|
773
773
|
function Ur({
|
|
774
774
|
textContent: e,
|
|
775
775
|
structuredContent: t,
|
|
776
776
|
contentItems: r
|
|
777
777
|
}) {
|
|
778
|
-
const o =
|
|
779
|
-
return r && a.push(...r), !
|
|
778
|
+
const o = ze(t), n = {}, a = [];
|
|
779
|
+
return r && a.push(...r), !Rr && t && a.push({
|
|
780
780
|
type: "text",
|
|
781
781
|
text: JSON.stringify(o)
|
|
782
782
|
}), e && a.push({ type: "text", text: e }), a.length > 0 && (n.content = a), t && (n.structuredContent = o), n;
|
|
@@ -787,11 +787,11 @@ function Lr(e) {
|
|
|
787
787
|
isError: !0
|
|
788
788
|
};
|
|
789
789
|
}
|
|
790
|
-
const
|
|
791
|
-
function
|
|
790
|
+
const Nr = /* @__PURE__ */ new Set(["file"]);
|
|
791
|
+
function Mr(e) {
|
|
792
792
|
return !e || typeof e != "object" || Array.isArray(e) ? e : Object.fromEntries(
|
|
793
793
|
Object.entries(e).map(
|
|
794
|
-
([t, r]) =>
|
|
794
|
+
([t, r]) => Nr.has(t) && r !== void 0 ? [t, "[redacted]"] : [t, r]
|
|
795
795
|
)
|
|
796
796
|
);
|
|
797
797
|
}
|
|
@@ -811,24 +811,24 @@ const Br = [
|
|
|
811
811
|
g.FIND_PROJECT_COLLABORATORS,
|
|
812
812
|
g.FIND_COMPLETED_TASKS
|
|
813
813
|
];
|
|
814
|
-
function
|
|
814
|
+
function Ke(e) {
|
|
815
815
|
if (e == null)
|
|
816
816
|
return e;
|
|
817
817
|
if (Array.isArray(e))
|
|
818
|
-
return e.map((t) =>
|
|
818
|
+
return e.map((t) => Ke(t));
|
|
819
819
|
if (typeof e == "object") {
|
|
820
820
|
const t = {};
|
|
821
821
|
for (const [r, o] of Object.entries(e))
|
|
822
|
-
r !== "email" && (t[r] =
|
|
822
|
+
r !== "email" && (t[r] = Ke(o));
|
|
823
823
|
return t;
|
|
824
824
|
}
|
|
825
825
|
return e;
|
|
826
826
|
}
|
|
827
|
-
function
|
|
827
|
+
function zr(e) {
|
|
828
828
|
const t = /\s*\([^)]*@[^)]+\)/g, r = /\S+@\S+\.\S+/g;
|
|
829
829
|
return e.replace(t, "").replace(r, "[email hidden]");
|
|
830
830
|
}
|
|
831
|
-
function
|
|
831
|
+
function Kr({
|
|
832
832
|
tool: e,
|
|
833
833
|
server: t,
|
|
834
834
|
client: r,
|
|
@@ -836,13 +836,13 @@ function zr({
|
|
|
836
836
|
}) {
|
|
837
837
|
const n = o.some((d) => d.name === "strip_emails") && Br.includes(e.name), a = e.execute, i = async (d, l) => {
|
|
838
838
|
try {
|
|
839
|
-
let { textContent: u, structuredContent: p, contentItems:
|
|
839
|
+
let { textContent: u, structuredContent: p, contentItems: m } = await br(
|
|
840
840
|
e.name,
|
|
841
841
|
() => O(() => a(d, r))
|
|
842
842
|
);
|
|
843
|
-
return n && (u && (u =
|
|
843
|
+
return n && (u && (u = zr(u)), p && (p = Ke(p))), Ur({ textContent: u, structuredContent: p, contentItems: m });
|
|
844
844
|
} catch (u) {
|
|
845
|
-
return console.error(`Error executing tool ${e.name}:`, { args:
|
|
845
|
+
return console.error(`Error executing tool ${e.name}:`, { args: Mr(d), error: u }), Lr(or(u));
|
|
846
846
|
}
|
|
847
847
|
}, c = {
|
|
848
848
|
description: e.description,
|
|
@@ -865,7 +865,7 @@ function zr({
|
|
|
865
865
|
}
|
|
866
866
|
t.registerTool(e.name, c, i);
|
|
867
867
|
}
|
|
868
|
-
const
|
|
868
|
+
const qr = {
|
|
869
869
|
period: s.enum(["today", "7d", "14d", "30d", "this-week", "this-month"]).default("7d").describe(
|
|
870
870
|
'Time period for the analysis. "today" analyzes the current day, "7d"/"14d"/"30d" analyze the last N days, "this-week" and "this-month" analyze the current week or month.'
|
|
871
871
|
),
|
|
@@ -874,7 +874,7 @@ const Yr = {
|
|
|
874
874
|
),
|
|
875
875
|
projectId: s.string().optional().describe("Optional project ID to scope the analysis to a specific project.")
|
|
876
876
|
};
|
|
877
|
-
function
|
|
877
|
+
function Yr(e, t = /* @__PURE__ */ new Date()) {
|
|
878
878
|
const r = (n) => n.toISOString().slice(0, 10), o = r(t);
|
|
879
879
|
switch (e) {
|
|
880
880
|
case "today":
|
|
@@ -921,7 +921,7 @@ function Gr(e, t = /* @__PURE__ */ new Date()) {
|
|
|
921
921
|
}
|
|
922
922
|
}
|
|
923
923
|
}
|
|
924
|
-
function
|
|
924
|
+
function Gr(e) {
|
|
925
925
|
const t = {
|
|
926
926
|
goals: `### Goal Tracking
|
|
927
927
|
- Compare tasks completed today vs the daily goal
|
|
@@ -953,7 +953,7 @@ function Kr(e) {
|
|
|
953
953
|
`) : t[e] ?? "";
|
|
954
954
|
}
|
|
955
955
|
function Vr(e) {
|
|
956
|
-
const { since: t, until: r, periodDescription: o } =
|
|
956
|
+
const { since: t, until: r, periodDescription: o } = Yr(e.period), n = e.projectId ? `
|
|
957
957
|
Scope this analysis to project ID: ${e.projectId}. Pass this projectId when calling find-completed-tasks and get-overview.` : "";
|
|
958
958
|
return `Analyze my Todoist productivity for ${o} (${t} to ${r}).${n}
|
|
959
959
|
|
|
@@ -974,7 +974,7 @@ ${e.focus === "overall" || e.focus === "projects" ? `4. **get-overview** — Get
|
|
|
974
974
|
|
|
975
975
|
Using the collected data, produce an analysis covering the following sections:
|
|
976
976
|
|
|
977
|
-
${
|
|
977
|
+
${Gr(e.focus)}
|
|
978
978
|
|
|
979
979
|
### Step 3: Format
|
|
980
980
|
|
|
@@ -997,50 +997,50 @@ function Jr(e) {
|
|
|
997
997
|
]
|
|
998
998
|
};
|
|
999
999
|
}
|
|
1000
|
-
const
|
|
1000
|
+
const he = {
|
|
1001
1001
|
name: "productivity-analysis",
|
|
1002
1002
|
title: "Productivity Analysis",
|
|
1003
1003
|
description: "Analyze your Todoist productivity with insights on completion trends, goal streaks, project distribution, and actionable recommendations. Gathers data from multiple tools and synthesizes a comprehensive report.",
|
|
1004
|
-
argsSchema:
|
|
1004
|
+
argsSchema: qr,
|
|
1005
1005
|
callback: Jr
|
|
1006
1006
|
};
|
|
1007
|
-
class
|
|
1007
|
+
class _ extends Error {
|
|
1008
1008
|
constructor(t, r) {
|
|
1009
1009
|
super(`Invalid duration format "${t}": ${r}`), this.name = "DurationParseError";
|
|
1010
1010
|
}
|
|
1011
1011
|
}
|
|
1012
1012
|
function Xt(e) {
|
|
1013
1013
|
if (!e || typeof e != "string")
|
|
1014
|
-
throw new
|
|
1014
|
+
throw new _(e, "Duration must be a non-empty string");
|
|
1015
1015
|
const t = e.trim().toLowerCase().replace(/\s+/g, "");
|
|
1016
1016
|
if (!t)
|
|
1017
|
-
throw new
|
|
1017
|
+
throw new _(e, "Duration must be a non-empty string");
|
|
1018
1018
|
const r = t.match(/^(?:(\d+(?:\.\d+)?)h)?(?:(\d+(?:\.\d+)?)m)?$/);
|
|
1019
1019
|
if (!r || !r[1] && !r[2])
|
|
1020
|
-
throw new
|
|
1020
|
+
throw new _(e, 'Use format like "2h", "30m", "2h30m", or "1.5h"');
|
|
1021
1021
|
let o = 0;
|
|
1022
1022
|
const [, n, a] = r;
|
|
1023
1023
|
if (n) {
|
|
1024
1024
|
const i = Number.parseFloat(n);
|
|
1025
1025
|
if (Number.isNaN(i) || i < 0)
|
|
1026
|
-
throw new
|
|
1026
|
+
throw new _(e, "Hours must be a positive number");
|
|
1027
1027
|
o += i * 60;
|
|
1028
1028
|
}
|
|
1029
1029
|
if (a) {
|
|
1030
1030
|
const i = Number.parseFloat(a);
|
|
1031
1031
|
if (Number.isNaN(i) || i < 0)
|
|
1032
|
-
throw new
|
|
1032
|
+
throw new _(e, "Minutes must be a positive number");
|
|
1033
1033
|
if (i % 1 !== 0)
|
|
1034
|
-
throw new
|
|
1034
|
+
throw new _(
|
|
1035
1035
|
e,
|
|
1036
1036
|
"Minutes must be a whole number (use decimal hours instead)"
|
|
1037
1037
|
);
|
|
1038
1038
|
o += i;
|
|
1039
1039
|
}
|
|
1040
1040
|
if (o = Math.round(o), o === 0)
|
|
1041
|
-
throw new
|
|
1041
|
+
throw new _(e, "Duration must be greater than 0 minutes");
|
|
1042
1042
|
if (o > 1440)
|
|
1043
|
-
throw new
|
|
1043
|
+
throw new _(e, "Duration cannot exceed 24 hours (1440 minutes)");
|
|
1044
1044
|
return { minutes: o };
|
|
1045
1045
|
}
|
|
1046
1046
|
function Xr(e) {
|
|
@@ -1126,12 +1126,12 @@ class ro {
|
|
|
1126
1126
|
try {
|
|
1127
1127
|
const p = await t.getUser();
|
|
1128
1128
|
if (p) {
|
|
1129
|
-
const
|
|
1129
|
+
const m = {
|
|
1130
1130
|
id: p.id,
|
|
1131
1131
|
name: p.fullName,
|
|
1132
1132
|
email: p.email
|
|
1133
1133
|
};
|
|
1134
|
-
d.some((
|
|
1134
|
+
d.some((h) => h.id === p.id) || (d = [m, ...d]);
|
|
1135
1135
|
}
|
|
1136
1136
|
} catch {
|
|
1137
1137
|
}
|
|
@@ -1194,21 +1194,21 @@ class ro {
|
|
|
1194
1194
|
const o = r === void 0 ? await this.getCacheScope(t) : r, n = this.getCacheKey(o, "all_collaborators"), a = n ? oe.get(n) : void 0;
|
|
1195
1195
|
if (a !== void 0) return a;
|
|
1196
1196
|
try {
|
|
1197
|
-
const c = (await
|
|
1197
|
+
const c = (await M({
|
|
1198
1198
|
apiMethod: t.getProjects.bind(t),
|
|
1199
1199
|
args: {}
|
|
1200
|
-
})).filter((
|
|
1200
|
+
})).filter((m) => m.isShared);
|
|
1201
1201
|
if (c.length === 0) {
|
|
1202
|
-
const
|
|
1203
|
-
return n && oe.set(n,
|
|
1202
|
+
const m = [];
|
|
1203
|
+
return n && oe.set(n, m), m;
|
|
1204
1204
|
}
|
|
1205
1205
|
const d = [], l = /* @__PURE__ */ new Set(), u = c.map(
|
|
1206
|
-
(
|
|
1206
|
+
(m) => this.getProjectCollaborators(t, m.id, o)
|
|
1207
1207
|
), p = await Promise.allSettled(u);
|
|
1208
|
-
for (const
|
|
1209
|
-
if (
|
|
1210
|
-
for (const
|
|
1211
|
-
|
|
1208
|
+
for (const m of p)
|
|
1209
|
+
if (m.status === "fulfilled")
|
|
1210
|
+
for (const h of m.value)
|
|
1211
|
+
h && !l.has(h.id) && (d.push(h), l.add(h.id));
|
|
1212
1212
|
return n && oe.set(n, d), d;
|
|
1213
1213
|
} catch {
|
|
1214
1214
|
return [];
|
|
@@ -1264,19 +1264,19 @@ function no({
|
|
|
1264
1264
|
}) {
|
|
1265
1265
|
return t ? e.filter((n) => n.responsibleUid === t) : o === "unassignedOrMe" ? e.filter((n) => !n.responsibleUid || n.responsibleUid === r) : o === "assigned" ? e.filter((n) => n.responsibleUid && n.responsibleUid !== r) : e;
|
|
1266
1266
|
}
|
|
1267
|
-
function
|
|
1267
|
+
function N(e) {
|
|
1268
1268
|
return e?.toLowerCase() === "inbox";
|
|
1269
1269
|
}
|
|
1270
1270
|
async function de(e) {
|
|
1271
1271
|
const { projectId: t, user: r, client: o } = e;
|
|
1272
|
-
if (!
|
|
1272
|
+
if (!N(t))
|
|
1273
1273
|
return t;
|
|
1274
1274
|
const n = r || (o ? await o.getUser() : null);
|
|
1275
1275
|
if (!n)
|
|
1276
1276
|
throw new Error("Either user or client must be provided when resolving inbox project ID");
|
|
1277
1277
|
return n.inboxProjectId;
|
|
1278
1278
|
}
|
|
1279
|
-
async function
|
|
1279
|
+
async function M(e) {
|
|
1280
1280
|
const { apiMethod: t, args: r, limit: o = 100 } = e, n = [];
|
|
1281
1281
|
let a = null;
|
|
1282
1282
|
do {
|
|
@@ -1293,21 +1293,21 @@ function et(e) {
|
|
|
1293
1293
|
return /(?<!\\)(?:\\\\)*\*/.test(e) ? e : `*${e.replaceAll(/\\(?!\*)/g, "\\\\")}*`;
|
|
1294
1294
|
}
|
|
1295
1295
|
async function rs(e, t) {
|
|
1296
|
-
return
|
|
1296
|
+
return M({
|
|
1297
1297
|
apiMethod: e.searchProjects.bind(e),
|
|
1298
1298
|
args: { query: et(t) },
|
|
1299
1299
|
limit: C.PROJECTS_MAX
|
|
1300
1300
|
});
|
|
1301
1301
|
}
|
|
1302
1302
|
async function os(e) {
|
|
1303
|
-
return
|
|
1303
|
+
return M({
|
|
1304
1304
|
apiMethod: e.getProjects.bind(e),
|
|
1305
1305
|
args: {},
|
|
1306
1306
|
limit: C.PROJECTS_MAX
|
|
1307
1307
|
});
|
|
1308
1308
|
}
|
|
1309
1309
|
async function ao(e) {
|
|
1310
|
-
return
|
|
1310
|
+
return M({
|
|
1311
1311
|
apiMethod: e.getArchivedProjects.bind(e),
|
|
1312
1312
|
args: {},
|
|
1313
1313
|
limit: C.PROJECTS_MAX
|
|
@@ -1323,14 +1323,14 @@ function io(e) {
|
|
|
1323
1323
|
return new RegExp(r ? `^${n}$` : n, "iu");
|
|
1324
1324
|
}
|
|
1325
1325
|
async function co(e, t) {
|
|
1326
|
-
return
|
|
1326
|
+
return M({
|
|
1327
1327
|
apiMethod: e.searchLabels.bind(e),
|
|
1328
1328
|
args: { query: et(t) },
|
|
1329
1329
|
limit: C.LABELS_MAX
|
|
1330
1330
|
});
|
|
1331
1331
|
}
|
|
1332
1332
|
async function lo(e) {
|
|
1333
|
-
return
|
|
1333
|
+
return M({
|
|
1334
1334
|
apiMethod: e.getSharedLabels.bind(e),
|
|
1335
1335
|
args: {},
|
|
1336
1336
|
limit: C.LABELS_MAX
|
|
@@ -1338,7 +1338,7 @@ async function lo(e) {
|
|
|
1338
1338
|
}
|
|
1339
1339
|
async function uo(e, t, r) {
|
|
1340
1340
|
const o = et(t);
|
|
1341
|
-
return
|
|
1341
|
+
return M({
|
|
1342
1342
|
apiMethod: e.searchSections.bind(e),
|
|
1343
1343
|
args: r ? { query: o, projectId: r } : { query: o },
|
|
1344
1344
|
limit: C.SECTIONS_MAX
|
|
@@ -1419,7 +1419,7 @@ function po(e) {
|
|
|
1419
1419
|
extraData: e.extraData ?? void 0
|
|
1420
1420
|
};
|
|
1421
1421
|
}
|
|
1422
|
-
const
|
|
1422
|
+
const mo = se.object({
|
|
1423
1423
|
httpStatusCode: se.number(),
|
|
1424
1424
|
responseData: se.object({
|
|
1425
1425
|
error: se.string(),
|
|
@@ -1437,7 +1437,7 @@ async function tt({
|
|
|
1437
1437
|
const { results: n, nextCursor: a } = await e.getTasksByFilter({ query: t, cursor: o, limit: r });
|
|
1438
1438
|
return { tasks: n.map(P), nextCursor: a };
|
|
1439
1439
|
} catch (n) {
|
|
1440
|
-
const a =
|
|
1440
|
+
const a = mo.safeParse(n);
|
|
1441
1441
|
if (!a.success)
|
|
1442
1442
|
throw n;
|
|
1443
1443
|
const { responseData: i } = a.data;
|
|
@@ -1492,125 +1492,119 @@ function ns(e) {
|
|
|
1492
1492
|
).length, r = e.filter((o) => o.type === "location").length;
|
|
1493
1493
|
return { timeBasedCount: t, locationCount: r };
|
|
1494
1494
|
}
|
|
1495
|
-
const Ie =
|
|
1496
|
-
function
|
|
1495
|
+
const Ie = Re.map((e) => e.key);
|
|
1496
|
+
function ho(e) {
|
|
1497
1497
|
if (typeof e != "string") return;
|
|
1498
1498
|
const t = e.toLowerCase();
|
|
1499
|
-
return (
|
|
1500
|
-
}
|
|
1501
|
-
const fo = `Color for the entity. Accepts a color key (e.g. "berry_red") or display name (e.g. "Berry Red"). Valid colors: ${Ie.join(", ")}. Unrecognized colors are omitted and charcoal will be used as the default.`, le = s.preprocess(
|
|
1502
|
-
s.enum(Ie)
|
|
1503
|
-
const ue = s.enum(Ie).optional().catch(void 0)
|
|
1504
|
-
id: s.string()
|
|
1505
|
-
content: s.string().describe("
|
|
1506
|
-
description: s.string()
|
|
1507
|
-
dueDate: s.string().optional().describe("
|
|
1508
|
-
recurring: s.union([s.boolean(), s.string()]).describe("
|
|
1509
|
-
deadlineDate: s.string().optional().describe("
|
|
1510
|
-
priority: Ze.describe(
|
|
1511
|
-
|
|
1512
|
-
),
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
completedAt: s.string().optional().describe("When the task was completed (ISO 8601 format)."),
|
|
1523
|
-
addedAt: s.string().optional().describe("When the task was created (ISO 8601 format).")
|
|
1499
|
+
return (Re.find((o) => o.key === t) ?? Re.find((o) => o.displayName.toLowerCase() === t))?.key;
|
|
1500
|
+
}
|
|
1501
|
+
const fo = `Color for the entity. Accepts a color key (e.g. "berry_red") or display name (e.g. "Berry Red"). Valid colors: ${Ie.join(", ")}. Unrecognized colors are omitted and charcoal will be used as the default.`, le = s.preprocess(ho, s.enum(Ie).optional()).describe(fo);
|
|
1502
|
+
s.enum(Ie);
|
|
1503
|
+
const ue = s.enum(Ie).optional().catch(void 0), F = s.object({
|
|
1504
|
+
id: s.string(),
|
|
1505
|
+
content: s.string().describe("Task title."),
|
|
1506
|
+
description: s.string(),
|
|
1507
|
+
dueDate: s.string().optional().describe("ISO 8601."),
|
|
1508
|
+
recurring: s.union([s.boolean(), s.string()]).describe("False when not recurring, otherwise the recurrence string."),
|
|
1509
|
+
deadlineDate: s.string().optional().describe("ISO 8601."),
|
|
1510
|
+
priority: Ze.describe("p1 is highest, p4 lowest."),
|
|
1511
|
+
projectId: s.string(),
|
|
1512
|
+
sectionId: s.string().optional(),
|
|
1513
|
+
parentId: s.string().optional(),
|
|
1514
|
+
labels: s.array(s.string()).optional(),
|
|
1515
|
+
duration: s.string().optional().describe('e.g. "2h30m".'),
|
|
1516
|
+
responsibleUid: s.string().optional(),
|
|
1517
|
+
isUncompletable: s.boolean().optional().describe("An organizational header, not a real task."),
|
|
1518
|
+
assignedByUid: s.string().optional(),
|
|
1519
|
+
checked: s.boolean().describe("Whether the task is completed."),
|
|
1520
|
+
completedAt: s.string().optional().describe("ISO 8601."),
|
|
1521
|
+
addedAt: s.string().optional().describe("ISO 8601.")
|
|
1524
1522
|
}), Q = s.object({
|
|
1525
|
-
id: s.string()
|
|
1526
|
-
name: s.string()
|
|
1527
|
-
description: s.string().describe("
|
|
1523
|
+
id: s.string(),
|
|
1524
|
+
name: s.string(),
|
|
1525
|
+
description: s.string().describe("Empty string when none."),
|
|
1528
1526
|
color: ue,
|
|
1529
|
-
isFavorite: s.boolean()
|
|
1530
|
-
isShared: s.boolean()
|
|
1531
|
-
parentId: s.string().optional()
|
|
1532
|
-
inboxProject: s.boolean()
|
|
1533
|
-
viewStyle: s.string().describe("
|
|
1534
|
-
workspaceId: s.string().optional().describe(
|
|
1535
|
-
|
|
1536
|
-
),
|
|
1537
|
-
|
|
1538
|
-
childOrder: s.number().describe("The ordering index of the project among its siblings."),
|
|
1539
|
-
isArchived: s.boolean().describe("Whether the project is archived.")
|
|
1527
|
+
isFavorite: s.boolean(),
|
|
1528
|
+
isShared: s.boolean(),
|
|
1529
|
+
parentId: s.string().optional(),
|
|
1530
|
+
inboxProject: s.boolean(),
|
|
1531
|
+
viewStyle: s.string().describe("list, board or calendar."),
|
|
1532
|
+
workspaceId: s.string().optional().describe("Undefined for personal projects."),
|
|
1533
|
+
folderId: s.string().optional().describe("Workspace projects only."),
|
|
1534
|
+
childOrder: s.number().describe("Ordering index among siblings."),
|
|
1535
|
+
isArchived: s.boolean()
|
|
1540
1536
|
}), X = s.object({
|
|
1541
|
-
id: s.string()
|
|
1542
|
-
name: s.string()
|
|
1543
|
-
sectionOrder: s.number().describe("
|
|
1544
|
-
description: s.string().optional().describe("
|
|
1537
|
+
id: s.string(),
|
|
1538
|
+
name: s.string(),
|
|
1539
|
+
sectionOrder: s.number().describe("Ordering index within the project."),
|
|
1540
|
+
description: s.string().optional().describe("Supports Markdown.")
|
|
1545
1541
|
});
|
|
1546
|
-
function
|
|
1542
|
+
function K({ id: e, name: t, sectionOrder: r, description: o }) {
|
|
1547
1543
|
return { id: e, name: t, sectionOrder: r, description: o ?? void 0 };
|
|
1548
1544
|
}
|
|
1549
1545
|
const bo = s.object({
|
|
1550
|
-
resourceType: s.string().describe("
|
|
1551
|
-
fileName: s.string().optional()
|
|
1552
|
-
fileSize: s.number().optional().describe("
|
|
1553
|
-
fileType: s.string().optional().describe("
|
|
1554
|
-
fileUrl: s.string().optional()
|
|
1555
|
-
fileDuration: s.number().optional().describe("
|
|
1556
|
-
uploadState: s.enum(["pending", "completed"]).optional()
|
|
1557
|
-
url: s.string().optional().describe("
|
|
1558
|
-
title: s.string().optional().describe("
|
|
1559
|
-
image: s.string().optional().describe("
|
|
1560
|
-
imageWidth: s.number().optional().describe("
|
|
1561
|
-
imageHeight: s.number().optional().describe("
|
|
1546
|
+
resourceType: s.string().describe("file, url, image, etc."),
|
|
1547
|
+
fileName: s.string().optional(),
|
|
1548
|
+
fileSize: s.number().optional().describe("Bytes."),
|
|
1549
|
+
fileType: s.string().optional().describe("MIME type."),
|
|
1550
|
+
fileUrl: s.string().optional(),
|
|
1551
|
+
fileDuration: s.number().optional().describe("Milliseconds, for audio/video."),
|
|
1552
|
+
uploadState: s.enum(["pending", "completed"]).optional(),
|
|
1553
|
+
url: s.string().optional().describe("For link/url resource types."),
|
|
1554
|
+
title: s.string().optional().describe("For link/url resource types."),
|
|
1555
|
+
image: s.string().optional().describe("For image resource types."),
|
|
1556
|
+
imageWidth: s.number().optional().describe("Pixels."),
|
|
1557
|
+
imageHeight: s.number().optional().describe("Pixels.")
|
|
1562
1558
|
}), ye = s.object({
|
|
1563
|
-
id: s.string()
|
|
1564
|
-
taskId: s.string().optional()
|
|
1565
|
-
projectId: s.string().optional()
|
|
1566
|
-
content: s.string()
|
|
1567
|
-
postedAt: s.string().describe("
|
|
1568
|
-
postedUid: s.string().optional()
|
|
1569
|
-
fileAttachment: bo.optional()
|
|
1559
|
+
id: s.string(),
|
|
1560
|
+
taskId: s.string().optional(),
|
|
1561
|
+
projectId: s.string().optional(),
|
|
1562
|
+
content: s.string(),
|
|
1563
|
+
postedAt: s.string().describe("ISO 8601."),
|
|
1564
|
+
postedUid: s.string().optional(),
|
|
1565
|
+
fileAttachment: bo.optional()
|
|
1570
1566
|
}), go = s.object({
|
|
1571
|
-
id: s.string().optional()
|
|
1572
|
-
objectType: s.string().describe("
|
|
1573
|
-
objectId: s.string()
|
|
1574
|
-
eventType: s.string().describe("
|
|
1575
|
-
eventDate: s.string().describe("
|
|
1576
|
-
parentProjectId: s.string().optional()
|
|
1577
|
-
parentItemId: s.string().optional()
|
|
1578
|
-
initiatorId: s.string().optional().describe("
|
|
1579
|
-
extraData: s.record(s.string(), s.unknown()).optional()
|
|
1567
|
+
id: s.string().optional(),
|
|
1568
|
+
objectType: s.string().describe("task, project, etc."),
|
|
1569
|
+
objectId: s.string(),
|
|
1570
|
+
eventType: s.string().describe("added, updated, deleted, completed, etc."),
|
|
1571
|
+
eventDate: s.string().describe("ISO 8601."),
|
|
1572
|
+
parentProjectId: s.string().optional(),
|
|
1573
|
+
parentItemId: s.string().optional(),
|
|
1574
|
+
initiatorId: s.string().optional().describe("User who initiated the event."),
|
|
1575
|
+
extraData: s.record(s.string(), s.unknown()).optional()
|
|
1580
1576
|
}), yo = s.object({
|
|
1581
|
-
id: s.string()
|
|
1582
|
-
name: s.string()
|
|
1583
|
-
email: s.string()
|
|
1577
|
+
id: s.string(),
|
|
1578
|
+
name: s.string(),
|
|
1579
|
+
email: s.string()
|
|
1584
1580
|
}), pe = s.object({
|
|
1585
|
-
id: s.string()
|
|
1586
|
-
name: s.string()
|
|
1581
|
+
id: s.string(),
|
|
1582
|
+
name: s.string(),
|
|
1587
1583
|
color: ue,
|
|
1588
|
-
order: s.number().optional().catch(void 0).describe("
|
|
1589
|
-
isFavorite: s.boolean()
|
|
1584
|
+
order: s.number().optional().catch(void 0).describe("Display order."),
|
|
1585
|
+
isFavorite: s.boolean()
|
|
1590
1586
|
}), To = s.object({
|
|
1591
|
-
isRecurring: s.boolean()
|
|
1587
|
+
isRecurring: s.boolean(),
|
|
1592
1588
|
string: s.string().describe("Human-readable due string."),
|
|
1593
|
-
date: s.string().describe("
|
|
1594
|
-
datetime: s.string().optional().describe("
|
|
1595
|
-
timezone: s.string().optional()
|
|
1589
|
+
date: s.string().describe("ISO 8601."),
|
|
1590
|
+
datetime: s.string().optional().describe("ISO 8601."),
|
|
1591
|
+
timezone: s.string().optional()
|
|
1596
1592
|
}), st = s.object({
|
|
1597
|
-
id: s.string()
|
|
1598
|
-
taskId: s.string()
|
|
1599
|
-
type: s.enum(
|
|
1600
|
-
minuteOffset: s.number().optional().describe("Minutes before due
|
|
1601
|
-
due: To.optional().describe(
|
|
1602
|
-
|
|
1603
|
-
),
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
radius: s.number().optional().describe("Geofence radius in meters (location reminders only)."),
|
|
1609
|
-
isUrgent: s.boolean().optional().describe("Whether this is an urgent reminder (relative and absolute reminders only).")
|
|
1593
|
+
id: s.string(),
|
|
1594
|
+
taskId: s.string(),
|
|
1595
|
+
type: s.enum(Ns),
|
|
1596
|
+
minuteOffset: s.number().optional().describe("Minutes before due. Relative reminders only."),
|
|
1597
|
+
due: To.optional().describe("Absolute, and sometimes relative, reminders."),
|
|
1598
|
+
name: s.string().optional().describe("Location name. Location reminders only."),
|
|
1599
|
+
locLat: s.string().optional().describe("Location reminders only."),
|
|
1600
|
+
locLong: s.string().optional().describe("Location reminders only."),
|
|
1601
|
+
locTrigger: s.enum(Nt).optional().describe("Location reminders only."),
|
|
1602
|
+
radius: s.number().optional().describe("Geofence radius in metres. Location reminders only."),
|
|
1603
|
+
isUrgent: s.boolean().optional().describe("Relative and absolute reminders only.")
|
|
1610
1604
|
}), ee = s.object({
|
|
1611
|
-
item: s.string().describe("
|
|
1612
|
-
error: s.string()
|
|
1613
|
-
code: s.string().optional()
|
|
1605
|
+
item: s.string().describe("Usually the ID of the item that failed."),
|
|
1606
|
+
error: s.string(),
|
|
1607
|
+
code: s.string().optional()
|
|
1614
1608
|
}), ko = s.object({
|
|
1615
1609
|
taskId: s.string().optional().describe("The ID of the task to comment on."),
|
|
1616
1610
|
projectId: s.string().optional().describe(
|
|
@@ -1641,19 +1635,19 @@ const bo = s.object({
|
|
|
1641
1635
|
`Comment ${l + 1}: Cannot provide both taskId and projectId. Choose one.`
|
|
1642
1636
|
);
|
|
1643
1637
|
}
|
|
1644
|
-
const n = r.some((l) =>
|
|
1645
|
-
const
|
|
1638
|
+
const n = r.some((l) => N(l.projectId)) ? await t.getUser() : void 0, a = r.map(async ({ content: l, taskId: u, projectId: p }) => {
|
|
1639
|
+
const m = await de({
|
|
1646
1640
|
projectId: p,
|
|
1647
1641
|
user: n,
|
|
1648
1642
|
client: n ? void 0 : t
|
|
1649
1643
|
});
|
|
1650
1644
|
return await t.addComment({
|
|
1651
1645
|
content: l,
|
|
1652
|
-
...u ? { taskId: u } : { projectId:
|
|
1646
|
+
...u ? { taskId: u } : { projectId: m }
|
|
1653
1647
|
});
|
|
1654
1648
|
}), c = (await Promise.all(a)).map(ge);
|
|
1655
1649
|
return {
|
|
1656
|
-
textContent:
|
|
1650
|
+
textContent: So({ comments: c }),
|
|
1657
1651
|
structuredContent: {
|
|
1658
1652
|
comments: c,
|
|
1659
1653
|
totalCount: c.length,
|
|
@@ -1662,7 +1656,7 @@ const bo = s.object({
|
|
|
1662
1656
|
};
|
|
1663
1657
|
}
|
|
1664
1658
|
};
|
|
1665
|
-
function
|
|
1659
|
+
function So({ comments: e }) {
|
|
1666
1660
|
const t = e.filter((a) => a.taskId).length, r = e.filter((a) => a.projectId).length, o = [];
|
|
1667
1661
|
if (t > 0) {
|
|
1668
1662
|
const a = t > 1 ? "comments" : "comment";
|
|
@@ -1674,7 +1668,7 @@ function jo({ comments: e }) {
|
|
|
1674
1668
|
}
|
|
1675
1669
|
return o.length > 0 ? `Added ${o.join(" and ")}` : "No comments added";
|
|
1676
1670
|
}
|
|
1677
|
-
const
|
|
1671
|
+
const jo = {
|
|
1678
1672
|
search: s.string().optional().describe(
|
|
1679
1673
|
"Search for a filter by name (partial and case insensitive match). If omitted, all filters are returned."
|
|
1680
1674
|
)
|
|
@@ -1691,7 +1685,7 @@ const So = {
|
|
|
1691
1685
|
}, $o = {
|
|
1692
1686
|
name: g.FIND_FILTERS,
|
|
1693
1687
|
description: 'List all personal filters or search for filters by name. Filters are saved custom views that use query syntax to organize tasks (e.g. "today & p1", "#Work & overdue").',
|
|
1694
|
-
parameters:
|
|
1688
|
+
parameters: jo,
|
|
1695
1689
|
outputSchema: Co,
|
|
1696
1690
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
1697
1691
|
async execute(e, t) {
|
|
@@ -1758,7 +1752,7 @@ const xo = s.object({
|
|
|
1758
1752
|
outputSchema: Eo,
|
|
1759
1753
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
1760
1754
|
async execute({ filters: e }, t) {
|
|
1761
|
-
const r = Date.now(), o = e.map((p,
|
|
1755
|
+
const r = Date.now(), o = e.map((p, m) => `tempFilterAdd${m}${r}`), n = e.map((p, m) => V(
|
|
1762
1756
|
"filter_add",
|
|
1763
1757
|
{
|
|
1764
1758
|
name: p.name,
|
|
@@ -1766,9 +1760,9 @@ const xo = s.object({
|
|
|
1766
1760
|
...p.color !== void 0 ? { color: p.color } : {},
|
|
1767
1761
|
...p.isFavorite !== void 0 ? { isFavorite: p.isFavorite } : {}
|
|
1768
1762
|
},
|
|
1769
|
-
o[
|
|
1770
|
-
)), i = (await t.sync({ commands: n })).tempIdMapping ?? {}, c = e.map((p,
|
|
1771
|
-
const
|
|
1763
|
+
o[m]
|
|
1764
|
+
)), i = (await t.sync({ commands: n })).tempIdMapping ?? {}, c = e.map((p, m) => {
|
|
1765
|
+
const h = o[m], y = h !== void 0 ? i[h] : void 0;
|
|
1772
1766
|
if (!y) return null;
|
|
1773
1767
|
const f = p.color !== void 0 ? ue.parse(p.color) : void 0;
|
|
1774
1768
|
return {
|
|
@@ -1795,16 +1789,16 @@ ${l}`,
|
|
|
1795
1789
|
color: le,
|
|
1796
1790
|
order: s.number().int().optional().describe("The position of the label in the label list."),
|
|
1797
1791
|
isFavorite: s.boolean().optional().describe("Whether the label is a favorite. Defaults to false.")
|
|
1798
|
-
}),
|
|
1792
|
+
}), _o = {
|
|
1799
1793
|
labels: s.array(Po).min(1).describe("The array of labels to add.")
|
|
1800
|
-
},
|
|
1794
|
+
}, Ro = {
|
|
1801
1795
|
labels: s.array(pe).describe("The created labels."),
|
|
1802
1796
|
totalCount: s.number().describe("The total number of labels created.")
|
|
1803
1797
|
}, Uo = {
|
|
1804
1798
|
name: g.ADD_LABELS,
|
|
1805
1799
|
description: "Add one or more new personal labels.",
|
|
1806
|
-
parameters:
|
|
1807
|
-
outputSchema:
|
|
1800
|
+
parameters: _o,
|
|
1801
|
+
outputSchema: Ro,
|
|
1808
1802
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
1809
1803
|
async execute({ labels: e }, t) {
|
|
1810
1804
|
const r = await Promise.all(e.map((n) => t.addLabel(n)));
|
|
@@ -1832,7 +1826,7 @@ function ot(e, t, r = {}) {
|
|
|
1832
1826
|
i.push(d);
|
|
1833
1827
|
const l = 5;
|
|
1834
1828
|
if (n || a <= l) {
|
|
1835
|
-
const u =
|
|
1829
|
+
const u = Se(t, l);
|
|
1836
1830
|
if (u.length > 0) {
|
|
1837
1831
|
const p = a > l ? `, +${a - l} more` : "";
|
|
1838
1832
|
i.push(`Tasks:
|
|
@@ -1867,11 +1861,11 @@ function at(e, t) {
|
|
|
1867
1861
|
Failed (${t.length}) - address or drop these items:
|
|
1868
1862
|
${n}${a}`;
|
|
1869
1863
|
}
|
|
1870
|
-
function
|
|
1864
|
+
function No(e) {
|
|
1871
1865
|
const t = e.content || e.title || "Untitled", r = e.dueDate ? ` • due ${e.dueDate}` : "", o = e.priority ? ` • ${e.priority.toUpperCase()}` : "", n = e.projectName ? ` • ${e.projectName}` : "", a = e.id ? ` • id=${e.id}` : "";
|
|
1872
1866
|
return ` ${t}${r}${o}${n}${a}`;
|
|
1873
1867
|
}
|
|
1874
|
-
function
|
|
1868
|
+
function Mo(e) {
|
|
1875
1869
|
const t = ` (${e.color})`, r = e.isFavorite ? " • ⭐" : "", o = ` • id=${e.id}`;
|
|
1876
1870
|
return ` ${e.name}${t}${r}${o}`;
|
|
1877
1871
|
}
|
|
@@ -1879,8 +1873,8 @@ function Fo(e) {
|
|
|
1879
1873
|
const t = e.inboxProject ? " • Inbox" : "", r = e.isFavorite ? " • ⭐" : "", o = e.isShared ? " • Shared" : "", n = e.isArchived ? " • Archived" : "", a = e.viewStyle && e.viewStyle !== "list" ? ` • ${e.viewStyle}` : "", i = ` • id=${e.id}`;
|
|
1880
1874
|
return ` ${e.name}${t}${r}${o}${n}${a}${i}`;
|
|
1881
1875
|
}
|
|
1882
|
-
function
|
|
1883
|
-
const o = e.slice(0, t).map(
|
|
1876
|
+
function Se(e, t = 5) {
|
|
1877
|
+
const o = e.slice(0, t).map(No).join(`
|
|
1884
1878
|
`);
|
|
1885
1879
|
if (e.length > t) {
|
|
1886
1880
|
const n = e.length - t;
|
|
@@ -1889,7 +1883,7 @@ function je(e, t = 5) {
|
|
|
1889
1883
|
}
|
|
1890
1884
|
return o;
|
|
1891
1885
|
}
|
|
1892
|
-
function
|
|
1886
|
+
function q({
|
|
1893
1887
|
subject: e,
|
|
1894
1888
|
count: t,
|
|
1895
1889
|
limit: r,
|
|
@@ -1974,7 +1968,7 @@ ${u}` + (d.length > 5 ? `
|
|
|
1974
1968
|
this.cache = null;
|
|
1975
1969
|
}
|
|
1976
1970
|
}
|
|
1977
|
-
const is = new Bo(),
|
|
1971
|
+
const is = new Bo(), zo = s.object({
|
|
1978
1972
|
name: s.string().min(1).describe("The name of the project."),
|
|
1979
1973
|
parentId: s.string().optional().describe("The ID of the parent project. If provided, creates this as a sub-project."),
|
|
1980
1974
|
isFavorite: s.boolean().optional().describe("Whether the project is a favorite. Defaults to false."),
|
|
@@ -1984,9 +1978,9 @@ const is = new Bo(), qo = s.object({
|
|
|
1984
1978
|
workspace: s.string().trim().min(1).optional().describe(
|
|
1985
1979
|
"The workspace to create the project in. Accepts a workspace name or workspace ID. If not provided, creates a personal project. Use list-workspaces to see available workspaces."
|
|
1986
1980
|
)
|
|
1987
|
-
}),
|
|
1988
|
-
projects: s.array(
|
|
1989
|
-
},
|
|
1981
|
+
}), Ko = {
|
|
1982
|
+
projects: s.array(zo).min(1).describe("The array of projects to add.")
|
|
1983
|
+
}, qo = {
|
|
1990
1984
|
projects: s.array(Q).describe("The created projects."),
|
|
1991
1985
|
totalCount: s.number().describe("The total number of projects created."),
|
|
1992
1986
|
failures: s.array(ee).describe(
|
|
@@ -1995,11 +1989,11 @@ const is = new Bo(), qo = s.object({
|
|
|
1995
1989
|
totalRequested: s.number().describe("The total number of projects requested."),
|
|
1996
1990
|
successCount: s.number().describe("The number of successfully created projects."),
|
|
1997
1991
|
failureCount: s.number().describe("The number of failed project creations.")
|
|
1998
|
-
},
|
|
1992
|
+
}, Yo = {
|
|
1999
1993
|
name: g.ADD_PROJECTS,
|
|
2000
1994
|
description: "Add one or more new projects.",
|
|
2001
|
-
parameters:
|
|
2002
|
-
outputSchema:
|
|
1995
|
+
parameters: Ko,
|
|
1996
|
+
outputSchema: qo,
|
|
2003
1997
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
2004
1998
|
async execute({ projects: e }, t) {
|
|
2005
1999
|
const r = /* @__PURE__ */ new Map(), o = (l) => {
|
|
@@ -2020,12 +2014,12 @@ const is = new Bo(), qo = s.object({
|
|
|
2020
2014
|
n.forEach((l, u) => {
|
|
2021
2015
|
l.status === "fulfilled" ? a.push(l.value) : i.push({
|
|
2022
2016
|
item: e[u]?.name ?? `Project ${u + 1}`,
|
|
2023
|
-
error:
|
|
2017
|
+
error: z(l.reason)
|
|
2024
2018
|
});
|
|
2025
2019
|
});
|
|
2026
2020
|
const c = a.map(Z);
|
|
2027
2021
|
return {
|
|
2028
|
-
textContent:
|
|
2022
|
+
textContent: Go({ projects: a, failures: i }),
|
|
2029
2023
|
structuredContent: {
|
|
2030
2024
|
projects: c,
|
|
2031
2025
|
totalCount: c.length,
|
|
@@ -2037,7 +2031,7 @@ const is = new Bo(), qo = s.object({
|
|
|
2037
2031
|
};
|
|
2038
2032
|
}
|
|
2039
2033
|
};
|
|
2040
|
-
function
|
|
2034
|
+
function Go({
|
|
2041
2035
|
projects: e,
|
|
2042
2036
|
failures: t
|
|
2043
2037
|
}) {
|
|
@@ -2046,18 +2040,18 @@ function Ko({
|
|
|
2046
2040
|
${o}` : "Added 0 projects";
|
|
2047
2041
|
return at(n, t);
|
|
2048
2042
|
}
|
|
2049
|
-
const we = 25,
|
|
2043
|
+
const we = 25, je = s.enum(Ms), cs = s.object({
|
|
2050
2044
|
date: s.string().optional().describe("Due date in YYYY-MM-DD format."),
|
|
2051
2045
|
string: s.string().optional().describe('Natural language due string, e.g. "tomorrow at 3pm".'),
|
|
2052
2046
|
timezone: s.string().optional().describe('Timezone for the reminder, e.g. "America/New_York".'),
|
|
2053
2047
|
lang: s.string().optional().describe('Language for parsing the due string, e.g. "en".')
|
|
2054
|
-
}), ds = s.enum(
|
|
2048
|
+
}), ds = s.enum(Nt), Ce = s.boolean().optional().describe("Whether this is an urgent reminder. Applies to relative and absolute reminders."), Vo = s.object({
|
|
2055
2049
|
type: s.literal("relative"),
|
|
2056
2050
|
taskId: s.string().min(1).describe("The ID of the task to set a reminder for."),
|
|
2057
2051
|
minuteOffset: s.number().int().min(0).describe(
|
|
2058
2052
|
"Minutes before the task due time to trigger the reminder. E.g., 30 for 30 minutes before, 60 for 1 hour before, 1440 for 1 day before."
|
|
2059
2053
|
),
|
|
2060
|
-
service:
|
|
2054
|
+
service: je.optional().describe(
|
|
2061
2055
|
'Delivery method: "email" or "push" notification. Defaults to push.'
|
|
2062
2056
|
),
|
|
2063
2057
|
isUrgent: Ce
|
|
@@ -2065,7 +2059,7 @@ const we = 25, Se = s.enum(Ns), cs = s.object({
|
|
|
2065
2059
|
type: s.literal("absolute"),
|
|
2066
2060
|
taskId: s.string().min(1).describe("The ID of the task to set a reminder for."),
|
|
2067
2061
|
due: cs.describe("The specific date/time for the reminder."),
|
|
2068
|
-
service:
|
|
2062
|
+
service: je.optional().describe(
|
|
2069
2063
|
'Delivery method: "email" or "push" notification. Defaults to push.'
|
|
2070
2064
|
),
|
|
2071
2065
|
isUrgent: Ce
|
|
@@ -2173,9 +2167,9 @@ const rn = s.object({
|
|
|
2173
2167
|
outputSchema: nn,
|
|
2174
2168
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
2175
2169
|
async execute({ sections: e }, t) {
|
|
2176
|
-
const r = e.some((c) =>
|
|
2170
|
+
const r = e.some((c) => N(c.projectId)) ? O(() => t.getUser()) : void 0, o = await Promise.allSettled(
|
|
2177
2171
|
e.map(async (c) => {
|
|
2178
|
-
const d =
|
|
2172
|
+
const d = N(c.projectId) ? await r : void 0, l = await de({
|
|
2179
2173
|
projectId: c.projectId,
|
|
2180
2174
|
user: d,
|
|
2181
2175
|
client: void 0
|
|
@@ -2186,12 +2180,12 @@ const rn = s.object({
|
|
|
2186
2180
|
return o.forEach((c, d) => {
|
|
2187
2181
|
c.status === "fulfilled" ? n.push(c.value) : a.push({
|
|
2188
2182
|
item: e[d]?.name ?? `Section ${d + 1}`,
|
|
2189
|
-
error:
|
|
2183
|
+
error: z(c.reason)
|
|
2190
2184
|
});
|
|
2191
2185
|
}), {
|
|
2192
2186
|
textContent: cn({ sections: n, failures: a }),
|
|
2193
2187
|
structuredContent: {
|
|
2194
|
-
sections: n.map(
|
|
2188
|
+
sections: n.map(K),
|
|
2195
2189
|
totalCount: n.length,
|
|
2196
2190
|
failures: a,
|
|
2197
2191
|
totalRequested: e.length,
|
|
@@ -2400,15 +2394,15 @@ class dn {
|
|
|
2400
2394
|
const u = await W.resolveUser(t, o);
|
|
2401
2395
|
if (!u)
|
|
2402
2396
|
return a.push("User not found - check spelling or invite to a shared project"), { canAssign: !1, projectInfo: l, recommendations: a };
|
|
2403
|
-
const p = d.some((y) => y.id === u.userId),
|
|
2397
|
+
const p = d.some((y) => y.id === u.userId), m = {
|
|
2404
2398
|
resolvedName: u.displayName,
|
|
2405
2399
|
isCollaborator: p
|
|
2406
2400
|
};
|
|
2407
2401
|
if (!p)
|
|
2408
2402
|
return a.push(
|
|
2409
2403
|
`Invite ${u.displayName} to collaborate on project "${c.name}"`
|
|
2410
|
-
), { canAssign: !1, projectInfo: l, userInfo:
|
|
2411
|
-
let
|
|
2404
|
+
), { canAssign: !1, projectInfo: l, userInfo: m, recommendations: a };
|
|
2405
|
+
let h;
|
|
2412
2406
|
if (n && n.length > 0) {
|
|
2413
2407
|
let y = 0, f = 0;
|
|
2414
2408
|
for (const v of n)
|
|
@@ -2417,13 +2411,13 @@ class dn {
|
|
|
2417
2411
|
} catch {
|
|
2418
2412
|
f++;
|
|
2419
2413
|
}
|
|
2420
|
-
|
|
2414
|
+
h = { accessibleTasks: y, inaccessibleTasks: f }, f > 0 && a.push(`${f} task(s) are not accessible`);
|
|
2421
2415
|
}
|
|
2422
2416
|
return i = !0, a.push(`Ready to assign tasks to ${u.displayName}`), {
|
|
2423
2417
|
canAssign: i,
|
|
2424
2418
|
projectInfo: l,
|
|
2425
|
-
userInfo:
|
|
2426
|
-
taskInfo:
|
|
2419
|
+
userInfo: m,
|
|
2420
|
+
taskInfo: h,
|
|
2427
2421
|
recommendations: a
|
|
2428
2422
|
};
|
|
2429
2423
|
}
|
|
@@ -2432,7 +2426,7 @@ const it = new dn();
|
|
|
2432
2426
|
function U(e) {
|
|
2433
2427
|
return s.string().transform((t) => t === "" ? void 0 : t).optional().describe(e);
|
|
2434
2428
|
}
|
|
2435
|
-
const Tt =
|
|
2429
|
+
const Tt = Kt.TASKS_PER_OPERATION, ln = s.object({
|
|
2436
2430
|
content: s.string().min(1).describe(
|
|
2437
2431
|
'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.'
|
|
2438
2432
|
),
|
|
@@ -2479,38 +2473,38 @@ const Tt = zt.TASKS_PER_OPERATION, ln = s.object({
|
|
|
2479
2473
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
2480
2474
|
async execute(e, t) {
|
|
2481
2475
|
const { tasks: r } = s.object(kt).parse(e), o = /* @__PURE__ */ new Map();
|
|
2482
|
-
r.forEach((
|
|
2483
|
-
const y =
|
|
2484
|
-
f ? f.push({ task:
|
|
2476
|
+
r.forEach((m, h) => {
|
|
2477
|
+
const y = mn(m), f = o.get(y);
|
|
2478
|
+
f ? f.push({ task: m, index: h }) : o.set(y, [{ task: m, index: h }]);
|
|
2485
2479
|
});
|
|
2486
2480
|
const n = /* @__PURE__ */ new Map(), i = (await Promise.all(
|
|
2487
|
-
[...o.values()].map(async (
|
|
2488
|
-
const
|
|
2489
|
-
for (const { task: y, index: f } of
|
|
2481
|
+
[...o.values()].map(async (m) => {
|
|
2482
|
+
const h = [];
|
|
2483
|
+
for (const { task: y, index: f } of m)
|
|
2490
2484
|
try {
|
|
2491
|
-
const v = await
|
|
2492
|
-
|
|
2485
|
+
const v = await hn(y, t, n);
|
|
2486
|
+
h.push({ index: f, result: { status: "fulfilled", value: v } });
|
|
2493
2487
|
} catch (v) {
|
|
2494
|
-
|
|
2488
|
+
h.push({
|
|
2495
2489
|
index: f,
|
|
2496
2490
|
result: { status: "rejected", reason: v }
|
|
2497
2491
|
});
|
|
2498
2492
|
}
|
|
2499
|
-
return
|
|
2493
|
+
return h;
|
|
2500
2494
|
})
|
|
2501
|
-
)).flat().sort((
|
|
2495
|
+
)).flat().sort((m, h) => m.index - h.index), c = [], d = [];
|
|
2502
2496
|
let l = !1;
|
|
2503
|
-
for (const { index:
|
|
2504
|
-
|
|
2505
|
-
item: r[
|
|
2497
|
+
for (const { index: m, result: h } of i)
|
|
2498
|
+
h.status === "fulfilled" ? c.push(h.value) : (l ||= h.reason instanceof ve, d.push({
|
|
2499
|
+
item: r[m]?.content ?? `Task ${m + 1}`,
|
|
2506
2500
|
// Keep API error signals (status/code/tag) — `error.message`
|
|
2507
2501
|
// alone collapses e.g. a full-project rejection into a bare
|
|
2508
2502
|
// "HTTP 403: Forbidden"
|
|
2509
|
-
error:
|
|
2503
|
+
error: z(h.reason)
|
|
2510
2504
|
}));
|
|
2511
2505
|
if (c.length === 0 && d.length > 0) {
|
|
2512
|
-
const
|
|
2513
|
-
throw l ? new
|
|
2506
|
+
const m = d.map((y) => `"${y.item}": ${y.error}`).join("; "), h = `All ${d.length} task(s) failed to create: ${m}`;
|
|
2507
|
+
throw l ? new zt(h) : new Error(h);
|
|
2514
2508
|
}
|
|
2515
2509
|
const u = c.map(P);
|
|
2516
2510
|
return {
|
|
@@ -2530,10 +2524,10 @@ const Tt = zt.TASKS_PER_OPERATION, ln = s.object({
|
|
|
2530
2524
|
};
|
|
2531
2525
|
}
|
|
2532
2526
|
};
|
|
2533
|
-
function
|
|
2527
|
+
function mn(e) {
|
|
2534
2528
|
return `${e.projectId ?? ""}|${e.sectionId ?? ""}|${e.parentId ?? ""}`;
|
|
2535
2529
|
}
|
|
2536
|
-
async function
|
|
2530
|
+
async function hn(e, t, r) {
|
|
2537
2531
|
const {
|
|
2538
2532
|
duration: o,
|
|
2539
2533
|
projectId: n,
|
|
@@ -2544,25 +2538,25 @@ async function mn(e, t, r) {
|
|
|
2544
2538
|
priority: l,
|
|
2545
2539
|
labels: u,
|
|
2546
2540
|
deadlineDate: p,
|
|
2547
|
-
...
|
|
2548
|
-
} = e,
|
|
2549
|
-
if (
|
|
2550
|
-
const f = await t.getProject(
|
|
2541
|
+
...m
|
|
2542
|
+
} = e, h = N(n) ? void 0 : n;
|
|
2543
|
+
if (h) {
|
|
2544
|
+
const f = await t.getProject(h);
|
|
2551
2545
|
if (f.isArchived)
|
|
2552
2546
|
throw new Error(
|
|
2553
2547
|
`Task "${e.content}": Cannot create task in archived project "${f.name}"`
|
|
2554
2548
|
);
|
|
2555
2549
|
}
|
|
2556
2550
|
let y = {
|
|
2557
|
-
...
|
|
2558
|
-
projectId:
|
|
2551
|
+
...m,
|
|
2552
|
+
projectId: h,
|
|
2559
2553
|
sectionId: a,
|
|
2560
2554
|
parentId: i,
|
|
2561
2555
|
order: c,
|
|
2562
2556
|
labels: u,
|
|
2563
2557
|
deadlineDate: p
|
|
2564
2558
|
};
|
|
2565
|
-
if (l && (y.priority = Zt(l)), d && !
|
|
2559
|
+
if (l && (y.priority = Zt(l)), d && !h && !a && !i)
|
|
2566
2560
|
throw new Error(
|
|
2567
2561
|
`Task "${e.content}": Cannot assign tasks without specifying project context. Please specify a projectId, sectionId, or parentId.`
|
|
2568
2562
|
);
|
|
@@ -2575,10 +2569,10 @@ async function mn(e, t, r) {
|
|
|
2575
2569
|
durationUnit: "minute"
|
|
2576
2570
|
};
|
|
2577
2571
|
} catch (f) {
|
|
2578
|
-
throw f instanceof
|
|
2572
|
+
throw f instanceof _ ? new Error(`Task "${e.content}": ${f.message}`) : f;
|
|
2579
2573
|
}
|
|
2580
2574
|
if (d) {
|
|
2581
|
-
let f =
|
|
2575
|
+
let f = h;
|
|
2582
2576
|
if (!f && i)
|
|
2583
2577
|
try {
|
|
2584
2578
|
f = (await t.getTask(i)).projectId;
|
|
@@ -2586,10 +2580,10 @@ async function mn(e, t, r) {
|
|
|
2586
2580
|
throw new Error(`Task "${e.content}": Parent task "${i}" not found`);
|
|
2587
2581
|
}
|
|
2588
2582
|
else if (!f && a && (f = r.get(a), !f)) {
|
|
2589
|
-
const
|
|
2590
|
-
if (!
|
|
2583
|
+
const j = await t.getSection(a);
|
|
2584
|
+
if (!j)
|
|
2591
2585
|
throw new Error(`Task "${e.content}": Section "${a}" not found`);
|
|
2592
|
-
f =
|
|
2586
|
+
f = j.projectId, r.set(a, j.projectId);
|
|
2593
2587
|
}
|
|
2594
2588
|
if (!f)
|
|
2595
2589
|
throw new Error(
|
|
@@ -2601,9 +2595,9 @@ async function mn(e, t, r) {
|
|
|
2601
2595
|
d
|
|
2602
2596
|
);
|
|
2603
2597
|
if (!v.isValid) {
|
|
2604
|
-
const
|
|
2598
|
+
const j = v.error?.message || "Assignment validation failed", A = v.error?.suggestions?.join(". ") || "";
|
|
2605
2599
|
throw new Error(
|
|
2606
|
-
`Task "${e.content}": ${
|
|
2600
|
+
`Task "${e.content}": ${j}${A ? `. ${A}` : ""}`
|
|
2607
2601
|
);
|
|
2608
2602
|
}
|
|
2609
2603
|
y.assigneeId = v.resolvedUser?.userId;
|
|
@@ -2626,7 +2620,7 @@ function fn({
|
|
|
2626
2620
|
}) {
|
|
2627
2621
|
const o = /* @__PURE__ */ new Set();
|
|
2628
2622
|
for (const a of r.tasks)
|
|
2629
|
-
a.projectId && !
|
|
2623
|
+
a.projectId && !N(a.projectId) ? o.add("projects") : a.sectionId ? o.add("sections") : a.parentId ? o.add("subtasks") : o.add("inbox");
|
|
2630
2624
|
let n = "";
|
|
2631
2625
|
if (o.size === 1) {
|
|
2632
2626
|
const a = Array.from(o)[0];
|
|
@@ -2651,7 +2645,7 @@ const bn = {
|
|
|
2651
2645
|
}, gn = {
|
|
2652
2646
|
projectId: s.string().describe("The project ID."),
|
|
2653
2647
|
health: s.object({
|
|
2654
|
-
status: s.enum(
|
|
2648
|
+
status: s.enum(Ge).describe("The health status after triggering analysis."),
|
|
2655
2649
|
isStale: s.boolean().describe("Whether the health data is still stale after the request."),
|
|
2656
2650
|
updateInProgress: s.boolean().describe("Whether an analysis update is currently in progress.")
|
|
2657
2651
|
}).describe("The health response returned after triggering analysis."),
|
|
@@ -2750,17 +2744,17 @@ const ls = [
|
|
|
2750
2744
|
], In = {
|
|
2751
2745
|
type: s.enum(ls).describe("The type of entity to delete."),
|
|
2752
2746
|
id: s.string().min(1).describe("The ID of the entity to delete.")
|
|
2753
|
-
},
|
|
2747
|
+
}, Sn = {
|
|
2754
2748
|
deletedEntity: s.object({
|
|
2755
2749
|
type: s.enum(ls).describe("The type of deleted entity."),
|
|
2756
2750
|
id: s.string().describe("The ID of the deleted entity.")
|
|
2757
2751
|
}).describe("Information about the deleted entity."),
|
|
2758
2752
|
success: s.boolean().describe("Whether the deletion was successful.")
|
|
2759
|
-
},
|
|
2753
|
+
}, jn = {
|
|
2760
2754
|
name: g.DELETE_OBJECT,
|
|
2761
2755
|
description: "Delete a project, section, task, comment, label, filter, reminder, or location_reminder by its ID. Projects can be deleted whether active or archived (find archived ones via find-projects with archivedStatus); note a workspace project must be archived before it can be deleted, while personal projects can be deleted regardless.",
|
|
2762
2756
|
parameters: In,
|
|
2763
|
-
outputSchema:
|
|
2757
|
+
outputSchema: Sn,
|
|
2764
2758
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !0 },
|
|
2765
2759
|
async execute(e, t) {
|
|
2766
2760
|
switch (e.type) {
|
|
@@ -2909,7 +2903,7 @@ async function Pn(e, t) {
|
|
|
2909
2903
|
childrenError: a ? `Could not check ${a} of ${r.length} subtasks for subtasks of their own; those are reported as hasChildren=false.` : void 0
|
|
2910
2904
|
};
|
|
2911
2905
|
}
|
|
2912
|
-
async function
|
|
2906
|
+
async function _n(e, t) {
|
|
2913
2907
|
if (!B(t))
|
|
2914
2908
|
return { childCount: 0, children: [] };
|
|
2915
2909
|
const r = await os(e), o = /* @__PURE__ */ new Map();
|
|
@@ -2942,7 +2936,7 @@ function It(e, t) {
|
|
|
2942
2936
|
const r = t.hasMoreChildren ? "+" : "", o = t.childrenError ? " (partial)" : "";
|
|
2943
2937
|
return ` • ${e}=${t.childCount}${r}${o}`;
|
|
2944
2938
|
}
|
|
2945
|
-
const ps = ["task", "project", "comment", "section"],
|
|
2939
|
+
const ps = ["task", "project", "comment", "section"], Rn = {
|
|
2946
2940
|
type: s.enum(ps).describe("The type of object to fetch."),
|
|
2947
2941
|
id: s.string().min(1).describe("The unique ID of the object to fetch."),
|
|
2948
2942
|
includeChildren: s.boolean().optional().describe(
|
|
@@ -2956,7 +2950,7 @@ const ps = ["task", "project", "comment", "section"], _n = {
|
|
|
2956
2950
|
}, Ln = {
|
|
2957
2951
|
name: g.FETCH_OBJECT,
|
|
2958
2952
|
description: "Fetch a single task, project, comment, or section by its ID. Use this when you have a specific object ID and want to retrieve its full details. Set includeChildren to also get its direct subtasks or sub-projects.",
|
|
2959
|
-
parameters:
|
|
2953
|
+
parameters: Rn,
|
|
2960
2954
|
outputSchema: Un,
|
|
2961
2955
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
2962
2956
|
async execute(e, t) {
|
|
@@ -2979,7 +2973,7 @@ const ps = ["task", "project", "comment", "section"], _n = {
|
|
|
2979
2973
|
};
|
|
2980
2974
|
}
|
|
2981
2975
|
case "project": {
|
|
2982
|
-
const a = await t.getProject(o), i = Z(a), c = n ? await vt(() =>
|
|
2976
|
+
const a = await t.getProject(o), i = Z(a), c = n ? await vt(() => _n(t, a)) : {};
|
|
2983
2977
|
return {
|
|
2984
2978
|
textContent: `Found project: ${i.name} • id=${i.id} • color=${i.color} • viewStyle=${i.viewStyle}${It("subProjects", c)}`,
|
|
2985
2979
|
structuredContent: {
|
|
@@ -3005,7 +2999,7 @@ const ps = ["task", "project", "comment", "section"], _n = {
|
|
|
3005
2999
|
const a = await t.getSection(o);
|
|
3006
3000
|
if (!a)
|
|
3007
3001
|
throw new Error(`Section ${o} not found.`);
|
|
3008
|
-
const i =
|
|
3002
|
+
const i = K(a);
|
|
3009
3003
|
return {
|
|
3010
3004
|
textContent: `Found section: ${i.name} • id=${i.id}`,
|
|
3011
3005
|
structuredContent: {
|
|
@@ -3022,11 +3016,11 @@ const ps = ["task", "project", "comment", "section"], _n = {
|
|
|
3022
3016
|
);
|
|
3023
3017
|
}
|
|
3024
3018
|
}
|
|
3025
|
-
},
|
|
3019
|
+
}, Nn = {
|
|
3026
3020
|
id: s.string().min(1).describe(
|
|
3027
3021
|
'A unique identifier for the document in the format "task:{id}" or "project:{id}".'
|
|
3028
3022
|
)
|
|
3029
|
-
},
|
|
3023
|
+
}, Mn = {
|
|
3030
3024
|
id: s.string().describe("The ID of the fetched document."),
|
|
3031
3025
|
title: s.string().describe("The title of the document."),
|
|
3032
3026
|
text: s.string().describe("The text content of the document."),
|
|
@@ -3035,8 +3029,8 @@ const ps = ["task", "project", "comment", "section"], _n = {
|
|
|
3035
3029
|
}, Fn = {
|
|
3036
3030
|
name: g.FETCH,
|
|
3037
3031
|
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}".',
|
|
3038
|
-
parameters:
|
|
3039
|
-
outputSchema:
|
|
3032
|
+
parameters: Nn,
|
|
3033
|
+
outputSchema: Mn,
|
|
3040
3034
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
3041
3035
|
async execute(e, t) {
|
|
3042
3036
|
const { id: r } = e, [o, n] = r.split(":", 2);
|
|
@@ -3055,7 +3049,7 @@ Labels: ${c.labels.join(", ")}`), a = {
|
|
|
3055
3049
|
id: `task:${c.id}`,
|
|
3056
3050
|
title: c.content,
|
|
3057
3051
|
text: d.join(""),
|
|
3058
|
-
url:
|
|
3052
|
+
url: Mt(c.id),
|
|
3059
3053
|
metadata: {
|
|
3060
3054
|
priority: c.priority,
|
|
3061
3055
|
projectId: c.projectId,
|
|
@@ -3097,7 +3091,7 @@ Favorite: Yes`), a = {
|
|
|
3097
3091
|
};
|
|
3098
3092
|
}
|
|
3099
3093
|
}, Hn = s.union([s.iso.date(), s.iso.datetime({ offset: !0 })]);
|
|
3100
|
-
function
|
|
3094
|
+
function St(e) {
|
|
3101
3095
|
return U(e).pipe(Hn.optional());
|
|
3102
3096
|
}
|
|
3103
3097
|
const Wn = {
|
|
@@ -3117,21 +3111,21 @@ const Wn = {
|
|
|
3117
3111
|
projectId: s.string().optional().describe("Filter events by parent project ID."),
|
|
3118
3112
|
taskId: s.string().optional().describe("Filter events by parent task ID (for subtask events)."),
|
|
3119
3113
|
initiatorId: s.string().optional().describe("Filter by the user ID who initiated the event."),
|
|
3120
|
-
dateFrom:
|
|
3114
|
+
dateFrom: St(
|
|
3121
3115
|
`Inclusive start of the activity range, as an ISO 8601 date or date-time. For all events on one local calendar day, use that day's start, for example "2026-08-02T00:00:00-04:00". Natural-language dates such as "tomorrow" are not supported.`
|
|
3122
3116
|
),
|
|
3123
|
-
dateTo:
|
|
3117
|
+
dateTo: St(
|
|
3124
3118
|
'Exclusive end of the activity range, as an ISO 8601 date or date-time. For all events on 2026-08-02, use "2026-08-03T00:00:00-04:00". Natural-language dates such as "tomorrow" are not supported.'
|
|
3125
3119
|
),
|
|
3126
3120
|
limit: s.number().int().min(1).max(C.ACTIVITY_MAX).default(C.ACTIVITY_DEFAULT).describe("Maximum number of activity events to return."),
|
|
3127
3121
|
cursor: s.string().optional().describe("Pagination cursor for retrieving the next page of results.")
|
|
3128
3122
|
}, Bn = {
|
|
3129
3123
|
events: s.array(go).describe("The activity events."),
|
|
3130
|
-
nextCursor: s.string().optional()
|
|
3124
|
+
nextCursor: s.string().optional(),
|
|
3131
3125
|
totalCount: s.number().describe("The total number of events in this page."),
|
|
3132
|
-
hasMore: s.boolean()
|
|
3133
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
3134
|
-
},
|
|
3126
|
+
hasMore: s.boolean(),
|
|
3127
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
3128
|
+
}, zn = {
|
|
3135
3129
|
name: g.FIND_ACTIVITY,
|
|
3136
3130
|
description: 'Retrieve activity logs to monitor and audit changes in Todoist. Shows events from all users by default (use initiatorId to filter by specific user). To answer what someone completed in a period, including recurring task occurrences, use objectType "task", eventType "completed", and dateFrom/dateTo. Track task completions, updates, deletions, project changes, and more with flexible filtering. Activity history availability and retention depend on the user plan.',
|
|
3137
3131
|
parameters: Wn,
|
|
@@ -3149,14 +3143,14 @@ const Wn = {
|
|
|
3149
3143
|
dateTo: l,
|
|
3150
3144
|
limit: u,
|
|
3151
3145
|
cursor: p
|
|
3152
|
-
} = e,
|
|
3146
|
+
} = e, m = {
|
|
3153
3147
|
limit: u,
|
|
3154
3148
|
cursor: p ?? null
|
|
3155
3149
|
};
|
|
3156
|
-
r && n ?
|
|
3157
|
-
const { results:
|
|
3150
|
+
r && n ? m.objectEventTypes = `${r}:${n}` : r ? m.objectEventTypes = `${r}:` : n && (m.objectEventTypes = `:${n}`), o && o !== "remove" && (m.objectId = o), a && (m.parentProjectId = a), i && (m.parentItemId = i), c && (m.initiatorId = c), d && (m.dateFrom = d), l && (m.dateTo = l);
|
|
3151
|
+
const { results: h, nextCursor: y } = await t.getActivityLogs(m), f = h.map(po);
|
|
3158
3152
|
return {
|
|
3159
|
-
textContent:
|
|
3153
|
+
textContent: Kn({ events: f, args: e, nextCursor: y }),
|
|
3160
3154
|
structuredContent: {
|
|
3161
3155
|
events: f,
|
|
3162
3156
|
nextCursor: y ?? void 0,
|
|
@@ -3167,7 +3161,7 @@ const Wn = {
|
|
|
3167
3161
|
};
|
|
3168
3162
|
}
|
|
3169
3163
|
};
|
|
3170
|
-
function
|
|
3164
|
+
function Kn({
|
|
3171
3165
|
events: e,
|
|
3172
3166
|
args: t,
|
|
3173
3167
|
nextCursor: r
|
|
@@ -3182,18 +3176,18 @@ function zn({
|
|
|
3182
3176
|
const a = [];
|
|
3183
3177
|
t.objectId && a.push(`object ID: ${t.objectId}`), t.projectId && a.push(`project: ${t.projectId}`), t.taskId && a.push(`task: ${t.taskId}`), t.initiatorId && a.push(`initiator: ${t.initiatorId}`), t.dateFrom && a.push(`from: ${t.dateFrom}`), t.dateTo && a.push(`until (exclusive): ${t.dateTo}`);
|
|
3184
3178
|
const i = [];
|
|
3185
|
-
return e.length === 0 && (i.push("No activity events match the specified filters"), i.push("Note: Activity logs only show recent events"), t.eventType && i.push(`Try removing the eventType filter (${t.eventType})`), t.objectType && i.push(`Try removing the objectType filter (${t.objectType})`), (t.objectId || t.projectId || t.taskId) && i.push("Verify the object ID is correct")),
|
|
3179
|
+
return e.length === 0 && (i.push("No activity events match the specified filters"), i.push("Note: Activity logs only show recent events"), t.eventType && i.push(`Try removing the eventType filter (${t.eventType})`), t.objectType && i.push(`Try removing the objectType filter (${t.objectType})`), (t.objectId || t.projectId || t.taskId) && i.push("Verify the object ID is correct")), q({
|
|
3186
3180
|
subject: o,
|
|
3187
3181
|
count: e.length,
|
|
3188
3182
|
limit: t.limit,
|
|
3189
3183
|
nextCursor: r ?? void 0,
|
|
3190
3184
|
filterHints: a,
|
|
3191
|
-
previewLines:
|
|
3185
|
+
previewLines: qn(e, Math.min(e.length, t.limit)),
|
|
3192
3186
|
zeroReasonHints: i
|
|
3193
3187
|
});
|
|
3194
3188
|
}
|
|
3195
|
-
function
|
|
3196
|
-
const o = e.slice(0, t).map(
|
|
3189
|
+
function qn(e, t = 10) {
|
|
3190
|
+
const o = e.slice(0, t).map(Yn).join(`
|
|
3197
3191
|
`);
|
|
3198
3192
|
if (e.length > t) {
|
|
3199
3193
|
const n = e.length - t;
|
|
@@ -3202,8 +3196,8 @@ function Yn(e, t = 10) {
|
|
|
3202
3196
|
}
|
|
3203
3197
|
return o;
|
|
3204
3198
|
}
|
|
3205
|
-
function
|
|
3206
|
-
const t =
|
|
3199
|
+
function Yn(e) {
|
|
3200
|
+
const t = Gn(e.eventDate), r = `${e.eventType} ${e.objectType}`;
|
|
3207
3201
|
let o = "";
|
|
3208
3202
|
if (e.extraData) {
|
|
3209
3203
|
const c = e.extraData.content || e.extraData.name || e.extraData.last_content;
|
|
@@ -3212,7 +3206,7 @@ function Gn(e) {
|
|
|
3212
3206
|
const n = e.objectId ? ` • id=${e.objectId}` : "", a = e.initiatorId ? ` • by=${e.initiatorId}` : " • system", i = e.parentProjectId ? ` • project=${e.parentProjectId}` : "";
|
|
3213
3207
|
return ` [${t}] ${r}${o}${n}${a}${i}`;
|
|
3214
3208
|
}
|
|
3215
|
-
function
|
|
3209
|
+
function Gn(e) {
|
|
3216
3210
|
try {
|
|
3217
3211
|
const t = new Date(e), r = t.toLocaleDateString("en-US", { month: "short", timeZone: "UTC" }), o = t.toLocaleDateString("en-US", { day: "numeric", timeZone: "UTC" }), n = t.toLocaleTimeString("en-US", {
|
|
3218
3212
|
hour: "2-digit",
|
|
@@ -3239,8 +3233,8 @@ const Vn = {
|
|
|
3239
3233
|
'The type of search performed: "single" (comment ID), "task" (task ID), or "project" (project ID).'
|
|
3240
3234
|
),
|
|
3241
3235
|
searchId: s.string().describe("The ID that was searched for (comment, task, or project ID)."),
|
|
3242
|
-
hasMore: s.boolean()
|
|
3243
|
-
nextCursor: s.string().optional()
|
|
3236
|
+
hasMore: s.boolean(),
|
|
3237
|
+
nextCursor: s.string().optional(),
|
|
3244
3238
|
totalCount: s.number().describe("The total number of comments in this page.")
|
|
3245
3239
|
}, Xn = {
|
|
3246
3240
|
name: g.FIND_COMMENTS,
|
|
@@ -3325,7 +3319,7 @@ ${i}`;
|
|
|
3325
3319
|
}
|
|
3326
3320
|
return a;
|
|
3327
3321
|
}
|
|
3328
|
-
function
|
|
3322
|
+
function ms(e) {
|
|
3329
3323
|
const t = e.getUTCFullYear(), r = String(e.getUTCMonth() + 1).padStart(2, "0"), o = String(e.getUTCDate()).padStart(2, "0");
|
|
3330
3324
|
return `${t}-${r}-${o}`;
|
|
3331
3325
|
}
|
|
@@ -3338,14 +3332,14 @@ function Qn(e) {
|
|
|
3338
3332
|
}
|
|
3339
3333
|
function ea(e, t) {
|
|
3340
3334
|
const r = new Date(e.getTime() + t * 60 * 1e3);
|
|
3341
|
-
return
|
|
3335
|
+
return ms(r);
|
|
3342
3336
|
}
|
|
3343
|
-
function
|
|
3337
|
+
function jt(e, t) {
|
|
3344
3338
|
const [r, o, n] = e.split("-"), a = Number(r), i = Number(o), c = Number(n);
|
|
3345
3339
|
if (!Number.isFinite(a) || !Number.isFinite(i) || !Number.isFinite(c))
|
|
3346
3340
|
throw new Error(`Invalid date format: ${e}. Expected YYYY-MM-DD.`);
|
|
3347
3341
|
const d = new Date(Date.UTC(a, i - 1, c));
|
|
3348
|
-
return d.setUTCDate(d.getUTCDate() + t),
|
|
3342
|
+
return d.setUTCDate(d.getUTCDate() + t), ms(d);
|
|
3349
3343
|
}
|
|
3350
3344
|
const ta = ["and", "or"], ct = {
|
|
3351
3345
|
labels: s.string().array().optional().describe("The labels to filter the tasks by"),
|
|
@@ -3365,9 +3359,9 @@ function ra({
|
|
|
3365
3359
|
userGmtOffset: r,
|
|
3366
3360
|
now: o = /* @__PURE__ */ new Date()
|
|
3367
3361
|
}) {
|
|
3368
|
-
const n = Qn(r), a = ea(o, n), i = sa - 1, c = t ?? (e ?
|
|
3362
|
+
const n = Qn(r), a = ea(o, n), i = sa - 1, c = t ?? (e ? jt(e, i) : a);
|
|
3369
3363
|
return {
|
|
3370
|
-
since: e ??
|
|
3364
|
+
since: e ?? jt(c, -i),
|
|
3371
3365
|
until: c
|
|
3372
3366
|
};
|
|
3373
3367
|
}
|
|
@@ -3397,10 +3391,10 @@ const oa = {
|
|
|
3397
3391
|
...ct
|
|
3398
3392
|
}, na = {
|
|
3399
3393
|
tasks: s.array(F).describe("The found completed tasks."),
|
|
3400
|
-
nextCursor: s.string().optional()
|
|
3394
|
+
nextCursor: s.string().optional(),
|
|
3401
3395
|
totalCount: s.number().describe("The total number of tasks in this page."),
|
|
3402
|
-
hasMore: s.boolean()
|
|
3403
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
3396
|
+
hasMore: s.boolean(),
|
|
3397
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
3404
3398
|
}, aa = {
|
|
3405
3399
|
name: g.FIND_COMPLETED_TASKS,
|
|
3406
3400
|
description: "Get completed tasks. since/until are optional and default to a 7-day window when omitted. Includes all collaborators by default. Person-specific queries (summaries, plans, reports) require responsibleUser.",
|
|
@@ -3414,44 +3408,44 @@ const oa = {
|
|
|
3414
3408
|
"Cursor pagination requires explicit since and until. Reuse structuredContent.appliedFilters.since and structuredContent.appliedFilters.until from the previous page."
|
|
3415
3409
|
);
|
|
3416
3410
|
const u = await Qe(t, c), p = u?.email;
|
|
3417
|
-
let
|
|
3418
|
-
u && p && (
|
|
3411
|
+
let h = dt(o, n);
|
|
3412
|
+
u && p && (h = ce(h, `assigned to: ${p}`));
|
|
3419
3413
|
const y = await t.getUser(), f = y.tzInfo?.gmtString || "+00:00", v = await de({
|
|
3420
3414
|
projectId: d,
|
|
3421
3415
|
user: y
|
|
3422
|
-
}),
|
|
3416
|
+
}), j = ra({
|
|
3423
3417
|
since: a,
|
|
3424
3418
|
until: i,
|
|
3425
3419
|
userGmtOffset: f
|
|
3426
|
-
}), A = `${
|
|
3420
|
+
}), A = `${j.since}T00:00:00${f}`, k = `${j.until}T23:59:59${f}`, I = new Date(A).toISOString(), x = new Date(k).toISOString(), T = {
|
|
3427
3421
|
...e,
|
|
3428
|
-
since:
|
|
3429
|
-
until:
|
|
3430
|
-
}, { items: b, nextCursor:
|
|
3422
|
+
since: j.since,
|
|
3423
|
+
until: j.until
|
|
3424
|
+
}, { items: b, nextCursor: S } = r === "completion" ? await t.getCompletedTasksByCompletionDate({
|
|
3431
3425
|
...l,
|
|
3432
3426
|
projectId: v,
|
|
3433
3427
|
since: I,
|
|
3434
3428
|
until: x,
|
|
3435
|
-
...
|
|
3429
|
+
...h ? { filterQuery: h, filterLang: "en" } : {}
|
|
3436
3430
|
}) : await t.getCompletedTasksByDueDate({
|
|
3437
3431
|
...l,
|
|
3438
3432
|
projectId: v,
|
|
3439
3433
|
since: I,
|
|
3440
3434
|
until: x,
|
|
3441
|
-
...
|
|
3435
|
+
...h ? { filterQuery: h, filterLang: "en" } : {}
|
|
3442
3436
|
}), $ = b.map(P);
|
|
3443
3437
|
return {
|
|
3444
3438
|
textContent: ia({
|
|
3445
3439
|
tasks: $,
|
|
3446
3440
|
args: T,
|
|
3447
|
-
nextCursor:
|
|
3441
|
+
nextCursor: S,
|
|
3448
3442
|
assigneeEmail: p
|
|
3449
3443
|
}),
|
|
3450
3444
|
structuredContent: {
|
|
3451
3445
|
tasks: $,
|
|
3452
|
-
nextCursor:
|
|
3446
|
+
nextCursor: S ?? void 0,
|
|
3453
3447
|
totalCount: $.length,
|
|
3454
|
-
hasMore: !!
|
|
3448
|
+
hasMore: !!S,
|
|
3455
3449
|
appliedFilters: T
|
|
3456
3450
|
}
|
|
3457
3451
|
};
|
|
@@ -3473,13 +3467,13 @@ function ia({
|
|
|
3473
3467
|
i.push(`assigned to: ${d}`);
|
|
3474
3468
|
}
|
|
3475
3469
|
const c = [];
|
|
3476
|
-
return e.length === 0 && (c.push("No tasks completed in this date range"), c.push("Try expanding the date range"), (t.projectId || t.sectionId || t.parentId) && c.push("Try removing project/section/parent filters"), t.getBy === "due" && c.push('Try switching to "completion" date instead')),
|
|
3470
|
+
return e.length === 0 && (c.push("No tasks completed in this date range"), c.push("Try expanding the date range"), (t.projectId || t.sectionId || t.parentId) && c.push("Try removing project/section/parent filters"), t.getBy === "due" && c.push('Try switching to "completion" date instead')), q({
|
|
3477
3471
|
subject: a,
|
|
3478
3472
|
count: e.length,
|
|
3479
3473
|
limit: t.limit,
|
|
3480
3474
|
nextCursor: r ?? void 0,
|
|
3481
3475
|
filterHints: i,
|
|
3482
|
-
previewLines:
|
|
3476
|
+
previewLines: Se(e, Math.min(e.length, t.limit)),
|
|
3483
3477
|
zeroReasonHints: c
|
|
3484
3478
|
});
|
|
3485
3479
|
}
|
|
@@ -3493,13 +3487,13 @@ const ca = {
|
|
|
3493
3487
|
)
|
|
3494
3488
|
}, da = {
|
|
3495
3489
|
labels: s.array(pe).describe("The found personal labels."),
|
|
3496
|
-
nextCursor: s.string().optional()
|
|
3490
|
+
nextCursor: s.string().optional(),
|
|
3497
3491
|
totalCount: s.number().describe("The total number of labels in this page."),
|
|
3498
|
-
hasMore: s.boolean()
|
|
3492
|
+
hasMore: s.boolean(),
|
|
3499
3493
|
sharedLabels: s.array(s.string()).describe(
|
|
3500
3494
|
"Names of all shared labels visible to you. These have no IDs or metadata — use their names directly when filtering tasks."
|
|
3501
3495
|
),
|
|
3502
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
3496
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
3503
3497
|
}, la = {
|
|
3504
3498
|
name: g.FIND_LABELS,
|
|
3505
3499
|
description: "List personal labels and shared labels. Personal labels have full metadata (id, name, color, order, isFavorite) and support pagination and name search (partial, case insensitive). Shared labels are labels used on tasks shared with you — they are returned as names only (no IDs or metadata). When searching, all matching personal labels are fetched across all pages and returned as a single result set (limit and cursor are ignored). When not searching, personal labels are returned with pagination.",
|
|
@@ -3535,14 +3529,14 @@ function ua({
|
|
|
3535
3529
|
}) {
|
|
3536
3530
|
const n = t.searchText ? `All labels matching "${t.searchText}"` : "Labels", a = [];
|
|
3537
3531
|
t.searchText && a.push(`searchText: "${t.searchText}"`);
|
|
3538
|
-
const i = 10, d = e.slice(0, i).map(
|
|
3532
|
+
const i = 10, d = e.slice(0, i).map(Mo).join(`
|
|
3539
3533
|
`), l = e.length - i, u = l > 0 ? `${d}
|
|
3540
3534
|
…and ${l} more` : d, p = [];
|
|
3541
3535
|
e.length === 0 && (t.searchText ? (p.push("Try broader search terms"), p.push("Check spelling"), p.push("Remove searchText to see all labels")) : p.push("No personal labels created yet"));
|
|
3542
|
-
const
|
|
3536
|
+
const m = o.length > 0 ? `
|
|
3543
3537
|
Shared labels (${o.length}): ${o.join(", ")}` : `
|
|
3544
3538
|
No shared labels.`;
|
|
3545
|
-
return
|
|
3539
|
+
return q({
|
|
3546
3540
|
subject: n,
|
|
3547
3541
|
count: e.length,
|
|
3548
3542
|
limit: t.searchText ? void 0 : t.limit,
|
|
@@ -3550,16 +3544,16 @@ No shared labels.`;
|
|
|
3550
3544
|
filterHints: a,
|
|
3551
3545
|
previewLines: u,
|
|
3552
3546
|
zeroReasonHints: p
|
|
3553
|
-
}) +
|
|
3547
|
+
}) + m;
|
|
3554
3548
|
}
|
|
3555
|
-
const { FIND_PROJECTS:
|
|
3549
|
+
const { FIND_PROJECTS: hs, ADD_TASKS: fs, UPDATE_TASKS: bs } = g, pa = {
|
|
3556
3550
|
projectId: s.string().min(1).optional().describe(
|
|
3557
3551
|
'Optional. If provided, searches only collaborators of this project. If omitted, searches across the collaborators of all shared projects the authenticated user can access (plus the authenticated user themselves) — use this for general "find a user" / "who is X" lookups.'
|
|
3558
3552
|
),
|
|
3559
3553
|
searchTerm: s.string().optional().describe(
|
|
3560
3554
|
"Search for a user by name or email (partial and case insensitive match). If omitted, all users are returned."
|
|
3561
3555
|
)
|
|
3562
|
-
},
|
|
3556
|
+
}, ma = {
|
|
3563
3557
|
collaborators: s.array(yo).describe("The found users."),
|
|
3564
3558
|
projectInfo: s.object({
|
|
3565
3559
|
id: s.string().describe("The project ID."),
|
|
@@ -3568,12 +3562,12 @@ const { FIND_PROJECTS: ms, ADD_TASKS: fs, UPDATE_TASKS: bs } = g, pa = {
|
|
|
3568
3562
|
}).optional().describe("Information about the project (only present when projectId was provided)."),
|
|
3569
3563
|
totalCount: s.number().describe("The total number of users found."),
|
|
3570
3564
|
totalAvailable: s.number().optional().describe("The total number of available users before the search filter was applied."),
|
|
3571
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
3572
|
-
},
|
|
3565
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
3566
|
+
}, ha = {
|
|
3573
3567
|
name: g.FIND_PROJECT_COLLABORATORS,
|
|
3574
3568
|
description: `Find Todoist users (collaborators, teammates) by name or email to look up their user ID. Use this whenever the user asks to find, look up, or identify a person — e.g. "find Carrie's user ID", "who is Ernesto", "look up a user". When projectId is omitted, searches across the collaborators of every shared project the authenticated user has access to, plus the authenticated user themselves — an empty result means the person is not a collaborator on any project you share with them, not necessarily that they do not exist in Todoist. When projectId is provided, searches only that project. Partial, case-insensitive match on name and email.`,
|
|
3575
3569
|
parameters: pa,
|
|
3576
|
-
outputSchema:
|
|
3570
|
+
outputSchema: ma,
|
|
3577
3571
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
3578
3572
|
async execute(e, t) {
|
|
3579
3573
|
const { projectId: r, searchTerm: o } = e;
|
|
@@ -3659,7 +3653,7 @@ async function fa({
|
|
|
3659
3653
|
textContent: `No users found. You may have no shared projects, or collaborator data is not accessible.
|
|
3660
3654
|
|
|
3661
3655
|
**Next steps:**
|
|
3662
|
-
• Use ${
|
|
3656
|
+
• Use ${hs} to find shared projects
|
|
3663
3657
|
• Share a project to add collaborators
|
|
3664
3658
|
• Ensure you have permission to view collaborators`,
|
|
3665
3659
|
structuredContent: {
|
|
@@ -3716,13 +3710,13 @@ function ys({
|
|
|
3716
3710
|
r && c.push(`matching "${r}"`), c.push(`in ${n}`);
|
|
3717
3711
|
let d = [];
|
|
3718
3712
|
e.length > 0 && (d = e.slice(0, 10).map((p) => {
|
|
3719
|
-
const
|
|
3720
|
-
return `• ${
|
|
3713
|
+
const m = p.name || "Unknown Name", h = p.email || "No email";
|
|
3714
|
+
return `• ${m} (${h}) - ID: ${p.id}`;
|
|
3721
3715
|
}), e.length > 10 && d.push(`... and ${e.length - 10} more`));
|
|
3722
3716
|
const l = [];
|
|
3723
3717
|
e.length === 0 && r && (l.push(`No users match "${r}"`), l.push("Try a broader search term or check spelling"), o > 0 && l.push(`${o} users available without filter`));
|
|
3724
3718
|
const u = [];
|
|
3725
|
-
return e.length > 0 ? (u.push(`Use ${fs} with responsibleUser to assign new tasks`), u.push(`Use ${bs} with responsibleUser to reassign existing tasks`), u.push("Use user names, emails, or IDs for assignments")) : (u.push(`Use ${
|
|
3719
|
+
return e.length > 0 ? (u.push(`Use ${fs} with responsibleUser to assign new tasks`), u.push(`Use ${bs} with responsibleUser to reassign existing tasks`), u.push("Use user names, emails, or IDs for assignments")) : (u.push(`Use ${hs} to find other projects`), r && o > 0 && u.push("Try searching without filters to see all users")), q({
|
|
3726
3720
|
subject: i,
|
|
3727
3721
|
count: e.length,
|
|
3728
3722
|
filterHints: c,
|
|
@@ -3749,10 +3743,10 @@ const { ADD_PROJECTS: Ct } = g, ga = {
|
|
|
3749
3743
|
)
|
|
3750
3744
|
}, Ta = {
|
|
3751
3745
|
projects: s.array(Q).describe("The found projects."),
|
|
3752
|
-
nextCursor: s.string().optional()
|
|
3746
|
+
nextCursor: s.string().optional(),
|
|
3753
3747
|
totalCount: s.number().describe("The total number of projects in this page."),
|
|
3754
|
-
hasMore: s.boolean()
|
|
3755
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
3748
|
+
hasMore: s.boolean(),
|
|
3749
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
3756
3750
|
}, ka = {
|
|
3757
3751
|
name: g.FIND_PROJECTS,
|
|
3758
3752
|
description: "List all projects or search for projects by name. By default only active projects are returned; use archivedStatus ('archived' or 'all') to include archived projects. When searching or when archivedStatus is 'all', all matching projects are returned (pagination is ignored). Otherwise projects are returned with pagination.",
|
|
@@ -3766,7 +3760,7 @@ const { ADD_PROJECTS: Ct } = g, ga = {
|
|
|
3766
3760
|
const c = Promise.resolve([]), [d, l] = await Promise.all([
|
|
3767
3761
|
o === "archived" ? c : r ? rs(t, r) : os(t),
|
|
3768
3762
|
o === "active" ? c : ao(t)
|
|
3769
|
-
]), u = r ? io(r) : null, p = u ? l.filter((
|
|
3763
|
+
]), u = r ? io(r) : null, p = u ? l.filter((m) => u.test(m.name)) : l;
|
|
3770
3764
|
n = [...d, ...p];
|
|
3771
3765
|
} else {
|
|
3772
3766
|
const c = o === "archived" ? await t.getArchivedProjects({
|
|
@@ -3798,7 +3792,7 @@ function wa({
|
|
|
3798
3792
|
const i = 10, d = e.slice(0, i).map(Fo).join(`
|
|
3799
3793
|
`), l = e.length - i, u = l > 0 ? `${d}
|
|
3800
3794
|
…and ${l} more` : d, p = [];
|
|
3801
|
-
return e.length === 0 && (t.searchText ? (p.push("Try broader search terms"), p.push("Check spelling"), p.push("Remove searchText to see all projects")) : t.archivedStatus === "archived" ? (p.push("No archived projects"), p.push("Use archivedStatus: 'all' to also see active projects")) : t.archivedStatus === "all" ? (p.push("No projects created yet"), p.push(`Use ${Ct} to create a project`)) : (p.push("No active projects"), p.push("Use archivedStatus: 'all' to include archived projects"), p.push(`Use ${Ct} to create a project`))),
|
|
3795
|
+
return e.length === 0 && (t.searchText ? (p.push("Try broader search terms"), p.push("Check spelling"), p.push("Remove searchText to see all projects")) : t.archivedStatus === "archived" ? (p.push("No archived projects"), p.push("Use archivedStatus: 'all' to also see active projects")) : t.archivedStatus === "all" ? (p.push("No projects created yet"), p.push(`Use ${Ct} to create a project`)) : (p.push("No active projects"), p.push("Use archivedStatus: 'all' to include archived projects"), p.push(`Use ${Ct} to create a project`))), q({
|
|
3802
3796
|
subject: n,
|
|
3803
3797
|
count: e.length,
|
|
3804
3798
|
limit: t.searchText || t.archivedStatus === "all" ? void 0 : t.limit,
|
|
@@ -3819,7 +3813,7 @@ const va = {
|
|
|
3819
3813
|
searchType: s.string().describe('The search type used: "task", "reminder", or "location_reminder".'),
|
|
3820
3814
|
searchId: s.string().describe("The ID used for the search."),
|
|
3821
3815
|
totalCount: s.number().describe("Total reminders in this response.")
|
|
3822
|
-
},
|
|
3816
|
+
}, Sa = {
|
|
3823
3817
|
name: g.FIND_REMINDERS,
|
|
3824
3818
|
description: "Find reminders by task ID (returns all reminder types), or get a specific reminder by its ID. Use reminderId for time-based reminders and locationReminderId for location reminders.",
|
|
3825
3819
|
parameters: va,
|
|
@@ -3859,17 +3853,17 @@ const va = {
|
|
|
3859
3853
|
}
|
|
3860
3854
|
if (r) {
|
|
3861
3855
|
const [i, c] = await Promise.all([
|
|
3862
|
-
|
|
3856
|
+
M({
|
|
3863
3857
|
apiMethod: (p) => t.getReminders(p),
|
|
3864
3858
|
args: { taskId: r }
|
|
3865
3859
|
}),
|
|
3866
|
-
|
|
3860
|
+
M({
|
|
3867
3861
|
apiMethod: (p) => t.getLocationReminders(p),
|
|
3868
3862
|
args: { taskId: r }
|
|
3869
3863
|
})
|
|
3870
3864
|
]), l = [...i, ...c].map(be);
|
|
3871
3865
|
return {
|
|
3872
|
-
textContent:
|
|
3866
|
+
textContent: ja(l, r),
|
|
3873
3867
|
structuredContent: {
|
|
3874
3868
|
reminders: l,
|
|
3875
3869
|
searchType: "task",
|
|
@@ -3881,7 +3875,7 @@ const va = {
|
|
|
3881
3875
|
throw new Error("One of taskId, reminderId, or locationReminderId must be provided.");
|
|
3882
3876
|
}
|
|
3883
3877
|
};
|
|
3884
|
-
function
|
|
3878
|
+
function ja(e, t) {
|
|
3885
3879
|
if (e.length === 0)
|
|
3886
3880
|
return `No reminders found for task ${t}`;
|
|
3887
3881
|
const { timeBasedCount: r, locationCount: o } = ns(e), n = [];
|
|
@@ -3905,7 +3899,7 @@ const { ADD_SECTIONS: Ca } = g, $a = {
|
|
|
3905
3899
|
}, Da = {
|
|
3906
3900
|
sections: s.array(X).describe("The found sections."),
|
|
3907
3901
|
totalCount: s.number().describe("The total number of sections found."),
|
|
3908
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
3902
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
3909
3903
|
}, xa = {
|
|
3910
3904
|
name: g.FIND_SECTIONS,
|
|
3911
3905
|
description: "Search for sections by name or other criteria in a project. When searching, uses server-side search to avoid fetching all sections.",
|
|
@@ -3921,7 +3915,7 @@ const { ADD_SECTIONS: Ca } = g, $a = {
|
|
|
3921
3915
|
e.searchText ? o = await uo(t, e.searchText, r) : o = (await t.getSections({
|
|
3922
3916
|
projectId: r
|
|
3923
3917
|
})).results;
|
|
3924
|
-
const n = o.map(
|
|
3918
|
+
const n = o.map(K);
|
|
3925
3919
|
return {
|
|
3926
3920
|
textContent: Aa({
|
|
3927
3921
|
sections: n,
|
|
@@ -3945,7 +3939,7 @@ function Aa({
|
|
|
3945
3939
|
r ? (o.push("Try broader search terms"), o.push("Check spelling"), o.push("Remove searchText to see all sections")) : (o.push("Project has no sections yet"), o.push(`Use ${Ca} to create sections`));
|
|
3946
3940
|
const n = r ? `Sections in project ${t} matching "${r}"` : `Sections in project ${t}`, a = e.length > 0 ? e.map((i) => ` ${i.name} • id=${i.id}`).join(`
|
|
3947
3941
|
`) : void 0;
|
|
3948
|
-
return
|
|
3942
|
+
return q({
|
|
3949
3943
|
subject: n,
|
|
3950
3944
|
count: e.length,
|
|
3951
3945
|
previewLines: a,
|
|
@@ -3956,7 +3950,9 @@ function Ts(e) {
|
|
|
3956
3950
|
return /* @__PURE__ */ new Date(`${e}T00:00:00`);
|
|
3957
3951
|
}
|
|
3958
3952
|
const Ea = {
|
|
3959
|
-
startDate: s.string().regex(/^(\d{4}-\d{2}-\d{2}|today)$/).optional().describe(
|
|
3953
|
+
startDate: s.string().regex(/^(\d{4}-\d{2}-\d{2}|today)$/).optional().describe(
|
|
3954
|
+
"The start date to get the tasks for. Format: YYYY-MM-DD, or 'today', which by default also includes overdue tasks."
|
|
3955
|
+
),
|
|
3960
3956
|
overdueOption: s.enum(["overdue-only", "include-overdue", "exclude-overdue"]).optional().describe(
|
|
3961
3957
|
"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'."
|
|
3962
3958
|
),
|
|
@@ -3976,10 +3972,10 @@ const Ea = {
|
|
|
3976
3972
|
...ct
|
|
3977
3973
|
}, Oa = {
|
|
3978
3974
|
tasks: s.array(F).describe("The found tasks."),
|
|
3979
|
-
nextCursor: s.string().optional()
|
|
3975
|
+
nextCursor: s.string().optional(),
|
|
3980
3976
|
totalCount: s.number().describe("The total number of tasks in this page."),
|
|
3981
|
-
hasMore: s.boolean()
|
|
3982
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
3977
|
+
hasMore: s.boolean(),
|
|
3978
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
3983
3979
|
}, Pa = {
|
|
3984
3980
|
name: g.FIND_TASKS_BY_DATE,
|
|
3985
3981
|
description: "Get tasks by date range. startDate='today' includes overdue items. Default responsibleUserFiltering='unassignedOrMe' excludes others' tasks. Person-specific queries (summaries, plans, reports) require responsibleUser.",
|
|
@@ -3997,13 +3993,13 @@ const Ea = {
|
|
|
3997
3993
|
a = "overdue";
|
|
3998
3994
|
else if (e.startDate === "today")
|
|
3999
3995
|
if (e.daysCount > 1) {
|
|
4000
|
-
const p = /* @__PURE__ */ new Date(),
|
|
3996
|
+
const p = /* @__PURE__ */ new Date(), m = ie(p), h = Ue(p, e.daysCount), y = lt(h, { representation: "date" }), f = `(due after: ${m} | due: ${m}) & due before: ${y}`;
|
|
4001
3997
|
a = e.overdueOption === "exclude-overdue" ? f : `(${f} | overdue)`;
|
|
4002
3998
|
} else
|
|
4003
3999
|
a = e.overdueOption === "exclude-overdue" ? "today" : "(today | overdue)";
|
|
4004
4000
|
else if (e.startDate) {
|
|
4005
|
-
const p = e.startDate,
|
|
4006
|
-
a = `(due after: ${p} | due: ${p}) & due before: ${
|
|
4001
|
+
const p = e.startDate, m = Ue(Ts(p), e.daysCount), h = lt(m, { representation: "date" });
|
|
4002
|
+
a = `(due after: ${p} | due: ${p}) & due before: ${h}`;
|
|
4007
4003
|
}
|
|
4008
4004
|
const i = dt(e.labels, e.labelsOperator);
|
|
4009
4005
|
i.length > 0 && (a = ce(a, `(${i})`));
|
|
@@ -4020,7 +4016,7 @@ const Ea = {
|
|
|
4020
4016
|
limit: e.limit
|
|
4021
4017
|
});
|
|
4022
4018
|
return {
|
|
4023
|
-
textContent:
|
|
4019
|
+
textContent: _a({ tasks: d, args: e, nextCursor: l, assigneeEmail: n }),
|
|
4024
4020
|
structuredContent: {
|
|
4025
4021
|
tasks: d,
|
|
4026
4022
|
nextCursor: l ?? void 0,
|
|
@@ -4031,7 +4027,7 @@ const Ea = {
|
|
|
4031
4027
|
};
|
|
4032
4028
|
}
|
|
4033
4029
|
};
|
|
4034
|
-
function
|
|
4030
|
+
function _a({
|
|
4035
4031
|
tasks: e,
|
|
4036
4032
|
args: t,
|
|
4037
4033
|
nextCursor: r,
|
|
@@ -4071,23 +4067,23 @@ function Ra({
|
|
|
4071
4067
|
i.push(`Great job! No tasks for today${c}`);
|
|
4072
4068
|
} else
|
|
4073
4069
|
i.push("Expand date range with larger 'daysCount'"), i.push("Check today's tasks with startDate='today'");
|
|
4074
|
-
return
|
|
4070
|
+
return q({
|
|
4075
4071
|
subject: a,
|
|
4076
4072
|
count: e.length,
|
|
4077
4073
|
limit: t.limit,
|
|
4078
4074
|
nextCursor: r ?? void 0,
|
|
4079
4075
|
filterHints: n,
|
|
4080
|
-
previewLines:
|
|
4076
|
+
previewLines: Se(e, Math.min(e.length, t.limit)),
|
|
4081
4077
|
zeroReasonHints: i
|
|
4082
4078
|
});
|
|
4083
4079
|
}
|
|
4084
|
-
const
|
|
4080
|
+
const Ra = 300 * 1e3;
|
|
4085
4081
|
class Ua {
|
|
4086
4082
|
constructor() {
|
|
4087
4083
|
this.cache = null;
|
|
4088
4084
|
}
|
|
4089
4085
|
async getFilters(t) {
|
|
4090
|
-
if (this.cache && Date.now() - this.cache.timestamp <
|
|
4086
|
+
if (this.cache && Date.now() - this.cache.timestamp < Ra)
|
|
4091
4087
|
return this.cache.filters;
|
|
4092
4088
|
const o = ((await t.sync({
|
|
4093
4089
|
resourceTypes: ["filters"],
|
|
@@ -4144,7 +4140,7 @@ ${u}` + (d.length > 5 ? `
|
|
|
4144
4140
|
this.cache = null;
|
|
4145
4141
|
}
|
|
4146
4142
|
}
|
|
4147
|
-
const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g,
|
|
4143
|
+
const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Na = {
|
|
4148
4144
|
searchText: s.string().optional().describe("The text to search for in tasks."),
|
|
4149
4145
|
projectId: s.string().optional().describe(
|
|
4150
4146
|
'Find tasks in this project. Project ID should be an ID string, or the text "inbox", for inbox tasks.'
|
|
@@ -4166,17 +4162,17 @@ const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ma = {
|
|
|
4166
4162
|
"The ID or name of a saved Todoist filter. The filter's query will be fetched and used to find tasks. Cannot be used with the `filter` parameter, projectId, sectionId, or parentId."
|
|
4167
4163
|
),
|
|
4168
4164
|
...ct
|
|
4169
|
-
},
|
|
4165
|
+
}, Ma = {
|
|
4170
4166
|
tasks: s.array(F).describe("The found tasks."),
|
|
4171
|
-
nextCursor: s.string().optional()
|
|
4167
|
+
nextCursor: s.string().optional(),
|
|
4172
4168
|
totalCount: s.number().describe("The total number of tasks in this page."),
|
|
4173
|
-
hasMore: s.boolean()
|
|
4174
|
-
appliedFilters: s.record(s.string(), s.unknown())
|
|
4169
|
+
hasMore: s.boolean(),
|
|
4170
|
+
appliedFilters: s.record(s.string(), s.unknown())
|
|
4175
4171
|
}, Fa = {
|
|
4176
4172
|
name: g.FIND_TASKS,
|
|
4177
4173
|
description: "Find tasks by text search, project/section/parent container, responsible user, labels, a raw Todoist filter string, or a saved filter by ID or name (filterIdOrName). At least one filter must be provided.",
|
|
4178
|
-
parameters:
|
|
4179
|
-
outputSchema:
|
|
4174
|
+
parameters: Na,
|
|
4175
|
+
outputSchema: Ma,
|
|
4180
4176
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
4181
4177
|
async execute(e, t) {
|
|
4182
4178
|
const {
|
|
@@ -4190,31 +4186,31 @@ const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ma = {
|
|
|
4190
4186
|
cursor: l,
|
|
4191
4187
|
labels: u,
|
|
4192
4188
|
labelsOperator: p,
|
|
4193
|
-
filter:
|
|
4194
|
-
filterIdOrName:
|
|
4189
|
+
filter: m,
|
|
4190
|
+
filterIdOrName: h
|
|
4195
4191
|
} = e, y = await t.getUser(), f = u && u.length > 0;
|
|
4196
|
-
if (!r && !o && !n && !a && !i && !f && !
|
|
4192
|
+
if (!r && !o && !n && !a && !i && !f && !m && !h)
|
|
4197
4193
|
throw new Error(
|
|
4198
4194
|
"At least one filter must be provided: searchText, projectId, sectionId, parentId, responsibleUser, labels, filter, or filterIdOrName"
|
|
4199
4195
|
);
|
|
4200
|
-
if (
|
|
4196
|
+
if (m && h)
|
|
4201
4197
|
throw new Error(
|
|
4202
4198
|
"The `filter` and `filterIdOrName` parameters cannot be used together. Provide only one."
|
|
4203
4199
|
);
|
|
4204
|
-
if ((
|
|
4200
|
+
if ((m || h) && (o || n || a))
|
|
4205
4201
|
throw new Error(
|
|
4206
4202
|
'The `filter`/`filterIdOrName` parameter cannot be combined with projectId, sectionId, or parentId. Use filter syntax instead (e.g. "##ProjectName").'
|
|
4207
4203
|
);
|
|
4208
|
-
let v =
|
|
4209
|
-
|
|
4210
|
-
const
|
|
4204
|
+
let v = m;
|
|
4205
|
+
h && (v = (await La.resolveFilter(t, h)).filterQuery);
|
|
4206
|
+
const j = await Qe(t, i), A = j?.userId, k = j?.email;
|
|
4211
4207
|
if (o || n || a) {
|
|
4212
4208
|
const D = {
|
|
4213
4209
|
limit: d,
|
|
4214
4210
|
cursor: l ?? null
|
|
4215
4211
|
};
|
|
4216
4212
|
o && (D.projectId = await de({ projectId: o, user: y })), n && (D.sectionId = n), a && (D.parentId = a);
|
|
4217
|
-
const { results:
|
|
4213
|
+
const { results: me, nextCursor: Y } = await t.getTasks(D), $e = me.map(P);
|
|
4218
4214
|
let H = r ? $e.filter(
|
|
4219
4215
|
(te) => te.content.toLowerCase().includes(r.toLowerCase()) || te.description?.toLowerCase().includes(r.toLowerCase())
|
|
4220
4216
|
) : $e;
|
|
@@ -4231,39 +4227,39 @@ const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ma = {
|
|
|
4231
4227
|
textContent: Ee({
|
|
4232
4228
|
tasks: H,
|
|
4233
4229
|
args: e,
|
|
4234
|
-
nextCursor:
|
|
4230
|
+
nextCursor: Y,
|
|
4235
4231
|
isContainerSearch: !0,
|
|
4236
4232
|
assigneeEmail: k
|
|
4237
4233
|
}),
|
|
4238
4234
|
structuredContent: {
|
|
4239
4235
|
tasks: H,
|
|
4240
|
-
nextCursor:
|
|
4236
|
+
nextCursor: Y ?? void 0,
|
|
4241
4237
|
totalCount: H.length,
|
|
4242
|
-
hasMore: !!
|
|
4238
|
+
hasMore: !!Y,
|
|
4243
4239
|
appliedFilters: e
|
|
4244
4240
|
}
|
|
4245
4241
|
};
|
|
4246
4242
|
}
|
|
4247
4243
|
if (A && !r && !f && !v) {
|
|
4248
|
-
const { results: D, nextCursor:
|
|
4244
|
+
const { results: D, nextCursor: me } = await t.getTasksByFilter({
|
|
4249
4245
|
query: `assigned to: ${k}`,
|
|
4250
4246
|
lang: "en",
|
|
4251
4247
|
limit: d,
|
|
4252
4248
|
cursor: l ?? null
|
|
4253
|
-
}),
|
|
4249
|
+
}), Y = D.map(P);
|
|
4254
4250
|
return {
|
|
4255
4251
|
textContent: Ee({
|
|
4256
|
-
tasks:
|
|
4252
|
+
tasks: Y,
|
|
4257
4253
|
args: e,
|
|
4258
|
-
nextCursor:
|
|
4254
|
+
nextCursor: me,
|
|
4259
4255
|
isContainerSearch: !1,
|
|
4260
4256
|
assigneeEmail: k
|
|
4261
4257
|
}),
|
|
4262
4258
|
structuredContent: {
|
|
4263
|
-
tasks:
|
|
4264
|
-
nextCursor:
|
|
4265
|
-
totalCount:
|
|
4266
|
-
hasMore: !!
|
|
4259
|
+
tasks: Y,
|
|
4260
|
+
nextCursor: me ?? void 0,
|
|
4261
|
+
totalCount: Y.length,
|
|
4262
|
+
hasMore: !!me,
|
|
4267
4263
|
appliedFilters: e
|
|
4268
4264
|
}
|
|
4269
4265
|
};
|
|
@@ -4271,7 +4267,7 @@ const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ma = {
|
|
|
4271
4267
|
let I = v ? `(${v})` : "";
|
|
4272
4268
|
r && (I = ce(I, `search: ${r}`));
|
|
4273
4269
|
const x = dt(u, p);
|
|
4274
|
-
if (I = ce(I, x), !(
|
|
4270
|
+
if (I = ce(I, x), !(h && !i && !c)) {
|
|
4275
4271
|
const D = ss({
|
|
4276
4272
|
resolvedAssigneeId: A,
|
|
4277
4273
|
assigneeEmail: k,
|
|
@@ -4279,7 +4275,7 @@ const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ma = {
|
|
|
4279
4275
|
});
|
|
4280
4276
|
I = ce(I, D);
|
|
4281
4277
|
}
|
|
4282
|
-
const { tasks: b, nextCursor:
|
|
4278
|
+
const { tasks: b, nextCursor: S } = await tt({
|
|
4283
4279
|
client: t,
|
|
4284
4280
|
query: I,
|
|
4285
4281
|
cursor: e.cursor,
|
|
@@ -4289,15 +4285,15 @@ const La = new Ua(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ma = {
|
|
|
4289
4285
|
textContent: Ee({
|
|
4290
4286
|
tasks: b,
|
|
4291
4287
|
args: e,
|
|
4292
|
-
nextCursor:
|
|
4288
|
+
nextCursor: S,
|
|
4293
4289
|
isContainerSearch: !1,
|
|
4294
4290
|
assigneeEmail: k
|
|
4295
4291
|
}),
|
|
4296
4292
|
structuredContent: {
|
|
4297
4293
|
tasks: b,
|
|
4298
|
-
nextCursor:
|
|
4294
|
+
nextCursor: S ?? void 0,
|
|
4299
4295
|
totalCount: b.length,
|
|
4300
|
-
hasMore: !!
|
|
4296
|
+
hasMore: !!S,
|
|
4301
4297
|
appliedFilters: e
|
|
4302
4298
|
}
|
|
4303
4299
|
};
|
|
@@ -4357,13 +4353,13 @@ function Ee({
|
|
|
4357
4353
|
t.searchText && (c.push("Try broader search terms"), c.push("Verify spelling and try partial words"), t.responsibleUser || c.push(`Check completed tasks with ${$t}`));
|
|
4358
4354
|
}
|
|
4359
4355
|
}
|
|
4360
|
-
return
|
|
4356
|
+
return q({
|
|
4361
4357
|
subject: a,
|
|
4362
4358
|
count: e.length,
|
|
4363
4359
|
limit: t.limit,
|
|
4364
4360
|
nextCursor: r ?? void 0,
|
|
4365
4361
|
filterHints: i,
|
|
4366
|
-
previewLines:
|
|
4362
|
+
previewLines: Se(e, Math.min(e.length, t.limit)),
|
|
4367
4363
|
zeroReasonHints: c
|
|
4368
4364
|
});
|
|
4369
4365
|
}
|
|
@@ -4420,7 +4416,7 @@ const Wa = {
|
|
|
4420
4416
|
tasksWithoutSection: s.number()
|
|
4421
4417
|
}).optional().describe("Statistics object (project overview only).")
|
|
4422
4418
|
};
|
|
4423
|
-
function
|
|
4419
|
+
function za(e) {
|
|
4424
4420
|
const t = {};
|
|
4425
4421
|
for (const n of e)
|
|
4426
4422
|
t[n.id] = {
|
|
@@ -4445,7 +4441,7 @@ function qa(e) {
|
|
|
4445
4441
|
}
|
|
4446
4442
|
return o(r), r;
|
|
4447
4443
|
}
|
|
4448
|
-
async function
|
|
4444
|
+
async function Ka(e, t) {
|
|
4449
4445
|
const r = {};
|
|
4450
4446
|
return await Promise.all(
|
|
4451
4447
|
t.map(async (o) => {
|
|
@@ -4481,11 +4477,11 @@ function xt(e) {
|
|
|
4481
4477
|
}
|
|
4482
4478
|
return r;
|
|
4483
4479
|
}
|
|
4484
|
-
function
|
|
4480
|
+
function qe(e, t = "") {
|
|
4485
4481
|
const r = [];
|
|
4486
4482
|
for (const o of e) {
|
|
4487
4483
|
const n = `id=${o.id}`, a = o.dueDate ? `; due=${o.dueDate}` : "", i = `; content=${o.content}`;
|
|
4488
|
-
r.push(`${t}- ${n}${a}${i}`), o.children.length > 0 && r.push(...
|
|
4484
|
+
r.push(`${t}- ${n}${a}${i}`), o.children.length > 0 && r.push(...qe(o.children, `${t} `));
|
|
4489
4485
|
}
|
|
4490
4486
|
return r;
|
|
4491
4487
|
}
|
|
@@ -4496,13 +4492,13 @@ function vs(e, t) {
|
|
|
4496
4492
|
parentId: B(e) ? e.parentId ?? void 0 : void 0,
|
|
4497
4493
|
folderId: ke(e) ? e.folderId ?? void 0 : void 0,
|
|
4498
4494
|
childOrder: e.childOrder,
|
|
4499
|
-
sections: (t[e.id] || []).map(
|
|
4495
|
+
sections: (t[e.id] || []).map(K),
|
|
4500
4496
|
children: e.children.map(
|
|
4501
4497
|
(r) => vs(r, t)
|
|
4502
4498
|
)
|
|
4503
4499
|
};
|
|
4504
4500
|
}
|
|
4505
|
-
async function
|
|
4501
|
+
async function qa(e, t) {
|
|
4506
4502
|
let r = [], o;
|
|
4507
4503
|
do {
|
|
4508
4504
|
const { results: n, nextCursor: a } = await e.getTasks({
|
|
@@ -4514,12 +4510,12 @@ async function Ya(e, t) {
|
|
|
4514
4510
|
} while (o);
|
|
4515
4511
|
return r;
|
|
4516
4512
|
}
|
|
4517
|
-
async function
|
|
4513
|
+
async function Ya(e, t) {
|
|
4518
4514
|
const { results: r } = await e.getSections({ projectId: t });
|
|
4519
4515
|
return r;
|
|
4520
4516
|
}
|
|
4521
|
-
async function
|
|
4522
|
-
const { results: t } = await e.getProjects({}), r = t.find((p) => B(p) && p.inboxProject === !0), o = t.filter((p) => !B(p) || p.inboxProject !== !0), n =
|
|
4517
|
+
async function Ga(e) {
|
|
4518
|
+
const { results: t } = await e.getProjects({}), r = t.find((p) => B(p) && p.inboxProject === !0), o = t.filter((p) => !B(p) || p.inboxProject !== !0), n = za(o), a = t.map((p) => p.id), i = await Ka(e, a), c = ["# Personal Projects", ""];
|
|
4523
4519
|
if (r) {
|
|
4524
4520
|
c.push(`- Inbox Project: ${r.name} (id=${r.id})`);
|
|
4525
4521
|
for (const p of i[r.id] || [])
|
|
@@ -4542,14 +4538,14 @@ async function Ka(e) {
|
|
|
4542
4538
|
inbox: r ? {
|
|
4543
4539
|
id: r.id,
|
|
4544
4540
|
name: r.name,
|
|
4545
|
-
sections: (i[r.id] || []).map(
|
|
4541
|
+
sections: (i[r.id] || []).map(K)
|
|
4546
4542
|
} : null,
|
|
4547
4543
|
projects: n.map(
|
|
4548
4544
|
(p) => vs(p, i)
|
|
4549
4545
|
),
|
|
4550
4546
|
totalProjects: t.length,
|
|
4551
4547
|
totalSections: a.reduce(
|
|
4552
|
-
(p,
|
|
4548
|
+
(p, m) => p + (i[m]?.length || 0),
|
|
4553
4549
|
0
|
|
4554
4550
|
),
|
|
4555
4551
|
hasNestedProjects: d
|
|
@@ -4559,8 +4555,8 @@ async function Ka(e) {
|
|
|
4559
4555
|
async function Va(e, t) {
|
|
4560
4556
|
const [r, o, n] = await Promise.all([
|
|
4561
4557
|
e.getProject(t),
|
|
4562
|
-
|
|
4563
|
-
|
|
4558
|
+
Ya(e, t),
|
|
4559
|
+
qa(e, t)
|
|
4564
4560
|
]), a = {};
|
|
4565
4561
|
for (const u of o)
|
|
4566
4562
|
a[u.id] = [];
|
|
@@ -4571,15 +4567,15 @@ async function Va(e, t) {
|
|
|
4571
4567
|
if (i.length > 0) {
|
|
4572
4568
|
c.push("");
|
|
4573
4569
|
const u = xt(i);
|
|
4574
|
-
c.push(...
|
|
4570
|
+
c.push(...qe(u));
|
|
4575
4571
|
}
|
|
4576
4572
|
for (const u of o) {
|
|
4577
4573
|
c.push(""), c.push(`## ${u.name}`);
|
|
4578
4574
|
const p = a[u.id];
|
|
4579
4575
|
if (!p?.length)
|
|
4580
4576
|
continue;
|
|
4581
|
-
const
|
|
4582
|
-
c.push(...
|
|
4577
|
+
const m = xt(p);
|
|
4578
|
+
c.push(...qe(m));
|
|
4583
4579
|
}
|
|
4584
4580
|
const d = c.join(`
|
|
4585
4581
|
`), l = {
|
|
@@ -4588,7 +4584,7 @@ async function Va(e, t) {
|
|
|
4588
4584
|
id: r.id,
|
|
4589
4585
|
name: r.name
|
|
4590
4586
|
},
|
|
4591
|
-
sections: o.map(
|
|
4587
|
+
sections: o.map(K),
|
|
4592
4588
|
tasks: n.map((u) => ({
|
|
4593
4589
|
...u,
|
|
4594
4590
|
children: []
|
|
@@ -4609,7 +4605,7 @@ const Ja = {
|
|
|
4609
4605
|
outputSchema: Ba,
|
|
4610
4606
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
4611
4607
|
async execute(e, t) {
|
|
4612
|
-
const r = e.projectId ? await Va(t, e.projectId) : await
|
|
4608
|
+
const r = e.projectId ? await Va(t, e.projectId) : await Ga(t);
|
|
4613
4609
|
return {
|
|
4614
4610
|
textContent: r.textContent,
|
|
4615
4611
|
structuredContent: r.structuredContent
|
|
@@ -4826,7 +4822,7 @@ const oi = {
|
|
|
4826
4822
|
progressPercent: s.number().describe("Completion percentage (0-100).")
|
|
4827
4823
|
}).describe("Project completion progress."),
|
|
4828
4824
|
health: s.object({
|
|
4829
|
-
status: s.enum(
|
|
4825
|
+
status: s.enum(Ge).describe("The overall health status of the project."),
|
|
4830
4826
|
description: s.string().nullable().optional().describe("Detailed description of the health assessment."),
|
|
4831
4827
|
descriptionSummary: s.string().nullable().optional().describe("Brief summary of the health assessment."),
|
|
4832
4828
|
taskRecommendations: s.array(ai).nullable().optional().describe("Specific recommendations for individual tasks."),
|
|
@@ -4939,10 +4935,10 @@ const ui = {
|
|
|
4939
4935
|
"The workspace ID or name. Supports exact ID, exact name match (case-insensitive), or unique partial name match."
|
|
4940
4936
|
),
|
|
4941
4937
|
projectIds: s.array(s.string().min(1)).min(1).optional().describe("Optional list of project IDs to scope insights to specific projects.")
|
|
4942
|
-
},
|
|
4938
|
+
}, mi = s.object({
|
|
4943
4939
|
projectId: s.string().describe("The project ID."),
|
|
4944
4940
|
health: s.object({
|
|
4945
|
-
status: s.enum(
|
|
4941
|
+
status: s.enum(Ge).describe("The health status of the project."),
|
|
4946
4942
|
isStale: s.boolean().describe("Whether the health data is stale."),
|
|
4947
4943
|
updateInProgress: s.boolean().describe("Whether a health analysis update is in progress.")
|
|
4948
4944
|
}).nullable().describe("Health data for this project, if available."),
|
|
@@ -4951,16 +4947,16 @@ const ui = {
|
|
|
4951
4947
|
activeCount: s.number().describe("Number of active tasks."),
|
|
4952
4948
|
progressPercent: s.number().describe("Completion percentage (0-100).")
|
|
4953
4949
|
}).nullable().describe("Progress data for this project, if available.")
|
|
4954
|
-
}),
|
|
4950
|
+
}), hi = {
|
|
4955
4951
|
workspaceId: s.string().describe("The resolved workspace ID."),
|
|
4956
4952
|
workspaceName: s.string().describe("The resolved workspace name."),
|
|
4957
4953
|
folderId: s.string().nullable().describe("The folder ID, if applicable."),
|
|
4958
|
-
projectInsights: s.array(
|
|
4954
|
+
projectInsights: s.array(mi).describe("Health and progress insights for each project in the workspace.")
|
|
4959
4955
|
}, fi = {
|
|
4960
4956
|
name: g.GET_WORKSPACE_INSIGHTS,
|
|
4961
4957
|
description: "Get aggregated health and progress insights across all projects in a workspace. Accepts workspace name or ID, with optional project ID filtering. Useful for a cross-project health overview.",
|
|
4962
4958
|
parameters: pi,
|
|
4963
|
-
outputSchema:
|
|
4959
|
+
outputSchema: hi,
|
|
4964
4960
|
annotations: {
|
|
4965
4961
|
readOnlyHint: !0,
|
|
4966
4962
|
destructiveHint: !1,
|
|
@@ -5060,7 +5056,7 @@ const yi = {
|
|
|
5060
5056
|
projectId: e,
|
|
5061
5057
|
file: r ?? "",
|
|
5062
5058
|
fileName: "template.csv"
|
|
5063
|
-
}), i = a.sections.map(
|
|
5059
|
+
}), i = a.sections.map(K), c = a.tasks.map(P), d = a.comments.map(ge), l = a.projects.length + i.length + c.length + d.length;
|
|
5064
5060
|
return {
|
|
5065
5061
|
textContent: wi({
|
|
5066
5062
|
projectId: e,
|
|
@@ -5095,12 +5091,12 @@ const vi = {}, Ii = {
|
|
|
5095
5091
|
isGuestAllowed: s.boolean().describe("Whether guests are allowed in the workspace."),
|
|
5096
5092
|
createdAt: s.string().optional().describe("The ISO 8601 timestamp when the workspace was created."),
|
|
5097
5093
|
creatorId: s.string().describe("The ID of the user who created the workspace.")
|
|
5098
|
-
},
|
|
5094
|
+
}, Si = {
|
|
5099
5095
|
type: s.literal("workspaces").describe("The type of the response."),
|
|
5100
5096
|
workspaces: s.array(s.object(Ii)).describe("List of workspaces."),
|
|
5101
5097
|
count: s.number().describe("The total number of workspaces.")
|
|
5102
5098
|
};
|
|
5103
|
-
async function
|
|
5099
|
+
async function ji(e) {
|
|
5104
5100
|
const r = (await e.getWorkspaces()).map((i) => ({
|
|
5105
5101
|
id: i.id,
|
|
5106
5102
|
name: i.name,
|
|
@@ -5135,10 +5131,10 @@ const Ci = {
|
|
|
5135
5131
|
name: g.LIST_WORKSPACES,
|
|
5136
5132
|
description: "Get all workspaces for the authenticated user. Returns workspace details including ID, name, plan type (STARTER/BUSINESS), user role (ADMIN/MEMBER/GUEST), link sharing settings, guest permissions, creation date, and creator ID.",
|
|
5137
5133
|
parameters: vi,
|
|
5138
|
-
outputSchema:
|
|
5134
|
+
outputSchema: Si,
|
|
5139
5135
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
5140
5136
|
async execute(e, t) {
|
|
5141
|
-
const r = await
|
|
5137
|
+
const r = await ji(t);
|
|
5142
5138
|
return {
|
|
5143
5139
|
textContent: r.textContent,
|
|
5144
5140
|
structuredContent: r.structuredContent
|
|
@@ -5247,17 +5243,17 @@ const Ci = {
|
|
|
5247
5243
|
originalAssigneeId: b.responsibleUid ?? void 0,
|
|
5248
5244
|
newAssigneeId: void 0
|
|
5249
5245
|
};
|
|
5250
|
-
} catch (
|
|
5246
|
+
} catch (S) {
|
|
5251
5247
|
return {
|
|
5252
5248
|
taskId: b.id,
|
|
5253
5249
|
success: !1,
|
|
5254
|
-
error:
|
|
5250
|
+
error: S instanceof Error ? S.message : "Update failed",
|
|
5255
5251
|
originalAssigneeId: b.responsibleUid ?? void 0
|
|
5256
5252
|
};
|
|
5257
5253
|
}
|
|
5258
5254
|
}), I = await Promise.all(k), x = [...I, ...l];
|
|
5259
5255
|
if (x.length > 0 && x.every((b) => !b.success)) {
|
|
5260
|
-
const b = x.map((
|
|
5256
|
+
const b = x.map((S) => `"${S.taskId}": ${S.error}`).join("; ");
|
|
5261
5257
|
throw new Error(`All ${x.length} unassign operation(s) failed: ${b}`);
|
|
5262
5258
|
}
|
|
5263
5259
|
return {
|
|
@@ -5276,13 +5272,13 @@ const Ci = {
|
|
|
5276
5272
|
}
|
|
5277
5273
|
};
|
|
5278
5274
|
}
|
|
5279
|
-
const
|
|
5275
|
+
const m = await it.validateBulkAssignment(
|
|
5280
5276
|
t,
|
|
5281
5277
|
p
|
|
5282
|
-
),
|
|
5278
|
+
), h = [], y = [];
|
|
5283
5279
|
for (let k = 0; k < p.length; k++) {
|
|
5284
|
-
const I = p[k], x =
|
|
5285
|
-
I && x?.isValid ?
|
|
5280
|
+
const I = p[k], x = m[k];
|
|
5281
|
+
I && x?.isValid ? h.push({ assignment: I, validation: x }) : I?.taskId && y.push({
|
|
5286
5282
|
taskId: I.taskId,
|
|
5287
5283
|
success: !1,
|
|
5288
5284
|
error: x?.error?.message || "Validation failed"
|
|
@@ -5293,9 +5289,9 @@ const Ci = {
|
|
|
5293
5289
|
(b) => b.assignment != null && b.validation != null
|
|
5294
5290
|
);
|
|
5295
5291
|
if (!I)
|
|
5296
|
-
return x.map(({ assignment: b, validation:
|
|
5292
|
+
return x.map(({ assignment: b, validation: S }) => {
|
|
5297
5293
|
const $ = d.find((D) => D.id === b.taskId);
|
|
5298
|
-
if (!b.taskId || !
|
|
5294
|
+
if (!b.taskId || !S.resolvedUser?.userId)
|
|
5299
5295
|
throw new Error(
|
|
5300
5296
|
"Invalid assignment or validation data - this should not happen"
|
|
5301
5297
|
);
|
|
@@ -5303,13 +5299,13 @@ const Ci = {
|
|
|
5303
5299
|
taskId: b.taskId,
|
|
5304
5300
|
success: !0,
|
|
5305
5301
|
originalAssigneeId: $?.responsibleUid ?? void 0,
|
|
5306
|
-
newAssigneeId:
|
|
5302
|
+
newAssigneeId: S.resolvedUser.userId
|
|
5307
5303
|
};
|
|
5308
5304
|
});
|
|
5309
5305
|
const T = x.map(
|
|
5310
|
-
async ({ assignment: b, validation:
|
|
5306
|
+
async ({ assignment: b, validation: S }) => {
|
|
5311
5307
|
const $ = d.find((D) => D.id === b.taskId);
|
|
5312
|
-
if (!b.taskId || !
|
|
5308
|
+
if (!b.taskId || !S.resolvedUser?.userId)
|
|
5313
5309
|
return {
|
|
5314
5310
|
taskId: b.taskId || "unknown-task",
|
|
5315
5311
|
success: !1,
|
|
@@ -5318,12 +5314,12 @@ const Ci = {
|
|
|
5318
5314
|
};
|
|
5319
5315
|
try {
|
|
5320
5316
|
return await t.updateTask(b.taskId, {
|
|
5321
|
-
assigneeId:
|
|
5317
|
+
assigneeId: S.resolvedUser.userId
|
|
5322
5318
|
}), {
|
|
5323
5319
|
taskId: b.taskId,
|
|
5324
5320
|
success: !0,
|
|
5325
5321
|
originalAssigneeId: $?.responsibleUid ?? void 0,
|
|
5326
|
-
newAssigneeId:
|
|
5322
|
+
newAssigneeId: S.resolvedUser.userId
|
|
5327
5323
|
};
|
|
5328
5324
|
} catch (D) {
|
|
5329
5325
|
return {
|
|
@@ -5337,23 +5333,23 @@ const Ci = {
|
|
|
5337
5333
|
);
|
|
5338
5334
|
return Promise.all(T);
|
|
5339
5335
|
}
|
|
5340
|
-
const v = await f(
|
|
5341
|
-
if (
|
|
5342
|
-
const k =
|
|
5343
|
-
throw new Error(`All ${
|
|
5336
|
+
const v = await f(h, !i), j = [...v, ...y, ...l];
|
|
5337
|
+
if (j.length > 0 && j.every((k) => !k.success)) {
|
|
5338
|
+
const k = j.map((I) => `"${I.taskId}": ${I.error}`).join("; ");
|
|
5339
|
+
throw new Error(`All ${j.length} ${r} operation(s) failed: ${k}`);
|
|
5344
5340
|
}
|
|
5345
5341
|
return {
|
|
5346
5342
|
textContent: Oe({
|
|
5347
5343
|
operation: r,
|
|
5348
|
-
results:
|
|
5344
|
+
results: j,
|
|
5349
5345
|
dryRun: i
|
|
5350
5346
|
}),
|
|
5351
5347
|
structuredContent: {
|
|
5352
5348
|
operation: r,
|
|
5353
|
-
results:
|
|
5349
|
+
results: j,
|
|
5354
5350
|
totalRequested: o.length,
|
|
5355
5351
|
successful: v.filter((k) => k.success).length,
|
|
5356
|
-
failed:
|
|
5352
|
+
failed: j.filter((k) => !k.success).length,
|
|
5357
5353
|
dryRun: i
|
|
5358
5354
|
}
|
|
5359
5355
|
};
|
|
@@ -5413,14 +5409,14 @@ function Oe({
|
|
|
5413
5409
|
const Pi = {
|
|
5414
5410
|
action: s.enum(["archive", "unarchive"]).describe("The action to perform on the project."),
|
|
5415
5411
|
projectId: s.string().min(1).describe("The ID of the project.")
|
|
5416
|
-
},
|
|
5412
|
+
}, _i = {
|
|
5417
5413
|
project: Q.describe("The updated project."),
|
|
5418
5414
|
success: s.boolean().describe("Whether the action was successful.")
|
|
5419
|
-
},
|
|
5415
|
+
}, Ri = {
|
|
5420
5416
|
name: g.PROJECT_MANAGEMENT,
|
|
5421
5417
|
description: "Archive or unarchive a project by its ID.",
|
|
5422
5418
|
parameters: Pi,
|
|
5423
|
-
outputSchema:
|
|
5419
|
+
outputSchema: _i,
|
|
5424
5420
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !0 },
|
|
5425
5421
|
async execute(e, t) {
|
|
5426
5422
|
const r = e.action === "archive" ? await t.archiveProject(e.projectId) : await t.unarchiveProject(e.projectId), o = Z(r);
|
|
@@ -5443,7 +5439,7 @@ const Pi = {
|
|
|
5443
5439
|
}, Li = {
|
|
5444
5440
|
project: Q.describe("The moved project."),
|
|
5445
5441
|
success: s.boolean().describe("Whether the move was successful.")
|
|
5446
|
-
},
|
|
5442
|
+
}, Ni = {
|
|
5447
5443
|
name: g.PROJECT_MOVE,
|
|
5448
5444
|
description: "Move a project between personal and workspace contexts.",
|
|
5449
5445
|
parameters: Ui,
|
|
@@ -5470,7 +5466,7 @@ const Pi = {
|
|
|
5470
5466
|
}
|
|
5471
5467
|
};
|
|
5472
5468
|
}
|
|
5473
|
-
}, Is = ["project", "section"],
|
|
5469
|
+
}, Is = ["project", "section"], Mi = {
|
|
5474
5470
|
type: s.enum(Is).describe(
|
|
5475
5471
|
'The type of entity to reorder. "project" reorders sibling projects within the same parent (and can move projects to a new parent). "section" reorders sections within the same project.'
|
|
5476
5472
|
),
|
|
@@ -5496,7 +5492,7 @@ const Pi = {
|
|
|
5496
5492
|
}, Hi = {
|
|
5497
5493
|
name: g.REORDER_OBJECTS,
|
|
5498
5494
|
description: 'Reorder sibling projects or sections, and optionally move projects to a new parent. For projects: set order to reorder siblings, and/or set parentId to move under a new parent (use "root" for top level). For sections: set order to reorder within a project.',
|
|
5499
|
-
parameters:
|
|
5495
|
+
parameters: Mi,
|
|
5500
5496
|
outputSchema: Fi,
|
|
5501
5497
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !0 },
|
|
5502
5498
|
async execute(e, t) {
|
|
@@ -5515,11 +5511,11 @@ const Pi = {
|
|
|
5515
5511
|
}
|
|
5516
5512
|
const a = [], i = o.filter((p) => p.parentId !== void 0);
|
|
5517
5513
|
for (const p of i) {
|
|
5518
|
-
const
|
|
5514
|
+
const m = p.parentId;
|
|
5519
5515
|
a.push(
|
|
5520
5516
|
V("project_move", {
|
|
5521
5517
|
id: p.id,
|
|
5522
|
-
parentId:
|
|
5518
|
+
parentId: m === "root" ? null : m
|
|
5523
5519
|
})
|
|
5524
5520
|
);
|
|
5525
5521
|
}
|
|
@@ -5544,8 +5540,8 @@ const Pi = {
|
|
|
5544
5540
|
try {
|
|
5545
5541
|
await t.sync({ commands: a });
|
|
5546
5542
|
} catch (p) {
|
|
5547
|
-
const
|
|
5548
|
-
throw new Error(`Reorder failed: ${
|
|
5543
|
+
const m = p instanceof Error ? p.message : String(p);
|
|
5544
|
+
throw new Error(`Reorder failed: ${m}`);
|
|
5549
5545
|
}
|
|
5550
5546
|
const d = r === "project" ? "projects" : "sections", l = o.map((p) => p.id), u = [];
|
|
5551
5547
|
return i.length > 0 && u.push(`moved ${i.length}`), c.length > 0 && u.push(`reordered ${c.length}`), {
|
|
@@ -5566,15 +5562,15 @@ const Pi = {
|
|
|
5566
5562
|
)
|
|
5567
5563
|
}), Bi = {
|
|
5568
5564
|
tasks: s.array(Wi).min(1).describe("The tasks to reschedule with their new dates.")
|
|
5569
|
-
},
|
|
5565
|
+
}, zi = {
|
|
5570
5566
|
tasks: s.array(F).describe("The rescheduled tasks."),
|
|
5571
5567
|
totalCount: s.number().describe("The total number of tasks rescheduled."),
|
|
5572
5568
|
rescheduledTaskIds: s.array(s.string()).describe("The IDs of the rescheduled tasks.")
|
|
5573
|
-
},
|
|
5569
|
+
}, Ki = {
|
|
5574
5570
|
name: g.RESCHEDULE_TASKS,
|
|
5575
5571
|
description: "Reschedule tasks to new dates while preserving recurring schedules. Unlike update-tasks (which replaces the entire due string and can wipe recurrence), this tool changes only the date, keeping recurrence patterns intact. Use this when moving recurring tasks to a different date without altering their repeat pattern.",
|
|
5576
5572
|
parameters: Bi,
|
|
5577
|
-
outputSchema:
|
|
5573
|
+
outputSchema: zi,
|
|
5578
5574
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5579
5575
|
async execute(e, t) {
|
|
5580
5576
|
const { tasks: r } = e, n = (await Promise.all(
|
|
@@ -5587,7 +5583,7 @@ const Pi = {
|
|
|
5587
5583
|
throw new Error(
|
|
5588
5584
|
`Task "${l.content}" (${l.id}) has no due date. Rescheduling requires an existing due date.`
|
|
5589
5585
|
);
|
|
5590
|
-
const u =
|
|
5586
|
+
const u = qi(d.date, l.due);
|
|
5591
5587
|
return V("item_update", {
|
|
5592
5588
|
id: d.id,
|
|
5593
5589
|
due: {
|
|
@@ -5618,16 +5614,16 @@ const Pi = {
|
|
|
5618
5614
|
};
|
|
5619
5615
|
}
|
|
5620
5616
|
};
|
|
5621
|
-
function
|
|
5617
|
+
function qi(e, t) {
|
|
5622
5618
|
if (/^\d{4}-\d{2}-\d{2}$/.test(e) && t.datetime) {
|
|
5623
5619
|
const o = t.datetime.substring(10);
|
|
5624
5620
|
return e + o;
|
|
5625
5621
|
}
|
|
5626
5622
|
return e;
|
|
5627
5623
|
}
|
|
5628
|
-
const
|
|
5624
|
+
const Yi = {
|
|
5629
5625
|
query: s.string().min(1).describe("The search query string to find tasks and projects.")
|
|
5630
|
-
},
|
|
5626
|
+
}, Gi = {
|
|
5631
5627
|
results: s.array(
|
|
5632
5628
|
s.object({
|
|
5633
5629
|
id: s.string().describe("The ID of the result."),
|
|
@@ -5639,8 +5635,8 @@ const Gi = {
|
|
|
5639
5635
|
}, Vi = {
|
|
5640
5636
|
name: g.SEARCH,
|
|
5641
5637
|
description: "Search across tasks and projects in Todoist. Returns a list of relevant results with IDs, titles, and URLs.",
|
|
5642
|
-
parameters:
|
|
5643
|
-
outputSchema:
|
|
5638
|
+
parameters: Yi,
|
|
5639
|
+
outputSchema: Gi,
|
|
5644
5640
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
5645
5641
|
async execute(e, t) {
|
|
5646
5642
|
const { query: r } = e, [o, n] = await Promise.all([
|
|
@@ -5656,7 +5652,7 @@ const Gi = {
|
|
|
5656
5652
|
a.push({
|
|
5657
5653
|
id: `task:${i.id}`,
|
|
5658
5654
|
title: i.content,
|
|
5659
|
-
url:
|
|
5655
|
+
url: Mt(i.id)
|
|
5660
5656
|
});
|
|
5661
5657
|
for (const i of n)
|
|
5662
5658
|
a.push({
|
|
@@ -5797,10 +5793,10 @@ const nc = s.object({
|
|
|
5797
5793
|
outputSchema: ic,
|
|
5798
5794
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5799
5795
|
async execute(e, t) {
|
|
5800
|
-
const { filters: r } = e, o = [], a = r.map((
|
|
5801
|
-
const
|
|
5802
|
-
return
|
|
5803
|
-
}).filter((
|
|
5796
|
+
const { filters: r } = e, o = [], a = r.map((m) => {
|
|
5797
|
+
const h = lc(m);
|
|
5798
|
+
return h !== null ? { kind: "skipped", reason: h } : (o.push(m), { kind: "updated", filter: m });
|
|
5799
|
+
}).filter((m) => m.kind === "skipped").length;
|
|
5804
5800
|
if (o.length === 0)
|
|
5805
5801
|
return {
|
|
5806
5802
|
textContent: `Updated 0 filters (${a} skipped - no changes)`,
|
|
@@ -5811,29 +5807,29 @@ const nc = s.object({
|
|
|
5811
5807
|
appliedOperations: { updateCount: 0, skippedCount: a }
|
|
5812
5808
|
}
|
|
5813
5809
|
};
|
|
5814
|
-
const i = o.map((
|
|
5815
|
-
const { id:
|
|
5810
|
+
const i = o.map((m) => {
|
|
5811
|
+
const { id: h, color: y, ...f } = m;
|
|
5816
5812
|
return V("filter_update", {
|
|
5817
|
-
id:
|
|
5813
|
+
id: h,
|
|
5818
5814
|
...f,
|
|
5819
5815
|
...y !== void 0 ? { color: y } : {}
|
|
5820
5816
|
});
|
|
5821
5817
|
});
|
|
5822
5818
|
await t.sync({ commands: i });
|
|
5823
|
-
const d = ((await t.sync({ resourceTypes: ["filters"], syncToken: "*" })).filters ?? []).filter((
|
|
5824
|
-
id:
|
|
5825
|
-
name:
|
|
5826
|
-
query:
|
|
5827
|
-
color: ue.parse(
|
|
5828
|
-
isFavorite:
|
|
5829
|
-
itemOrder:
|
|
5819
|
+
const d = ((await t.sync({ resourceTypes: ["filters"], syncToken: "*" })).filters ?? []).filter((m) => !m.isDeleted), l = new Set(o.map((m) => m.id)), u = d.filter((m) => l.has(m.id)).map((m) => ({
|
|
5820
|
+
id: m.id,
|
|
5821
|
+
name: m.name,
|
|
5822
|
+
query: m.query,
|
|
5823
|
+
color: ue.parse(m.color),
|
|
5824
|
+
isFavorite: m.isFavorite,
|
|
5825
|
+
itemOrder: m.itemOrder
|
|
5830
5826
|
}));
|
|
5831
5827
|
return {
|
|
5832
5828
|
textContent: dc({ filters: u, skippedCount: a }),
|
|
5833
5829
|
structuredContent: {
|
|
5834
5830
|
filters: u,
|
|
5835
5831
|
totalCount: u.length,
|
|
5836
|
-
updatedFilterIds: u.map((
|
|
5832
|
+
updatedFilterIds: u.map((m) => m.id),
|
|
5837
5833
|
appliedOperations: {
|
|
5838
5834
|
updateCount: u.length,
|
|
5839
5835
|
skippedCount: a
|
|
@@ -5872,11 +5868,11 @@ const uc = s.object({
|
|
|
5872
5868
|
),
|
|
5873
5869
|
name: s.string().min(1).describe("The current name of the shared label."),
|
|
5874
5870
|
newName: s.string().min(1).describe("The new name for the shared label.")
|
|
5875
|
-
}),
|
|
5871
|
+
}), mc = s.discriminatedUnion("labelType", [
|
|
5876
5872
|
uc,
|
|
5877
5873
|
pc
|
|
5878
|
-
]),
|
|
5879
|
-
labels: s.array(
|
|
5874
|
+
]), hc = {
|
|
5875
|
+
labels: s.array(mc).min(1).describe(
|
|
5880
5876
|
'The labels to update. Use labelType="personal" with an ID to update a personal label, or labelType="shared" with name+newName to rename a shared label.'
|
|
5881
5877
|
)
|
|
5882
5878
|
}, fc = s.object({
|
|
@@ -5894,17 +5890,17 @@ const uc = s.object({
|
|
|
5894
5890
|
}, gc = {
|
|
5895
5891
|
name: g.UPDATE_LABELS,
|
|
5896
5892
|
description: "Update one or more existing labels. Personal labels (identified by ID) can have their name, color, order, and favorite flag updated. Shared labels (identified by name) can only be renamed.",
|
|
5897
|
-
parameters:
|
|
5893
|
+
parameters: hc,
|
|
5898
5894
|
outputSchema: bc,
|
|
5899
5895
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5900
5896
|
async execute(e, t) {
|
|
5901
5897
|
const { labels: r } = e, o = await Promise.all(
|
|
5902
5898
|
r.map(async (u) => {
|
|
5903
5899
|
if (u.labelType === "personal") {
|
|
5904
|
-
const
|
|
5905
|
-
if (
|
|
5906
|
-
const { id:
|
|
5907
|
-
return { kind: "updated", label: await t.updateLabel(
|
|
5900
|
+
const m = Tc(u);
|
|
5901
|
+
if (m !== null) return { kind: "skipped", reason: m };
|
|
5902
|
+
const { id: h, labelType: y, ...f } = u;
|
|
5903
|
+
return { kind: "updated", label: await t.updateLabel(h, f) };
|
|
5908
5904
|
}
|
|
5909
5905
|
return await t.renameSharedLabel({
|
|
5910
5906
|
name: u.name,
|
|
@@ -6005,10 +6001,10 @@ const kc = s.object({
|
|
|
6005
6001
|
async execute(e, t) {
|
|
6006
6002
|
const { projects: r } = e, o = await Promise.allSettled(
|
|
6007
6003
|
r.map(async (l) => {
|
|
6008
|
-
const u =
|
|
6004
|
+
const u = jc(l);
|
|
6009
6005
|
if (u !== null) return { kind: "skipped", reason: u };
|
|
6010
|
-
const { id: p, ...
|
|
6011
|
-
return { kind: "updated", project: await O(() => t.updateProject(p,
|
|
6006
|
+
const { id: p, ...m } = l;
|
|
6007
|
+
return { kind: "updated", project: await O(() => t.updateProject(p, m)) };
|
|
6012
6008
|
})
|
|
6013
6009
|
), n = [], a = [];
|
|
6014
6010
|
let i = 0, c = 0;
|
|
@@ -6016,14 +6012,14 @@ const kc = s.object({
|
|
|
6016
6012
|
if (u.status === "rejected") {
|
|
6017
6013
|
a.push({
|
|
6018
6014
|
item: r[l]?.id ?? `Project ${l + 1}`,
|
|
6019
|
-
error:
|
|
6015
|
+
error: z(u.reason)
|
|
6020
6016
|
});
|
|
6021
6017
|
continue;
|
|
6022
6018
|
}
|
|
6023
6019
|
u.value.kind === "updated" ? n.push(Z(u.value.project)) : u.value.reason === "no-fields" ? i++ : c++;
|
|
6024
6020
|
}
|
|
6025
6021
|
return {
|
|
6026
|
-
textContent:
|
|
6022
|
+
textContent: Sc({
|
|
6027
6023
|
projects: n,
|
|
6028
6024
|
skippedNoFields: i,
|
|
6029
6025
|
skippedNoValidValues: c,
|
|
@@ -6043,7 +6039,7 @@ const kc = s.object({
|
|
|
6043
6039
|
};
|
|
6044
6040
|
}
|
|
6045
6041
|
};
|
|
6046
|
-
function
|
|
6042
|
+
function Sc({
|
|
6047
6043
|
projects: e,
|
|
6048
6044
|
skippedNoFields: t,
|
|
6049
6045
|
skippedNoValidValues: r,
|
|
@@ -6056,7 +6052,7 @@ function jc({
|
|
|
6056
6052
|
return t > 0 && c.push(`${t} skipped - no changes`), r > 0 && c.push(`${r} skipped - no valid field values`), c.length > 0 && (i += ` (${c.join(", ")})`), n > 0 && (i += `:
|
|
6057
6053
|
${a}`), at(i, o);
|
|
6058
6054
|
}
|
|
6059
|
-
function
|
|
6055
|
+
function jc({ id: e, ...t }) {
|
|
6060
6056
|
const r = Object.values(t);
|
|
6061
6057
|
return r.length === 0 ? "no-fields" : r.every((o) => o === void 0) ? "no-valid-values" : null;
|
|
6062
6058
|
}
|
|
@@ -6064,13 +6060,13 @@ const Cc = s.object({
|
|
|
6064
6060
|
type: s.literal("relative"),
|
|
6065
6061
|
id: s.string().min(1).describe("The ID of the relative reminder to update."),
|
|
6066
6062
|
minuteOffset: s.number().int().min(0).optional().describe("New minute offset before task due time."),
|
|
6067
|
-
service:
|
|
6063
|
+
service: je.optional().describe('New delivery method: "email" or "push".'),
|
|
6068
6064
|
isUrgent: Ce
|
|
6069
6065
|
}), $c = s.object({
|
|
6070
6066
|
type: s.literal("absolute"),
|
|
6071
6067
|
id: s.string().min(1).describe("The ID of the absolute reminder to update."),
|
|
6072
6068
|
due: cs.optional().describe("New due date/time for the reminder."),
|
|
6073
|
-
service:
|
|
6069
|
+
service: je.optional().describe('New delivery method: "email" or "push".'),
|
|
6074
6070
|
isUrgent: Ce
|
|
6075
6071
|
}), Dc = s.object({
|
|
6076
6072
|
type: s.literal("location"),
|
|
@@ -6147,17 +6143,17 @@ const Cc = s.object({
|
|
|
6147
6143
|
).optional()
|
|
6148
6144
|
}).refine((e) => e.name !== void 0 || e.description !== void 0, {
|
|
6149
6145
|
message: 'Provide at least one of "name" or "description" to update.'
|
|
6150
|
-
}),
|
|
6146
|
+
}), _c = {
|
|
6151
6147
|
sections: s.array(Pc).min(1).describe("The sections to update.")
|
|
6152
|
-
},
|
|
6148
|
+
}, Rc = {
|
|
6153
6149
|
sections: s.array(X).describe("The updated sections."),
|
|
6154
6150
|
totalCount: s.number().describe("The total number of sections updated."),
|
|
6155
6151
|
updatedSectionIds: s.array(s.string()).describe("The IDs of the updated sections.")
|
|
6156
6152
|
}, Uc = {
|
|
6157
6153
|
name: g.UPDATE_SECTIONS,
|
|
6158
6154
|
description: "Update multiple existing sections with new values.",
|
|
6159
|
-
parameters:
|
|
6160
|
-
outputSchema:
|
|
6155
|
+
parameters: _c,
|
|
6156
|
+
outputSchema: Rc,
|
|
6161
6157
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
6162
6158
|
async execute({ sections: e }, t) {
|
|
6163
6159
|
const r = await Promise.all(
|
|
@@ -6174,7 +6170,7 @@ const Cc = s.object({
|
|
|
6174
6170
|
sections: r
|
|
6175
6171
|
}),
|
|
6176
6172
|
structuredContent: {
|
|
6177
|
-
sections: r.map(
|
|
6173
|
+
sections: r.map(K),
|
|
6178
6174
|
totalCount: r.length,
|
|
6179
6175
|
updatedSectionIds: r.map((n) => n.id)
|
|
6180
6176
|
}
|
|
@@ -6187,13 +6183,13 @@ function Lc({ sections: e }) {
|
|
|
6187
6183
|
return `Updated ${t} section${t === 1 ? "" : "s"}:
|
|
6188
6184
|
${r}`;
|
|
6189
6185
|
}
|
|
6190
|
-
function
|
|
6186
|
+
function Ss(e, t) {
|
|
6191
6187
|
return t.projectId !== void 0 ? e.projectId === t.projectId && !e.sectionId && !e.parentId : t.sectionId !== void 0 ? e.sectionId === t.sectionId && !e.parentId : e.parentId === t.parentId;
|
|
6192
6188
|
}
|
|
6193
|
-
function
|
|
6189
|
+
function Nc(e, t) {
|
|
6194
6190
|
return t.projectId !== void 0 ? e.projectId === t.projectId : t.sectionId !== void 0 ? e.sectionId === t.sectionId : e.parentId === t.parentId;
|
|
6195
6191
|
}
|
|
6196
|
-
function
|
|
6192
|
+
function Mc(e) {
|
|
6197
6193
|
return e.projectId !== void 0 ? `project:${e.projectId}` : e.sectionId !== void 0 ? `section:${e.sectionId}` : `parent:${e.parentId}`;
|
|
6198
6194
|
}
|
|
6199
6195
|
function Fc(e) {
|
|
@@ -6210,7 +6206,7 @@ function Hc({
|
|
|
6210
6206
|
return { redundantMoveSkipped: !1 };
|
|
6211
6207
|
let n = o, a = !1;
|
|
6212
6208
|
if (r) {
|
|
6213
|
-
const i = o.length === 1 ? (c) =>
|
|
6209
|
+
const i = o.length === 1 ? (c) => Ss(r, c) : (c) => Nc(r, c);
|
|
6214
6210
|
n = o.filter((c) => !i(c)), a = n.length < o.length;
|
|
6215
6211
|
}
|
|
6216
6212
|
if (n.length === 0)
|
|
@@ -6266,9 +6262,9 @@ const Wc = s.object({
|
|
|
6266
6262
|
isUncompletable: s.boolean().optional().describe(
|
|
6267
6263
|
"Whether this task should be uncompletable (organizational header). Tasks with isUncompletable: true appear as organizational headers and cannot be completed."
|
|
6268
6264
|
)
|
|
6269
|
-
}), Bc = (e) => !!(e.projectId || e.sectionId || e.parentId),
|
|
6270
|
-
tasks: s.array(Wc).min(1).max(
|
|
6271
|
-
},
|
|
6265
|
+
}), Bc = (e) => !!(e.projectId || e.sectionId || e.parentId), js = (e) => Object.keys(e).length > 0, zc = ["remove", "no date"], Kc = ["remove", "no date", "no deadline"], qc = "no date", Ye = Kt.TASKS_PER_OPERATION, Ot = {
|
|
6266
|
+
tasks: s.array(Wc).min(1).max(Ye).describe(`The tasks to update (max ${Ye}).`)
|
|
6267
|
+
}, Yc = {
|
|
6272
6268
|
tasks: s.array(F).describe("The updated tasks."),
|
|
6273
6269
|
totalCount: s.number().describe("The total number of tasks updated."),
|
|
6274
6270
|
updatedTaskIds: s.array(s.string()).describe("The IDs of the updated tasks."),
|
|
@@ -6283,17 +6279,17 @@ const Wc = s.object({
|
|
|
6283
6279
|
"Moves not performed because the task was already in the requested destination. A non-zero count means container fields were sent that did not need to be."
|
|
6284
6280
|
)
|
|
6285
6281
|
}).describe("Summary of operations performed.")
|
|
6286
|
-
},
|
|
6282
|
+
}, Gc = {
|
|
6287
6283
|
name: g.UPDATE_TASKS,
|
|
6288
6284
|
description: "Update existing tasks including content, dates, priorities, and assignments. Send only the fields that change.",
|
|
6289
6285
|
parameters: Ot,
|
|
6290
|
-
outputSchema:
|
|
6286
|
+
outputSchema: Yc,
|
|
6291
6287
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
6292
6288
|
async execute(e, t) {
|
|
6293
6289
|
const { tasks: r } = s.object(Ot).parse(e), o = r.map(() => ({ kind: "skipped" })), n = (T, b) => {
|
|
6294
6290
|
o[T] = { kind: "failed", error: b };
|
|
6295
6291
|
}, a = (T, b) => {
|
|
6296
|
-
n(T,
|
|
6292
|
+
n(T, z(b));
|
|
6297
6293
|
}, i = r.map((T, b) => ({ task: T, index: b })).filter(({ task: T }) => rd(T)), c = await Jc(
|
|
6298
6294
|
i.map(({ task: T }) => T),
|
|
6299
6295
|
t
|
|
@@ -6301,8 +6297,8 @@ const Wc = s.object({
|
|
|
6301
6297
|
i.map(({ task: T, index: b }) => ed({ task: T, index: b, client: t, inbox: c }))
|
|
6302
6298
|
), l = [];
|
|
6303
6299
|
for (const [T, b] of d.entries()) {
|
|
6304
|
-
const
|
|
6305
|
-
b.status === "fulfilled" ? l.push(b.value) : a(
|
|
6300
|
+
const S = i[T]?.index ?? T;
|
|
6301
|
+
b.status === "fulfilled" ? l.push(b.value) : a(S, b.reason);
|
|
6306
6302
|
}
|
|
6307
6303
|
const u = await Cs({
|
|
6308
6304
|
client: t,
|
|
@@ -6323,26 +6319,26 @@ const Wc = s.object({
|
|
|
6323
6319
|
} catch (b) {
|
|
6324
6320
|
a(T.index, b), T.failed = !0;
|
|
6325
6321
|
}
|
|
6326
|
-
const
|
|
6327
|
-
const b = T.filter((
|
|
6328
|
-
b.length !== 0 &&
|
|
6322
|
+
const m = /* @__PURE__ */ new Map(), h = [], y = (T) => {
|
|
6323
|
+
const b = T.filter((S) => !S.failed);
|
|
6324
|
+
b.length !== 0 && h.push(
|
|
6329
6325
|
Qc({
|
|
6330
6326
|
client: t,
|
|
6331
6327
|
items: b,
|
|
6332
|
-
onUpdated: (
|
|
6333
|
-
o[
|
|
6328
|
+
onUpdated: (S, $) => {
|
|
6329
|
+
o[S.index] = { kind: "updated", task: $ };
|
|
6334
6330
|
},
|
|
6335
|
-
onFailed: (
|
|
6336
|
-
const D =
|
|
6331
|
+
onFailed: (S, $) => {
|
|
6332
|
+
const D = m.get(S.index);
|
|
6337
6333
|
if (D && "task" in D) {
|
|
6338
|
-
o[
|
|
6334
|
+
o[S.index] = {
|
|
6339
6335
|
kind: "partial",
|
|
6340
6336
|
task: D.task,
|
|
6341
|
-
error: `Move applied; field update failed: ${
|
|
6337
|
+
error: `Move applied; field update failed: ${z($)}`
|
|
6342
6338
|
};
|
|
6343
6339
|
return;
|
|
6344
6340
|
}
|
|
6345
|
-
a(
|
|
6341
|
+
a(S.index, $);
|
|
6346
6342
|
}
|
|
6347
6343
|
})
|
|
6348
6344
|
);
|
|
@@ -6350,31 +6346,31 @@ const Wc = s.object({
|
|
|
6350
6346
|
y(l.filter((T) => !f.has(T.index))), await Xc({
|
|
6351
6347
|
client: t,
|
|
6352
6348
|
moving: p,
|
|
6353
|
-
results:
|
|
6349
|
+
results: m,
|
|
6354
6350
|
onResolved: (T) => {
|
|
6355
6351
|
const b = [];
|
|
6356
|
-
for (const { item:
|
|
6357
|
-
const $ =
|
|
6352
|
+
for (const { item: S } of T) {
|
|
6353
|
+
const $ = m.get(S.index);
|
|
6358
6354
|
if ($ && "error" in $) {
|
|
6359
|
-
n(
|
|
6355
|
+
n(S.index, $.error), S.failed = !0;
|
|
6360
6356
|
continue;
|
|
6361
6357
|
}
|
|
6362
|
-
b.push(
|
|
6358
|
+
b.push(S);
|
|
6363
6359
|
}
|
|
6364
6360
|
y(b);
|
|
6365
6361
|
}
|
|
6366
|
-
}), await Promise.all(
|
|
6362
|
+
}), await Promise.all(h);
|
|
6367
6363
|
for (const T of l) {
|
|
6368
|
-
if (T.failed ||
|
|
6364
|
+
if (T.failed || js(T.updateArgs))
|
|
6369
6365
|
continue;
|
|
6370
|
-
const b =
|
|
6366
|
+
const b = m.get(T.index);
|
|
6371
6367
|
b && "task" in b && (o[T.index] = { kind: "updated", task: b.task });
|
|
6372
6368
|
}
|
|
6373
|
-
const { updatedTasks: v, failures:
|
|
6369
|
+
const { updatedTasks: v, failures: j, skippedCount: A } = Vc({ tasks: r, outcomes: o }), k = l.filter((T) => T.redundantMoveSkipped).length, I = v.map(P);
|
|
6374
6370
|
return {
|
|
6375
6371
|
textContent: sd({
|
|
6376
6372
|
tasks: I,
|
|
6377
|
-
failures:
|
|
6373
|
+
failures: j,
|
|
6378
6374
|
skippedCount: A,
|
|
6379
6375
|
redundantMovesSkipped: k
|
|
6380
6376
|
}),
|
|
@@ -6382,11 +6378,11 @@ const Wc = s.object({
|
|
|
6382
6378
|
tasks: I,
|
|
6383
6379
|
totalCount: I.length,
|
|
6384
6380
|
updatedTaskIds: v.map((T) => T.id),
|
|
6385
|
-
failures:
|
|
6381
|
+
failures: j,
|
|
6386
6382
|
appliedOperations: {
|
|
6387
6383
|
updateCount: I.length,
|
|
6388
6384
|
skippedCount: A,
|
|
6389
|
-
failureCount:
|
|
6385
|
+
failureCount: j.length,
|
|
6390
6386
|
redundantMovesSkipped: k
|
|
6391
6387
|
}
|
|
6392
6388
|
}
|
|
@@ -6411,7 +6407,7 @@ function Vc({ tasks: e, outcomes: t }) {
|
|
|
6411
6407
|
return { updatedTasks: r, failures: o, skippedCount: n };
|
|
6412
6408
|
}
|
|
6413
6409
|
async function Jc(e, t) {
|
|
6414
|
-
if (!e.some((r) =>
|
|
6410
|
+
if (!e.some((r) => N(r.projectId)))
|
|
6415
6411
|
return {};
|
|
6416
6412
|
try {
|
|
6417
6413
|
return { projectId: (await O(() => t.getUser())).inboxProjectId };
|
|
@@ -6429,7 +6425,7 @@ async function Cs({
|
|
|
6429
6425
|
try {
|
|
6430
6426
|
const o = new Set(t), n = {
|
|
6431
6427
|
ids: t.join(","),
|
|
6432
|
-
limit:
|
|
6428
|
+
limit: Ye
|
|
6433
6429
|
}, { results: a } = await O(() => e.getTasks(n));
|
|
6434
6430
|
for (const i of a)
|
|
6435
6431
|
o.has(i.id) && r.set(i.id, i);
|
|
@@ -6447,7 +6443,7 @@ async function Xc({
|
|
|
6447
6443
|
return;
|
|
6448
6444
|
const n = /* @__PURE__ */ new Map();
|
|
6449
6445
|
for (const c of t) {
|
|
6450
|
-
const d =
|
|
6446
|
+
const d = Mc(c.move), l = n.get(d);
|
|
6451
6447
|
l ? l.push(c) : n.set(d, [c]);
|
|
6452
6448
|
}
|
|
6453
6449
|
const a = lr(e), i = [];
|
|
@@ -6463,15 +6459,15 @@ async function Xc({
|
|
|
6463
6459
|
}
|
|
6464
6460
|
const p = await a(
|
|
6465
6461
|
() => O(() => e.moveTasks(d, l))
|
|
6466
|
-
),
|
|
6462
|
+
), m = new Map(p.map((f) => [f.id, f])), h = [], y = [];
|
|
6467
6463
|
for (const f of c) {
|
|
6468
|
-
const v =
|
|
6469
|
-
v ? (r.set(f.item.index, { task: v }), y.push(f)) :
|
|
6464
|
+
const v = m.get(f.item.id);
|
|
6465
|
+
v ? (r.set(f.item.index, { task: v }), y.push(f)) : h.push(f);
|
|
6470
6466
|
}
|
|
6471
|
-
o(y),
|
|
6467
|
+
o(y), h.length > 0 && i.push({ group: h, destination: l });
|
|
6472
6468
|
} catch (p) {
|
|
6473
6469
|
if (u) {
|
|
6474
|
-
r.set(u.item.index, { error:
|
|
6470
|
+
r.set(u.item.index, { error: z(p) }), o(c);
|
|
6475
6471
|
continue;
|
|
6476
6472
|
}
|
|
6477
6473
|
i.push({ group: c, destination: l, error: p });
|
|
@@ -6490,10 +6486,10 @@ async function Zc({
|
|
|
6490
6486
|
}) {
|
|
6491
6487
|
const o = [...new Set(t.flatMap(({ group: a }) => a.map(({ item: i }) => i.id)))], n = await Cs({ client: e, ids: o });
|
|
6492
6488
|
for (const { group: a, destination: i, error: c } of t) {
|
|
6493
|
-
const d = c === void 0 ? "Task not returned by the move" :
|
|
6489
|
+
const d = c === void 0 ? "Task not returned by the move" : z(c);
|
|
6494
6490
|
for (const { item: l } of a) {
|
|
6495
6491
|
const u = n.get(l.id);
|
|
6496
|
-
if (u &&
|
|
6492
|
+
if (u && Ss(u, i)) {
|
|
6497
6493
|
r.set(l.index, { task: u });
|
|
6498
6494
|
continue;
|
|
6499
6495
|
}
|
|
@@ -6509,7 +6505,7 @@ async function Qc({
|
|
|
6509
6505
|
}) {
|
|
6510
6506
|
const n = ur(e);
|
|
6511
6507
|
await Promise.all(
|
|
6512
|
-
t.filter((a) =>
|
|
6508
|
+
t.filter((a) => js(a.updateArgs)).map(async (a) => {
|
|
6513
6509
|
try {
|
|
6514
6510
|
const i = await n(
|
|
6515
6511
|
() => O(() => e.updateTask(a.id, a.updateArgs))
|
|
@@ -6536,25 +6532,25 @@ async function ed({
|
|
|
6536
6532
|
duration: l,
|
|
6537
6533
|
responsibleUser: u,
|
|
6538
6534
|
priority: p,
|
|
6539
|
-
labels:
|
|
6540
|
-
deadlineDate:
|
|
6535
|
+
labels: m,
|
|
6536
|
+
deadlineDate: h,
|
|
6541
6537
|
...y
|
|
6542
6538
|
} = e;
|
|
6543
|
-
if (
|
|
6539
|
+
if (N(a) && o.error !== void 0)
|
|
6544
6540
|
throw o.error;
|
|
6545
|
-
const f =
|
|
6541
|
+
const f = N(a) ? o.projectId : a;
|
|
6546
6542
|
let v = {
|
|
6547
6543
|
...y,
|
|
6548
|
-
...
|
|
6544
|
+
...m !== void 0 && { labels: m }
|
|
6549
6545
|
};
|
|
6550
6546
|
p && (v.priority = Zt(p));
|
|
6551
|
-
const
|
|
6547
|
+
const j = Pt(
|
|
6552
6548
|
d,
|
|
6553
|
-
|
|
6554
|
-
|
|
6549
|
+
zc,
|
|
6550
|
+
qc
|
|
6555
6551
|
);
|
|
6556
|
-
|
|
6557
|
-
const A = Pt(
|
|
6552
|
+
j !== void 0 && (v = { ...v, dueString: j });
|
|
6553
|
+
const A = Pt(h, Kc, null);
|
|
6558
6554
|
if (A !== void 0 && (v = { ...v, deadlineDate: A }), l)
|
|
6559
6555
|
try {
|
|
6560
6556
|
const { minutes: k } = Xt(l);
|
|
@@ -6564,7 +6560,7 @@ async function ed({
|
|
|
6564
6560
|
durationUnit: "minute"
|
|
6565
6561
|
};
|
|
6566
6562
|
} catch (k) {
|
|
6567
|
-
throw k instanceof
|
|
6563
|
+
throw k instanceof _ ? new Error(`Task ${n}: ${k.message}`) : k;
|
|
6568
6564
|
}
|
|
6569
6565
|
return u !== void 0 && (v = {
|
|
6570
6566
|
...v,
|
|
@@ -6686,8 +6682,8 @@ function pd(e, t) {
|
|
|
6686
6682
|
hour12: !1
|
|
6687
6683
|
});
|
|
6688
6684
|
}
|
|
6689
|
-
async function
|
|
6690
|
-
const t = await e.getUser(), r = t.tzInfo?.timezone ?? "UTC", o = $s(r), n = /* @__PURE__ */ new Date(), a = pd(n, o), i = t.startDay ?? 1, c = ld(i), d = ad(t), l = new Date(n.toLocaleString("en-US", { timeZone: o })), u = id(l, i), p = cd(u),
|
|
6685
|
+
async function md(e) {
|
|
6686
|
+
const t = await e.getUser(), r = t.tzInfo?.timezone ?? "UTC", o = $s(r), n = /* @__PURE__ */ new Date(), a = pd(n, o), i = t.startDay ?? 1, c = ld(i), d = ad(t), l = new Date(n.toLocaleString("en-US", { timeZone: o })), u = id(l, i), p = cd(u), m = dd(l), y = [
|
|
6691
6687
|
"# User Information",
|
|
6692
6688
|
"",
|
|
6693
6689
|
`**User ID:** ${t.id}`,
|
|
@@ -6698,7 +6694,7 @@ async function hd(e) {
|
|
|
6698
6694
|
"",
|
|
6699
6695
|
"## Week Settings",
|
|
6700
6696
|
`**Week Start Day:** ${c} (${i})`,
|
|
6701
|
-
`**Current Week:** Week ${
|
|
6697
|
+
`**Current Week:** Week ${m}`,
|
|
6702
6698
|
`**Week Start Date:** ${ie(u)}`,
|
|
6703
6699
|
`**Week End Date:** ${ie(p)}`,
|
|
6704
6700
|
"",
|
|
@@ -6720,7 +6716,7 @@ async function hd(e) {
|
|
|
6720
6716
|
startDayName: c,
|
|
6721
6717
|
weekStartDate: ie(u),
|
|
6722
6718
|
weekEndDate: ie(p),
|
|
6723
|
-
currentWeekNumber:
|
|
6719
|
+
currentWeekNumber: m,
|
|
6724
6720
|
completedToday: t.completedToday,
|
|
6725
6721
|
dailyGoal: t.dailyGoal,
|
|
6726
6722
|
weeklyGoal: t.weeklyGoal,
|
|
@@ -6729,20 +6725,20 @@ async function hd(e) {
|
|
|
6729
6725
|
};
|
|
6730
6726
|
return { textContent: y, structuredContent: f };
|
|
6731
6727
|
}
|
|
6732
|
-
const
|
|
6728
|
+
const hd = {
|
|
6733
6729
|
name: g.USER_INFO,
|
|
6734
6730
|
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).",
|
|
6735
6731
|
parameters: od,
|
|
6736
6732
|
outputSchema: nd,
|
|
6737
6733
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
6738
6734
|
async execute(e, t) {
|
|
6739
|
-
const r = await
|
|
6735
|
+
const r = await md(t);
|
|
6740
6736
|
return {
|
|
6741
6737
|
textContent: r.textContent,
|
|
6742
6738
|
structuredContent: r.structuredContent
|
|
6743
6739
|
};
|
|
6744
6740
|
}
|
|
6745
|
-
},
|
|
6741
|
+
}, _t = 10 * 1024 * 1024, fd = /* @__PURE__ */ new Set([
|
|
6746
6742
|
"image/png",
|
|
6747
6743
|
"image/jpeg",
|
|
6748
6744
|
"image/gif",
|
|
@@ -6810,24 +6806,24 @@ const vd = {
|
|
|
6810
6806
|
},
|
|
6811
6807
|
async execute({ fileUrl: e }, t) {
|
|
6812
6808
|
const r = await t.viewAttachment(e), o = r.headers["content-length"], n = o ? Number.parseInt(o, 10) : void 0, a = wd(e), i = r.headers["content-type"], c = i ? Td(i) : void 0, d = c && c !== "application/octet-stream" ? c : kd(e) ?? c ?? "application/octet-stream";
|
|
6813
|
-
if (n && n >
|
|
6809
|
+
if (n && n > _t)
|
|
6814
6810
|
return {
|
|
6815
6811
|
textContent: `Attachment "${a ?? e}" is too large to display inline (${(n / 1024 / 1024).toFixed(1)}MB, limit is 10MB). File type: ${d}`
|
|
6816
6812
|
};
|
|
6817
6813
|
const l = Buffer.from(await r.arrayBuffer()), u = l.byteLength;
|
|
6818
|
-
if (u >
|
|
6814
|
+
if (u > _t)
|
|
6819
6815
|
return {
|
|
6820
6816
|
textContent: `Attachment "${a ?? e}" is too large to display inline (${(u / 1024 / 1024).toFixed(1)}MB, limit is 10MB). File type: ${d}`
|
|
6821
6817
|
};
|
|
6822
|
-
const p = yd(d),
|
|
6823
|
-
return p === "image" ?
|
|
6818
|
+
const p = yd(d), m = [];
|
|
6819
|
+
return p === "image" ? m.push({
|
|
6824
6820
|
type: "image",
|
|
6825
6821
|
data: l.toString("base64"),
|
|
6826
6822
|
mimeType: d
|
|
6827
|
-
}) : p === "text" ?
|
|
6823
|
+
}) : p === "text" ? m.push({
|
|
6828
6824
|
type: "text",
|
|
6829
6825
|
text: l.toString("utf-8")
|
|
6830
|
-
}) :
|
|
6826
|
+
}) : m.push({
|
|
6831
6827
|
type: "resource",
|
|
6832
6828
|
resource: {
|
|
6833
6829
|
uri: e,
|
|
@@ -6836,32 +6832,32 @@ const vd = {
|
|
|
6836
6832
|
}
|
|
6837
6833
|
}), {
|
|
6838
6834
|
textContent: `Attachment: ${a ?? "unknown"} (${d}, ${(u / 1024).toFixed(1)}KB)`,
|
|
6839
|
-
contentItems:
|
|
6835
|
+
contentItems: m
|
|
6840
6836
|
};
|
|
6841
6837
|
}
|
|
6842
|
-
},
|
|
6838
|
+
}, Sd = {
|
|
6843
6839
|
...Pa,
|
|
6844
6840
|
_meta: {
|
|
6845
6841
|
ui: {
|
|
6846
6842
|
resourceUri: Le
|
|
6847
6843
|
}
|
|
6848
6844
|
}
|
|
6849
|
-
},
|
|
6845
|
+
}, jd = {
|
|
6850
6846
|
// Task management tools
|
|
6851
6847
|
addTasks: pn,
|
|
6852
6848
|
completeTasks: wn,
|
|
6853
6849
|
uncompleteTasks: Zi,
|
|
6854
|
-
updateTasks:
|
|
6855
|
-
rescheduleTasks:
|
|
6850
|
+
updateTasks: Gc,
|
|
6851
|
+
rescheduleTasks: Ki,
|
|
6856
6852
|
findTasks: Fa,
|
|
6857
|
-
findTasksByDate:
|
|
6853
|
+
findTasksByDate: Sd,
|
|
6858
6854
|
findCompletedTasks: aa,
|
|
6859
6855
|
// Project management tools
|
|
6860
|
-
addProjects:
|
|
6856
|
+
addProjects: Yo,
|
|
6861
6857
|
updateProjects: Ic,
|
|
6862
6858
|
findProjects: ka,
|
|
6863
|
-
projectManagement:
|
|
6864
|
-
projectMove:
|
|
6859
|
+
projectManagement: Ri,
|
|
6860
|
+
projectMove: Ni,
|
|
6865
6861
|
// Section management tools
|
|
6866
6862
|
addSections: an,
|
|
6867
6863
|
updateSections: Uc,
|
|
@@ -6872,7 +6868,7 @@ const vd = {
|
|
|
6872
6868
|
updateComments: rc,
|
|
6873
6869
|
// Reminder management tools
|
|
6874
6870
|
addReminders: tn,
|
|
6875
|
-
findReminders:
|
|
6871
|
+
findReminders: Sa,
|
|
6876
6872
|
updateReminders: Oc,
|
|
6877
6873
|
// Attachment tools
|
|
6878
6874
|
viewAttachment: Id,
|
|
@@ -6885,7 +6881,7 @@ const vd = {
|
|
|
6885
6881
|
addFilters: Oo,
|
|
6886
6882
|
updateFilters: cc,
|
|
6887
6883
|
// Activity and audit tools
|
|
6888
|
-
findActivity:
|
|
6884
|
+
findActivity: zn,
|
|
6889
6885
|
getProductivityStats: Qa,
|
|
6890
6886
|
// Health and insights tools
|
|
6891
6887
|
getProjectHealth: ui,
|
|
@@ -6894,12 +6890,12 @@ const vd = {
|
|
|
6894
6890
|
getWorkspaceInsights: fi,
|
|
6895
6891
|
// General tools
|
|
6896
6892
|
getOverview: Ja,
|
|
6897
|
-
deleteObject:
|
|
6893
|
+
deleteObject: jn,
|
|
6898
6894
|
fetchObject: Ln,
|
|
6899
6895
|
reorderObjects: Hi,
|
|
6900
|
-
userInfo:
|
|
6896
|
+
userInfo: hd,
|
|
6901
6897
|
// Assignment and collaboration tools
|
|
6902
|
-
findProjectCollaborators:
|
|
6898
|
+
findProjectCollaborators: ha,
|
|
6903
6899
|
manageAssignments: Oi,
|
|
6904
6900
|
// Template tools
|
|
6905
6901
|
exportProjectTemplate: Dn,
|
|
@@ -6909,7 +6905,7 @@ const vd = {
|
|
|
6909
6905
|
// OpenAI MCP tools
|
|
6910
6906
|
search: Vi,
|
|
6911
6907
|
fetch: Fn
|
|
6912
|
-
}, Cd = Object.values(
|
|
6908
|
+
}, Cd = Object.values(jd), $d = `
|
|
6913
6909
|
## Todoist Task and Project Management Tools
|
|
6914
6910
|
|
|
6915
6911
|
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.
|
|
@@ -6921,95 +6917,43 @@ You have access to comprehensive Todoist management tools for personal productiv
|
|
|
6921
6917
|
- Bulk assignment operations for team workflows
|
|
6922
6918
|
- Get overviews and insights about workload and progress
|
|
6923
6919
|
|
|
6924
|
-
###
|
|
6925
|
-
|
|
6926
|
-
**Task Management:**
|
|
6927
|
-
- **add-tasks**: Create tasks (max 25 per call) with content, description, priority (\`p1\`, \`p2\`, \`p3\`, \`p4\` strings only; \`p1\` highest and \`p4\` lowest/default; integers are not accepted), dueString (natural language like "tomorrow", "next Friday", "2024-12-25"; also use natural language for recurrences and do not prefix them with \`recurring\`), deadlineDate (ISO 8601 format like "2025-12-31" for immovable constraints), duration (formats like "2h", "90m", "2h30m"), and assignments to project collaborators
|
|
6928
|
-
- **update-tasks**: Modify existing tasks - get task IDs from search results first, only include fields that need changes. Supports priority updates using \`p1\`/\`p2\`/\`p3\`/\`p4\` string values (\`p1\` highest, \`p4\` lowest/default; integers are not accepted), due date updates via dueString and due date removal via "dueString: remove", plus deadlineDate (ISO 8601 format like "2025-12-31") updates and removals via "deadlineDate: remove". **IMPORTANT: Do NOT use update-tasks to reschedule/move task dates — use reschedule-tasks instead.** update-tasks replaces the entire due string which destroys recurrence patterns on recurring tasks. Never echo back a task's existing projectId/sectionId/parentId — those fields are treated as a move.
|
|
6929
|
-
- **reschedule-tasks**: **Always use this tool when moving/rescheduling task due dates to a different date.** This tool preserves recurring schedules and existing time-of-day. Accepts YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS. Works for both recurring and non-recurring tasks. Do NOT use update-tasks for rescheduling.
|
|
6930
|
-
- **complete-tasks**: Mark tasks as done using task IDs
|
|
6931
|
-
- **uncomplete-tasks**: Reopen completed tasks using task IDs
|
|
6932
|
-
- **find-tasks**: Search by text, project/section/parent container, responsible user, labels, a raw Todoist \`filter\` string (e.g. "today", "p1", "##Work", "(today | overdue) & p1"), or a saved filter by ID or name (\`filterIdOrName\`). Requires at least one search parameter. \`filter\`/\`filterIdOrName\` cannot be combined with projectId/sectionId/parentId, and \`filter\` and \`filterIdOrName\` are mutually exclusive.
|
|
6933
|
-
- **find-tasks-by-date**: Get tasks by date range (startDate: YYYY-MM-DD or 'today' which includes overdue tasks) or specific day counts
|
|
6934
|
-
- **find-completed-tasks**: View completed tasks by completion date or original due date; if since/until are omitted, defaults to the last 7 days (returns all collaborators unless filtered). For a history of actual task-completion events, including recurring task occurrences, use find-activity instead.
|
|
6935
|
-
|
|
6936
|
-
**Project & Organization:**
|
|
6937
|
-
- **add-projects/update-projects/find-projects**: Manage project lifecycle with names, descriptions (Markdown), favorites, view styles (list/board/calendar), and workspace assignment for new projects (by name or ID). find-projects returns active projects by default; pass archivedStatus ('archived' or 'all') to include archived projects. Every returned project includes an isArchived field
|
|
6938
|
-
- **project-management**: Archive or unarchive projects by ID
|
|
6939
|
-
- To delete a project (active or archived), use **delete-object** with type "project". Note: workspace projects must be archived first; personal projects can be deleted regardless
|
|
6940
|
-
- **project-move**: Move projects between personal and workspace contexts
|
|
6941
|
-
- **add-sections/update-sections/find-sections**: Organize tasks within projects using sections
|
|
6942
|
-
- **get-overview**: Get comprehensive Markdown overview of entire account or specific project with task hierarchies. Project data includes parentId (sub-projects), folderId (workspace folder membership), and childOrder (sibling ordering)
|
|
6943
|
-
- **list-workspaces**: Get all workspaces for the user with details like plan type, role, and settings
|
|
6944
|
-
|
|
6945
|
-
**Reminders:**
|
|
6946
|
-
- **add-reminders**: Create reminders for tasks. Three types: "relative" (minutes before due), "absolute" (specific date/time), or "location" (geofence-triggered). Each reminder must specify a taskId.
|
|
6947
|
-
- **find-reminders**: Find reminders by task ID (returns both time-based and location reminders), or get a specific reminder by ID (use reminderId for time-based, locationReminderId for location-based).
|
|
6948
|
-
- **update-reminders**: Update existing reminders. Must specify the reminder type ("relative", "absolute", or "location") and ID.
|
|
6949
|
-
- Relative and absolute reminders support an **isUrgent** flag to mark a reminder as urgent.
|
|
6950
|
-
- Reminders can be deleted using **delete-object** with type "reminder" (time-based) or "location_reminder" (location-based).
|
|
6951
|
-
|
|
6952
|
-
**Collaboration & Comments:**
|
|
6953
|
-
- **add-comments/update-comments/find-comments**: Manage task and project discussions
|
|
6954
|
-
- **view-attachment**: View file attachments from comments. Pass the fileUrl from a comment's fileAttachment. Returns images inline, text files as text, and binary files as embedded resources.
|
|
6955
|
-
- **find-project-collaborators**: Look up Todoist users (collaborators, teammates) by name or email to get their user ID — use for "find/who is X" questions or any time you need to resolve a person's name to an ID. By default searches collaborators of every shared project the authenticated user can access (plus the authenticated user themselves). An empty result means the person is not a collaborator on any shared project, not that they do not exist. Pass projectId to scope to a single project
|
|
6956
|
-
- **manage-assignments**: Bulk assign/unassign/reassign up to 50 tasks with atomic operations and dry-run validation
|
|
6957
|
-
|
|
6958
|
-
**Filters:**
|
|
6959
|
-
- **find-filters**: List all personal filters or search by name; filters are saved task views using query syntax
|
|
6960
|
-
- **add-filters**: Create personal filters with name, query (e.g. "today & p1"), color, and favorite flag
|
|
6961
|
-
- **update-filters**: Modify existing filters' name, query, color, or favorite status
|
|
6962
|
-
|
|
6963
|
-
**Templates:**
|
|
6964
|
-
- **export-project-template**: Export a project as a Todoist template — CSV content (format "file") or a shareable link (format "url"). Prefer "url" for large projects. To read a project's contents rather than export it, use find-tasks.
|
|
6965
|
-
- **import-project-template**: Add a template's tasks, sections and comments to an existing project. Source it with templateId (a gallery slug like "product-launch", a personal template ID like "UT_28Ex...", or a full Todoist template URL) or with csvFileContent (CSV from export-project-template). Templates cannot be listed through this server, so only use the ID or URL the user gave you. Gallery templates work for any account; personal templates only for the account that saved them. For "start a new project from this template", call add-projects first and import into the new project. Imports write immediately and cannot be undone.
|
|
6920
|
+
### Choosing between tools
|
|
6966
6921
|
|
|
6967
|
-
|
|
6968
|
-
- **find-activity**: Retrieve activity logs to monitor and audit changes. Shows events from all users by default; use initiatorId to filter by specific user. Filter by object type (task/project/comment), event type (added/updated/deleted/completed/uncompleted/archived/unarchived/shared/left), objects (objectId, projectId, taskId), and an inclusive dateFrom/exclusive dateTo range. For “what did I complete?” or “what got done?” questions, including recurring task occurrences, use objectType="task", eventType="completed", and the requested date range. Activity history retention depends on the user plan.
|
|
6969
|
-
- **get-productivity-stats**: Get comprehensive productivity statistics including daily/weekly completion breakdowns, goal streaks (current, last, max), karma score and trends, and historical karma data. No parameters required.
|
|
6922
|
+
What each tool does and how to fill its parameters is in the tool's own description and input schema. This section covers only what those cannot: which tool to reach for, and how tools relate to each other.
|
|
6970
6923
|
|
|
6971
|
-
**
|
|
6972
|
-
- **get-project-health**: Get comprehensive health assessment for a project including completion progress (completed/active counts, percentage), health status (EXCELLENT/ON_TRACK/AT_RISK/CRITICAL), description, and task-level recommendations. Use includeContext=true for detailed metrics (overdue tasks, weekly activity, avg completion time) and full task data. Health data may be stale — check isStale flag.
|
|
6973
|
-
- **get-project-activity-stats**: Get daily and optional weekly activity statistics for a project over a configurable time window (1-12 weeks). Useful for identifying activity trends.
|
|
6974
|
-
- **analyze-project-health**: Trigger a new health analysis for a project. Use when health data is stale. The analysis may take time — use get-project-health afterward to see updated results.
|
|
6975
|
-
- **get-workspace-insights**: Get aggregated health and progress insights across all projects in a workspace. Accepts workspace name or ID, with optional project ID filtering.
|
|
6924
|
+
**Dates**
|
|
6976
6925
|
|
|
6977
|
-
**
|
|
6978
|
-
-
|
|
6979
|
-
-
|
|
6980
|
-
- **reorder-objects**: Reorder sibling projects or sections, and optionally move projects to a new parent. For projects: set order to reorder siblings, and/or set parentId to move under a new parent (use "root" for top level). For sections: set order to reorder within a project
|
|
6981
|
-
- **user-info**: Get user details including timezone, goals, and plan information
|
|
6926
|
+
- To move a task to a different date use **reschedule-tasks**, never **update-tasks**. update-tasks replaces the whole due string, which destroys recurrence on recurring tasks.
|
|
6927
|
+
- Never send a task's existing projectId, sectionId or parentId back to **update-tasks** — those fields are treated as a move.
|
|
6928
|
+
- All dates respect the user's timezone.
|
|
6982
6929
|
|
|
6983
|
-
|
|
6930
|
+
**Finding things**
|
|
6984
6931
|
|
|
6985
|
-
|
|
6932
|
+
- For "what did I complete?", use **find-activity** with objectType="task" and eventType="completed". It reports completion events, including each occurrence of a recurring task. **find-completed-tasks** lists completed tasks, which is not the same question.
|
|
6933
|
+
- To resolve a person's name or email to a user ID, or to answer "who is X?", use **find-project-collaborators** with just a searchTerm. It covers every shared project you can access plus yourself, so an empty result means they collaborate on none of them — not that they do not exist.
|
|
6934
|
+
- Before assigning work to someone, call **find-project-collaborators** again with the target projectId. Resolving an ID only proves they collaborate on *some* project you can see; assignment fails unless they collaborate on that one.
|
|
6935
|
+
- To find out whether a task hides subtasks, use **fetch-object** with includeChildren rather than a speculative **find-tasks** call.
|
|
6936
|
+
- Filter tasks by label **name**. Label IDs are only for **delete-object** and **update-labels**. Shared labels can be renamed but not recoloured, reordered or favourited.
|
|
6986
6937
|
|
|
6987
|
-
|
|
6938
|
+
**Deleting and archiving**
|
|
6988
6939
|
|
|
6989
|
-
|
|
6940
|
+
- **delete-object** removes every object type; there is no per-type delete tool. Reminders use type "reminder", location reminders "location_reminder".
|
|
6941
|
+
- A workspace project must be archived with **project-management** before it can be deleted. A personal project can be deleted directly.
|
|
6990
6942
|
|
|
6991
|
-
|
|
6943
|
+
**Templates**
|
|
6992
6944
|
|
|
6993
|
-
|
|
6945
|
+
- Templates cannot be listed through this server, so only use an ID or URL the user gave you. To start a new project from one, call **add-projects** first and import into it. Imports write immediately and cannot be undone.
|
|
6994
6946
|
|
|
6995
|
-
|
|
6947
|
+
**Project health**
|
|
6996
6948
|
|
|
6997
|
-
|
|
6949
|
+
- Health data may be stale — check the isStale flag, and call **analyze-project-health** to refresh it before reading again.
|
|
6998
6950
|
|
|
6999
|
-
|
|
6951
|
+
**Batches**
|
|
7000
6952
|
|
|
7001
|
-
|
|
6953
|
+
- Prefer a batch tool over one call per item.
|
|
6954
|
+
- Where a batch tool returns per-item \`failures\` alongside successes, one failure does not undo the rest: never retry the whole batch, re-send only the items whose failure reason is fixable. **reschedule-tasks** is the exception — it has no per-item failures and throws if any task fails, so retry it as a whole.
|
|
7002
6955
|
|
|
7003
|
-
|
|
7004
|
-
- **Team Assignment**: find-project-collaborators → add-tasks with responsibleUser → manage-assignments for bulk changes
|
|
7005
|
-
- **User Lookup**: find-project-collaborators with just a searchTerm (no projectId) to resolve a name or email to a Todoist user ID across all shared-project collaborators you can access
|
|
7006
|
-
- **Task Search**: find-tasks with multiple filters → update-tasks or complete-tasks based on results
|
|
7007
|
-
- **Project Organization**: add-projects → add-sections → add-tasks with projectId and sectionId
|
|
7008
|
-
- **Completion History**: find-activity with objectType="task", eventType="completed", dateFrom, and dateTo to report what was actually completed in a period, including recurring task occurrences; use initiatorId for one collaborator
|
|
7009
|
-
- **Progress Reviews**: find-completed-tasks (defaults to last 7 days; optionally use explicit date ranges) → get-overview for project summaries
|
|
7010
|
-
- **Activity Auditing**: find-activity with event/object filters to track changes, monitor team activity, or investigate specific actions
|
|
7011
|
-
- **Productivity Analysis**: Use the productivity-analysis prompt for comprehensive analysis combining user-info, get-productivity-stats, and find-completed-tasks data into actionable insights
|
|
7012
|
-
- **Project Health Reviews**: get-project-health → analyze-project-health if stale → get-project-health with includeContext=true for detailed metrics → get-workspace-insights for cross-project overview
|
|
6956
|
+
Use the **productivity-analysis** prompt for a combined productivity review — it pulls together user-info, get-productivity-stats and find-completed-tasks.
|
|
7013
6957
|
|
|
7014
6958
|
Always provide clear, actionable task titles and descriptions. Use the overview tools to give users context about their workload and project status.
|
|
7015
6959
|
`;
|
|
@@ -7027,19 +6971,19 @@ function Hd({
|
|
|
7027
6971
|
},
|
|
7028
6972
|
instructions: $d
|
|
7029
6973
|
}
|
|
7030
|
-
), n =
|
|
7031
|
-
|
|
6974
|
+
), n = jr(e, { baseUrl: t });
|
|
6975
|
+
Gs(o);
|
|
7032
6976
|
const a = { server: o, client: n, features: r };
|
|
7033
6977
|
for (const i of Cd)
|
|
7034
|
-
|
|
6978
|
+
Kr({ tool: i, ...a });
|
|
7035
6979
|
return o.registerPrompt(
|
|
7036
|
-
|
|
6980
|
+
he.name,
|
|
7037
6981
|
{
|
|
7038
|
-
title:
|
|
7039
|
-
description:
|
|
7040
|
-
argsSchema:
|
|
6982
|
+
title: he.title,
|
|
6983
|
+
description: he.description,
|
|
6984
|
+
argsSchema: he.argsSchema
|
|
7041
6985
|
},
|
|
7042
|
-
|
|
6986
|
+
he.callback
|
|
7043
6987
|
), o;
|
|
7044
6988
|
}
|
|
7045
6989
|
export {
|
|
@@ -7053,11 +6997,11 @@ export {
|
|
|
7053
6997
|
ki as G,
|
|
7054
6998
|
Ci as H,
|
|
7055
6999
|
Oi as I,
|
|
7056
|
-
|
|
7057
|
-
|
|
7000
|
+
Ri as J,
|
|
7001
|
+
Ni as K,
|
|
7058
7002
|
Cd as L,
|
|
7059
7003
|
Hi as M,
|
|
7060
|
-
|
|
7004
|
+
Ki as N,
|
|
7061
7005
|
Vi as O,
|
|
7062
7006
|
Zi as P,
|
|
7063
7007
|
rc as Q,
|
|
@@ -7066,34 +7010,34 @@ export {
|
|
|
7066
7010
|
Ic as T,
|
|
7067
7011
|
Oc as U,
|
|
7068
7012
|
Uc as V,
|
|
7069
|
-
|
|
7070
|
-
|
|
7013
|
+
Gc as W,
|
|
7014
|
+
hd as X,
|
|
7071
7015
|
Id as Y,
|
|
7072
|
-
|
|
7016
|
+
jr as Z,
|
|
7073
7017
|
br as _,
|
|
7074
7018
|
Io as a,
|
|
7075
7019
|
Oo as b,
|
|
7076
7020
|
Uo as c,
|
|
7077
|
-
|
|
7021
|
+
Yo as d,
|
|
7078
7022
|
tn as e,
|
|
7079
7023
|
an as f,
|
|
7080
7024
|
Hd as g,
|
|
7081
7025
|
pn as h,
|
|
7082
7026
|
yn as i,
|
|
7083
7027
|
wn as j,
|
|
7084
|
-
|
|
7028
|
+
jn as k,
|
|
7085
7029
|
Dn as l,
|
|
7086
7030
|
Fn as m,
|
|
7087
7031
|
Ln as n,
|
|
7088
|
-
|
|
7032
|
+
zn as o,
|
|
7089
7033
|
Xn as p,
|
|
7090
7034
|
aa as q,
|
|
7091
7035
|
$o as r,
|
|
7092
7036
|
la as s,
|
|
7093
|
-
|
|
7094
|
-
|
|
7037
|
+
jd as t,
|
|
7038
|
+
ha as u,
|
|
7095
7039
|
ka as v,
|
|
7096
|
-
|
|
7040
|
+
Sa as w,
|
|
7097
7041
|
xa as x,
|
|
7098
7042
|
Fa as y,
|
|
7099
7043
|
Pa as z
|