@doist/todoist-mcp 12.5.1 → 12.5.3

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