@doist/todoist-ai 4.11.0 → 4.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/filter-helpers.d.ts +51 -0
- package/dist/filter-helpers.d.ts.map +1 -0
- package/dist/filter-helpers.js +79 -0
- package/dist/index.d.ts +47 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/tool-helpers.d.ts +8 -20
- package/dist/tool-helpers.d.ts.map +1 -1
- package/dist/tool-helpers.js +6 -23
- package/dist/tools/__tests__/find-tasks-by-date.test.js +118 -20
- package/dist/tools/__tests__/find-tasks.test.js +2 -0
- package/dist/tools/add-projects.d.ts +3 -3
- package/dist/tools/add-tasks.d.ts +6 -3
- package/dist/tools/add-tasks.d.ts.map +1 -1
- package/dist/tools/delete-object.d.ts +1 -1
- package/dist/tools/find-completed-tasks.d.ts +16 -10
- package/dist/tools/find-completed-tasks.d.ts.map +1 -1
- package/dist/tools/find-completed-tasks.js +23 -4
- package/dist/tools/find-tasks-by-date.d.ts +9 -0
- package/dist/tools/find-tasks-by-date.d.ts.map +1 -1
- package/dist/tools/find-tasks-by-date.js +39 -15
- package/dist/tools/find-tasks.d.ts +5 -2
- package/dist/tools/find-tasks.d.ts.map +1 -1
- package/dist/tools/find-tasks.js +20 -36
- package/dist/tools/update-comments.d.ts +3 -3
- package/dist/tools/update-sections.d.ts +3 -3
- package/dist/tools/update-tasks.d.ts +9 -6
- package/dist/tools/update-tasks.d.ts.map +1 -1
- package/dist/utils/test-helpers.d.ts +3 -0
- package/dist/utils/test-helpers.d.ts.map +1 -1
- package/dist/utils/test-helpers.js +3 -0
- package/dist/utils/user-resolver.d.ts +2 -4
- package/dist/utils/user-resolver.d.ts.map +1 -1
- package/dist/utils/user-resolver.js +5 -5
- package/package.json +4 -4
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { TodoistApi } from '@doist/todoist-api-typescript';
|
|
2
|
+
export declare const RESPONSIBLE_USER_FILTERING: readonly ["assigned", "unassignedOrMe", "all"];
|
|
3
|
+
export type ResponsibleUserFiltering = (typeof RESPONSIBLE_USER_FILTERING)[number];
|
|
4
|
+
/**
|
|
5
|
+
* Resolves a responsible user name/email to user ID and email.
|
|
6
|
+
* @param client - Todoist API client
|
|
7
|
+
* @param responsibleUser - User identifier (can be user ID, name, or email)
|
|
8
|
+
* @returns Object with userId and email, or undefined if not provided
|
|
9
|
+
* @throws Error if user cannot be found
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveResponsibleUser(client: TodoistApi, responsibleUser: string | undefined): Promise<{
|
|
12
|
+
userId: string;
|
|
13
|
+
email: string;
|
|
14
|
+
} | undefined>;
|
|
15
|
+
/**
|
|
16
|
+
* Appends a filter component to a query string with proper ' & ' separator.
|
|
17
|
+
* @param query - The existing query string
|
|
18
|
+
* @param filterComponent - The filter component to append
|
|
19
|
+
* @returns The updated query string
|
|
20
|
+
*/
|
|
21
|
+
export declare function appendToQuery(query: string, filterComponent: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Builds a query filter string for responsible user filtering that can be appended to a Todoist filter query.
|
|
24
|
+
* @param resolvedAssigneeId - The resolved assignee ID (if provided)
|
|
25
|
+
* @param assigneeEmail - The assignee email (if provided)
|
|
26
|
+
* @param responsibleUserFiltering - The filtering mode ('assigned', 'unassignedOrMe', 'all')
|
|
27
|
+
* @returns Query filter string (e.g., "assigned to: email@example.com" or "!assigned to: others")
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildResponsibleUserQueryFilter({ resolvedAssigneeId, assigneeEmail, responsibleUserFiltering, }: {
|
|
30
|
+
resolvedAssigneeId: string | undefined;
|
|
31
|
+
assigneeEmail: string | undefined;
|
|
32
|
+
responsibleUserFiltering?: ResponsibleUserFiltering;
|
|
33
|
+
}): string;
|
|
34
|
+
/**
|
|
35
|
+
* Filters tasks based on responsible user logic:
|
|
36
|
+
* - If resolvedAssigneeId is provided: returns only tasks assigned to that user
|
|
37
|
+
* - If no resolvedAssigneeId: returns only unassigned tasks or tasks assigned to current user
|
|
38
|
+
* @param tasks - Array of tasks to filter (must have responsibleUid property)
|
|
39
|
+
* @param resolvedAssigneeId - The resolved assignee ID to filter by (optional)
|
|
40
|
+
* @param currentUserId - The current authenticated user's ID
|
|
41
|
+
* @returns Filtered array of tasks
|
|
42
|
+
*/
|
|
43
|
+
export declare function filterTasksByResponsibleUser<T extends {
|
|
44
|
+
responsibleUid: string | null;
|
|
45
|
+
}>({ tasks, resolvedAssigneeId, currentUserId, responsibleUserFiltering, }: {
|
|
46
|
+
tasks: T[];
|
|
47
|
+
resolvedAssigneeId: string | undefined;
|
|
48
|
+
currentUserId: string;
|
|
49
|
+
responsibleUserFiltering?: ResponsibleUserFiltering;
|
|
50
|
+
}): T[];
|
|
51
|
+
//# sourceMappingURL=filter-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-helpers.d.ts","sourceRoot":"","sources":["../src/filter-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAG/D,eAAO,MAAM,0BAA0B,gDAAiD,CAAA;AACxF,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAA;AAElF;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,UAAU,EAClB,eAAe,EAAE,MAAM,GAAG,SAAS,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CAaxD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,EAC5C,kBAAkB,EAClB,aAAa,EACb,wBAA2C,GAC9C,EAAE;IACC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,wBAAwB,CAAC,EAAE,wBAAwB,CAAA;CACtD,GAAG,MAAM,CAmBT;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS;IAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,EACtF,KAAK,EACL,kBAAkB,EAClB,aAAa,EACb,wBAA2C,GAC9C,EAAE;IACC,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,aAAa,EAAE,MAAM,CAAA;IACrB,wBAAwB,CAAC,EAAE,wBAAwB,CAAA;CACtD,GAAG,CAAC,EAAE,CAUN"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { resolveUserNameToId } from './utils/user-resolver.js';
|
|
2
|
+
export const RESPONSIBLE_USER_FILTERING = ['assigned', 'unassignedOrMe', 'all'];
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a responsible user name/email to user ID and email.
|
|
5
|
+
* @param client - Todoist API client
|
|
6
|
+
* @param responsibleUser - User identifier (can be user ID, name, or email)
|
|
7
|
+
* @returns Object with userId and email, or undefined if not provided
|
|
8
|
+
* @throws Error if user cannot be found
|
|
9
|
+
*/
|
|
10
|
+
export async function resolveResponsibleUser(client, responsibleUser) {
|
|
11
|
+
if (!responsibleUser) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const resolved = await resolveUserNameToId(client, responsibleUser);
|
|
15
|
+
if (!resolved) {
|
|
16
|
+
throw new Error(`Could not find user: "${responsibleUser}". Make sure the user is a collaborator on a shared project.`);
|
|
17
|
+
}
|
|
18
|
+
return { userId: resolved.userId, email: resolved.email };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Appends a filter component to a query string with proper ' & ' separator.
|
|
22
|
+
* @param query - The existing query string
|
|
23
|
+
* @param filterComponent - The filter component to append
|
|
24
|
+
* @returns The updated query string
|
|
25
|
+
*/
|
|
26
|
+
export function appendToQuery(query, filterComponent) {
|
|
27
|
+
if (filterComponent.length === 0) {
|
|
28
|
+
return query;
|
|
29
|
+
}
|
|
30
|
+
if (query.length === 0) {
|
|
31
|
+
return filterComponent;
|
|
32
|
+
}
|
|
33
|
+
return `${query} & ${filterComponent}`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Builds a query filter string for responsible user filtering that can be appended to a Todoist filter query.
|
|
37
|
+
* @param resolvedAssigneeId - The resolved assignee ID (if provided)
|
|
38
|
+
* @param assigneeEmail - The assignee email (if provided)
|
|
39
|
+
* @param responsibleUserFiltering - The filtering mode ('assigned', 'unassignedOrMe', 'all')
|
|
40
|
+
* @returns Query filter string (e.g., "assigned to: email@example.com" or "!assigned to: others")
|
|
41
|
+
*/
|
|
42
|
+
export function buildResponsibleUserQueryFilter({ resolvedAssigneeId, assigneeEmail, responsibleUserFiltering = 'unassignedOrMe', }) {
|
|
43
|
+
if (resolvedAssigneeId && assigneeEmail) {
|
|
44
|
+
// If specific user is provided, filter by that user
|
|
45
|
+
return `assigned to: ${assigneeEmail}`;
|
|
46
|
+
}
|
|
47
|
+
// Otherwise use the filtering mode
|
|
48
|
+
if (responsibleUserFiltering === 'unassignedOrMe') {
|
|
49
|
+
// Exclude tasks assigned to others (keeps unassigned + assigned to me)
|
|
50
|
+
return '!assigned to: others';
|
|
51
|
+
}
|
|
52
|
+
if (responsibleUserFiltering === 'assigned') {
|
|
53
|
+
// Only tasks assigned to others
|
|
54
|
+
return 'assigned to: others';
|
|
55
|
+
}
|
|
56
|
+
// For 'all', don't add any assignment filter
|
|
57
|
+
return '';
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Filters tasks based on responsible user logic:
|
|
61
|
+
* - If resolvedAssigneeId is provided: returns only tasks assigned to that user
|
|
62
|
+
* - If no resolvedAssigneeId: returns only unassigned tasks or tasks assigned to current user
|
|
63
|
+
* @param tasks - Array of tasks to filter (must have responsibleUid property)
|
|
64
|
+
* @param resolvedAssigneeId - The resolved assignee ID to filter by (optional)
|
|
65
|
+
* @param currentUserId - The current authenticated user's ID
|
|
66
|
+
* @returns Filtered array of tasks
|
|
67
|
+
*/
|
|
68
|
+
export function filterTasksByResponsibleUser({ tasks, resolvedAssigneeId, currentUserId, responsibleUserFiltering = 'unassignedOrMe', }) {
|
|
69
|
+
if (resolvedAssigneeId) {
|
|
70
|
+
// If responsibleUser provided, only return tasks assigned to that user
|
|
71
|
+
return tasks.filter((task) => task.responsibleUid === resolvedAssigneeId);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// If no responsibleUser, only return unassigned tasks or tasks assigned to current user
|
|
75
|
+
return responsibleUserFiltering === 'unassignedOrMe'
|
|
76
|
+
? tasks.filter((task) => !task.responsibleUid || task.responsibleUid === currentUserId)
|
|
77
|
+
: tasks;
|
|
78
|
+
}
|
|
79
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -40,8 +40,8 @@ declare const tools: {
|
|
|
40
40
|
}, "strip", import("zod").ZodTypeAny, {
|
|
41
41
|
content: string;
|
|
42
42
|
description?: string | undefined;
|
|
43
|
-
projectId?: string | undefined;
|
|
44
43
|
parentId?: string | undefined;
|
|
44
|
+
projectId?: string | undefined;
|
|
45
45
|
sectionId?: string | undefined;
|
|
46
46
|
labels?: string[] | undefined;
|
|
47
47
|
duration?: string | undefined;
|
|
@@ -51,8 +51,8 @@ declare const tools: {
|
|
|
51
51
|
}, {
|
|
52
52
|
content: string;
|
|
53
53
|
description?: string | undefined;
|
|
54
|
-
projectId?: string | undefined;
|
|
55
54
|
parentId?: string | undefined;
|
|
55
|
+
projectId?: string | undefined;
|
|
56
56
|
sectionId?: string | undefined;
|
|
57
57
|
labels?: string[] | undefined;
|
|
58
58
|
duration?: string | undefined;
|
|
@@ -65,8 +65,8 @@ declare const tools: {
|
|
|
65
65
|
tasks: {
|
|
66
66
|
content: string;
|
|
67
67
|
description?: string | undefined;
|
|
68
|
-
projectId?: string | undefined;
|
|
69
68
|
parentId?: string | undefined;
|
|
69
|
+
projectId?: string | undefined;
|
|
70
70
|
sectionId?: string | undefined;
|
|
71
71
|
labels?: string[] | undefined;
|
|
72
72
|
duration?: string | undefined;
|
|
@@ -94,6 +94,9 @@ declare const tools: {
|
|
|
94
94
|
duration: string | null;
|
|
95
95
|
responsibleUid: string | null;
|
|
96
96
|
assignedByUid: string | null;
|
|
97
|
+
checked: boolean;
|
|
98
|
+
completedAt: string | null;
|
|
99
|
+
updatedAt: string | null;
|
|
97
100
|
}[];
|
|
98
101
|
totalCount: number;
|
|
99
102
|
};
|
|
@@ -166,10 +169,10 @@ declare const tools: {
|
|
|
166
169
|
labels: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
|
|
167
170
|
}, "strip", import("zod").ZodTypeAny, {
|
|
168
171
|
id: string;
|
|
169
|
-
content?: string | undefined;
|
|
170
172
|
description?: string | undefined;
|
|
171
|
-
projectId?: string | undefined;
|
|
172
173
|
parentId?: string | undefined;
|
|
174
|
+
content?: string | undefined;
|
|
175
|
+
projectId?: string | undefined;
|
|
173
176
|
sectionId?: string | undefined;
|
|
174
177
|
labels?: string[] | undefined;
|
|
175
178
|
duration?: string | undefined;
|
|
@@ -179,10 +182,10 @@ declare const tools: {
|
|
|
179
182
|
order?: number | undefined;
|
|
180
183
|
}, {
|
|
181
184
|
id: string;
|
|
182
|
-
content?: string | undefined;
|
|
183
185
|
description?: string | undefined;
|
|
184
|
-
projectId?: string | undefined;
|
|
185
186
|
parentId?: string | undefined;
|
|
187
|
+
content?: string | undefined;
|
|
188
|
+
projectId?: string | undefined;
|
|
186
189
|
sectionId?: string | undefined;
|
|
187
190
|
labels?: string[] | undefined;
|
|
188
191
|
duration?: string | undefined;
|
|
@@ -195,10 +198,10 @@ declare const tools: {
|
|
|
195
198
|
execute(args: {
|
|
196
199
|
tasks: {
|
|
197
200
|
id: string;
|
|
198
|
-
content?: string | undefined;
|
|
199
201
|
description?: string | undefined;
|
|
200
|
-
projectId?: string | undefined;
|
|
201
202
|
parentId?: string | undefined;
|
|
203
|
+
content?: string | undefined;
|
|
204
|
+
projectId?: string | undefined;
|
|
202
205
|
sectionId?: string | undefined;
|
|
203
206
|
labels?: string[] | undefined;
|
|
204
207
|
duration?: string | undefined;
|
|
@@ -227,6 +230,9 @@ declare const tools: {
|
|
|
227
230
|
duration: string | null;
|
|
228
231
|
responsibleUid: string | null;
|
|
229
232
|
assignedByUid: string | null;
|
|
233
|
+
checked: boolean;
|
|
234
|
+
completedAt: string | null;
|
|
235
|
+
updatedAt: string | null;
|
|
230
236
|
}[];
|
|
231
237
|
totalCount: number;
|
|
232
238
|
updatedTaskIds: string[];
|
|
@@ -265,9 +271,9 @@ declare const tools: {
|
|
|
265
271
|
};
|
|
266
272
|
execute(args: {
|
|
267
273
|
limit: number;
|
|
268
|
-
projectId?: string | undefined;
|
|
269
274
|
parentId?: string | undefined;
|
|
270
275
|
responsibleUserFiltering?: "assigned" | "unassignedOrMe" | "all" | undefined;
|
|
276
|
+
projectId?: string | undefined;
|
|
271
277
|
sectionId?: string | undefined;
|
|
272
278
|
labels?: string[] | undefined;
|
|
273
279
|
cursor?: string | undefined;
|
|
@@ -294,15 +300,18 @@ declare const tools: {
|
|
|
294
300
|
duration: string | null;
|
|
295
301
|
responsibleUid: string | null;
|
|
296
302
|
assignedByUid: string | null;
|
|
303
|
+
checked: boolean;
|
|
304
|
+
completedAt: string | null;
|
|
305
|
+
updatedAt: string | null;
|
|
297
306
|
}[];
|
|
298
307
|
nextCursor: string | null;
|
|
299
308
|
totalCount: number;
|
|
300
309
|
hasMore: boolean;
|
|
301
310
|
appliedFilters: {
|
|
302
311
|
limit: number;
|
|
303
|
-
projectId?: string | undefined;
|
|
304
312
|
parentId?: string | undefined;
|
|
305
313
|
responsibleUserFiltering?: "assigned" | "unassignedOrMe" | "all" | undefined;
|
|
314
|
+
projectId?: string | undefined;
|
|
306
315
|
sectionId?: string | undefined;
|
|
307
316
|
labels?: string[] | undefined;
|
|
308
317
|
cursor?: string | undefined;
|
|
@@ -335,12 +344,16 @@ declare const tools: {
|
|
|
335
344
|
daysCount: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
336
345
|
limit: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
337
346
|
cursor: import("zod").ZodOptional<import("zod").ZodString>;
|
|
347
|
+
responsibleUser: import("zod").ZodOptional<import("zod").ZodString>;
|
|
348
|
+
responsibleUserFiltering: import("zod").ZodOptional<import("zod").ZodEnum<["assigned", "unassignedOrMe", "all"]>>;
|
|
338
349
|
};
|
|
339
350
|
execute(args: {
|
|
340
351
|
limit: number;
|
|
341
352
|
daysCount: number;
|
|
353
|
+
responsibleUserFiltering?: "assigned" | "unassignedOrMe" | "all" | undefined;
|
|
342
354
|
labels?: string[] | undefined;
|
|
343
355
|
cursor?: string | undefined;
|
|
356
|
+
responsibleUser?: string | undefined;
|
|
344
357
|
labelsOperator?: "and" | "or" | undefined;
|
|
345
358
|
startDate?: string | undefined;
|
|
346
359
|
overdueOption?: "overdue-only" | "include-overdue" | "exclude-overdue" | undefined;
|
|
@@ -364,6 +377,9 @@ declare const tools: {
|
|
|
364
377
|
duration: string | null;
|
|
365
378
|
responsibleUid: string | null;
|
|
366
379
|
assignedByUid: string | null;
|
|
380
|
+
checked: boolean;
|
|
381
|
+
completedAt: string | null;
|
|
382
|
+
updatedAt: string | null;
|
|
367
383
|
}[];
|
|
368
384
|
nextCursor: string | null;
|
|
369
385
|
totalCount: number;
|
|
@@ -371,8 +387,10 @@ declare const tools: {
|
|
|
371
387
|
appliedFilters: {
|
|
372
388
|
limit: number;
|
|
373
389
|
daysCount: number;
|
|
390
|
+
responsibleUserFiltering?: "assigned" | "unassignedOrMe" | "all" | undefined;
|
|
374
391
|
labels?: string[] | undefined;
|
|
375
392
|
cursor?: string | undefined;
|
|
393
|
+
responsibleUser?: string | undefined;
|
|
376
394
|
labelsOperator?: "and" | "or" | undefined;
|
|
377
395
|
startDate?: string | undefined;
|
|
378
396
|
overdueOption?: "overdue-only" | "include-overdue" | "exclude-overdue" | undefined;
|
|
@@ -404,6 +422,7 @@ declare const tools: {
|
|
|
404
422
|
projectId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
405
423
|
sectionId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
406
424
|
parentId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
425
|
+
responsibleUser: import("zod").ZodOptional<import("zod").ZodString>;
|
|
407
426
|
limit: import("zod").ZodDefault<import("zod").ZodNumber>;
|
|
408
427
|
cursor: import("zod").ZodOptional<import("zod").ZodString>;
|
|
409
428
|
};
|
|
@@ -412,12 +431,13 @@ declare const tools: {
|
|
|
412
431
|
getBy: "due" | "completion";
|
|
413
432
|
since: string;
|
|
414
433
|
until: string;
|
|
415
|
-
projectId?: string | undefined;
|
|
416
434
|
parentId?: string | undefined;
|
|
417
435
|
workspaceId?: string | undefined;
|
|
436
|
+
projectId?: string | undefined;
|
|
418
437
|
sectionId?: string | undefined;
|
|
419
438
|
labels?: string[] | undefined;
|
|
420
439
|
cursor?: string | undefined;
|
|
440
|
+
responsibleUser?: string | undefined;
|
|
421
441
|
labelsOperator?: "and" | "or" | undefined;
|
|
422
442
|
}, client: import("@doist/todoist-api-typescript").TodoistApi): Promise<{
|
|
423
443
|
content: {
|
|
@@ -439,6 +459,9 @@ declare const tools: {
|
|
|
439
459
|
duration: string | null;
|
|
440
460
|
responsibleUid: string | null;
|
|
441
461
|
assignedByUid: string | null;
|
|
462
|
+
checked: boolean;
|
|
463
|
+
completedAt: string | null;
|
|
464
|
+
updatedAt: string | null;
|
|
442
465
|
}[];
|
|
443
466
|
nextCursor: string | null;
|
|
444
467
|
totalCount: number;
|
|
@@ -448,12 +471,13 @@ declare const tools: {
|
|
|
448
471
|
getBy: "due" | "completion";
|
|
449
472
|
since: string;
|
|
450
473
|
until: string;
|
|
451
|
-
projectId?: string | undefined;
|
|
452
474
|
parentId?: string | undefined;
|
|
453
475
|
workspaceId?: string | undefined;
|
|
476
|
+
projectId?: string | undefined;
|
|
454
477
|
sectionId?: string | undefined;
|
|
455
478
|
labels?: string[] | undefined;
|
|
456
479
|
cursor?: string | undefined;
|
|
480
|
+
responsibleUser?: string | undefined;
|
|
457
481
|
labelsOperator?: "and" | "or" | undefined;
|
|
458
482
|
};
|
|
459
483
|
};
|
|
@@ -481,22 +505,22 @@ declare const tools: {
|
|
|
481
505
|
viewStyle: import("zod").ZodOptional<import("zod").ZodEnum<["list", "board", "calendar"]>>;
|
|
482
506
|
}, "strip", import("zod").ZodTypeAny, {
|
|
483
507
|
name: string;
|
|
484
|
-
parentId?: string | undefined;
|
|
485
508
|
isFavorite?: boolean | undefined;
|
|
486
509
|
viewStyle?: "list" | "board" | "calendar" | undefined;
|
|
510
|
+
parentId?: string | undefined;
|
|
487
511
|
}, {
|
|
488
512
|
name: string;
|
|
489
|
-
parentId?: string | undefined;
|
|
490
513
|
isFavorite?: boolean | undefined;
|
|
491
514
|
viewStyle?: "list" | "board" | "calendar" | undefined;
|
|
515
|
+
parentId?: string | undefined;
|
|
492
516
|
}>, "many">;
|
|
493
517
|
};
|
|
494
518
|
execute({ projects }: {
|
|
495
519
|
projects: {
|
|
496
520
|
name: string;
|
|
497
|
-
parentId?: string | undefined;
|
|
498
521
|
isFavorite?: boolean | undefined;
|
|
499
522
|
viewStyle?: "list" | "board" | "calendar" | undefined;
|
|
523
|
+
parentId?: string | undefined;
|
|
500
524
|
}[];
|
|
501
525
|
}, client: import("@doist/todoist-api-typescript").TodoistApi): Promise<{
|
|
502
526
|
content: {
|
|
@@ -778,17 +802,17 @@ declare const tools: {
|
|
|
778
802
|
id: import("zod").ZodString;
|
|
779
803
|
name: import("zod").ZodString;
|
|
780
804
|
}, "strip", import("zod").ZodTypeAny, {
|
|
781
|
-
name: string;
|
|
782
805
|
id: string;
|
|
783
|
-
}, {
|
|
784
806
|
name: string;
|
|
807
|
+
}, {
|
|
785
808
|
id: string;
|
|
809
|
+
name: string;
|
|
786
810
|
}>, "many">;
|
|
787
811
|
};
|
|
788
812
|
execute({ sections }: {
|
|
789
813
|
sections: {
|
|
790
|
-
name: string;
|
|
791
814
|
id: string;
|
|
815
|
+
name: string;
|
|
792
816
|
}[];
|
|
793
817
|
}, client: import("@doist/todoist-api-typescript").TodoistApi): Promise<{
|
|
794
818
|
content: {
|
|
@@ -944,17 +968,17 @@ declare const tools: {
|
|
|
944
968
|
id: import("zod").ZodString;
|
|
945
969
|
content: import("zod").ZodString;
|
|
946
970
|
}, "strip", import("zod").ZodTypeAny, {
|
|
947
|
-
content: string;
|
|
948
971
|
id: string;
|
|
949
|
-
}, {
|
|
950
972
|
content: string;
|
|
973
|
+
}, {
|
|
951
974
|
id: string;
|
|
975
|
+
content: string;
|
|
952
976
|
}>, "many">;
|
|
953
977
|
};
|
|
954
978
|
execute(args: {
|
|
955
979
|
comments: {
|
|
956
|
-
content: string;
|
|
957
980
|
id: string;
|
|
981
|
+
content: string;
|
|
958
982
|
}[];
|
|
959
983
|
}, client: import("@doist/todoist-api-typescript").TodoistApi): Promise<{
|
|
960
984
|
content: {
|
|
@@ -1107,8 +1131,8 @@ declare const tools: {
|
|
|
1107
1131
|
id: import("zod").ZodString;
|
|
1108
1132
|
};
|
|
1109
1133
|
execute(args: {
|
|
1110
|
-
type: "task" | "comment" | "project" | "section";
|
|
1111
1134
|
id: string;
|
|
1135
|
+
type: "task" | "comment" | "project" | "section";
|
|
1112
1136
|
}, client: import("@doist/todoist-api-typescript").TodoistApi): Promise<{
|
|
1113
1137
|
content: {
|
|
1114
1138
|
type: "text";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAErD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAEpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,QAAA,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/tool-helpers.d.ts
CHANGED
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
import type { MoveTaskArgs, PersonalProject, Task, TodoistApi, WorkspaceProject } from '@doist/todoist-api-typescript';
|
|
2
|
-
export
|
|
3
|
-
export type ResponsibleUserFiltering = (typeof RESPONSIBLE_USER_FILTERING)[number];
|
|
2
|
+
export { appendToQuery, buildResponsibleUserQueryFilter, filterTasksByResponsibleUser, RESPONSIBLE_USER_FILTERING, type ResponsibleUserFiltering, resolveResponsibleUser, } from './filter-helpers.js';
|
|
4
3
|
export type Project = PersonalProject | WorkspaceProject;
|
|
5
4
|
export declare function isPersonalProject(project: Project): project is PersonalProject;
|
|
6
5
|
export declare function isWorkspaceProject(project: Project): project is WorkspaceProject;
|
|
7
|
-
/**
|
|
8
|
-
* Filters tasks based on responsible user logic:
|
|
9
|
-
* - If resolvedAssigneeId is provided: returns only tasks assigned to that user
|
|
10
|
-
* - If no resolvedAssigneeId: returns only unassigned tasks or tasks assigned to current user
|
|
11
|
-
* @param tasks - Array of tasks to filter (must have responsibleUid property)
|
|
12
|
-
* @param resolvedAssigneeId - The resolved assignee ID to filter by (optional)
|
|
13
|
-
* @param currentUserId - The current authenticated user's ID
|
|
14
|
-
* @returns Filtered array of tasks
|
|
15
|
-
*/
|
|
16
|
-
export declare function filterTasksByResponsibleUser<T extends {
|
|
17
|
-
responsibleUid: string | null;
|
|
18
|
-
}>({ tasks, resolvedAssigneeId, currentUserId, responsibleUserFiltering, }: {
|
|
19
|
-
tasks: T[];
|
|
20
|
-
resolvedAssigneeId: string | undefined;
|
|
21
|
-
currentUserId: string;
|
|
22
|
-
responsibleUserFiltering?: ResponsibleUserFiltering;
|
|
23
|
-
}): T[];
|
|
24
6
|
/**
|
|
25
7
|
* Creates a MoveTaskArgs object from move parameters, validating that exactly one is provided.
|
|
26
8
|
* @param taskId - The task ID (used for error messages)
|
|
@@ -50,6 +32,9 @@ declare function mapTask(task: Task): {
|
|
|
50
32
|
duration: string | null;
|
|
51
33
|
responsibleUid: string | null;
|
|
52
34
|
assignedByUid: string | null;
|
|
35
|
+
checked: boolean;
|
|
36
|
+
completedAt: string | null;
|
|
37
|
+
updatedAt: string | null;
|
|
53
38
|
};
|
|
54
39
|
/**
|
|
55
40
|
* Map a single Todoist project to a more structured format, for LLM consumption.
|
|
@@ -86,6 +71,9 @@ declare function getTasksByFilter({ client, query, limit, cursor, }: {
|
|
|
86
71
|
duration: string | null;
|
|
87
72
|
responsibleUid: string | null;
|
|
88
73
|
assignedByUid: string | null;
|
|
74
|
+
checked: boolean;
|
|
75
|
+
completedAt: string | null;
|
|
76
|
+
updatedAt: string | null;
|
|
89
77
|
}[];
|
|
90
78
|
nextCursor: string | null;
|
|
91
79
|
}>;
|
|
@@ -96,5 +84,5 @@ declare function getTasksByFilter({ client, query, limit, cursor, }: {
|
|
|
96
84
|
* @returns The URL string
|
|
97
85
|
*/
|
|
98
86
|
declare function buildTodoistUrl(type: 'task' | 'project', id: string): string;
|
|
99
|
-
export {
|
|
87
|
+
export { buildTodoistUrl, getTasksByFilter, mapProject, mapTask };
|
|
100
88
|
//# sourceMappingURL=tool-helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../src/tool-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EACZ,eAAe,EACf,IAAI,EACJ,UAAU,EACV,gBAAgB,EACnB,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../src/tool-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EACZ,eAAe,EACf,IAAI,EACJ,UAAU,EACV,gBAAgB,EACnB,MAAM,+BAA+B,CAAA;AAKtC,OAAO,EACH,aAAa,EACb,+BAA+B,EAC/B,4BAA4B,EAC5B,0BAA0B,EAC1B,KAAK,wBAAwB,EAC7B,sBAAsB,GACzB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,MAAM,OAAO,GAAG,eAAe,GAAG,gBAAgB,CAAA;AAExD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,eAAe,CAE9E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAEhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAClB,YAAY,CAsBd;AAED;;;;GAIG;AACH,iBAAS,OAAO,CAAC,IAAI,EAAE,IAAI;;;;;;;;;;;;;;;;;EAmB1B;AAED;;;;GAIG;AACH,iBAAS,UAAU,CAAC,OAAO,EAAE,OAAO;;;;;;;;;EAWnC;AAWD,iBAAe,gBAAgB,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,KAAK,EACL,MAAM,GACT,EAAE;IACC,MAAM,EAAE,UAAU,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;;;;;;;;;;;;;;;;;;;;GAkBA;AAED;;;;;GAKG;AACH,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA"}
|
package/dist/tool-helpers.js
CHANGED
|
@@ -1,33 +1,13 @@
|
|
|
1
1
|
import z from 'zod';
|
|
2
2
|
import { formatDuration } from './utils/duration-parser.js';
|
|
3
|
-
export
|
|
3
|
+
// Re-export filter helpers for backward compatibility
|
|
4
|
+
export { appendToQuery, buildResponsibleUserQueryFilter, filterTasksByResponsibleUser, RESPONSIBLE_USER_FILTERING, resolveResponsibleUser, } from './filter-helpers.js';
|
|
4
5
|
export function isPersonalProject(project) {
|
|
5
6
|
return 'inboxProject' in project;
|
|
6
7
|
}
|
|
7
8
|
export function isWorkspaceProject(project) {
|
|
8
9
|
return 'accessLevel' in project;
|
|
9
10
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Filters tasks based on responsible user logic:
|
|
12
|
-
* - If resolvedAssigneeId is provided: returns only tasks assigned to that user
|
|
13
|
-
* - If no resolvedAssigneeId: returns only unassigned tasks or tasks assigned to current user
|
|
14
|
-
* @param tasks - Array of tasks to filter (must have responsibleUid property)
|
|
15
|
-
* @param resolvedAssigneeId - The resolved assignee ID to filter by (optional)
|
|
16
|
-
* @param currentUserId - The current authenticated user's ID
|
|
17
|
-
* @returns Filtered array of tasks
|
|
18
|
-
*/
|
|
19
|
-
export function filterTasksByResponsibleUser({ tasks, resolvedAssigneeId, currentUserId, responsibleUserFiltering = 'unassignedOrMe', }) {
|
|
20
|
-
if (resolvedAssigneeId) {
|
|
21
|
-
// If responsibleUser provided, only return tasks assigned to that user
|
|
22
|
-
return tasks.filter((task) => task.responsibleUid === resolvedAssigneeId);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
// If no responsibleUser, only return unassigned tasks or tasks assigned to current user
|
|
26
|
-
return responsibleUserFiltering === 'unassignedOrMe'
|
|
27
|
-
? tasks.filter((task) => !task.responsibleUid || task.responsibleUid === currentUserId)
|
|
28
|
-
: tasks;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
11
|
/**
|
|
32
12
|
* Creates a MoveTaskArgs object from move parameters, validating that exactly one is provided.
|
|
33
13
|
* @param taskId - The task ID (used for error messages)
|
|
@@ -76,6 +56,9 @@ function mapTask(task) {
|
|
|
76
56
|
duration: task.duration ? formatDuration(task.duration.amount) : null,
|
|
77
57
|
responsibleUid: task.responsibleUid,
|
|
78
58
|
assignedByUid: task.assignedByUid,
|
|
59
|
+
checked: task.checked,
|
|
60
|
+
completedAt: task.completedAt,
|
|
61
|
+
updatedAt: task.updatedAt,
|
|
79
62
|
};
|
|
80
63
|
}
|
|
81
64
|
/**
|
|
@@ -130,4 +113,4 @@ async function getTasksByFilter({ client, query, limit, cursor, }) {
|
|
|
130
113
|
function buildTodoistUrl(type, id) {
|
|
131
114
|
return `https://app.todoist.com/app/${type}/${id}`;
|
|
132
115
|
}
|
|
133
|
-
export {
|
|
116
|
+
export { buildTodoistUrl, getTasksByFilter, mapProject, mapTask };
|