@doist/todoist-mcp 12.5.6 → 12.5.7
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.d.ts +0 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/main-http.js +2 -2
- package/dist/main.js +1 -1
- package/dist/{mcp-server-Drv9wBc-.js → mcp-server-HzS0zbN7.js} +422 -432
- package/dist/{require-valid-todoist-token-CC6hWyEx.js → require-valid-todoist-token-B8Dy2Kgy.js} +1 -1
- package/dist/tool-registry.d.ts +0 -8
- package/dist/tool-registry.d.ts.map +1 -1
- package/dist/tools/get-project-health.d.ts +0 -8
- package/dist/tools/get-project-health.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -301,7 +301,7 @@ function Ve(e) {
|
|
|
301
301
|
w(t?.message),
|
|
302
302
|
w(r?.message),
|
|
303
303
|
e instanceof Error ? e.message : w(e)
|
|
304
|
-
].filter((
|
|
304
|
+
].filter((m) => !!m), l = d.find((m) => !He(m)) || d[0], u = L(
|
|
305
305
|
G(n?.errorExtra),
|
|
306
306
|
G(n?.error_extra),
|
|
307
307
|
G(n?.details),
|
|
@@ -371,7 +371,7 @@ function or(e) {
|
|
|
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.7", ir = {
|
|
375
375
|
version: nr
|
|
376
376
|
}, C = {
|
|
377
377
|
/** Default limit for task listings */
|
|
@@ -434,7 +434,7 @@ const nr = "12.5.6", ir = {
|
|
|
434
434
|
*/
|
|
435
435
|
QUEUE_WAIT_MS: 3e4
|
|
436
436
|
};
|
|
437
|
-
function
|
|
437
|
+
function ht(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)}`
|
|
@@ -477,11 +477,11 @@ function mt(e, { queueTimeoutMs: t = Be.QUEUE_WAIT_MS } = {}) {
|
|
|
477
477
|
}
|
|
478
478
|
function Kt() {
|
|
479
479
|
return {
|
|
480
|
-
moves:
|
|
481
|
-
writes:
|
|
480
|
+
moves: ht(Be.TASK_MOVES),
|
|
481
|
+
writes: ht(Be.WRITES)
|
|
482
482
|
};
|
|
483
483
|
}
|
|
484
|
-
const
|
|
484
|
+
const mt = /* @__PURE__ */ new Map(), Yt = /* @__PURE__ */ new WeakMap();
|
|
485
485
|
let ft;
|
|
486
486
|
function ar() {
|
|
487
487
|
return ft ??= Kt(), ft;
|
|
@@ -491,8 +491,8 @@ function cr(e) {
|
|
|
491
491
|
}
|
|
492
492
|
function dr(e, t) {
|
|
493
493
|
const r = cr(t);
|
|
494
|
-
let o =
|
|
495
|
-
o || (o = Kt(),
|
|
494
|
+
let o = mt.get(r);
|
|
495
|
+
o || (o = Kt(), mt.set(r, o)), Yt.set(e, o);
|
|
496
496
|
}
|
|
497
497
|
function Gt(e) {
|
|
498
498
|
return Yt.get(e) ?? ar();
|
|
@@ -505,11 +505,11 @@ function ur(e) {
|
|
|
505
505
|
}
|
|
506
506
|
const pr = "todoist-mcp", Je = ir.version, Vt = new Rs(), bt = Us(import.meta.url);
|
|
507
507
|
let Te;
|
|
508
|
-
const
|
|
508
|
+
const hr = async () => {
|
|
509
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 mr = hr;
|
|
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 = mr().then((e) => e.getDefaultDispatcher()).catch((e) => {
|
|
587
587
|
throw Te = void 0, e;
|
|
588
588
|
})), Te;
|
|
589
589
|
}
|
|
@@ -608,18 +608,18 @@ function Ir(e) {
|
|
|
608
608
|
function Sr(e = globalThis.fetch, t = {}) {
|
|
609
609
|
const r = e === globalThis.fetch, { enabled: o = !0, platform: n = "mcp", sessionId: i = Pe() } = t;
|
|
610
610
|
return async (a, c = {}) => {
|
|
611
|
-
const { timeout: d, headers: l, signal: u, ...p } = c, { signal:
|
|
611
|
+
const { timeout: d, headers: l, signal: u, ...p } = c, { signal: h, cleanup: m } = Tr(u, d);
|
|
612
612
|
try {
|
|
613
613
|
const y = {
|
|
614
614
|
...p,
|
|
615
|
-
signal:
|
|
615
|
+
signal: h,
|
|
616
616
|
...o ? { headers: yr(l, { platform: n, sessionId: i }) } : l !== void 0 ? { headers: l } : {}
|
|
617
617
|
};
|
|
618
618
|
r && await vr(y);
|
|
619
619
|
const f = await e(a, y);
|
|
620
620
|
return Ir(f);
|
|
621
621
|
} finally {
|
|
622
|
-
|
|
622
|
+
m();
|
|
623
623
|
}
|
|
624
624
|
};
|
|
625
625
|
}
|
|
@@ -763,7 +763,7 @@ const g = {
|
|
|
763
763
|
// OpenAI MCP tools
|
|
764
764
|
SEARCH: "search",
|
|
765
765
|
FETCH: "fetch"
|
|
766
|
-
},
|
|
766
|
+
}, Md = {
|
|
767
767
|
/**
|
|
768
768
|
* Strips email addresses from tool outputs that expose user data.
|
|
769
769
|
* Affects: find-project-collaborators, find-completed-tasks
|
|
@@ -836,11 +836,11 @@ function qr({
|
|
|
836
836
|
}) {
|
|
837
837
|
const n = o.some((d) => d.name === "strip_emails") && Br.includes(e.name), i = e.execute, a = async (d, l) => {
|
|
838
838
|
try {
|
|
839
|
-
let { textContent: u, structuredContent: p, contentItems:
|
|
839
|
+
let { textContent: u, structuredContent: p, contentItems: h } = await br(
|
|
840
840
|
e.name,
|
|
841
841
|
() => O(() => i(d, r))
|
|
842
842
|
);
|
|
843
|
-
return n && (u && (u = zr(u)), p && (p = qe(p))), Ur({ textContent: u, structuredContent: p, contentItems:
|
|
843
|
+
return n && (u && (u = zr(u)), p && (p = qe(p))), Ur({ textContent: u, structuredContent: p, contentItems: h });
|
|
844
844
|
} catch (u) {
|
|
845
845
|
return console.error(`Error executing tool ${e.name}:`, { args: Mr(d), error: u }), Lr(or(u));
|
|
846
846
|
}
|
|
@@ -997,7 +997,7 @@ function Jr(e) {
|
|
|
997
997
|
]
|
|
998
998
|
};
|
|
999
999
|
}
|
|
1000
|
-
const
|
|
1000
|
+
const me = {
|
|
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.",
|
|
@@ -1126,12 +1126,12 @@ class ro {
|
|
|
1126
1126
|
try {
|
|
1127
1127
|
const p = await t.getUser();
|
|
1128
1128
|
if (p) {
|
|
1129
|
-
const
|
|
1129
|
+
const h = {
|
|
1130
1130
|
id: p.id,
|
|
1131
1131
|
name: p.fullName,
|
|
1132
1132
|
email: p.email
|
|
1133
1133
|
};
|
|
1134
|
-
d.some((
|
|
1134
|
+
d.some((m) => m.id === p.id) || (d = [h, ...d]);
|
|
1135
1135
|
}
|
|
1136
1136
|
} catch {
|
|
1137
1137
|
}
|
|
@@ -1197,18 +1197,18 @@ class ro {
|
|
|
1197
1197
|
const c = (await M({
|
|
1198
1198
|
apiMethod: t.getProjects.bind(t),
|
|
1199
1199
|
args: {}
|
|
1200
|
-
})).filter((
|
|
1200
|
+
})).filter((h) => h.isShared);
|
|
1201
1201
|
if (c.length === 0) {
|
|
1202
|
-
const
|
|
1203
|
-
return n && oe.set(n,
|
|
1202
|
+
const h = [];
|
|
1203
|
+
return n && oe.set(n, h), h;
|
|
1204
1204
|
}
|
|
1205
1205
|
const d = [], l = /* @__PURE__ */ new Set(), u = c.map(
|
|
1206
|
-
(
|
|
1206
|
+
(h) => this.getProjectCollaborators(t, h.id, o)
|
|
1207
1207
|
), p = await Promise.allSettled(u);
|
|
1208
|
-
for (const
|
|
1209
|
-
if (
|
|
1210
|
-
for (const
|
|
1211
|
-
|
|
1208
|
+
for (const h of p)
|
|
1209
|
+
if (h.status === "fulfilled")
|
|
1210
|
+
for (const m of h.value)
|
|
1211
|
+
m && !l.has(m.id) && (d.push(m), l.add(m.id));
|
|
1212
1212
|
return n && oe.set(n, d), d;
|
|
1213
1213
|
} catch {
|
|
1214
1214
|
return [];
|
|
@@ -1419,7 +1419,7 @@ function po(e) {
|
|
|
1419
1419
|
extraData: e.extraData ?? void 0
|
|
1420
1420
|
};
|
|
1421
1421
|
}
|
|
1422
|
-
const
|
|
1422
|
+
const ho = 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: i } = await e.getTasksByFilter({ query: t, cursor: o, limit: r });
|
|
1438
1438
|
return { tasks: n.map(P), nextCursor: i };
|
|
1439
1439
|
} catch (n) {
|
|
1440
|
-
const i =
|
|
1440
|
+
const i = ho.safeParse(n);
|
|
1441
1441
|
if (!i.success)
|
|
1442
1442
|
throw n;
|
|
1443
1443
|
const { responseData: a } = i.data;
|
|
@@ -1493,12 +1493,12 @@ function ns(e) {
|
|
|
1493
1493
|
return { timeBasedCount: t, locationCount: r };
|
|
1494
1494
|
}
|
|
1495
1495
|
const Ie = Re.map((e) => e.key);
|
|
1496
|
-
function
|
|
1496
|
+
function mo(e) {
|
|
1497
1497
|
if (typeof e != "string") return;
|
|
1498
1498
|
const t = e.toLowerCase();
|
|
1499
1499
|
return (Re.find((o) => o.key === t) ?? Re.find((o) => o.displayName.toLowerCase() === t))?.key;
|
|
1500
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(
|
|
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(mo, s.enum(Ie).optional()).describe(fo);
|
|
1502
1502
|
s.enum(Ie);
|
|
1503
1503
|
const ue = s.enum(Ie).optional().catch(void 0), F = s.object({
|
|
1504
1504
|
id: s.string(),
|
|
@@ -1636,14 +1636,14 @@ const bo = s.object({
|
|
|
1636
1636
|
);
|
|
1637
1637
|
}
|
|
1638
1638
|
const n = r.some((l) => N(l.projectId)) ? await t.getUser() : void 0, i = r.map(async ({ content: l, taskId: u, projectId: p }) => {
|
|
1639
|
-
const
|
|
1639
|
+
const h = await de({
|
|
1640
1640
|
projectId: p,
|
|
1641
1641
|
user: n,
|
|
1642
1642
|
client: n ? void 0 : t
|
|
1643
1643
|
});
|
|
1644
1644
|
return await t.addComment({
|
|
1645
1645
|
content: l,
|
|
1646
|
-
...u ? { taskId: u } : { projectId:
|
|
1646
|
+
...u ? { taskId: u } : { projectId: h }
|
|
1647
1647
|
});
|
|
1648
1648
|
}), c = (await Promise.all(i)).map(ge);
|
|
1649
1649
|
return {
|
|
@@ -1752,7 +1752,7 @@ const xo = s.object({
|
|
|
1752
1752
|
outputSchema: Eo,
|
|
1753
1753
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
1754
1754
|
async execute({ filters: e }, t) {
|
|
1755
|
-
const r = Date.now(), o = e.map((p,
|
|
1755
|
+
const r = Date.now(), o = e.map((p, h) => `tempFilterAdd${h}${r}`), n = e.map((p, h) => V(
|
|
1756
1756
|
"filter_add",
|
|
1757
1757
|
{
|
|
1758
1758
|
name: p.name,
|
|
@@ -1760,9 +1760,9 @@ const xo = s.object({
|
|
|
1760
1760
|
...p.color !== void 0 ? { color: p.color } : {},
|
|
1761
1761
|
...p.isFavorite !== void 0 ? { isFavorite: p.isFavorite } : {}
|
|
1762
1762
|
},
|
|
1763
|
-
o[
|
|
1764
|
-
)), a = (await t.sync({ commands: n })).tempIdMapping ?? {}, c = e.map((p,
|
|
1765
|
-
const
|
|
1763
|
+
o[h]
|
|
1764
|
+
)), a = (await t.sync({ commands: n })).tempIdMapping ?? {}, c = e.map((p, h) => {
|
|
1765
|
+
const m = o[h], y = m !== void 0 ? a[m] : void 0;
|
|
1766
1766
|
if (!y) return null;
|
|
1767
1767
|
const f = p.color !== void 0 ? ue.parse(p.color) : void 0;
|
|
1768
1768
|
return {
|
|
@@ -2394,15 +2394,15 @@ class dn {
|
|
|
2394
2394
|
const u = await W.resolveUser(t, o);
|
|
2395
2395
|
if (!u)
|
|
2396
2396
|
return i.push("User not found - check spelling or invite to a shared project"), { canAssign: !1, projectInfo: l, recommendations: i };
|
|
2397
|
-
const p = d.some((y) => y.id === u.userId),
|
|
2397
|
+
const p = d.some((y) => y.id === u.userId), h = {
|
|
2398
2398
|
resolvedName: u.displayName,
|
|
2399
2399
|
isCollaborator: p
|
|
2400
2400
|
};
|
|
2401
2401
|
if (!p)
|
|
2402
2402
|
return i.push(
|
|
2403
2403
|
`Invite ${u.displayName} to collaborate on project "${c.name}"`
|
|
2404
|
-
), { canAssign: !1, projectInfo: l, userInfo:
|
|
2405
|
-
let
|
|
2404
|
+
), { canAssign: !1, projectInfo: l, userInfo: h, recommendations: i };
|
|
2405
|
+
let m;
|
|
2406
2406
|
if (n && n.length > 0) {
|
|
2407
2407
|
let y = 0, f = 0;
|
|
2408
2408
|
for (const v of n)
|
|
@@ -2411,13 +2411,13 @@ class dn {
|
|
|
2411
2411
|
} catch {
|
|
2412
2412
|
f++;
|
|
2413
2413
|
}
|
|
2414
|
-
|
|
2414
|
+
m = { accessibleTasks: y, inaccessibleTasks: f }, f > 0 && i.push(`${f} task(s) are not accessible`);
|
|
2415
2415
|
}
|
|
2416
2416
|
return a = !0, i.push(`Ready to assign tasks to ${u.displayName}`), {
|
|
2417
2417
|
canAssign: a,
|
|
2418
2418
|
projectInfo: l,
|
|
2419
|
-
userInfo:
|
|
2420
|
-
taskInfo:
|
|
2419
|
+
userInfo: h,
|
|
2420
|
+
taskInfo: m,
|
|
2421
2421
|
recommendations: i
|
|
2422
2422
|
};
|
|
2423
2423
|
}
|
|
@@ -2473,38 +2473,38 @@ const Tt = qt.TASKS_PER_OPERATION, ln = s.object({
|
|
|
2473
2473
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
2474
2474
|
async execute(e, t) {
|
|
2475
2475
|
const { tasks: r } = s.object(kt).parse(e), o = /* @__PURE__ */ new Map();
|
|
2476
|
-
r.forEach((
|
|
2477
|
-
const y =
|
|
2478
|
-
f ? f.push({ task:
|
|
2476
|
+
r.forEach((h, m) => {
|
|
2477
|
+
const y = hn(h), f = o.get(y);
|
|
2478
|
+
f ? f.push({ task: h, index: m }) : o.set(y, [{ task: h, index: m }]);
|
|
2479
2479
|
});
|
|
2480
2480
|
const n = /* @__PURE__ */ new Map(), a = (await Promise.all(
|
|
2481
|
-
[...o.values()].map(async (
|
|
2482
|
-
const
|
|
2483
|
-
for (const { task: y, index: f } of
|
|
2481
|
+
[...o.values()].map(async (h) => {
|
|
2482
|
+
const m = [];
|
|
2483
|
+
for (const { task: y, index: f } of h)
|
|
2484
2484
|
try {
|
|
2485
|
-
const v = await
|
|
2486
|
-
|
|
2485
|
+
const v = await mn(y, t, n);
|
|
2486
|
+
m.push({ index: f, result: { status: "fulfilled", value: v } });
|
|
2487
2487
|
} catch (v) {
|
|
2488
|
-
|
|
2488
|
+
m.push({
|
|
2489
2489
|
index: f,
|
|
2490
2490
|
result: { status: "rejected", reason: v }
|
|
2491
2491
|
});
|
|
2492
2492
|
}
|
|
2493
|
-
return
|
|
2493
|
+
return m;
|
|
2494
2494
|
})
|
|
2495
|
-
)).flat().sort((
|
|
2495
|
+
)).flat().sort((h, m) => h.index - m.index), c = [], d = [];
|
|
2496
2496
|
let l = !1;
|
|
2497
|
-
for (const { index:
|
|
2498
|
-
|
|
2499
|
-
item: r[
|
|
2497
|
+
for (const { index: h, result: m } of a)
|
|
2498
|
+
m.status === "fulfilled" ? c.push(m.value) : (l ||= m.reason instanceof ve, d.push({
|
|
2499
|
+
item: r[h]?.content ?? `Task ${h + 1}`,
|
|
2500
2500
|
// Keep API error signals (status/code/tag) — `error.message`
|
|
2501
2501
|
// alone collapses e.g. a full-project rejection into a bare
|
|
2502
2502
|
// "HTTP 403: Forbidden"
|
|
2503
|
-
error: z(
|
|
2503
|
+
error: z(m.reason)
|
|
2504
2504
|
}));
|
|
2505
2505
|
if (c.length === 0 && d.length > 0) {
|
|
2506
|
-
const
|
|
2507
|
-
throw l ? new zt(
|
|
2506
|
+
const h = d.map((y) => `"${y.item}": ${y.error}`).join("; "), m = `All ${d.length} task(s) failed to create: ${h}`;
|
|
2507
|
+
throw l ? new zt(m) : new Error(m);
|
|
2508
2508
|
}
|
|
2509
2509
|
const u = c.map(P);
|
|
2510
2510
|
return {
|
|
@@ -2524,10 +2524,10 @@ const Tt = qt.TASKS_PER_OPERATION, ln = s.object({
|
|
|
2524
2524
|
};
|
|
2525
2525
|
}
|
|
2526
2526
|
};
|
|
2527
|
-
function
|
|
2527
|
+
function hn(e) {
|
|
2528
2528
|
return `${e.projectId ?? ""}|${e.sectionId ?? ""}|${e.parentId ?? ""}`;
|
|
2529
2529
|
}
|
|
2530
|
-
async function
|
|
2530
|
+
async function mn(e, t, r) {
|
|
2531
2531
|
const {
|
|
2532
2532
|
duration: o,
|
|
2533
2533
|
projectId: n,
|
|
@@ -2538,25 +2538,25 @@ async function hn(e, t, r) {
|
|
|
2538
2538
|
priority: l,
|
|
2539
2539
|
labels: u,
|
|
2540
2540
|
deadlineDate: p,
|
|
2541
|
-
...
|
|
2542
|
-
} = e,
|
|
2543
|
-
if (
|
|
2544
|
-
const f = await t.getProject(
|
|
2541
|
+
...h
|
|
2542
|
+
} = e, m = N(n) ? void 0 : n;
|
|
2543
|
+
if (m) {
|
|
2544
|
+
const f = await t.getProject(m);
|
|
2545
2545
|
if (f.isArchived)
|
|
2546
2546
|
throw new Error(
|
|
2547
2547
|
`Task "${e.content}": Cannot create task in archived project "${f.name}"`
|
|
2548
2548
|
);
|
|
2549
2549
|
}
|
|
2550
2550
|
let y = {
|
|
2551
|
-
...
|
|
2552
|
-
projectId:
|
|
2551
|
+
...h,
|
|
2552
|
+
projectId: m,
|
|
2553
2553
|
sectionId: i,
|
|
2554
2554
|
parentId: a,
|
|
2555
2555
|
order: c,
|
|
2556
2556
|
labels: u,
|
|
2557
2557
|
deadlineDate: p
|
|
2558
2558
|
};
|
|
2559
|
-
if (l && (y.priority = Zt(l)), d && !
|
|
2559
|
+
if (l && (y.priority = Zt(l)), d && !m && !i && !a)
|
|
2560
2560
|
throw new Error(
|
|
2561
2561
|
`Task "${e.content}": Cannot assign tasks without specifying project context. Please specify a projectId, sectionId, or parentId.`
|
|
2562
2562
|
);
|
|
@@ -2572,7 +2572,7 @@ async function hn(e, t, r) {
|
|
|
2572
2572
|
throw f instanceof _ ? new Error(`Task "${e.content}": ${f.message}`) : f;
|
|
2573
2573
|
}
|
|
2574
2574
|
if (d) {
|
|
2575
|
-
let f =
|
|
2575
|
+
let f = m;
|
|
2576
2576
|
if (!f && a)
|
|
2577
2577
|
try {
|
|
2578
2578
|
f = (await t.getTask(a)).projectId;
|
|
@@ -3145,12 +3145,12 @@ const Wn = {
|
|
|
3145
3145
|
dateTo: l,
|
|
3146
3146
|
limit: u,
|
|
3147
3147
|
cursor: p
|
|
3148
|
-
} = e,
|
|
3148
|
+
} = e, h = {
|
|
3149
3149
|
limit: u,
|
|
3150
3150
|
cursor: p ?? null
|
|
3151
3151
|
};
|
|
3152
|
-
r && n ?
|
|
3153
|
-
const { results:
|
|
3152
|
+
r && n ? h.objectEventTypes = `${r}:${n}` : r ? h.objectEventTypes = `${r}:` : n && (h.objectEventTypes = `:${n}`), o && o !== "remove" && (h.objectId = o), i && (h.parentProjectId = i), a && (h.parentItemId = a), c && (h.initiatorId = c), d && (h.dateFrom = d), l && (h.dateTo = l);
|
|
3153
|
+
const { results: m, nextCursor: y } = await t.getActivityLogs(h), f = m.map(po);
|
|
3154
3154
|
return {
|
|
3155
3155
|
textContent: qn({ events: f, args: e, nextCursor: y }),
|
|
3156
3156
|
structuredContent: {
|
|
@@ -3321,7 +3321,7 @@ ${a}`;
|
|
|
3321
3321
|
}
|
|
3322
3322
|
return i;
|
|
3323
3323
|
}
|
|
3324
|
-
function
|
|
3324
|
+
function hs(e) {
|
|
3325
3325
|
const t = e.getUTCFullYear(), r = String(e.getUTCMonth() + 1).padStart(2, "0"), o = String(e.getUTCDate()).padStart(2, "0");
|
|
3326
3326
|
return `${t}-${r}-${o}`;
|
|
3327
3327
|
}
|
|
@@ -3334,14 +3334,14 @@ function Qn(e) {
|
|
|
3334
3334
|
}
|
|
3335
3335
|
function ei(e, t) {
|
|
3336
3336
|
const r = new Date(e.getTime() + t * 60 * 1e3);
|
|
3337
|
-
return
|
|
3337
|
+
return hs(r);
|
|
3338
3338
|
}
|
|
3339
3339
|
function jt(e, t) {
|
|
3340
3340
|
const [r, o, n] = e.split("-"), i = Number(r), a = Number(o), c = Number(n);
|
|
3341
3341
|
if (!Number.isFinite(i) || !Number.isFinite(a) || !Number.isFinite(c))
|
|
3342
3342
|
throw new Error(`Invalid date format: ${e}. Expected YYYY-MM-DD.`);
|
|
3343
3343
|
const d = new Date(Date.UTC(i, a - 1, c));
|
|
3344
|
-
return d.setUTCDate(d.getUTCDate() + t),
|
|
3344
|
+
return d.setUTCDate(d.getUTCDate() + t), hs(d);
|
|
3345
3345
|
}
|
|
3346
3346
|
const ti = ["and", "or"], ct = {
|
|
3347
3347
|
labels: s.string().array().optional().describe("The labels to filter the tasks by"),
|
|
@@ -3410,8 +3410,8 @@ const oi = {
|
|
|
3410
3410
|
"Cursor pagination requires explicit since and until. Reuse structuredContent.appliedFilters.since and structuredContent.appliedFilters.until from the previous page."
|
|
3411
3411
|
);
|
|
3412
3412
|
const u = await Qe(t, c), p = u?.email;
|
|
3413
|
-
let
|
|
3414
|
-
u && p && (
|
|
3413
|
+
let m = dt(o, n);
|
|
3414
|
+
u && p && (m = ce(m, `assigned to: ${p}`));
|
|
3415
3415
|
const y = await t.getUser(), f = y.tzInfo?.gmtString || "+00:00", v = await de({
|
|
3416
3416
|
projectId: d,
|
|
3417
3417
|
user: y
|
|
@@ -3428,13 +3428,13 @@ const oi = {
|
|
|
3428
3428
|
projectId: v,
|
|
3429
3429
|
since: I,
|
|
3430
3430
|
until: x,
|
|
3431
|
-
...
|
|
3431
|
+
...m ? { filterQuery: m, filterLang: "en" } : {}
|
|
3432
3432
|
}) : await t.getCompletedTasksByDueDate({
|
|
3433
3433
|
...l,
|
|
3434
3434
|
projectId: v,
|
|
3435
3435
|
since: I,
|
|
3436
3436
|
until: x,
|
|
3437
|
-
...
|
|
3437
|
+
...m ? { filterQuery: m, filterLang: "en" } : {}
|
|
3438
3438
|
}), $ = b.map(P);
|
|
3439
3439
|
return {
|
|
3440
3440
|
textContent: ai({
|
|
@@ -3535,7 +3535,7 @@ function ui({
|
|
|
3535
3535
|
`), l = e.length - a, u = l > 0 ? `${d}
|
|
3536
3536
|
…and ${l} more` : d, p = [];
|
|
3537
3537
|
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"));
|
|
3538
|
-
const
|
|
3538
|
+
const h = o.length > 0 ? `
|
|
3539
3539
|
Shared labels (${o.length}): ${o.join(", ")}` : `
|
|
3540
3540
|
No shared labels.`;
|
|
3541
3541
|
return K({
|
|
@@ -3546,16 +3546,16 @@ No shared labels.`;
|
|
|
3546
3546
|
filterHints: i,
|
|
3547
3547
|
previewLines: u,
|
|
3548
3548
|
zeroReasonHints: p
|
|
3549
|
-
}) +
|
|
3549
|
+
}) + h;
|
|
3550
3550
|
}
|
|
3551
|
-
const { FIND_PROJECTS:
|
|
3551
|
+
const { FIND_PROJECTS: ms, ADD_TASKS: fs, UPDATE_TASKS: bs } = g, pi = {
|
|
3552
3552
|
projectId: s.string().min(1).optional().describe(
|
|
3553
3553
|
'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.'
|
|
3554
3554
|
),
|
|
3555
3555
|
searchTerm: s.string().optional().describe(
|
|
3556
3556
|
"Search for a user by name or email (partial and case insensitive match). If omitted, all users are returned."
|
|
3557
3557
|
)
|
|
3558
|
-
},
|
|
3558
|
+
}, hi = {
|
|
3559
3559
|
collaborators: s.array(yo).describe("The found users."),
|
|
3560
3560
|
projectInfo: s.object({
|
|
3561
3561
|
id: s.string().describe("The project ID."),
|
|
@@ -3565,11 +3565,11 @@ const { FIND_PROJECTS: hs, ADD_TASKS: fs, UPDATE_TASKS: bs } = g, pi = {
|
|
|
3565
3565
|
totalCount: s.number().describe("The total number of users found."),
|
|
3566
3566
|
totalAvailable: s.number().optional().describe("The total number of available users before the search filter was applied."),
|
|
3567
3567
|
appliedFilters: s.record(s.string(), s.unknown())
|
|
3568
|
-
},
|
|
3568
|
+
}, mi = {
|
|
3569
3569
|
name: g.FIND_PROJECT_COLLABORATORS,
|
|
3570
3570
|
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.`,
|
|
3571
3571
|
parameters: pi,
|
|
3572
|
-
outputSchema:
|
|
3572
|
+
outputSchema: hi,
|
|
3573
3573
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
3574
3574
|
async execute(e, t) {
|
|
3575
3575
|
const { projectId: r, searchTerm: o } = e;
|
|
@@ -3655,7 +3655,7 @@ async function fi({
|
|
|
3655
3655
|
textContent: `No users found. You may have no shared projects, or collaborator data is not accessible.
|
|
3656
3656
|
|
|
3657
3657
|
**Next steps:**
|
|
3658
|
-
• Use ${
|
|
3658
|
+
• Use ${ms} to find shared projects
|
|
3659
3659
|
• Share a project to add collaborators
|
|
3660
3660
|
• Ensure you have permission to view collaborators`,
|
|
3661
3661
|
structuredContent: {
|
|
@@ -3712,13 +3712,13 @@ function ys({
|
|
|
3712
3712
|
r && c.push(`matching "${r}"`), c.push(`in ${n}`);
|
|
3713
3713
|
let d = [];
|
|
3714
3714
|
e.length > 0 && (d = e.slice(0, 10).map((p) => {
|
|
3715
|
-
const
|
|
3716
|
-
return `• ${
|
|
3715
|
+
const h = p.name || "Unknown Name", m = p.email || "No email";
|
|
3716
|
+
return `• ${h} (${m}) - ID: ${p.id}`;
|
|
3717
3717
|
}), e.length > 10 && d.push(`... and ${e.length - 10} more`));
|
|
3718
3718
|
const l = [];
|
|
3719
3719
|
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`));
|
|
3720
3720
|
const u = [];
|
|
3721
|
-
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 ${
|
|
3721
|
+
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 ${ms} to find other projects`), r && o > 0 && u.push("Try searching without filters to see all users")), K({
|
|
3722
3722
|
subject: a,
|
|
3723
3723
|
count: e.length,
|
|
3724
3724
|
filterHints: c,
|
|
@@ -3762,7 +3762,7 @@ const { ADD_PROJECTS: Ct } = g, gi = {
|
|
|
3762
3762
|
const c = Promise.resolve([]), [d, l] = await Promise.all([
|
|
3763
3763
|
o === "archived" ? c : r ? rs(t, r) : os(t),
|
|
3764
3764
|
o === "active" ? c : io(t)
|
|
3765
|
-
]), u = r ? ao(r) : null, p = u ? l.filter((
|
|
3765
|
+
]), u = r ? ao(r) : null, p = u ? l.filter((h) => u.test(h.name)) : l;
|
|
3766
3766
|
n = [...d, ...p];
|
|
3767
3767
|
} else {
|
|
3768
3768
|
const c = o === "archived" ? await t.getArchivedProjects({
|
|
@@ -3995,13 +3995,13 @@ const Ei = {
|
|
|
3995
3995
|
i = "overdue";
|
|
3996
3996
|
else if (e.startDate === "today")
|
|
3997
3997
|
if (e.daysCount > 1) {
|
|
3998
|
-
const p = /* @__PURE__ */ new Date(),
|
|
3998
|
+
const p = /* @__PURE__ */ new Date(), h = ae(p), m = Ue(p, e.daysCount), y = lt(m, { representation: "date" }), f = `(due after: ${h} | due: ${h}) & due before: ${y}`;
|
|
3999
3999
|
i = e.overdueOption === "exclude-overdue" ? f : `(${f} | overdue)`;
|
|
4000
4000
|
} else
|
|
4001
4001
|
i = e.overdueOption === "exclude-overdue" ? "today" : "(today | overdue)";
|
|
4002
4002
|
else if (e.startDate) {
|
|
4003
|
-
const p = e.startDate,
|
|
4004
|
-
i = `(due after: ${p} | due: ${p}) & due before: ${
|
|
4003
|
+
const p = e.startDate, h = Ue(Ts(p), e.daysCount), m = lt(h, { representation: "date" });
|
|
4004
|
+
i = `(due after: ${p} | due: ${p}) & due before: ${m}`;
|
|
4005
4005
|
}
|
|
4006
4006
|
const a = dt(e.labels, e.labelsOperator);
|
|
4007
4007
|
a.length > 0 && (i = ce(i, `(${a})`));
|
|
@@ -4188,23 +4188,23 @@ const Li = new Ui(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ni = {
|
|
|
4188
4188
|
cursor: l,
|
|
4189
4189
|
labels: u,
|
|
4190
4190
|
labelsOperator: p,
|
|
4191
|
-
filter:
|
|
4192
|
-
filterIdOrName:
|
|
4191
|
+
filter: h,
|
|
4192
|
+
filterIdOrName: m
|
|
4193
4193
|
} = e, y = await t.getUser(), f = u && u.length > 0;
|
|
4194
|
-
if (!r && !o && !n && !i && !a && !f && !
|
|
4194
|
+
if (!r && !o && !n && !i && !a && !f && !h && !m)
|
|
4195
4195
|
throw new Error(
|
|
4196
4196
|
"At least one filter must be provided: searchText, projectId, sectionId, parentId, responsibleUser, labels, filter, or filterIdOrName"
|
|
4197
4197
|
);
|
|
4198
|
-
if (
|
|
4198
|
+
if (h && m)
|
|
4199
4199
|
throw new Error(
|
|
4200
4200
|
"The `filter` and `filterIdOrName` parameters cannot be used together. Provide only one."
|
|
4201
4201
|
);
|
|
4202
|
-
if ((
|
|
4202
|
+
if ((h || m) && (o || n || i))
|
|
4203
4203
|
throw new Error(
|
|
4204
4204
|
'The `filter`/`filterIdOrName` parameter cannot be combined with projectId, sectionId, or parentId. Use filter syntax instead (e.g. "##ProjectName").'
|
|
4205
4205
|
);
|
|
4206
|
-
let v =
|
|
4207
|
-
|
|
4206
|
+
let v = h;
|
|
4207
|
+
m && (v = (await Li.resolveFilter(t, m)).filterQuery);
|
|
4208
4208
|
const j = await Qe(t, a), A = j?.userId, k = j?.email;
|
|
4209
4209
|
if (o || n || i) {
|
|
4210
4210
|
const D = {
|
|
@@ -4212,7 +4212,7 @@ const Li = new Ui(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ni = {
|
|
|
4212
4212
|
cursor: l ?? null
|
|
4213
4213
|
};
|
|
4214
4214
|
o && (D.projectId = await de({ projectId: o, user: y })), n && (D.sectionId = n), i && (D.parentId = i);
|
|
4215
|
-
const { results:
|
|
4215
|
+
const { results: he, nextCursor: Y } = await t.getTasks(D), $e = he.map(P);
|
|
4216
4216
|
let H = r ? $e.filter(
|
|
4217
4217
|
(te) => te.content.toLowerCase().includes(r.toLowerCase()) || te.description?.toLowerCase().includes(r.toLowerCase())
|
|
4218
4218
|
) : $e;
|
|
@@ -4243,7 +4243,7 @@ const Li = new Ui(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ni = {
|
|
|
4243
4243
|
};
|
|
4244
4244
|
}
|
|
4245
4245
|
if (A && !r && !f && !v) {
|
|
4246
|
-
const { results: D, nextCursor:
|
|
4246
|
+
const { results: D, nextCursor: he } = await t.getTasksByFilter({
|
|
4247
4247
|
query: `assigned to: ${k}`,
|
|
4248
4248
|
lang: "en",
|
|
4249
4249
|
limit: d,
|
|
@@ -4253,15 +4253,15 @@ const Li = new Ui(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ni = {
|
|
|
4253
4253
|
textContent: Ee({
|
|
4254
4254
|
tasks: Y,
|
|
4255
4255
|
args: e,
|
|
4256
|
-
nextCursor:
|
|
4256
|
+
nextCursor: he,
|
|
4257
4257
|
isContainerSearch: !1,
|
|
4258
4258
|
assigneeEmail: k
|
|
4259
4259
|
}),
|
|
4260
4260
|
structuredContent: {
|
|
4261
4261
|
tasks: Y,
|
|
4262
|
-
nextCursor:
|
|
4262
|
+
nextCursor: he ?? void 0,
|
|
4263
4263
|
totalCount: Y.length,
|
|
4264
|
-
hasMore: !!
|
|
4264
|
+
hasMore: !!he,
|
|
4265
4265
|
appliedFilters: e
|
|
4266
4266
|
}
|
|
4267
4267
|
};
|
|
@@ -4269,7 +4269,7 @@ const Li = new Ui(), { FIND_COMPLETED_TASKS: $t, ADD_TASKS: Dt } = g, Ni = {
|
|
|
4269
4269
|
let I = v ? `(${v})` : "";
|
|
4270
4270
|
r && (I = ce(I, `search: ${r}`));
|
|
4271
4271
|
const x = dt(u, p);
|
|
4272
|
-
if (I = ce(I, x), !(
|
|
4272
|
+
if (I = ce(I, x), !(m && !a && !c)) {
|
|
4273
4273
|
const D = ss({
|
|
4274
4274
|
resolvedAssigneeId: A,
|
|
4275
4275
|
assigneeEmail: k,
|
|
@@ -4547,7 +4547,7 @@ async function Gi(e) {
|
|
|
4547
4547
|
),
|
|
4548
4548
|
totalProjects: t.length,
|
|
4549
4549
|
totalSections: i.reduce(
|
|
4550
|
-
(p,
|
|
4550
|
+
(p, h) => p + (a[h]?.length || 0),
|
|
4551
4551
|
0
|
|
4552
4552
|
),
|
|
4553
4553
|
hasNestedProjects: d
|
|
@@ -4576,8 +4576,8 @@ async function Vi(e, t) {
|
|
|
4576
4576
|
const p = i[u.id];
|
|
4577
4577
|
if (!p?.length)
|
|
4578
4578
|
continue;
|
|
4579
|
-
const
|
|
4580
|
-
c.push(...Ke(
|
|
4579
|
+
const h = xt(p);
|
|
4580
|
+
c.push(...Ke(h));
|
|
4581
4581
|
}
|
|
4582
4582
|
const d = c.join(`
|
|
4583
4583
|
`), l = {
|
|
@@ -4805,9 +4805,6 @@ const oa = {
|
|
|
4805
4805
|
"Include detailed health context with project metrics and task-level data. May produce large output for projects with many tasks."
|
|
4806
4806
|
)
|
|
4807
4807
|
}, ia = s.object({
|
|
4808
|
-
taskId: s.string().describe("The ID of the task this recommendation is for."),
|
|
4809
|
-
recommendation: s.string().describe("The recommendation for this task.")
|
|
4810
|
-
}), aa = s.object({
|
|
4811
4808
|
id: s.string().describe("The task ID."),
|
|
4812
4809
|
content: s.string().describe("The task content/title."),
|
|
4813
4810
|
priority: s.string().describe("The task priority (1-4)."),
|
|
@@ -4815,7 +4812,7 @@ const oa = {
|
|
|
4815
4812
|
deadline: s.string().optional().describe("The deadline date string, if set."),
|
|
4816
4813
|
isCompleted: s.boolean().describe("Whether the task is completed."),
|
|
4817
4814
|
labels: s.array(s.string()).describe("Labels applied to this task.")
|
|
4818
|
-
}),
|
|
4815
|
+
}), aa = {
|
|
4819
4816
|
projectId: s.string().describe("The project ID."),
|
|
4820
4817
|
projectName: s.string().describe("The project name."),
|
|
4821
4818
|
progress: s.object({
|
|
@@ -4827,7 +4824,6 @@ const oa = {
|
|
|
4827
4824
|
status: s.enum(Ge).describe("The overall health status of the project."),
|
|
4828
4825
|
description: s.string().optional().describe("Detailed description of the health assessment."),
|
|
4829
4826
|
descriptionSummary: s.string().optional().describe("Brief summary of the health assessment."),
|
|
4830
|
-
taskRecommendations: s.array(ia).optional().describe("Specific recommendations for individual tasks."),
|
|
4831
4827
|
isStale: s.boolean().describe("Whether the health data is stale and may need refreshing."),
|
|
4832
4828
|
updateInProgress: s.boolean().describe("Whether a health analysis update is currently in progress."),
|
|
4833
4829
|
updatedAt: s.string().optional().describe("When the health assessment was last updated.")
|
|
@@ -4842,12 +4838,12 @@ const oa = {
|
|
|
4842
4838
|
tasksCompletedThisWeek: s.number().describe("Tasks completed in the current week."),
|
|
4843
4839
|
averageCompletionTime: s.number().optional().describe("Average task completion time in days, if available.")
|
|
4844
4840
|
}).describe("Aggregated project metrics."),
|
|
4845
|
-
tasks: s.array(
|
|
4841
|
+
tasks: s.array(ia).describe("Tasks in the project.")
|
|
4846
4842
|
}).optional().describe(
|
|
4847
4843
|
"Detailed project context with metrics and task data. Only included when includeContext is true."
|
|
4848
4844
|
)
|
|
4849
4845
|
};
|
|
4850
|
-
async function
|
|
4846
|
+
async function ca(e, t, r) {
|
|
4851
4847
|
if (r) {
|
|
4852
4848
|
const [i, a, c] = await Promise.all([
|
|
4853
4849
|
e.getProjectProgress(t),
|
|
@@ -4862,16 +4858,11 @@ async function da(e, t, r) {
|
|
|
4862
4858
|
]);
|
|
4863
4859
|
return { progress: o, health: n };
|
|
4864
4860
|
}
|
|
4865
|
-
function
|
|
4861
|
+
function da(e, { progress: t, health: r, context: o }) {
|
|
4866
4862
|
const n = [`# Project Health: ${e}`, ""];
|
|
4867
4863
|
if (n.push(`**Status:** ${r.status}`), r.isStale && n.push("**Note:** Health data is stale and may not reflect recent changes."), r.updateInProgress && n.push("**Note:** A health analysis update is currently in progress."), r.updatedAt && n.push(`**Last Updated:** ${r.updatedAt.toISOString()}`), n.push(""), n.push("## Progress"), n.push(
|
|
4868
4864
|
`**Completed:** ${t.completedCount} | **Active:** ${t.activeCount} | **Progress:** ${t.progressPercent}%`
|
|
4869
|
-
), r.description && (n.push(""), n.push("## Health Description"), n.push(r.description)),
|
|
4870
|
-
n.push(""), n.push("## Task Recommendations");
|
|
4871
|
-
for (const i of r.taskRecommendations)
|
|
4872
|
-
n.push(`- **Task ${i.taskId}**: ${i.recommendation}`);
|
|
4873
|
-
}
|
|
4874
|
-
if (o) {
|
|
4865
|
+
), r.description && (n.push(""), n.push("## Health Description"), n.push(r.description)), o) {
|
|
4875
4866
|
n.push(""), n.push("## Project Metrics");
|
|
4876
4867
|
const i = o.projectMetrics;
|
|
4877
4868
|
if (n.push(`- **Total Tasks:** ${i.totalTasks}`), n.push(`- **Completed:** ${i.completedTasks}`), n.push(`- **Overdue:** ${i.overdueTasks}`), n.push(`- **Created This Week:** ${i.tasksCreatedThisWeek}`), n.push(`- **Completed This Week:** ${i.tasksCompletedThisWeek}`), i.averageCompletionTime !== null && n.push(`- **Avg Completion Time:** ${i.averageCompletionTime} days`), o.tasks.length > 0) {
|
|
@@ -4885,18 +4876,18 @@ function la(e, { progress: t, health: r, context: o }) {
|
|
|
4885
4876
|
return n.join(`
|
|
4886
4877
|
`);
|
|
4887
4878
|
}
|
|
4888
|
-
const
|
|
4879
|
+
const la = {
|
|
4889
4880
|
name: g.GET_PROJECT_HEALTH,
|
|
4890
|
-
description: "Get a comprehensive health assessment for a project including completion progress, health status (EXCELLENT, ON_TRACK, AT_RISK, CRITICAL), and optional detailed context with project metrics and task-level
|
|
4881
|
+
description: "Get a comprehensive health assessment for a project including completion progress, health status (EXCELLENT, ON_TRACK, AT_RISK, CRITICAL), and optional detailed context with project metrics and task-level data. Use includeContext=true for that full detail.",
|
|
4891
4882
|
parameters: na,
|
|
4892
|
-
outputSchema:
|
|
4883
|
+
outputSchema: aa,
|
|
4893
4884
|
annotations: {
|
|
4894
4885
|
readOnlyHint: !0,
|
|
4895
4886
|
destructiveHint: !1,
|
|
4896
4887
|
idempotentHint: !0
|
|
4897
4888
|
},
|
|
4898
4889
|
async execute(e, t) {
|
|
4899
|
-
const { projectId: r, includeContext: o } = e, n = await
|
|
4890
|
+
const { projectId: r, includeContext: o } = e, n = await ca(t, r, o), i = n.context?.projectName ?? `Project ${r}`, a = da(i, n), c = n.context ? {
|
|
4900
4891
|
projectDescription: n.context.projectDescription ?? void 0,
|
|
4901
4892
|
projectMetrics: {
|
|
4902
4893
|
...n.context.projectMetrics,
|
|
@@ -4926,7 +4917,6 @@ const ua = {
|
|
|
4926
4917
|
status: n.health.status,
|
|
4927
4918
|
description: n.health.description ?? void 0,
|
|
4928
4919
|
descriptionSummary: n.health.descriptionSummary ?? void 0,
|
|
4929
|
-
taskRecommendations: n.health.taskRecommendations ?? void 0,
|
|
4930
4920
|
isStale: n.health.isStale,
|
|
4931
4921
|
updateInProgress: n.health.updateInProgress,
|
|
4932
4922
|
updatedAt: n.health.updatedAt?.toISOString()
|
|
@@ -4935,12 +4925,12 @@ const ua = {
|
|
|
4935
4925
|
}
|
|
4936
4926
|
};
|
|
4937
4927
|
}
|
|
4938
|
-
},
|
|
4928
|
+
}, ua = {
|
|
4939
4929
|
workspaceIdOrName: s.string().min(1).describe(
|
|
4940
4930
|
"The workspace ID or name. Supports exact ID, exact name match (case-insensitive), or unique partial name match."
|
|
4941
4931
|
),
|
|
4942
4932
|
projectIds: s.array(s.string().min(1)).min(1).optional().describe("Optional list of project IDs to scope insights to specific projects.")
|
|
4943
|
-
},
|
|
4933
|
+
}, pa = s.object({
|
|
4944
4934
|
projectId: s.string().describe("The project ID."),
|
|
4945
4935
|
health: s.object({
|
|
4946
4936
|
status: s.enum(Ge).describe("The health status of the project."),
|
|
@@ -4955,11 +4945,11 @@ const ua = {
|
|
|
4955
4945
|
}), ha = {
|
|
4956
4946
|
workspaceId: s.string().describe("The resolved workspace ID."),
|
|
4957
4947
|
workspaceName: s.string().describe("The resolved workspace name."),
|
|
4958
|
-
projectInsights: s.array(
|
|
4959
|
-
},
|
|
4948
|
+
projectInsights: s.array(pa).describe("Health and progress insights for each project in the workspace.")
|
|
4949
|
+
}, ma = {
|
|
4960
4950
|
name: g.GET_WORKSPACE_INSIGHTS,
|
|
4961
4951
|
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
|
-
parameters:
|
|
4952
|
+
parameters: ua,
|
|
4963
4953
|
outputSchema: ha,
|
|
4964
4954
|
annotations: {
|
|
4965
4955
|
readOnlyHint: !0,
|
|
@@ -5000,7 +4990,7 @@ const ua = {
|
|
|
5000
4990
|
};
|
|
5001
4991
|
}
|
|
5002
4992
|
};
|
|
5003
|
-
function
|
|
4993
|
+
function fa(e) {
|
|
5004
4994
|
const t = e.trim();
|
|
5005
4995
|
if (!/^https?:\/\//i.test(t))
|
|
5006
4996
|
return t;
|
|
@@ -5010,7 +5000,7 @@ function ba(e) {
|
|
|
5010
5000
|
} catch {
|
|
5011
5001
|
throw new Error(`Could not read a template ID from "${t}".`);
|
|
5012
5002
|
}
|
|
5013
|
-
if (!
|
|
5003
|
+
if (!ba(r.hostname))
|
|
5014
5004
|
throw new Error(
|
|
5015
5005
|
`"${r.hostname}" is not a Todoist domain. Pass a todoist.com template URL or the template ID itself.`
|
|
5016
5006
|
);
|
|
@@ -5022,11 +5012,11 @@ function ba(e) {
|
|
|
5022
5012
|
throw new Error(`Could not read a template ID from "${t}".`);
|
|
5023
5013
|
return i;
|
|
5024
5014
|
}
|
|
5025
|
-
function
|
|
5015
|
+
function ba(e) {
|
|
5026
5016
|
const t = e.toLowerCase();
|
|
5027
5017
|
return t === "todoist.com" || t.endsWith(".todoist.com");
|
|
5028
5018
|
}
|
|
5029
|
-
const
|
|
5019
|
+
const ga = {
|
|
5030
5020
|
projectId: s.string().min(1).describe("The ID of the existing project to import the template into."),
|
|
5031
5021
|
templateId: s.string().optional().describe(
|
|
5032
5022
|
'The template to import — either a gallery slug ("product-launch"), a personal template ID ("UT_28Ex..."), or a full Todoist template URL, which is reduced to the ID automatically. Gallery templates work for anyone; personal templates only for the account that owns them. There is no way to list templates through this server, so only use the ID or URL the user supplied. Provide either this or `csvFileContent`, not both.'
|
|
@@ -5035,16 +5025,16 @@ const ya = {
|
|
|
5035
5025
|
"Raw CSV template content, as produced by export-project-template. Provide either this or `templateId`, not both."
|
|
5036
5026
|
),
|
|
5037
5027
|
locale: s.string().optional().describe('Locale for the imported content when using `templateId`. Defaults to "en".')
|
|
5038
|
-
},
|
|
5028
|
+
}, ya = {
|
|
5039
5029
|
sections: s.array(X).describe("Sections created by the import."),
|
|
5040
5030
|
tasks: s.array(F).describe("Tasks created by the import."),
|
|
5041
5031
|
comments: s.array(ye).describe("Comments created by the import."),
|
|
5042
5032
|
totalCount: s.number().describe("The total number of objects created by the import.")
|
|
5043
|
-
},
|
|
5033
|
+
}, Ta = {
|
|
5044
5034
|
name: g.IMPORT_PROJECT_TEMPLATE,
|
|
5045
5035
|
description: "Import a template into an existing project, adding its tasks, sections and comments to whatever is already there. Source it by template ID/URL or by passing CSV content from export-project-template. To start a new project from a template, create the project with add-projects first, then import into it. This writes immediately and cannot be undone, so only run it against a project the user named.",
|
|
5046
|
-
parameters:
|
|
5047
|
-
outputSchema:
|
|
5036
|
+
parameters: ga,
|
|
5037
|
+
outputSchema: ya,
|
|
5048
5038
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
5049
5039
|
async execute({ projectId: e, templateId: t, csvFileContent: r, locale: o }, n) {
|
|
5050
5040
|
if (!!t == !!r)
|
|
@@ -5053,7 +5043,7 @@ const ya = {
|
|
|
5053
5043
|
);
|
|
5054
5044
|
const i = t ? await n.importTemplateFromId({
|
|
5055
5045
|
projectId: e,
|
|
5056
|
-
templateId:
|
|
5046
|
+
templateId: fa(t),
|
|
5057
5047
|
locale: o
|
|
5058
5048
|
}) : await n.importTemplateIntoProject({
|
|
5059
5049
|
projectId: e,
|
|
@@ -5061,7 +5051,7 @@ const ya = {
|
|
|
5061
5051
|
fileName: "template.csv"
|
|
5062
5052
|
}), a = i.sections.map(q), c = i.tasks.map(P), d = i.comments.map(ge), l = i.projects.length + a.length + c.length + d.length;
|
|
5063
5053
|
return {
|
|
5064
|
-
textContent:
|
|
5054
|
+
textContent: ka({
|
|
5065
5055
|
projectId: e,
|
|
5066
5056
|
counts: {
|
|
5067
5057
|
projects: i.projects.length,
|
|
@@ -5075,7 +5065,7 @@ const ya = {
|
|
|
5075
5065
|
};
|
|
5076
5066
|
}
|
|
5077
5067
|
};
|
|
5078
|
-
function
|
|
5068
|
+
function ka({
|
|
5079
5069
|
projectId: e,
|
|
5080
5070
|
counts: t,
|
|
5081
5071
|
totalCount: r
|
|
@@ -5085,7 +5075,7 @@ function wa({
|
|
|
5085
5075
|
const o = Object.entries(t).filter(([, n]) => n > 0).map(([n, i]) => `${i} ${i === 1 ? n.replace(/s$/, "") : n}`);
|
|
5086
5076
|
return `Imported template into project (id=${e}): ${o.join(", ")}.`;
|
|
5087
5077
|
}
|
|
5088
|
-
const
|
|
5078
|
+
const wa = {}, va = {
|
|
5089
5079
|
id: s.string().describe("The unique identifier for the workspace."),
|
|
5090
5080
|
name: s.string().describe("The name of the workspace."),
|
|
5091
5081
|
plan: s.enum(Hs).describe("The workspace plan type."),
|
|
@@ -5094,12 +5084,12 @@ const va = {}, Ia = {
|
|
|
5094
5084
|
isGuestAllowed: s.boolean().describe("Whether guests are allowed in the workspace."),
|
|
5095
5085
|
createdAt: s.string().optional().describe("The ISO 8601 timestamp when the workspace was created."),
|
|
5096
5086
|
creatorId: s.string().describe("The ID of the user who created the workspace.")
|
|
5097
|
-
},
|
|
5087
|
+
}, Ia = {
|
|
5098
5088
|
type: s.literal("workspaces").describe("The type of the response."),
|
|
5099
|
-
workspaces: s.array(s.object(
|
|
5089
|
+
workspaces: s.array(s.object(va)).describe("List of workspaces."),
|
|
5100
5090
|
count: s.number().describe("The total number of workspaces.")
|
|
5101
5091
|
};
|
|
5102
|
-
async function
|
|
5092
|
+
async function Sa(e) {
|
|
5103
5093
|
const r = (await e.getWorkspaces()).map((a) => ({
|
|
5104
5094
|
id: a.id,
|
|
5105
5095
|
name: a.name,
|
|
@@ -5130,22 +5120,22 @@ async function ja(e) {
|
|
|
5130
5120
|
};
|
|
5131
5121
|
return { textContent: n, structuredContent: i };
|
|
5132
5122
|
}
|
|
5133
|
-
const
|
|
5123
|
+
const ja = {
|
|
5134
5124
|
name: g.LIST_WORKSPACES,
|
|
5135
5125
|
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.",
|
|
5136
|
-
parameters:
|
|
5137
|
-
outputSchema:
|
|
5126
|
+
parameters: wa,
|
|
5127
|
+
outputSchema: Ia,
|
|
5138
5128
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
5139
5129
|
async execute(e, t) {
|
|
5140
|
-
const r = await
|
|
5130
|
+
const r = await Sa(t);
|
|
5141
5131
|
return {
|
|
5142
5132
|
textContent: r.textContent,
|
|
5143
5133
|
structuredContent: r.structuredContent
|
|
5144
5134
|
};
|
|
5145
5135
|
}
|
|
5146
|
-
}, { FIND_TASKS:
|
|
5136
|
+
}, { FIND_TASKS: Ca, FIND_PROJECT_COLLABORATORS: Et, UPDATE_TASKS: $a } = g, Da = 50, xa = {
|
|
5147
5137
|
operation: s.enum(["assign", "unassign", "reassign"]).describe("The assignment operation to perform."),
|
|
5148
|
-
taskIds: s.array(s.string()).min(1).max(
|
|
5138
|
+
taskIds: s.array(s.string()).min(1).max(Da).describe("The IDs of the tasks to operate on (max 50)."),
|
|
5149
5139
|
responsibleUser: s.string().optional().describe(
|
|
5150
5140
|
'The user to assign tasks to. Can be "me" (assigns to current user), a user ID, name, or email. Required for assign and reassign operations.'
|
|
5151
5141
|
),
|
|
@@ -5153,7 +5143,7 @@ const Ca = {
|
|
|
5153
5143
|
"For reassign operations: the current assignee to reassign from. Can be user ID, name, or email. Optional - if not provided, reassigns from any current assignee."
|
|
5154
5144
|
),
|
|
5155
5145
|
dryRun: s.boolean().optional().default(!1).describe("If true, validates operations without executing them.")
|
|
5156
|
-
},
|
|
5146
|
+
}, Aa = {
|
|
5157
5147
|
results: s.array(
|
|
5158
5148
|
s.object({
|
|
5159
5149
|
taskId: s.string().describe("The ID of the task."),
|
|
@@ -5169,11 +5159,11 @@ const Ca = {
|
|
|
5169
5159
|
failed: s.number().describe("Number of failed operations."),
|
|
5170
5160
|
dryRun: s.boolean().describe("Whether this was a dry run.")
|
|
5171
5161
|
}).optional().describe("Summary of the operation.")
|
|
5172
|
-
},
|
|
5162
|
+
}, Ea = {
|
|
5173
5163
|
name: g.MANAGE_ASSIGNMENTS,
|
|
5174
5164
|
description: "Bulk assignment operations for multiple tasks. Supports assign, unassign, and reassign operations with atomic rollback on failures.",
|
|
5175
|
-
parameters:
|
|
5176
|
-
outputSchema:
|
|
5165
|
+
parameters: xa,
|
|
5166
|
+
outputSchema: Aa,
|
|
5177
5167
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5178
5168
|
async execute(e, t) {
|
|
5179
5169
|
const { operation: r, taskIds: o, responsibleUser: n, fromAssigneeUser: i, dryRun: a } = e;
|
|
@@ -5275,13 +5265,13 @@ const Ca = {
|
|
|
5275
5265
|
}
|
|
5276
5266
|
};
|
|
5277
5267
|
}
|
|
5278
|
-
const
|
|
5268
|
+
const h = await at.validateBulkAssignment(
|
|
5279
5269
|
t,
|
|
5280
5270
|
p
|
|
5281
|
-
),
|
|
5271
|
+
), m = [], y = [];
|
|
5282
5272
|
for (let k = 0; k < p.length; k++) {
|
|
5283
|
-
const I = p[k], x =
|
|
5284
|
-
I && x?.isValid ?
|
|
5273
|
+
const I = p[k], x = h[k];
|
|
5274
|
+
I && x?.isValid ? m.push({ assignment: I, validation: x }) : I?.taskId && y.push({
|
|
5285
5275
|
taskId: I.taskId,
|
|
5286
5276
|
success: !1,
|
|
5287
5277
|
error: x?.error?.message || "Validation failed"
|
|
@@ -5336,7 +5326,7 @@ const Ca = {
|
|
|
5336
5326
|
);
|
|
5337
5327
|
return Promise.all(T);
|
|
5338
5328
|
}
|
|
5339
|
-
const v = await f(
|
|
5329
|
+
const v = await f(m, !a), j = [...v, ...y, ...l];
|
|
5340
5330
|
if (j.length > 0 && j.every((k) => !k.success)) {
|
|
5341
5331
|
const k = j.map((I) => `"${I.taskId}": ${I.error}`).join("; ");
|
|
5342
5332
|
throw new Error(`All ${j.length} ${r} operation(s) failed: ${k}`);
|
|
@@ -5396,8 +5386,8 @@ function Oe({
|
|
|
5396
5386
|
`;
|
|
5397
5387
|
}
|
|
5398
5388
|
return !r && o.length > 0 ? (c += `**Next steps:**
|
|
5399
|
-
`, c += `• Use ${
|
|
5400
|
-
`, c += `• Use ${
|
|
5389
|
+
`, c += `• Use ${Ca} with responsibleUser to see ${e === "unassign" ? "unassigned" : "newly assigned"} tasks
|
|
5390
|
+
`, c += `• Use ${$a} for individual assignment changes
|
|
5401
5391
|
`, n.length > 0 && (c += `• Check failed tasks and use ${Et} to verify collaborator access
|
|
5402
5392
|
`)) : r ? (c += `**To execute:**
|
|
5403
5393
|
`, c += `• Remove dryRun parameter and run again to execute changes
|
|
@@ -5409,17 +5399,17 @@ function Oe({
|
|
|
5409
5399
|
`, c += `• Use dryRun=true to validate before executing
|
|
5410
5400
|
`), c;
|
|
5411
5401
|
}
|
|
5412
|
-
const
|
|
5402
|
+
const Oa = {
|
|
5413
5403
|
action: s.enum(["archive", "unarchive"]).describe("The action to perform on the project."),
|
|
5414
5404
|
projectId: s.string().min(1).describe("The ID of the project.")
|
|
5415
|
-
},
|
|
5405
|
+
}, Pa = {
|
|
5416
5406
|
project: Q.describe("The updated project."),
|
|
5417
5407
|
success: s.boolean().describe("Whether the action was successful.")
|
|
5418
|
-
},
|
|
5408
|
+
}, _a = {
|
|
5419
5409
|
name: g.PROJECT_MANAGEMENT,
|
|
5420
5410
|
description: "Archive or unarchive a project by its ID.",
|
|
5421
|
-
parameters:
|
|
5422
|
-
outputSchema:
|
|
5411
|
+
parameters: Oa,
|
|
5412
|
+
outputSchema: Pa,
|
|
5423
5413
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !0 },
|
|
5424
5414
|
async execute(e, t) {
|
|
5425
5415
|
const r = e.action === "archive" ? await t.archiveProject(e.projectId) : await t.unarchiveProject(e.projectId), o = Z(r);
|
|
@@ -5431,7 +5421,7 @@ const Pa = {
|
|
|
5431
5421
|
}
|
|
5432
5422
|
};
|
|
5433
5423
|
}
|
|
5434
|
-
},
|
|
5424
|
+
}, Ra = {
|
|
5435
5425
|
action: s.enum(["move-to-workspace", "move-to-personal"]).describe("The action to perform on the project."),
|
|
5436
5426
|
projectId: s.string().min(1).describe("The ID of the project to move."),
|
|
5437
5427
|
workspaceId: s.string().min(1).optional().describe("The target workspace ID. Required when action is move-to-workspace."),
|
|
@@ -5439,14 +5429,14 @@ const Pa = {
|
|
|
5439
5429
|
visibility: s.enum(["restricted", "team", "public"]).optional().describe(
|
|
5440
5430
|
"Optional access visibility for the project in the workspace (restricted, team, or public)."
|
|
5441
5431
|
)
|
|
5442
|
-
},
|
|
5432
|
+
}, Ua = {
|
|
5443
5433
|
project: Q.describe("The moved project."),
|
|
5444
5434
|
success: s.boolean().describe("Whether the move was successful.")
|
|
5445
|
-
},
|
|
5435
|
+
}, La = {
|
|
5446
5436
|
name: g.PROJECT_MOVE,
|
|
5447
5437
|
description: "Move a project between personal and workspace contexts.",
|
|
5448
|
-
parameters:
|
|
5449
|
-
outputSchema:
|
|
5438
|
+
parameters: Ra,
|
|
5439
|
+
outputSchema: Ua,
|
|
5450
5440
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !0 },
|
|
5451
5441
|
async execute(e, t) {
|
|
5452
5442
|
let r;
|
|
@@ -5469,7 +5459,7 @@ const Pa = {
|
|
|
5469
5459
|
}
|
|
5470
5460
|
};
|
|
5471
5461
|
}
|
|
5472
|
-
}, Is = ["project", "section"],
|
|
5462
|
+
}, Is = ["project", "section"], Na = {
|
|
5473
5463
|
type: s.enum(Is).describe(
|
|
5474
5464
|
'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.'
|
|
5475
5465
|
),
|
|
@@ -5486,17 +5476,17 @@ const Pa = {
|
|
|
5486
5476
|
).min(1).describe(
|
|
5487
5477
|
"The items to reorder or move. Each item must have at least order or parentId. Items with parentId will be moved first, then items with order will be reordered. All items being reordered should be siblings for predictable results."
|
|
5488
5478
|
)
|
|
5489
|
-
},
|
|
5479
|
+
}, Ma = {
|
|
5490
5480
|
type: s.enum(Is).describe("The type of entity that was reordered/moved."),
|
|
5491
5481
|
movedCount: s.number().describe("The number of entities moved to a new parent."),
|
|
5492
5482
|
reorderedCount: s.number().describe("The number of entities reordered."),
|
|
5493
5483
|
affectedIds: s.array(s.string()).describe("The IDs of all affected entities."),
|
|
5494
5484
|
success: s.boolean().describe("Whether the operation was successful.")
|
|
5495
|
-
},
|
|
5485
|
+
}, Fa = {
|
|
5496
5486
|
name: g.REORDER_OBJECTS,
|
|
5497
5487
|
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.',
|
|
5498
|
-
parameters:
|
|
5499
|
-
outputSchema:
|
|
5488
|
+
parameters: Na,
|
|
5489
|
+
outputSchema: Ma,
|
|
5500
5490
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !0 },
|
|
5501
5491
|
async execute(e, t) {
|
|
5502
5492
|
const { type: r, items: o } = e, n = /* @__PURE__ */ new Set();
|
|
@@ -5514,11 +5504,11 @@ const Pa = {
|
|
|
5514
5504
|
}
|
|
5515
5505
|
const i = [], a = o.filter((p) => p.parentId !== void 0);
|
|
5516
5506
|
for (const p of a) {
|
|
5517
|
-
const
|
|
5507
|
+
const h = p.parentId;
|
|
5518
5508
|
i.push(
|
|
5519
5509
|
V("project_move", {
|
|
5520
5510
|
id: p.id,
|
|
5521
|
-
parentId:
|
|
5511
|
+
parentId: h === "root" ? null : h
|
|
5522
5512
|
})
|
|
5523
5513
|
);
|
|
5524
5514
|
}
|
|
@@ -5543,8 +5533,8 @@ const Pa = {
|
|
|
5543
5533
|
try {
|
|
5544
5534
|
await t.sync({ commands: i });
|
|
5545
5535
|
} catch (p) {
|
|
5546
|
-
const
|
|
5547
|
-
throw new Error(`Reorder failed: ${
|
|
5536
|
+
const h = p instanceof Error ? p.message : String(p);
|
|
5537
|
+
throw new Error(`Reorder failed: ${h}`);
|
|
5548
5538
|
}
|
|
5549
5539
|
const d = r === "project" ? "projects" : "sections", l = o.map((p) => p.id), u = [];
|
|
5550
5540
|
return a.length > 0 && u.push(`moved ${a.length}`), c.length > 0 && u.push(`reordered ${c.length}`), {
|
|
@@ -5558,22 +5548,22 @@ const Pa = {
|
|
|
5558
5548
|
}
|
|
5559
5549
|
};
|
|
5560
5550
|
}
|
|
5561
|
-
},
|
|
5551
|
+
}, Ha = s.object({
|
|
5562
5552
|
id: s.string().min(1).describe("The ID of the task to reschedule."),
|
|
5563
5553
|
date: s.string().min(1).describe(
|
|
5564
5554
|
"The new date for the task. Use YYYY-MM-DD for date-only, or YYYY-MM-DDTHH:MM:SS for datetime. If date-only is provided and the task already has a specific time, the existing time is preserved."
|
|
5565
5555
|
)
|
|
5566
|
-
}),
|
|
5567
|
-
tasks: s.array(
|
|
5568
|
-
},
|
|
5556
|
+
}), Wa = {
|
|
5557
|
+
tasks: s.array(Ha).min(1).describe("The tasks to reschedule with their new dates.")
|
|
5558
|
+
}, Ba = {
|
|
5569
5559
|
tasks: s.array(F).describe("The rescheduled tasks."),
|
|
5570
5560
|
totalCount: s.number().describe("The total number of tasks rescheduled."),
|
|
5571
5561
|
rescheduledTaskIds: s.array(s.string()).describe("The IDs of the rescheduled tasks.")
|
|
5572
|
-
},
|
|
5562
|
+
}, za = {
|
|
5573
5563
|
name: g.RESCHEDULE_TASKS,
|
|
5574
5564
|
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.",
|
|
5575
|
-
parameters:
|
|
5576
|
-
outputSchema:
|
|
5565
|
+
parameters: Wa,
|
|
5566
|
+
outputSchema: Ba,
|
|
5577
5567
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5578
5568
|
async execute(e, t) {
|
|
5579
5569
|
const { tasks: r } = e, n = (await Promise.all(
|
|
@@ -5586,7 +5576,7 @@ const Pa = {
|
|
|
5586
5576
|
throw new Error(
|
|
5587
5577
|
`Task "${l.content}" (${l.id}) has no due date. Rescheduling requires an existing due date.`
|
|
5588
5578
|
);
|
|
5589
|
-
const u =
|
|
5579
|
+
const u = qa(d.date, l.due);
|
|
5590
5580
|
return V("item_update", {
|
|
5591
5581
|
id: d.id,
|
|
5592
5582
|
due: {
|
|
@@ -5617,16 +5607,16 @@ const Pa = {
|
|
|
5617
5607
|
};
|
|
5618
5608
|
}
|
|
5619
5609
|
};
|
|
5620
|
-
function
|
|
5610
|
+
function qa(e, t) {
|
|
5621
5611
|
if (/^\d{4}-\d{2}-\d{2}$/.test(e) && t.datetime) {
|
|
5622
5612
|
const o = t.datetime.substring(10);
|
|
5623
5613
|
return e + o;
|
|
5624
5614
|
}
|
|
5625
5615
|
return e;
|
|
5626
5616
|
}
|
|
5627
|
-
const
|
|
5617
|
+
const Ka = {
|
|
5628
5618
|
query: s.string().min(1).describe("The search query string to find tasks and projects.")
|
|
5629
|
-
},
|
|
5619
|
+
}, Ya = {
|
|
5630
5620
|
results: s.array(
|
|
5631
5621
|
s.object({
|
|
5632
5622
|
id: s.string().describe("The ID of the result."),
|
|
@@ -5635,11 +5625,11 @@ const Ya = {
|
|
|
5635
5625
|
})
|
|
5636
5626
|
).describe("The search results."),
|
|
5637
5627
|
totalCount: s.number().describe("Total number of results found.")
|
|
5638
|
-
},
|
|
5628
|
+
}, Ga = {
|
|
5639
5629
|
name: g.SEARCH,
|
|
5640
5630
|
description: "Search across tasks and projects in Todoist. Returns a list of relevant results with IDs, titles, and URLs.",
|
|
5641
|
-
parameters:
|
|
5642
|
-
outputSchema:
|
|
5631
|
+
parameters: Ka,
|
|
5632
|
+
outputSchema: Ya,
|
|
5643
5633
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
5644
5634
|
async execute(e, t) {
|
|
5645
5635
|
const { query: r } = e, [o, n] = await Promise.all([
|
|
@@ -5668,19 +5658,19 @@ const Ya = {
|
|
|
5668
5658
|
structuredContent: { results: i, totalCount: i.length }
|
|
5669
5659
|
};
|
|
5670
5660
|
}
|
|
5671
|
-
},
|
|
5661
|
+
}, Va = {
|
|
5672
5662
|
ids: s.array(s.string().min(1)).min(1).describe("The IDs of the tasks to uncomplete.")
|
|
5673
|
-
},
|
|
5663
|
+
}, Ja = {
|
|
5674
5664
|
uncompleted: s.array(s.string()).describe("The IDs of successfully uncompleted tasks."),
|
|
5675
5665
|
failures: s.array(ee).describe("Failed task uncompletion with error details."),
|
|
5676
5666
|
totalRequested: s.number().describe("The total number of tasks requested to uncomplete."),
|
|
5677
5667
|
successCount: s.number().describe("The number of successfully uncompleted tasks."),
|
|
5678
5668
|
failureCount: s.number().describe("The number of failed task uncompletions.")
|
|
5679
|
-
},
|
|
5669
|
+
}, Xa = {
|
|
5680
5670
|
name: g.UNCOMPLETE_TASKS,
|
|
5681
5671
|
description: "Uncomplete (reopen) one or more completed tasks by their IDs.",
|
|
5682
|
-
parameters:
|
|
5683
|
-
outputSchema:
|
|
5672
|
+
parameters: Va,
|
|
5673
|
+
outputSchema: Ja,
|
|
5684
5674
|
annotations: { readOnlyHint: !1, destructiveHint: !1, idempotentHint: !1 },
|
|
5685
5675
|
async execute(e, t) {
|
|
5686
5676
|
const r = [], o = [];
|
|
@@ -5695,7 +5685,7 @@ const Ya = {
|
|
|
5695
5685
|
});
|
|
5696
5686
|
}
|
|
5697
5687
|
return {
|
|
5698
|
-
textContent:
|
|
5688
|
+
textContent: Za({
|
|
5699
5689
|
uncompleted: r,
|
|
5700
5690
|
failures: o,
|
|
5701
5691
|
args: e
|
|
@@ -5710,7 +5700,7 @@ const Ya = {
|
|
|
5710
5700
|
};
|
|
5711
5701
|
}
|
|
5712
5702
|
};
|
|
5713
|
-
function
|
|
5703
|
+
function Za({
|
|
5714
5704
|
uncompleted: e,
|
|
5715
5705
|
failures: t,
|
|
5716
5706
|
args: r
|
|
@@ -5724,28 +5714,28 @@ function Qa({
|
|
|
5724
5714
|
failures: t
|
|
5725
5715
|
});
|
|
5726
5716
|
}
|
|
5727
|
-
const
|
|
5717
|
+
const Qa = s.object({
|
|
5728
5718
|
id: s.string().min(1).describe("The ID of the comment to update."),
|
|
5729
5719
|
content: s.string().min(1).describe("The new content for the comment.")
|
|
5730
|
-
}),
|
|
5731
|
-
comments: s.array(
|
|
5732
|
-
},
|
|
5720
|
+
}), ec = {
|
|
5721
|
+
comments: s.array(Qa).min(1).describe("The comments to update.")
|
|
5722
|
+
}, tc = {
|
|
5733
5723
|
comments: s.array(ye).describe("The updated comments."),
|
|
5734
5724
|
totalCount: s.number().describe("The total number of comments updated."),
|
|
5735
5725
|
updatedCommentIds: s.array(s.string()).describe("The IDs of the updated comments."),
|
|
5736
5726
|
appliedOperations: s.object({
|
|
5737
5727
|
updateCount: s.number().describe("The number of comments updated.")
|
|
5738
5728
|
}).describe("Summary of operations performed.")
|
|
5739
|
-
},
|
|
5729
|
+
}, sc = {
|
|
5740
5730
|
name: g.UPDATE_COMMENTS,
|
|
5741
5731
|
description: "Update multiple existing comments with new content.",
|
|
5742
|
-
parameters:
|
|
5743
|
-
outputSchema:
|
|
5732
|
+
parameters: ec,
|
|
5733
|
+
outputSchema: tc,
|
|
5744
5734
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5745
5735
|
async execute(e, t) {
|
|
5746
5736
|
const { comments: r } = e, o = r.map(async (c) => await t.updateComment(c.id, { content: c.content })), i = (await Promise.all(o)).map(ge);
|
|
5747
5737
|
return {
|
|
5748
|
-
textContent:
|
|
5738
|
+
textContent: rc({
|
|
5749
5739
|
comments: i
|
|
5750
5740
|
}),
|
|
5751
5741
|
structuredContent: {
|
|
@@ -5759,7 +5749,7 @@ const ec = s.object({
|
|
|
5759
5749
|
};
|
|
5760
5750
|
}
|
|
5761
5751
|
};
|
|
5762
|
-
function
|
|
5752
|
+
function rc({ comments: e }) {
|
|
5763
5753
|
const t = e.filter((i) => i.taskId).length, r = e.filter((i) => i.projectId).length, o = [];
|
|
5764
5754
|
if (t > 0) {
|
|
5765
5755
|
const i = t > 1 ? "comments" : "comment";
|
|
@@ -5771,7 +5761,7 @@ function oc({ comments: e }) {
|
|
|
5771
5761
|
}
|
|
5772
5762
|
return o.length > 0 ? `Updated ${o.join(" and ")}` : "No comments updated";
|
|
5773
5763
|
}
|
|
5774
|
-
const
|
|
5764
|
+
const oc = s.object({
|
|
5775
5765
|
id: s.string().min(1).describe("The ID of the filter to update."),
|
|
5776
5766
|
name: s.string().min(1).optional().describe("The new name of the filter."),
|
|
5777
5767
|
query: s.string().min(1).optional().describe(
|
|
@@ -5779,9 +5769,9 @@ const nc = s.object({
|
|
|
5779
5769
|
),
|
|
5780
5770
|
color: le,
|
|
5781
5771
|
isFavorite: s.boolean().optional().describe("Whether to mark the filter as a favorite.")
|
|
5782
|
-
}),
|
|
5783
|
-
filters: s.array(
|
|
5784
|
-
},
|
|
5772
|
+
}), nc = {
|
|
5773
|
+
filters: s.array(oc).min(1).describe("The filters to update.")
|
|
5774
|
+
}, ic = {
|
|
5785
5775
|
filters: s.array(rt).describe("The updated filters."),
|
|
5786
5776
|
totalCount: s.number().describe("The total number of filters updated."),
|
|
5787
5777
|
updatedFilterIds: s.array(s.string()).describe("The IDs of the updated filters."),
|
|
@@ -5789,17 +5779,17 @@ const nc = s.object({
|
|
|
5789
5779
|
updateCount: s.number().describe("The number of filters actually updated."),
|
|
5790
5780
|
skippedCount: s.number().describe("The number of filters skipped (no changes).")
|
|
5791
5781
|
}).describe("Summary of operations performed.")
|
|
5792
|
-
},
|
|
5782
|
+
}, ac = {
|
|
5793
5783
|
name: g.UPDATE_FILTERS,
|
|
5794
5784
|
description: "Update one or more existing personal filters with new values.",
|
|
5795
|
-
parameters:
|
|
5796
|
-
outputSchema:
|
|
5785
|
+
parameters: nc,
|
|
5786
|
+
outputSchema: ic,
|
|
5797
5787
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5798
5788
|
async execute(e, t) {
|
|
5799
|
-
const { filters: r } = e, o = [], i = r.map((
|
|
5800
|
-
const
|
|
5801
|
-
return
|
|
5802
|
-
}).filter((
|
|
5789
|
+
const { filters: r } = e, o = [], i = r.map((h) => {
|
|
5790
|
+
const m = dc(h);
|
|
5791
|
+
return m !== null ? { kind: "skipped", reason: m } : (o.push(h), { kind: "updated", filter: h });
|
|
5792
|
+
}).filter((h) => h.kind === "skipped").length;
|
|
5803
5793
|
if (o.length === 0)
|
|
5804
5794
|
return {
|
|
5805
5795
|
textContent: `Updated 0 filters (${i} skipped - no changes)`,
|
|
@@ -5810,29 +5800,29 @@ const nc = s.object({
|
|
|
5810
5800
|
appliedOperations: { updateCount: 0, skippedCount: i }
|
|
5811
5801
|
}
|
|
5812
5802
|
};
|
|
5813
|
-
const a = o.map((
|
|
5814
|
-
const { id:
|
|
5803
|
+
const a = o.map((h) => {
|
|
5804
|
+
const { id: m, color: y, ...f } = h;
|
|
5815
5805
|
return V("filter_update", {
|
|
5816
|
-
id:
|
|
5806
|
+
id: m,
|
|
5817
5807
|
...f,
|
|
5818
5808
|
...y !== void 0 ? { color: y } : {}
|
|
5819
5809
|
});
|
|
5820
5810
|
});
|
|
5821
5811
|
await t.sync({ commands: a });
|
|
5822
|
-
const d = ((await t.sync({ resourceTypes: ["filters"], syncToken: "*" })).filters ?? []).filter((
|
|
5823
|
-
id:
|
|
5824
|
-
name:
|
|
5825
|
-
query:
|
|
5826
|
-
color: ue.parse(
|
|
5827
|
-
isFavorite:
|
|
5828
|
-
itemOrder:
|
|
5812
|
+
const d = ((await t.sync({ resourceTypes: ["filters"], syncToken: "*" })).filters ?? []).filter((h) => !h.isDeleted), l = new Set(o.map((h) => h.id)), u = d.filter((h) => l.has(h.id)).map((h) => ({
|
|
5813
|
+
id: h.id,
|
|
5814
|
+
name: h.name,
|
|
5815
|
+
query: h.query,
|
|
5816
|
+
color: ue.parse(h.color),
|
|
5817
|
+
isFavorite: h.isFavorite,
|
|
5818
|
+
itemOrder: h.itemOrder
|
|
5829
5819
|
}));
|
|
5830
5820
|
return {
|
|
5831
|
-
textContent:
|
|
5821
|
+
textContent: cc({ filters: u, skippedCount: i }),
|
|
5832
5822
|
structuredContent: {
|
|
5833
5823
|
filters: u,
|
|
5834
5824
|
totalCount: u.length,
|
|
5835
|
-
updatedFilterIds: u.map((
|
|
5825
|
+
updatedFilterIds: u.map((h) => h.id),
|
|
5836
5826
|
appliedOperations: {
|
|
5837
5827
|
updateCount: u.length,
|
|
5838
5828
|
skippedCount: i
|
|
@@ -5841,7 +5831,7 @@ const nc = s.object({
|
|
|
5841
5831
|
};
|
|
5842
5832
|
}
|
|
5843
5833
|
};
|
|
5844
|
-
function
|
|
5834
|
+
function cc({
|
|
5845
5835
|
filters: e,
|
|
5846
5836
|
skippedCount: t
|
|
5847
5837
|
}) {
|
|
@@ -5855,55 +5845,55 @@ ${n}`;
|
|
|
5855
5845
|
}
|
|
5856
5846
|
return o;
|
|
5857
5847
|
}
|
|
5858
|
-
function
|
|
5848
|
+
function dc({ id: e, ...t }) {
|
|
5859
5849
|
return Object.values(t).every((o) => o === void 0) ? "no-fields" : null;
|
|
5860
5850
|
}
|
|
5861
|
-
const
|
|
5851
|
+
const lc = s.object({
|
|
5862
5852
|
labelType: s.literal("personal").describe("Update a personal label, identified by its ID."),
|
|
5863
5853
|
id: s.string().min(1).describe("The ID of the personal label to update."),
|
|
5864
5854
|
name: s.string().min(1).max(128).optional().describe("The new name of the label."),
|
|
5865
5855
|
color: le,
|
|
5866
5856
|
order: s.number().int().optional().describe("The new position of the label in the label list."),
|
|
5867
5857
|
isFavorite: s.boolean().optional().describe("Whether to mark the label as a favorite.")
|
|
5868
|
-
}),
|
|
5858
|
+
}), uc = s.object({
|
|
5869
5859
|
labelType: s.literal("shared").describe(
|
|
5870
5860
|
"Rename a shared label across all tasks. Shared labels are identified by name; only renaming is supported (no color, order, or favorite)."
|
|
5871
5861
|
),
|
|
5872
5862
|
name: s.string().min(1).describe("The current name of the shared label."),
|
|
5873
5863
|
newName: s.string().min(1).describe("The new name for the shared label.")
|
|
5874
|
-
}),
|
|
5875
|
-
|
|
5876
|
-
|
|
5864
|
+
}), pc = s.discriminatedUnion("labelType", [
|
|
5865
|
+
lc,
|
|
5866
|
+
uc
|
|
5877
5867
|
]), hc = {
|
|
5878
|
-
labels: s.array(
|
|
5868
|
+
labels: s.array(pc).min(1).describe(
|
|
5879
5869
|
'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.'
|
|
5880
5870
|
)
|
|
5881
|
-
},
|
|
5871
|
+
}, mc = s.object({
|
|
5882
5872
|
name: s.string().describe("The previous name of the shared label."),
|
|
5883
5873
|
newName: s.string().describe("The new name of the shared label.")
|
|
5884
|
-
}),
|
|
5874
|
+
}), fc = {
|
|
5885
5875
|
updatedLabels: s.array(pe).describe("The updated personal labels."),
|
|
5886
|
-
renamedSharedLabels: s.array(
|
|
5876
|
+
renamedSharedLabels: s.array(mc).describe("The shared labels that were renamed."),
|
|
5887
5877
|
totalCount: s.number().describe("The total number of successful operations (personal + shared)."),
|
|
5888
5878
|
appliedOperations: s.object({
|
|
5889
5879
|
updateCount: s.number().describe("Number of personal labels updated."),
|
|
5890
5880
|
renameCount: s.number().describe("Number of shared labels renamed."),
|
|
5891
5881
|
skippedCount: s.number().describe("Number of operations skipped (no changes or shared label not found).")
|
|
5892
5882
|
}).describe("Summary of operations performed.")
|
|
5893
|
-
},
|
|
5883
|
+
}, bc = {
|
|
5894
5884
|
name: g.UPDATE_LABELS,
|
|
5895
5885
|
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.",
|
|
5896
5886
|
parameters: hc,
|
|
5897
|
-
outputSchema:
|
|
5887
|
+
outputSchema: fc,
|
|
5898
5888
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
5899
5889
|
async execute(e, t) {
|
|
5900
5890
|
const { labels: r } = e, o = await Promise.all(
|
|
5901
5891
|
r.map(async (u) => {
|
|
5902
5892
|
if (u.labelType === "personal") {
|
|
5903
|
-
const
|
|
5904
|
-
if (
|
|
5905
|
-
const { id:
|
|
5906
|
-
return { kind: "updated", label: await t.updateLabel(
|
|
5893
|
+
const h = yc(u);
|
|
5894
|
+
if (h !== null) return { kind: "skipped", reason: h };
|
|
5895
|
+
const { id: m, labelType: y, ...f } = u;
|
|
5896
|
+
return { kind: "updated", label: await t.updateLabel(m, f) };
|
|
5907
5897
|
}
|
|
5908
5898
|
return await t.renameSharedLabel({
|
|
5909
5899
|
name: u.name,
|
|
@@ -5918,7 +5908,7 @@ const uc = s.object({
|
|
|
5918
5908
|
(u) => u.kind === "skipped" && u.reason === "not-found"
|
|
5919
5909
|
).length;
|
|
5920
5910
|
return {
|
|
5921
|
-
textContent:
|
|
5911
|
+
textContent: gc({
|
|
5922
5912
|
updatedLabels: n,
|
|
5923
5913
|
renamedSharedLabels: i,
|
|
5924
5914
|
skippedNoFields: c,
|
|
@@ -5937,7 +5927,7 @@ const uc = s.object({
|
|
|
5937
5927
|
};
|
|
5938
5928
|
}
|
|
5939
5929
|
};
|
|
5940
|
-
function
|
|
5930
|
+
function gc({
|
|
5941
5931
|
updatedLabels: e,
|
|
5942
5932
|
renamedSharedLabels: t,
|
|
5943
5933
|
skippedNoFields: r,
|
|
@@ -5959,14 +5949,14 @@ function yc({
|
|
|
5959
5949
|
return c.join(`
|
|
5960
5950
|
`);
|
|
5961
5951
|
}
|
|
5962
|
-
function
|
|
5952
|
+
function yc({
|
|
5963
5953
|
id: e,
|
|
5964
5954
|
labelType: t,
|
|
5965
5955
|
...r
|
|
5966
5956
|
}) {
|
|
5967
5957
|
return Object.values(r).every((n) => n === void 0) ? "no-fields" : null;
|
|
5968
5958
|
}
|
|
5969
|
-
const
|
|
5959
|
+
const Tc = s.object({
|
|
5970
5960
|
id: s.string().min(1).describe("The ID of the project to update."),
|
|
5971
5961
|
name: s.string().min(1).optional().describe("The new name of the project."),
|
|
5972
5962
|
isFavorite: s.boolean().optional().describe("Whether the project is a favorite."),
|
|
@@ -5981,9 +5971,9 @@ const kc = s.object({
|
|
|
5981
5971
|
)
|
|
5982
5972
|
).optional(),
|
|
5983
5973
|
color: le
|
|
5984
|
-
}),
|
|
5985
|
-
projects: s.array(
|
|
5986
|
-
},
|
|
5974
|
+
}), kc = {
|
|
5975
|
+
projects: s.array(Tc).min(1).describe("The projects to update.")
|
|
5976
|
+
}, wc = {
|
|
5987
5977
|
projects: s.array(Q).describe("The updated projects."),
|
|
5988
5978
|
totalCount: s.number().describe("The total number of projects updated."),
|
|
5989
5979
|
updatedProjectIds: s.array(s.string()).describe("The IDs of the updated projects."),
|
|
@@ -5995,19 +5985,19 @@ const kc = s.object({
|
|
|
5995
5985
|
skippedCount: s.number().describe("The number of projects skipped (no changes)."),
|
|
5996
5986
|
failureCount: s.number().describe("The number of projects that failed to update.")
|
|
5997
5987
|
}).describe("Summary of operations performed.")
|
|
5998
|
-
},
|
|
5988
|
+
}, vc = {
|
|
5999
5989
|
name: g.UPDATE_PROJECTS,
|
|
6000
5990
|
description: "Update multiple existing projects with new values.",
|
|
6001
|
-
parameters:
|
|
6002
|
-
outputSchema:
|
|
5991
|
+
parameters: kc,
|
|
5992
|
+
outputSchema: wc,
|
|
6003
5993
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
6004
5994
|
async execute(e, t) {
|
|
6005
5995
|
const { projects: r } = e, o = await Promise.allSettled(
|
|
6006
5996
|
r.map(async (l) => {
|
|
6007
|
-
const u =
|
|
5997
|
+
const u = Sc(l);
|
|
6008
5998
|
if (u !== null) return { kind: "skipped", reason: u };
|
|
6009
|
-
const { id: p, ...
|
|
6010
|
-
return { kind: "updated", project: await O(() => t.updateProject(p,
|
|
5999
|
+
const { id: p, ...h } = l;
|
|
6000
|
+
return { kind: "updated", project: await O(() => t.updateProject(p, h)) };
|
|
6011
6001
|
})
|
|
6012
6002
|
), n = [], i = [];
|
|
6013
6003
|
let a = 0, c = 0;
|
|
@@ -6022,7 +6012,7 @@ const kc = s.object({
|
|
|
6022
6012
|
u.value.kind === "updated" ? n.push(Z(u.value.project)) : u.value.reason === "no-fields" ? a++ : c++;
|
|
6023
6013
|
}
|
|
6024
6014
|
return {
|
|
6025
|
-
textContent:
|
|
6015
|
+
textContent: Ic({
|
|
6026
6016
|
projects: n,
|
|
6027
6017
|
skippedNoFields: a,
|
|
6028
6018
|
skippedNoValidValues: c,
|
|
@@ -6042,7 +6032,7 @@ const kc = s.object({
|
|
|
6042
6032
|
};
|
|
6043
6033
|
}
|
|
6044
6034
|
};
|
|
6045
|
-
function
|
|
6035
|
+
function Ic({
|
|
6046
6036
|
projects: e,
|
|
6047
6037
|
skippedNoFields: t,
|
|
6048
6038
|
skippedNoValidValues: r,
|
|
@@ -6055,23 +6045,23 @@ function Sc({
|
|
|
6055
6045
|
return t > 0 && c.push(`${t} skipped - no changes`), r > 0 && c.push(`${r} skipped - no valid field values`), c.length > 0 && (a += ` (${c.join(", ")})`), n > 0 && (a += `:
|
|
6056
6046
|
${i}`), it(a, o);
|
|
6057
6047
|
}
|
|
6058
|
-
function
|
|
6048
|
+
function Sc({ id: e, ...t }) {
|
|
6059
6049
|
const r = Object.values(t);
|
|
6060
6050
|
return r.length === 0 ? "no-fields" : r.every((o) => o === void 0) ? "no-valid-values" : null;
|
|
6061
6051
|
}
|
|
6062
|
-
const
|
|
6052
|
+
const jc = s.object({
|
|
6063
6053
|
type: s.literal("relative"),
|
|
6064
6054
|
id: s.string().min(1).describe("The ID of the relative reminder to update."),
|
|
6065
6055
|
minuteOffset: s.number().int().min(0).optional().describe("New minute offset before task due time."),
|
|
6066
6056
|
service: je.optional().describe('New delivery method: "email" or "push".'),
|
|
6067
6057
|
isUrgent: Ce
|
|
6068
|
-
}),
|
|
6058
|
+
}), Cc = s.object({
|
|
6069
6059
|
type: s.literal("absolute"),
|
|
6070
6060
|
id: s.string().min(1).describe("The ID of the absolute reminder to update."),
|
|
6071
6061
|
due: cs.optional().describe("New due date/time for the reminder."),
|
|
6072
6062
|
service: je.optional().describe('New delivery method: "email" or "push".'),
|
|
6073
6063
|
isUrgent: Ce
|
|
6074
|
-
}),
|
|
6064
|
+
}), $c = s.object({
|
|
6075
6065
|
type: s.literal("location"),
|
|
6076
6066
|
id: s.string().min(1).describe("The ID of the location reminder to update."),
|
|
6077
6067
|
name: s.string().optional().describe("New location name."),
|
|
@@ -6081,23 +6071,23 @@ const Cc = s.object({
|
|
|
6081
6071
|
'New trigger condition: "on_enter" or "on_leave".'
|
|
6082
6072
|
),
|
|
6083
6073
|
radius: s.number().int().optional().describe("New radius in meters.")
|
|
6084
|
-
}),
|
|
6074
|
+
}), Dc = s.discriminatedUnion("type", [
|
|
6075
|
+
jc,
|
|
6085
6076
|
Cc,
|
|
6086
|
-
$c
|
|
6087
|
-
|
|
6088
|
-
|
|
6089
|
-
reminders: s.array(xc).min(1).max(we).describe(
|
|
6077
|
+
$c
|
|
6078
|
+
]), xc = {
|
|
6079
|
+
reminders: s.array(Dc).min(1).max(we).describe(
|
|
6090
6080
|
`Array of reminders to update (max ${we}). Each must include the reminder type and ID. Only include fields that need to change.`
|
|
6091
6081
|
)
|
|
6092
|
-
},
|
|
6082
|
+
}, Ac = {
|
|
6093
6083
|
reminders: s.array(st).describe("The updated reminders."),
|
|
6094
6084
|
totalCount: s.number().describe("Total reminders updated."),
|
|
6095
6085
|
updatedReminderIds: s.array(s.string()).describe("IDs of updated reminders.")
|
|
6096
|
-
},
|
|
6086
|
+
}, Ec = {
|
|
6097
6087
|
name: g.UPDATE_REMINDERS,
|
|
6098
6088
|
description: 'Update existing reminders. Each reminder must specify its type ("relative", "absolute", or "location") and ID. Only include fields that need to change.',
|
|
6099
|
-
parameters:
|
|
6100
|
-
outputSchema:
|
|
6089
|
+
parameters: xc,
|
|
6090
|
+
outputSchema: Ac,
|
|
6101
6091
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !0 },
|
|
6102
6092
|
async execute(e, t) {
|
|
6103
6093
|
const { reminders: r } = e, o = r.map(async (d) => {
|
|
@@ -6131,7 +6121,7 @@ const Cc = s.object({
|
|
|
6131
6121
|
}
|
|
6132
6122
|
};
|
|
6133
6123
|
}
|
|
6134
|
-
},
|
|
6124
|
+
}, Oc = s.object({
|
|
6135
6125
|
id: s.string().min(1).describe("The ID of the section to update."),
|
|
6136
6126
|
name: s.string().min(1).optional().describe("The new name of the section."),
|
|
6137
6127
|
description: s.preprocess(
|
|
@@ -6146,17 +6136,17 @@ const Cc = s.object({
|
|
|
6146
6136
|
).optional()
|
|
6147
6137
|
}).refine((e) => e.name !== void 0 || e.description !== void 0, {
|
|
6148
6138
|
message: 'Provide at least one of "name" or "description" to update.'
|
|
6149
|
-
}),
|
|
6150
|
-
sections: s.array(
|
|
6151
|
-
},
|
|
6139
|
+
}), Pc = {
|
|
6140
|
+
sections: s.array(Oc).min(1).describe("The sections to update.")
|
|
6141
|
+
}, _c = {
|
|
6152
6142
|
sections: s.array(X).describe("The updated sections."),
|
|
6153
6143
|
totalCount: s.number().describe("The total number of sections updated."),
|
|
6154
6144
|
updatedSectionIds: s.array(s.string()).describe("The IDs of the updated sections.")
|
|
6155
|
-
},
|
|
6145
|
+
}, Rc = {
|
|
6156
6146
|
name: g.UPDATE_SECTIONS,
|
|
6157
6147
|
description: "Update multiple existing sections with new values.",
|
|
6158
|
-
parameters:
|
|
6159
|
-
outputSchema:
|
|
6148
|
+
parameters: Pc,
|
|
6149
|
+
outputSchema: _c,
|
|
6160
6150
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
6161
6151
|
async execute({ sections: e }, t) {
|
|
6162
6152
|
const r = await Promise.all(
|
|
@@ -6169,7 +6159,7 @@ const Cc = s.object({
|
|
|
6169
6159
|
})
|
|
6170
6160
|
);
|
|
6171
6161
|
return {
|
|
6172
|
-
textContent:
|
|
6162
|
+
textContent: Uc({
|
|
6173
6163
|
sections: r
|
|
6174
6164
|
}),
|
|
6175
6165
|
structuredContent: {
|
|
@@ -6180,7 +6170,7 @@ const Cc = s.object({
|
|
|
6180
6170
|
};
|
|
6181
6171
|
}
|
|
6182
6172
|
};
|
|
6183
|
-
function
|
|
6173
|
+
function Uc({ sections: e }) {
|
|
6184
6174
|
const t = e.length, r = e.map((n) => `• ${n.name} (id=${n.id}, projectId=${n.projectId})`).join(`
|
|
6185
6175
|
`);
|
|
6186
6176
|
return `Updated ${t} section${t === 1 ? "" : "s"}:
|
|
@@ -6189,27 +6179,27 @@ ${r}`;
|
|
|
6189
6179
|
function Ss(e, t) {
|
|
6190
6180
|
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;
|
|
6191
6181
|
}
|
|
6192
|
-
function
|
|
6182
|
+
function Lc(e, t) {
|
|
6193
6183
|
return t.projectId !== void 0 ? e.projectId === t.projectId : t.sectionId !== void 0 ? e.sectionId === t.sectionId : e.parentId === t.parentId;
|
|
6194
6184
|
}
|
|
6195
|
-
function
|
|
6185
|
+
function Nc(e) {
|
|
6196
6186
|
return e.projectId !== void 0 ? `project:${e.projectId}` : e.sectionId !== void 0 ? `section:${e.sectionId}` : `parent:${e.parentId}`;
|
|
6197
6187
|
}
|
|
6198
|
-
function
|
|
6188
|
+
function Mc(e) {
|
|
6199
6189
|
const t = [];
|
|
6200
6190
|
return e.projectId && t.push({ projectId: e.projectId }), e.sectionId && t.push({ sectionId: e.sectionId }), e.parentId && t.push({ parentId: e.parentId }), t;
|
|
6201
6191
|
}
|
|
6202
|
-
function
|
|
6192
|
+
function Fc({
|
|
6203
6193
|
taskId: e,
|
|
6204
6194
|
request: t,
|
|
6205
6195
|
current: r
|
|
6206
6196
|
}) {
|
|
6207
|
-
const o =
|
|
6197
|
+
const o = Mc(t);
|
|
6208
6198
|
if (o.length === 0)
|
|
6209
6199
|
return { redundantMoveSkipped: !1 };
|
|
6210
6200
|
let n = o, i = !1;
|
|
6211
6201
|
if (r) {
|
|
6212
|
-
const a = o.length === 1 ? (c) => Ss(r, c) : (c) =>
|
|
6202
|
+
const a = o.length === 1 ? (c) => Ss(r, c) : (c) => Lc(r, c);
|
|
6213
6203
|
n = o.filter((c) => !a(c)), i = n.length < o.length;
|
|
6214
6204
|
}
|
|
6215
6205
|
if (n.length === 0)
|
|
@@ -6220,7 +6210,7 @@ function Hc({
|
|
|
6220
6210
|
);
|
|
6221
6211
|
return { move: n[0], redundantMoveSkipped: i };
|
|
6222
6212
|
}
|
|
6223
|
-
const
|
|
6213
|
+
const Hc = s.object({
|
|
6224
6214
|
id: s.string().min(1).describe("The ID of the task to update."),
|
|
6225
6215
|
content: s.string().optional().describe(
|
|
6226
6216
|
'The new task name/title. Should be concise and actionable (e.g., "Review PR #123", "Call dentist"). For longer content, use the description field instead. Supports Markdown.'
|
|
@@ -6265,9 +6255,9 @@ const Wc = s.object({
|
|
|
6265
6255
|
isUncompletable: s.boolean().optional().describe(
|
|
6266
6256
|
"Whether this task should be uncompletable (organizational header). Tasks with isUncompletable: true appear as organizational headers and cannot be completed."
|
|
6267
6257
|
)
|
|
6268
|
-
}),
|
|
6269
|
-
tasks: s.array(
|
|
6270
|
-
},
|
|
6258
|
+
}), Wc = (e) => !!(e.projectId || e.sectionId || e.parentId), js = (e) => Object.keys(e).length > 0, Bc = ["remove", "no date"], zc = ["remove", "no date", "no deadline"], qc = "no date", Ye = qt.TASKS_PER_OPERATION, Ot = {
|
|
6259
|
+
tasks: s.array(Hc).min(1).max(Ye).describe(`The tasks to update (max ${Ye}).`)
|
|
6260
|
+
}, Kc = {
|
|
6271
6261
|
tasks: s.array(F).describe("The updated tasks."),
|
|
6272
6262
|
totalCount: s.number().describe("The total number of tasks updated."),
|
|
6273
6263
|
updatedTaskIds: s.array(s.string()).describe("The IDs of the updated tasks."),
|
|
@@ -6282,22 +6272,22 @@ const Wc = s.object({
|
|
|
6282
6272
|
"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."
|
|
6283
6273
|
)
|
|
6284
6274
|
}).describe("Summary of operations performed.")
|
|
6285
|
-
},
|
|
6275
|
+
}, Yc = {
|
|
6286
6276
|
name: g.UPDATE_TASKS,
|
|
6287
6277
|
description: "Update existing tasks including content, dates, priorities, and assignments. Send only the fields that change.",
|
|
6288
6278
|
parameters: Ot,
|
|
6289
|
-
outputSchema:
|
|
6279
|
+
outputSchema: Kc,
|
|
6290
6280
|
annotations: { readOnlyHint: !1, destructiveHint: !0, idempotentHint: !1 },
|
|
6291
6281
|
async execute(e, t) {
|
|
6292
6282
|
const { tasks: r } = s.object(Ot).parse(e), o = r.map(() => ({ kind: "skipped" })), n = (T, b) => {
|
|
6293
6283
|
o[T] = { kind: "failed", error: b };
|
|
6294
6284
|
}, i = (T, b) => {
|
|
6295
6285
|
n(T, z(b));
|
|
6296
|
-
}, a = r.map((T, b) => ({ task: T, index: b })).filter(({ task: T }) =>
|
|
6286
|
+
}, a = r.map((T, b) => ({ task: T, index: b })).filter(({ task: T }) => sd(T)), c = await Vc(
|
|
6297
6287
|
a.map(({ task: T }) => T),
|
|
6298
6288
|
t
|
|
6299
6289
|
), d = await Promise.allSettled(
|
|
6300
|
-
a.map(({ task: T, index: b }) =>
|
|
6290
|
+
a.map(({ task: T, index: b }) => Qc({ task: T, index: b, client: t, inbox: c }))
|
|
6301
6291
|
), l = [];
|
|
6302
6292
|
for (const [T, b] of d.entries()) {
|
|
6303
6293
|
const S = a[T]?.index ?? T;
|
|
@@ -6307,13 +6297,13 @@ const Wc = s.object({
|
|
|
6307
6297
|
client: t,
|
|
6308
6298
|
ids: [
|
|
6309
6299
|
...new Set(
|
|
6310
|
-
l.filter((T) =>
|
|
6300
|
+
l.filter((T) => Wc(T.moveRequest)).map((T) => T.id)
|
|
6311
6301
|
)
|
|
6312
6302
|
]
|
|
6313
6303
|
}), p = [];
|
|
6314
6304
|
for (const T of l)
|
|
6315
6305
|
try {
|
|
6316
|
-
const b =
|
|
6306
|
+
const b = Fc({
|
|
6317
6307
|
taskId: T.id,
|
|
6318
6308
|
request: T.moveRequest,
|
|
6319
6309
|
current: u.get(T.id)
|
|
@@ -6322,17 +6312,17 @@ const Wc = s.object({
|
|
|
6322
6312
|
} catch (b) {
|
|
6323
6313
|
i(T.index, b), T.failed = !0;
|
|
6324
6314
|
}
|
|
6325
|
-
const
|
|
6315
|
+
const h = /* @__PURE__ */ new Map(), m = [], y = (T) => {
|
|
6326
6316
|
const b = T.filter((S) => !S.failed);
|
|
6327
|
-
b.length !== 0 &&
|
|
6328
|
-
|
|
6317
|
+
b.length !== 0 && m.push(
|
|
6318
|
+
Zc({
|
|
6329
6319
|
client: t,
|
|
6330
6320
|
items: b,
|
|
6331
6321
|
onUpdated: (S, $) => {
|
|
6332
6322
|
o[S.index] = { kind: "updated", task: $ };
|
|
6333
6323
|
},
|
|
6334
6324
|
onFailed: (S, $) => {
|
|
6335
|
-
const D =
|
|
6325
|
+
const D = h.get(S.index);
|
|
6336
6326
|
if (D && "task" in D) {
|
|
6337
6327
|
o[S.index] = {
|
|
6338
6328
|
kind: "partial",
|
|
@@ -6346,14 +6336,14 @@ const Wc = s.object({
|
|
|
6346
6336
|
})
|
|
6347
6337
|
);
|
|
6348
6338
|
}, f = new Set(p.map(({ item: T }) => T.index));
|
|
6349
|
-
y(l.filter((T) => !f.has(T.index))), await
|
|
6339
|
+
y(l.filter((T) => !f.has(T.index))), await Jc({
|
|
6350
6340
|
client: t,
|
|
6351
6341
|
moving: p,
|
|
6352
|
-
results:
|
|
6342
|
+
results: h,
|
|
6353
6343
|
onResolved: (T) => {
|
|
6354
6344
|
const b = [];
|
|
6355
6345
|
for (const { item: S } of T) {
|
|
6356
|
-
const $ =
|
|
6346
|
+
const $ = h.get(S.index);
|
|
6357
6347
|
if ($ && "error" in $) {
|
|
6358
6348
|
n(S.index, $.error), S.failed = !0;
|
|
6359
6349
|
continue;
|
|
@@ -6362,16 +6352,16 @@ const Wc = s.object({
|
|
|
6362
6352
|
}
|
|
6363
6353
|
y(b);
|
|
6364
6354
|
}
|
|
6365
|
-
}), await Promise.all(
|
|
6355
|
+
}), await Promise.all(m);
|
|
6366
6356
|
for (const T of l) {
|
|
6367
6357
|
if (T.failed || js(T.updateArgs))
|
|
6368
6358
|
continue;
|
|
6369
|
-
const b =
|
|
6359
|
+
const b = h.get(T.index);
|
|
6370
6360
|
b && "task" in b && (o[T.index] = { kind: "updated", task: b.task });
|
|
6371
6361
|
}
|
|
6372
|
-
const { updatedTasks: v, failures: j, skippedCount: A } =
|
|
6362
|
+
const { updatedTasks: v, failures: j, skippedCount: A } = Gc({ tasks: r, outcomes: o }), k = l.filter((T) => T.redundantMoveSkipped).length, I = v.map(P);
|
|
6373
6363
|
return {
|
|
6374
|
-
textContent:
|
|
6364
|
+
textContent: td({
|
|
6375
6365
|
tasks: I,
|
|
6376
6366
|
failures: j,
|
|
6377
6367
|
skippedCount: A,
|
|
@@ -6392,7 +6382,7 @@ const Wc = s.object({
|
|
|
6392
6382
|
};
|
|
6393
6383
|
}
|
|
6394
6384
|
};
|
|
6395
|
-
function
|
|
6385
|
+
function Gc({ tasks: e, outcomes: t }) {
|
|
6396
6386
|
const r = [], o = [];
|
|
6397
6387
|
let n = 0;
|
|
6398
6388
|
for (const [i, a] of t.entries()) {
|
|
@@ -6409,7 +6399,7 @@ function Vc({ tasks: e, outcomes: t }) {
|
|
|
6409
6399
|
}
|
|
6410
6400
|
return { updatedTasks: r, failures: o, skippedCount: n };
|
|
6411
6401
|
}
|
|
6412
|
-
async function
|
|
6402
|
+
async function Vc(e, t) {
|
|
6413
6403
|
if (!e.some((r) => N(r.projectId)))
|
|
6414
6404
|
return {};
|
|
6415
6405
|
try {
|
|
@@ -6436,7 +6426,7 @@ async function Cs({
|
|
|
6436
6426
|
}
|
|
6437
6427
|
return r;
|
|
6438
6428
|
}
|
|
6439
|
-
async function
|
|
6429
|
+
async function Jc({
|
|
6440
6430
|
client: e,
|
|
6441
6431
|
moving: t,
|
|
6442
6432
|
results: r,
|
|
@@ -6446,7 +6436,7 @@ async function Xc({
|
|
|
6446
6436
|
return;
|
|
6447
6437
|
const n = /* @__PURE__ */ new Map();
|
|
6448
6438
|
for (const c of t) {
|
|
6449
|
-
const d =
|
|
6439
|
+
const d = Nc(c.move), l = n.get(d);
|
|
6450
6440
|
l ? l.push(c) : n.set(d, [c]);
|
|
6451
6441
|
}
|
|
6452
6442
|
const i = lr(e), a = [];
|
|
@@ -6462,12 +6452,12 @@ async function Xc({
|
|
|
6462
6452
|
}
|
|
6463
6453
|
const p = await i(
|
|
6464
6454
|
() => O(() => e.moveTasks(d, l))
|
|
6465
|
-
),
|
|
6455
|
+
), h = new Map(p.map((f) => [f.id, f])), m = [], y = [];
|
|
6466
6456
|
for (const f of c) {
|
|
6467
|
-
const v =
|
|
6468
|
-
v ? (r.set(f.item.index, { task: v }), y.push(f)) :
|
|
6457
|
+
const v = h.get(f.item.id);
|
|
6458
|
+
v ? (r.set(f.item.index, { task: v }), y.push(f)) : m.push(f);
|
|
6469
6459
|
}
|
|
6470
|
-
o(y),
|
|
6460
|
+
o(y), m.length > 0 && a.push({ group: m, destination: l });
|
|
6471
6461
|
} catch (p) {
|
|
6472
6462
|
if (u) {
|
|
6473
6463
|
r.set(u.item.index, { error: z(p) }), o(c);
|
|
@@ -6477,12 +6467,12 @@ async function Xc({
|
|
|
6477
6467
|
}
|
|
6478
6468
|
}
|
|
6479
6469
|
if (a.length > 0) {
|
|
6480
|
-
await
|
|
6470
|
+
await Xc({ client: e, unresolved: a, results: r });
|
|
6481
6471
|
for (const { group: c } of a)
|
|
6482
6472
|
o(c);
|
|
6483
6473
|
}
|
|
6484
6474
|
}
|
|
6485
|
-
async function
|
|
6475
|
+
async function Xc({
|
|
6486
6476
|
client: e,
|
|
6487
6477
|
unresolved: t,
|
|
6488
6478
|
results: r
|
|
@@ -6500,7 +6490,7 @@ async function Zc({
|
|
|
6500
6490
|
}
|
|
6501
6491
|
}
|
|
6502
6492
|
}
|
|
6503
|
-
async function
|
|
6493
|
+
async function Zc({
|
|
6504
6494
|
client: e,
|
|
6505
6495
|
items: t,
|
|
6506
6496
|
onUpdated: r,
|
|
@@ -6520,7 +6510,7 @@ async function Qc({
|
|
|
6520
6510
|
})
|
|
6521
6511
|
);
|
|
6522
6512
|
}
|
|
6523
|
-
async function
|
|
6513
|
+
async function Qc({
|
|
6524
6514
|
task: e,
|
|
6525
6515
|
index: t,
|
|
6526
6516
|
client: r,
|
|
@@ -6535,8 +6525,8 @@ async function ed({
|
|
|
6535
6525
|
duration: l,
|
|
6536
6526
|
responsibleUser: u,
|
|
6537
6527
|
priority: p,
|
|
6538
|
-
labels:
|
|
6539
|
-
deadlineDate:
|
|
6528
|
+
labels: h,
|
|
6529
|
+
deadlineDate: m,
|
|
6540
6530
|
...y
|
|
6541
6531
|
} = e;
|
|
6542
6532
|
if (N(i) && o.error !== void 0)
|
|
@@ -6544,16 +6534,16 @@ async function ed({
|
|
|
6544
6534
|
const f = N(i) ? o.projectId : i;
|
|
6545
6535
|
let v = {
|
|
6546
6536
|
...y,
|
|
6547
|
-
...
|
|
6537
|
+
...h !== void 0 && { labels: h }
|
|
6548
6538
|
};
|
|
6549
6539
|
p && (v.priority = Zt(p));
|
|
6550
6540
|
const j = Pt(
|
|
6551
6541
|
d,
|
|
6552
|
-
|
|
6553
|
-
|
|
6542
|
+
Bc,
|
|
6543
|
+
qc
|
|
6554
6544
|
);
|
|
6555
6545
|
j !== void 0 && (v = { ...v, dueString: j });
|
|
6556
|
-
const A = Pt(
|
|
6546
|
+
const A = Pt(m, zc, null);
|
|
6557
6547
|
if (A !== void 0 && (v = { ...v, deadlineDate: A }), l)
|
|
6558
6548
|
try {
|
|
6559
6549
|
const { minutes: k } = Xt(l);
|
|
@@ -6567,7 +6557,7 @@ async function ed({
|
|
|
6567
6557
|
}
|
|
6568
6558
|
return u !== void 0 && (v = {
|
|
6569
6559
|
...v,
|
|
6570
|
-
assigneeId: await
|
|
6560
|
+
assigneeId: await ed(r, n, u)
|
|
6571
6561
|
}), {
|
|
6572
6562
|
index: t,
|
|
6573
6563
|
id: n,
|
|
@@ -6581,7 +6571,7 @@ async function ed({
|
|
|
6581
6571
|
failed: !1
|
|
6582
6572
|
};
|
|
6583
6573
|
}
|
|
6584
|
-
async function
|
|
6574
|
+
async function ed(e, t, r) {
|
|
6585
6575
|
if (r === null || r === "unassign")
|
|
6586
6576
|
return null;
|
|
6587
6577
|
const o = await at.validateTaskUpdateAssignment(
|
|
@@ -6595,7 +6585,7 @@ async function td(e, t, r) {
|
|
|
6595
6585
|
}
|
|
6596
6586
|
return o.resolvedUser?.userId;
|
|
6597
6587
|
}
|
|
6598
|
-
function
|
|
6588
|
+
function td({
|
|
6599
6589
|
tasks: e,
|
|
6600
6590
|
failures: t,
|
|
6601
6591
|
skippedCount: r,
|
|
@@ -6616,7 +6606,7 @@ function sd({
|
|
|
6616
6606
|
Failed (${t.length}) - address or drop these items:
|
|
6617
6607
|
${l}${u}`;
|
|
6618
6608
|
}
|
|
6619
|
-
function
|
|
6609
|
+
function sd({ id: e, ...t }) {
|
|
6620
6610
|
return Object.keys(t).length > 0;
|
|
6621
6611
|
}
|
|
6622
6612
|
function Pt(e, t, r) {
|
|
@@ -6627,7 +6617,7 @@ function Pt(e, t, r) {
|
|
|
6627
6617
|
const o = e.trim().toLowerCase();
|
|
6628
6618
|
return t.includes(o) ? r : e;
|
|
6629
6619
|
}
|
|
6630
|
-
const
|
|
6620
|
+
const rd = {}, od = {
|
|
6631
6621
|
type: s.literal("user_info").describe("The type of the response."),
|
|
6632
6622
|
userId: s.string().describe("The user ID."),
|
|
6633
6623
|
fullName: s.string().describe("The full name of the user."),
|
|
@@ -6644,25 +6634,25 @@ const od = {}, nd = {
|
|
|
6644
6634
|
email: s.string().describe("The email address of the user."),
|
|
6645
6635
|
plan: s.enum(["Todoist Free", "Todoist Pro", "Todoist Business"]).describe("The user plan.")
|
|
6646
6636
|
};
|
|
6647
|
-
function
|
|
6637
|
+
function nd(e) {
|
|
6648
6638
|
return e.businessAccountId ? "Todoist Business" : e.isPremium ? "Todoist Pro" : "Todoist Free";
|
|
6649
6639
|
}
|
|
6650
|
-
function
|
|
6640
|
+
function id(e, t) {
|
|
6651
6641
|
const o = ((e.getDay() || 7) - t + 7) % 7, n = new Date(e);
|
|
6652
6642
|
return n.setDate(e.getDate() - o), n;
|
|
6653
6643
|
}
|
|
6654
|
-
function
|
|
6644
|
+
function ad(e) {
|
|
6655
6645
|
const t = new Date(e);
|
|
6656
6646
|
return t.setDate(e.getDate() + 6), t;
|
|
6657
6647
|
}
|
|
6658
|
-
function
|
|
6648
|
+
function cd(e) {
|
|
6659
6649
|
const t = new Date(e.getFullYear(), 0, 1), r = (e.getTime() - t.getTime()) / 864e5;
|
|
6660
6650
|
return Math.ceil((r + t.getDay() + 1) / 7);
|
|
6661
6651
|
}
|
|
6662
|
-
function
|
|
6652
|
+
function dd(e) {
|
|
6663
6653
|
return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][e === 7 ? 0 : e] ?? "Unknown";
|
|
6664
6654
|
}
|
|
6665
|
-
function
|
|
6655
|
+
function ld(e) {
|
|
6666
6656
|
try {
|
|
6667
6657
|
return new Intl.DateTimeFormat("en-US", { timeZone: e }), !0;
|
|
6668
6658
|
} catch {
|
|
@@ -6670,9 +6660,9 @@ function ud(e) {
|
|
|
6670
6660
|
}
|
|
6671
6661
|
}
|
|
6672
6662
|
function $s(e) {
|
|
6673
|
-
return
|
|
6663
|
+
return ld(e) ? e : "UTC";
|
|
6674
6664
|
}
|
|
6675
|
-
function
|
|
6665
|
+
function ud(e, t) {
|
|
6676
6666
|
const r = $s(t);
|
|
6677
6667
|
return e.toLocaleString("en-US", {
|
|
6678
6668
|
timeZone: r,
|
|
@@ -6685,8 +6675,8 @@ function pd(e, t) {
|
|
|
6685
6675
|
hour12: !1
|
|
6686
6676
|
});
|
|
6687
6677
|
}
|
|
6688
|
-
async function
|
|
6689
|
-
const t = await e.getUser(), r = t.tzInfo?.timezone ?? "UTC", o = $s(r), n = /* @__PURE__ */ new Date(), i =
|
|
6678
|
+
async function pd(e) {
|
|
6679
|
+
const t = await e.getUser(), r = t.tzInfo?.timezone ?? "UTC", o = $s(r), n = /* @__PURE__ */ new Date(), i = ud(n, o), a = t.startDay ?? 1, c = dd(a), d = nd(t), l = new Date(n.toLocaleString("en-US", { timeZone: o })), u = id(l, a), p = ad(u), h = cd(l), y = [
|
|
6690
6680
|
"# User Information",
|
|
6691
6681
|
"",
|
|
6692
6682
|
`**User ID:** ${t.id}`,
|
|
@@ -6697,7 +6687,7 @@ async function md(e) {
|
|
|
6697
6687
|
"",
|
|
6698
6688
|
"## Week Settings",
|
|
6699
6689
|
`**Week Start Day:** ${c} (${a})`,
|
|
6700
|
-
`**Current Week:** Week ${
|
|
6690
|
+
`**Current Week:** Week ${h}`,
|
|
6701
6691
|
`**Week Start Date:** ${ae(u)}`,
|
|
6702
6692
|
`**Week End Date:** ${ae(p)}`,
|
|
6703
6693
|
"",
|
|
@@ -6719,7 +6709,7 @@ async function md(e) {
|
|
|
6719
6709
|
startDayName: c,
|
|
6720
6710
|
weekStartDate: ae(u),
|
|
6721
6711
|
weekEndDate: ae(p),
|
|
6722
|
-
currentWeekNumber:
|
|
6712
|
+
currentWeekNumber: h,
|
|
6723
6713
|
completedToday: t.completedToday,
|
|
6724
6714
|
dailyGoal: t.dailyGoal,
|
|
6725
6715
|
weeklyGoal: t.weeklyGoal,
|
|
@@ -6731,23 +6721,23 @@ async function md(e) {
|
|
|
6731
6721
|
const hd = {
|
|
6732
6722
|
name: g.USER_INFO,
|
|
6733
6723
|
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).",
|
|
6734
|
-
parameters:
|
|
6735
|
-
outputSchema:
|
|
6724
|
+
parameters: rd,
|
|
6725
|
+
outputSchema: od,
|
|
6736
6726
|
annotations: { readOnlyHint: !0, destructiveHint: !1, idempotentHint: !0 },
|
|
6737
6727
|
async execute(e, t) {
|
|
6738
|
-
const r = await
|
|
6728
|
+
const r = await pd(t);
|
|
6739
6729
|
return {
|
|
6740
6730
|
textContent: r.textContent,
|
|
6741
6731
|
structuredContent: r.structuredContent
|
|
6742
6732
|
};
|
|
6743
6733
|
}
|
|
6744
|
-
}, _t = 10 * 1024 * 1024,
|
|
6734
|
+
}, _t = 10 * 1024 * 1024, md = /* @__PURE__ */ new Set([
|
|
6745
6735
|
"image/png",
|
|
6746
6736
|
"image/jpeg",
|
|
6747
6737
|
"image/gif",
|
|
6748
6738
|
"image/webp",
|
|
6749
6739
|
"image/svg+xml"
|
|
6750
|
-
]),
|
|
6740
|
+
]), fd = /* @__PURE__ */ new Set([
|
|
6751
6741
|
"text/plain",
|
|
6752
6742
|
"text/csv",
|
|
6753
6743
|
"text/html",
|
|
@@ -6755,7 +6745,7 @@ const hd = {
|
|
|
6755
6745
|
"application/json",
|
|
6756
6746
|
"application/xml",
|
|
6757
6747
|
"text/xml"
|
|
6758
|
-
]),
|
|
6748
|
+
]), bd = {
|
|
6759
6749
|
".png": "image/png",
|
|
6760
6750
|
".jpg": "image/jpeg",
|
|
6761
6751
|
".jpeg": "image/jpeg",
|
|
@@ -6770,23 +6760,23 @@ const hd = {
|
|
|
6770
6760
|
".xml": "application/xml",
|
|
6771
6761
|
".pdf": "application/pdf"
|
|
6772
6762
|
};
|
|
6773
|
-
function
|
|
6774
|
-
return
|
|
6763
|
+
function gd(e) {
|
|
6764
|
+
return md.has(e) ? "image" : fd.has(e) || e.startsWith("text/") ? "text" : "binary";
|
|
6775
6765
|
}
|
|
6776
|
-
function
|
|
6766
|
+
function yd(e) {
|
|
6777
6767
|
return (e.split(";")[0] ?? e).trim().toLowerCase();
|
|
6778
6768
|
}
|
|
6779
|
-
function
|
|
6769
|
+
function Td(e) {
|
|
6780
6770
|
try {
|
|
6781
6771
|
const t = new URL(e).pathname, r = t.lastIndexOf(".");
|
|
6782
6772
|
if (r === -1) return;
|
|
6783
6773
|
const o = t.slice(r).toLowerCase();
|
|
6784
|
-
return
|
|
6774
|
+
return bd[o];
|
|
6785
6775
|
} catch {
|
|
6786
6776
|
return;
|
|
6787
6777
|
}
|
|
6788
6778
|
}
|
|
6789
|
-
function
|
|
6779
|
+
function kd(e) {
|
|
6790
6780
|
try {
|
|
6791
6781
|
const t = new URL(e).pathname, r = t.lastIndexOf("/");
|
|
6792
6782
|
return r === -1 ? void 0 : t.slice(r + 1) || void 0;
|
|
@@ -6794,21 +6784,21 @@ function wd(e) {
|
|
|
6794
6784
|
return;
|
|
6795
6785
|
}
|
|
6796
6786
|
}
|
|
6797
|
-
const
|
|
6787
|
+
const wd = {
|
|
6798
6788
|
fileUrl: s.url().describe(
|
|
6799
6789
|
"The URL of the attachment file to view. Get this from the fileUrl field in a comment's fileAttachment."
|
|
6800
6790
|
)
|
|
6801
|
-
},
|
|
6791
|
+
}, vd = {
|
|
6802
6792
|
name: g.VIEW_ATTACHMENT,
|
|
6803
6793
|
description: "View a file attachment from a Todoist comment. Pass the fileUrl from a comment's fileAttachment field. Supports images (returned inline), text files (returned as text), and binary files like PDFs (returned as embedded resources).",
|
|
6804
|
-
parameters:
|
|
6794
|
+
parameters: wd,
|
|
6805
6795
|
annotations: {
|
|
6806
6796
|
readOnlyHint: !0,
|
|
6807
6797
|
destructiveHint: !1,
|
|
6808
6798
|
idempotentHint: !0
|
|
6809
6799
|
},
|
|
6810
6800
|
async execute({ fileUrl: e }, t) {
|
|
6811
|
-
const r = await t.viewAttachment(e), o = r.headers["content-length"], n = o ? Number.parseInt(o, 10) : void 0, i =
|
|
6801
|
+
const r = await t.viewAttachment(e), o = r.headers["content-length"], n = o ? Number.parseInt(o, 10) : void 0, i = kd(e), a = r.headers["content-type"], c = a ? yd(a) : void 0, d = c && c !== "application/octet-stream" ? c : Td(e) ?? c ?? "application/octet-stream";
|
|
6812
6802
|
if (n && n > _t)
|
|
6813
6803
|
return {
|
|
6814
6804
|
textContent: `Attachment "${i ?? e}" is too large to display inline (${(n / 1024 / 1024).toFixed(1)}MB, limit is 10MB). File type: ${d}`
|
|
@@ -6818,15 +6808,15 @@ const vd = {
|
|
|
6818
6808
|
return {
|
|
6819
6809
|
textContent: `Attachment "${i ?? e}" is too large to display inline (${(u / 1024 / 1024).toFixed(1)}MB, limit is 10MB). File type: ${d}`
|
|
6820
6810
|
};
|
|
6821
|
-
const p =
|
|
6822
|
-
return p === "image" ?
|
|
6811
|
+
const p = gd(d), h = [];
|
|
6812
|
+
return p === "image" ? h.push({
|
|
6823
6813
|
type: "image",
|
|
6824
6814
|
data: l.toString("base64"),
|
|
6825
6815
|
mimeType: d
|
|
6826
|
-
}) : p === "text" ?
|
|
6816
|
+
}) : p === "text" ? h.push({
|
|
6827
6817
|
type: "text",
|
|
6828
6818
|
text: l.toString("utf-8")
|
|
6829
|
-
}) :
|
|
6819
|
+
}) : h.push({
|
|
6830
6820
|
type: "resource",
|
|
6831
6821
|
resource: {
|
|
6832
6822
|
uri: e,
|
|
@@ -6835,80 +6825,80 @@ const vd = {
|
|
|
6835
6825
|
}
|
|
6836
6826
|
}), {
|
|
6837
6827
|
textContent: `Attachment: ${i ?? "unknown"} (${d}, ${(u / 1024).toFixed(1)}KB)`,
|
|
6838
|
-
contentItems:
|
|
6828
|
+
contentItems: h
|
|
6839
6829
|
};
|
|
6840
6830
|
}
|
|
6841
|
-
},
|
|
6831
|
+
}, Id = {
|
|
6842
6832
|
...Pi,
|
|
6843
6833
|
_meta: {
|
|
6844
6834
|
ui: {
|
|
6845
6835
|
resourceUri: Le
|
|
6846
6836
|
}
|
|
6847
6837
|
}
|
|
6848
|
-
},
|
|
6838
|
+
}, Sd = {
|
|
6849
6839
|
// Task management tools
|
|
6850
6840
|
addTasks: pn,
|
|
6851
6841
|
completeTasks: wn,
|
|
6852
|
-
uncompleteTasks:
|
|
6853
|
-
updateTasks:
|
|
6854
|
-
rescheduleTasks:
|
|
6842
|
+
uncompleteTasks: Xa,
|
|
6843
|
+
updateTasks: Yc,
|
|
6844
|
+
rescheduleTasks: za,
|
|
6855
6845
|
findTasks: Fi,
|
|
6856
|
-
findTasksByDate:
|
|
6846
|
+
findTasksByDate: Id,
|
|
6857
6847
|
findCompletedTasks: ii,
|
|
6858
6848
|
// Project management tools
|
|
6859
6849
|
addProjects: Yo,
|
|
6860
|
-
updateProjects:
|
|
6850
|
+
updateProjects: vc,
|
|
6861
6851
|
findProjects: ki,
|
|
6862
|
-
projectManagement:
|
|
6863
|
-
projectMove:
|
|
6852
|
+
projectManagement: _a,
|
|
6853
|
+
projectMove: La,
|
|
6864
6854
|
// Section management tools
|
|
6865
6855
|
addSections: an,
|
|
6866
|
-
updateSections:
|
|
6856
|
+
updateSections: Rc,
|
|
6867
6857
|
findSections: xi,
|
|
6868
6858
|
// Comment management tools
|
|
6869
6859
|
addComments: Io,
|
|
6870
6860
|
findComments: Xn,
|
|
6871
|
-
updateComments:
|
|
6861
|
+
updateComments: sc,
|
|
6872
6862
|
// Reminder management tools
|
|
6873
6863
|
addReminders: tn,
|
|
6874
6864
|
findReminders: Si,
|
|
6875
|
-
updateReminders:
|
|
6865
|
+
updateReminders: Ec,
|
|
6876
6866
|
// Attachment tools
|
|
6877
|
-
viewAttachment:
|
|
6867
|
+
viewAttachment: vd,
|
|
6878
6868
|
// Label management tools
|
|
6879
6869
|
addLabels: Uo,
|
|
6880
|
-
updateLabels:
|
|
6870
|
+
updateLabels: bc,
|
|
6881
6871
|
findLabels: li,
|
|
6882
6872
|
// Filter management tools
|
|
6883
6873
|
findFilters: $o,
|
|
6884
6874
|
addFilters: Oo,
|
|
6885
|
-
updateFilters:
|
|
6875
|
+
updateFilters: ac,
|
|
6886
6876
|
// Activity and audit tools
|
|
6887
6877
|
findActivity: zn,
|
|
6888
6878
|
getProductivityStats: Qi,
|
|
6889
6879
|
// Health and insights tools
|
|
6890
|
-
getProjectHealth:
|
|
6880
|
+
getProjectHealth: la,
|
|
6891
6881
|
getProjectActivityStats: oa,
|
|
6892
6882
|
analyzeProjectHealth: yn,
|
|
6893
|
-
getWorkspaceInsights:
|
|
6883
|
+
getWorkspaceInsights: ma,
|
|
6894
6884
|
// General tools
|
|
6895
6885
|
getOverview: Ji,
|
|
6896
6886
|
deleteObject: jn,
|
|
6897
6887
|
fetchObject: Ln,
|
|
6898
|
-
reorderObjects:
|
|
6888
|
+
reorderObjects: Fa,
|
|
6899
6889
|
userInfo: hd,
|
|
6900
6890
|
// Assignment and collaboration tools
|
|
6901
|
-
findProjectCollaborators:
|
|
6902
|
-
manageAssignments:
|
|
6891
|
+
findProjectCollaborators: mi,
|
|
6892
|
+
manageAssignments: Ea,
|
|
6903
6893
|
// Template tools
|
|
6904
6894
|
exportProjectTemplate: Dn,
|
|
6905
|
-
importProjectTemplate:
|
|
6895
|
+
importProjectTemplate: Ta,
|
|
6906
6896
|
// Workspace tools
|
|
6907
|
-
listWorkspaces:
|
|
6897
|
+
listWorkspaces: ja,
|
|
6908
6898
|
// OpenAI MCP tools
|
|
6909
|
-
search:
|
|
6899
|
+
search: Ga,
|
|
6910
6900
|
fetch: Fn
|
|
6911
|
-
},
|
|
6901
|
+
}, jd = Object.values(Sd), Cd = `
|
|
6912
6902
|
## Todoist Task and Project Management Tools
|
|
6913
6903
|
|
|
6914
6904
|
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.
|
|
@@ -6960,7 +6950,7 @@ Use the **productivity-analysis** prompt for a combined productivity review —
|
|
|
6960
6950
|
|
|
6961
6951
|
Always provide clear, actionable task titles and descriptions. Use the overview tools to give users context about their workload and project status.
|
|
6962
6952
|
`;
|
|
6963
|
-
function
|
|
6953
|
+
function Fd({
|
|
6964
6954
|
todoistApiKey: e,
|
|
6965
6955
|
baseUrl: t,
|
|
6966
6956
|
features: r = []
|
|
@@ -6972,21 +6962,21 @@ function Hd({
|
|
|
6972
6962
|
tools: { listChanged: !0 },
|
|
6973
6963
|
prompts: { listChanged: !0 }
|
|
6974
6964
|
},
|
|
6975
|
-
instructions:
|
|
6965
|
+
instructions: Cd
|
|
6976
6966
|
}
|
|
6977
6967
|
), n = jr(e, { baseUrl: t });
|
|
6978
6968
|
Gs(o);
|
|
6979
6969
|
const i = { server: o, client: n, features: r };
|
|
6980
|
-
for (const a of
|
|
6970
|
+
for (const a of jd)
|
|
6981
6971
|
qr({ tool: a, ...i });
|
|
6982
6972
|
return o.registerPrompt(
|
|
6983
|
-
|
|
6973
|
+
me.name,
|
|
6984
6974
|
{
|
|
6985
|
-
title:
|
|
6986
|
-
description:
|
|
6987
|
-
argsSchema:
|
|
6975
|
+
title: me.title,
|
|
6976
|
+
description: me.description,
|
|
6977
|
+
argsSchema: me.argsSchema
|
|
6988
6978
|
},
|
|
6989
|
-
|
|
6979
|
+
me.callback
|
|
6990
6980
|
), o;
|
|
6991
6981
|
}
|
|
6992
6982
|
export {
|
|
@@ -6994,28 +6984,28 @@ export {
|
|
|
6994
6984
|
Ji as A,
|
|
6995
6985
|
Qi as B,
|
|
6996
6986
|
oa as C,
|
|
6997
|
-
|
|
6998
|
-
|
|
6999
|
-
|
|
7000
|
-
|
|
7001
|
-
|
|
7002
|
-
|
|
7003
|
-
|
|
7004
|
-
|
|
7005
|
-
|
|
7006
|
-
|
|
7007
|
-
|
|
7008
|
-
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
6987
|
+
la as D,
|
|
6988
|
+
ma as E,
|
|
6989
|
+
Md as F,
|
|
6990
|
+
Ta as G,
|
|
6991
|
+
ja as H,
|
|
6992
|
+
Ea as I,
|
|
6993
|
+
_a as J,
|
|
6994
|
+
La as K,
|
|
6995
|
+
jd as L,
|
|
6996
|
+
Fa as M,
|
|
6997
|
+
za as N,
|
|
6998
|
+
Ga as O,
|
|
6999
|
+
Xa as P,
|
|
7000
|
+
sc as Q,
|
|
7001
|
+
ac as R,
|
|
7002
|
+
bc as S,
|
|
7003
|
+
vc as T,
|
|
7004
|
+
Ec as U,
|
|
7005
|
+
Rc as V,
|
|
7006
|
+
Yc as W,
|
|
7017
7007
|
hd as X,
|
|
7018
|
-
|
|
7008
|
+
vd as Y,
|
|
7019
7009
|
jr as Z,
|
|
7020
7010
|
br as _,
|
|
7021
7011
|
Io as a,
|
|
@@ -7024,7 +7014,7 @@ export {
|
|
|
7024
7014
|
Yo as d,
|
|
7025
7015
|
tn as e,
|
|
7026
7016
|
an as f,
|
|
7027
|
-
|
|
7017
|
+
Fd as g,
|
|
7028
7018
|
pn as h,
|
|
7029
7019
|
yn as i,
|
|
7030
7020
|
wn as j,
|
|
@@ -7037,8 +7027,8 @@ export {
|
|
|
7037
7027
|
ii as q,
|
|
7038
7028
|
$o as r,
|
|
7039
7029
|
li as s,
|
|
7040
|
-
|
|
7041
|
-
|
|
7030
|
+
Sd as t,
|
|
7031
|
+
mi as u,
|
|
7042
7032
|
ki as v,
|
|
7043
7033
|
Si as w,
|
|
7044
7034
|
xi as x,
|