@doist/todoist-cli 1.29.4 → 1.30.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.
Files changed (246) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/__mocks__/chalk.d.ts +3 -0
  3. package/dist/__mocks__/chalk.d.ts.map +1 -0
  4. package/dist/__mocks__/chalk.js +8 -0
  5. package/dist/__mocks__/chalk.js.map +1 -0
  6. package/dist/commands/activity.d.ts +3 -0
  7. package/dist/commands/activity.d.ts.map +1 -0
  8. package/dist/commands/activity.js +267 -0
  9. package/dist/commands/activity.js.map +1 -0
  10. package/dist/commands/add.d.ts +3 -0
  11. package/dist/commands/add.d.ts.map +1 -0
  12. package/dist/commands/add.js +36 -0
  13. package/dist/commands/add.js.map +1 -0
  14. package/dist/commands/attachment.d.ts +3 -0
  15. package/dist/commands/attachment.d.ts.map +1 -0
  16. package/dist/commands/attachment.js +156 -0
  17. package/dist/commands/attachment.js.map +1 -0
  18. package/dist/commands/auth.d.ts +3 -0
  19. package/dist/commands/auth.d.ts.map +1 -0
  20. package/dist/commands/auth.js +124 -0
  21. package/dist/commands/auth.js.map +1 -0
  22. package/dist/commands/changelog.d.ts +8 -0
  23. package/dist/commands/changelog.d.ts.map +1 -0
  24. package/dist/commands/changelog.js +92 -0
  25. package/dist/commands/changelog.js.map +1 -0
  26. package/dist/commands/comment.d.ts +3 -0
  27. package/dist/commands/comment.d.ts.map +1 -0
  28. package/dist/commands/comment.js +301 -0
  29. package/dist/commands/comment.js.map +1 -0
  30. package/dist/commands/completed.d.ts +3 -0
  31. package/dist/commands/completed.d.ts.map +1 -0
  32. package/dist/commands/completed.js +107 -0
  33. package/dist/commands/completed.js.map +1 -0
  34. package/dist/commands/completion.d.ts +3 -0
  35. package/dist/commands/completion.d.ts.map +1 -0
  36. package/dist/commands/completion.js +107 -0
  37. package/dist/commands/completion.js.map +1 -0
  38. package/dist/commands/filter.d.ts +5 -0
  39. package/dist/commands/filter.d.ts.map +1 -0
  40. package/dist/commands/filter.js +287 -0
  41. package/dist/commands/filter.js.map +1 -0
  42. package/dist/commands/inbox.d.ts +3 -0
  43. package/dist/commands/inbox.d.ts.map +1 -0
  44. package/dist/commands/inbox.js +25 -0
  45. package/dist/commands/inbox.js.map +1 -0
  46. package/dist/commands/label.d.ts +5 -0
  47. package/dist/commands/label.d.ts.map +1 -0
  48. package/dist/commands/label.js +328 -0
  49. package/dist/commands/label.js.map +1 -0
  50. package/dist/commands/notification.d.ts +3 -0
  51. package/dist/commands/notification.d.ts.map +1 -0
  52. package/dist/commands/notification.js +274 -0
  53. package/dist/commands/notification.js.map +1 -0
  54. package/dist/commands/project.d.ts +7 -0
  55. package/dist/commands/project.d.ts.map +1 -0
  56. package/dist/commands/project.js +714 -0
  57. package/dist/commands/project.js.map +1 -0
  58. package/dist/commands/reminder.d.ts +3 -0
  59. package/dist/commands/reminder.d.ts.map +1 -0
  60. package/dist/commands/reminder.js +271 -0
  61. package/dist/commands/reminder.js.map +1 -0
  62. package/dist/commands/section.d.ts +3 -0
  63. package/dist/commands/section.d.ts.map +1 -0
  64. package/dist/commands/section.js +216 -0
  65. package/dist/commands/section.js.map +1 -0
  66. package/dist/commands/settings.d.ts +12 -0
  67. package/dist/commands/settings.d.ts.map +1 -0
  68. package/dist/commands/settings.js +312 -0
  69. package/dist/commands/settings.js.map +1 -0
  70. package/dist/commands/skill.d.ts +3 -0
  71. package/dist/commands/skill.d.ts.map +1 -0
  72. package/dist/commands/skill.js +127 -0
  73. package/dist/commands/skill.js.map +1 -0
  74. package/dist/commands/stats.d.ts +3 -0
  75. package/dist/commands/stats.d.ts.map +1 -0
  76. package/dist/commands/stats.js +151 -0
  77. package/dist/commands/stats.js.map +1 -0
  78. package/dist/commands/task.d.ts +5 -0
  79. package/dist/commands/task.d.ts.map +1 -0
  80. package/dist/commands/task.js +559 -0
  81. package/dist/commands/task.js.map +1 -0
  82. package/dist/commands/today.d.ts +18 -0
  83. package/dist/commands/today.d.ts.map +1 -0
  84. package/dist/commands/today.js +108 -0
  85. package/dist/commands/today.js.map +1 -0
  86. package/dist/commands/upcoming.d.ts +17 -0
  87. package/dist/commands/upcoming.d.ts.map +1 -0
  88. package/dist/commands/upcoming.js +129 -0
  89. package/dist/commands/upcoming.js.map +1 -0
  90. package/dist/commands/update.d.ts +6 -0
  91. package/dist/commands/update.d.ts.map +1 -0
  92. package/dist/commands/update.js +90 -0
  93. package/dist/commands/update.js.map +1 -0
  94. package/dist/commands/view.d.ts +3 -0
  95. package/dist/commands/view.d.ts.map +1 -0
  96. package/dist/commands/view.js +79 -0
  97. package/dist/commands/view.js.map +1 -0
  98. package/dist/commands/workspace.d.ts +3 -0
  99. package/dist/commands/workspace.d.ts.map +1 -0
  100. package/dist/commands/workspace.js +309 -0
  101. package/dist/commands/workspace.js.map +1 -0
  102. package/dist/index.d.ts +3 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +176 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/lib/api/core.d.ts +13 -0
  107. package/dist/lib/api/core.d.ts.map +1 -0
  108. package/dist/lib/api/core.js +176 -0
  109. package/dist/lib/api/core.js.map +1 -0
  110. package/dist/lib/api/filters.d.ts +19 -0
  111. package/dist/lib/api/filters.d.ts.map +1 -0
  112. package/dist/lib/api/filters.js +60 -0
  113. package/dist/lib/api/filters.js.map +1 -0
  114. package/dist/lib/api/notifications.d.ts +33 -0
  115. package/dist/lib/api/notifications.d.ts.map +1 -0
  116. package/dist/lib/api/notifications.js +94 -0
  117. package/dist/lib/api/notifications.js.map +1 -0
  118. package/dist/lib/api/reminders.d.ts +30 -0
  119. package/dist/lib/api/reminders.d.ts.map +1 -0
  120. package/dist/lib/api/reminders.js +65 -0
  121. package/dist/lib/api/reminders.js.map +1 -0
  122. package/dist/lib/api/stats.d.ts +41 -0
  123. package/dist/lib/api/stats.d.ts.map +1 -0
  124. package/dist/lib/api/stats.js +74 -0
  125. package/dist/lib/api/stats.js.map +1 -0
  126. package/dist/lib/api/uploads.d.ts +10 -0
  127. package/dist/lib/api/uploads.d.ts.map +1 -0
  128. package/dist/lib/api/uploads.js +31 -0
  129. package/dist/lib/api/uploads.js.map +1 -0
  130. package/dist/lib/api/user-settings.d.ts +34 -0
  131. package/dist/lib/api/user-settings.d.ts.map +1 -0
  132. package/dist/lib/api/user-settings.js +58 -0
  133. package/dist/lib/api/user-settings.js.map +1 -0
  134. package/dist/lib/api/workspaces.d.ts +23 -0
  135. package/dist/lib/api/workspaces.d.ts.map +1 -0
  136. package/dist/lib/api/workspaces.js +61 -0
  137. package/dist/lib/api/workspaces.js.map +1 -0
  138. package/dist/lib/auth.d.ts +14 -0
  139. package/dist/lib/auth.d.ts.map +1 -0
  140. package/dist/lib/auth.js +182 -0
  141. package/dist/lib/auth.js.map +1 -0
  142. package/dist/lib/browser.d.ts +2 -0
  143. package/dist/lib/browser.d.ts.map +1 -0
  144. package/dist/lib/browser.js +6 -0
  145. package/dist/lib/browser.js.map +1 -0
  146. package/dist/lib/collaborators.d.ts +29 -0
  147. package/dist/lib/collaborators.d.ts.map +1 -0
  148. package/dist/lib/collaborators.js +184 -0
  149. package/dist/lib/collaborators.js.map +1 -0
  150. package/dist/lib/completion.d.ts +41 -0
  151. package/dist/lib/completion.d.ts.map +1 -0
  152. package/dist/lib/completion.js +191 -0
  153. package/dist/lib/completion.js.map +1 -0
  154. package/dist/lib/dates.d.ts +16 -0
  155. package/dist/lib/dates.d.ts.map +1 -0
  156. package/dist/lib/dates.js +45 -0
  157. package/dist/lib/dates.js.map +1 -0
  158. package/dist/lib/duration.d.ts +14 -0
  159. package/dist/lib/duration.d.ts.map +1 -0
  160. package/dist/lib/duration.js +58 -0
  161. package/dist/lib/duration.js.map +1 -0
  162. package/dist/lib/logger.d.ts +42 -0
  163. package/dist/lib/logger.d.ts.map +1 -0
  164. package/dist/lib/logger.js +227 -0
  165. package/dist/lib/logger.js.map +1 -0
  166. package/dist/lib/markdown.d.ts +3 -0
  167. package/dist/lib/markdown.d.ts.map +1 -0
  168. package/dist/lib/markdown.js +22 -0
  169. package/dist/lib/markdown.js.map +1 -0
  170. package/dist/lib/oauth-server.d.ts +6 -0
  171. package/dist/lib/oauth-server.d.ts.map +1 -0
  172. package/dist/lib/oauth-server.js +773 -0
  173. package/dist/lib/oauth-server.js.map +1 -0
  174. package/dist/lib/oauth.d.ts +3 -0
  175. package/dist/lib/oauth.d.ts.map +1 -0
  176. package/dist/lib/oauth.js +38 -0
  177. package/dist/lib/oauth.js.map +1 -0
  178. package/dist/lib/options.d.ts +16 -0
  179. package/dist/lib/options.d.ts.map +1 -0
  180. package/dist/lib/options.js +2 -0
  181. package/dist/lib/options.js.map +1 -0
  182. package/dist/lib/output.d.ts +39 -0
  183. package/dist/lib/output.d.ts.map +1 -0
  184. package/dist/lib/output.js +311 -0
  185. package/dist/lib/output.js.map +1 -0
  186. package/dist/lib/pagination.d.ts +23 -0
  187. package/dist/lib/pagination.d.ts.map +1 -0
  188. package/dist/lib/pagination.js +26 -0
  189. package/dist/lib/pagination.js.map +1 -0
  190. package/dist/lib/pkce.d.ts +4 -0
  191. package/dist/lib/pkce.d.ts.map +1 -0
  192. package/dist/lib/pkce.js +19 -0
  193. package/dist/lib/pkce.js.map +1 -0
  194. package/dist/lib/progress.d.ts +29 -0
  195. package/dist/lib/progress.d.ts.map +1 -0
  196. package/dist/lib/progress.js +101 -0
  197. package/dist/lib/progress.js.map +1 -0
  198. package/dist/lib/refs.d.ts +52 -0
  199. package/dist/lib/refs.d.ts.map +1 -0
  200. package/dist/lib/refs.js +225 -0
  201. package/dist/lib/refs.js.map +1 -0
  202. package/dist/lib/secure-store.d.ts +11 -0
  203. package/dist/lib/secure-store.d.ts.map +1 -0
  204. package/dist/lib/secure-store.js +57 -0
  205. package/dist/lib/secure-store.js.map +1 -0
  206. package/dist/lib/skills/content.d.ts +4 -0
  207. package/dist/lib/skills/content.d.ts.map +1 -0
  208. package/dist/lib/skills/content.js +429 -0
  209. package/dist/lib/skills/content.js.map +1 -0
  210. package/dist/lib/skills/create-installer.d.ts +10 -0
  211. package/dist/lib/skills/create-installer.d.ts.map +1 -0
  212. package/dist/lib/skills/create-installer.js +77 -0
  213. package/dist/lib/skills/create-installer.js.map +1 -0
  214. package/dist/lib/skills/index.d.ts +6 -0
  215. package/dist/lib/skills/index.d.ts.map +1 -0
  216. package/dist/lib/skills/index.js +40 -0
  217. package/dist/lib/skills/index.js.map +1 -0
  218. package/dist/lib/skills/types.d.ts +11 -0
  219. package/dist/lib/skills/types.d.ts.map +1 -0
  220. package/dist/lib/skills/types.js +2 -0
  221. package/dist/lib/skills/types.js.map +1 -0
  222. package/dist/lib/skills/update-installed.d.ts +7 -0
  223. package/dist/lib/skills/update-installed.d.ts.map +1 -0
  224. package/dist/lib/skills/update-installed.js +23 -0
  225. package/dist/lib/skills/update-installed.js.map +1 -0
  226. package/dist/lib/spinner.d.ts +23 -0
  227. package/dist/lib/spinner.d.ts.map +1 -0
  228. package/dist/lib/spinner.js +138 -0
  229. package/dist/lib/spinner.js.map +1 -0
  230. package/dist/lib/stdin.d.ts +2 -0
  231. package/dist/lib/stdin.d.ts.map +1 -0
  232. package/dist/lib/stdin.js +12 -0
  233. package/dist/lib/stdin.js.map +1 -0
  234. package/dist/lib/task-list.d.ts +31 -0
  235. package/dist/lib/task-list.d.ts.map +1 -0
  236. package/dist/lib/task-list.js +271 -0
  237. package/dist/lib/task-list.js.map +1 -0
  238. package/dist/lib/urls.d.ts +8 -0
  239. package/dist/lib/urls.d.ts.map +1 -0
  240. package/dist/lib/urls.js +26 -0
  241. package/dist/lib/urls.js.map +1 -0
  242. package/dist/postinstall.d.ts +2 -0
  243. package/dist/postinstall.d.ts.map +1 -0
  244. package/dist/postinstall.js +3 -0
  245. package/dist/postinstall.js.map +1 -0
  246. package/package.json +3 -2
@@ -0,0 +1,176 @@
1
+ import { createCommand, TodoistApi, } from '@doist/todoist-api-typescript';
2
+ import { getApiToken } from '../auth.js';
3
+ import { getProgressTracker } from '../progress.js';
4
+ import { withSpinner } from '../spinner.js';
5
+ let apiClient = null;
6
+ // Mapping of API method names to user-friendly spinner messages
7
+ const API_SPINNER_MESSAGES = {
8
+ getUser: { text: 'Checking authentication...', color: 'blue' },
9
+ getTasks: { text: 'Loading tasks...', color: 'blue' },
10
+ getProjects: { text: 'Loading projects...', color: 'blue' },
11
+ getLabels: { text: 'Loading labels...', color: 'blue' },
12
+ getSharedLabels: { text: 'Loading shared labels...', color: 'blue' },
13
+ getSections: { text: 'Loading sections...', color: 'blue' },
14
+ getComments: { text: 'Loading comments...', color: 'blue' },
15
+ addTask: { text: 'Creating task...', color: 'green' },
16
+ updateTask: { text: 'Updating task...', color: 'yellow' },
17
+ closeTask: { text: 'Completing task...', color: 'green' },
18
+ reopenTask: { text: 'Reopening task...', color: 'yellow' },
19
+ deleteTask: { text: 'Deleting task...', color: 'yellow' },
20
+ addProject: { text: 'Creating project...', color: 'green' },
21
+ updateProject: { text: 'Updating project...', color: 'yellow' },
22
+ deleteProject: { text: 'Deleting project...', color: 'yellow' },
23
+ addLabel: { text: 'Creating label...', color: 'green' },
24
+ updateLabel: { text: 'Updating label...', color: 'yellow' },
25
+ deleteLabel: { text: 'Deleting label...', color: 'yellow' },
26
+ addSection: { text: 'Creating section...', color: 'green' },
27
+ updateSection: { text: 'Updating section...', color: 'yellow' },
28
+ deleteSection: { text: 'Deleting section...', color: 'yellow' },
29
+ quickAddTask: { text: 'Adding task...', color: 'green' },
30
+ getTasksByFilter: { text: 'Loading tasks...', color: 'blue' },
31
+ moveProjectToWorkspace: { text: 'Moving project to workspace...', color: 'yellow' },
32
+ moveProjectToPersonal: { text: 'Moving project to personal...', color: 'yellow' },
33
+ getArchivedProjectsCount: { text: 'Counting archived projects...', color: 'blue' },
34
+ getProjectPermissions: { text: 'Loading permissions...', color: 'blue' },
35
+ getFullProject: { text: 'Loading project...', color: 'blue' },
36
+ joinProject: { text: 'Joining project...', color: 'green' },
37
+ archiveSection: { text: 'Archiving section...', color: 'yellow' },
38
+ unarchiveSection: { text: 'Unarchiving section...', color: 'yellow' },
39
+ sync: { text: 'Syncing...', color: 'blue' },
40
+ viewAttachment: { text: 'Fetching attachment...', color: 'blue' },
41
+ };
42
+ function createSpinnerWrappedApi(api) {
43
+ return new Proxy(api, {
44
+ get(target, property, receiver) {
45
+ const originalMethod = Reflect.get(target, property, receiver);
46
+ // Only wrap methods (functions) and only if they're likely async API calls
47
+ if (typeof originalMethod === 'function' && typeof property === 'string') {
48
+ const spinnerConfig = API_SPINNER_MESSAGES[property];
49
+ if (spinnerConfig) {
50
+ return (...args) => {
51
+ const progressTracker = getProgressTracker();
52
+ // Extract cursor from args for paginated methods
53
+ let cursor = null;
54
+ if (args.length > 0 && typeof args[0] === 'object' && args[0] !== null) {
55
+ const options = args[0];
56
+ if ('cursor' in options && typeof options.cursor === 'string') {
57
+ cursor = options.cursor;
58
+ }
59
+ }
60
+ // Emit progress event for API call start
61
+ if (progressTracker.isEnabled()) {
62
+ progressTracker.emitApiCall(property, cursor);
63
+ }
64
+ const result = originalMethod.apply(target, args);
65
+ // If the method returns a Promise, wrap it with spinner and progress tracking
66
+ if (result && typeof result.then === 'function') {
67
+ const wrappedPromise = result
68
+ .then((response) => {
69
+ // Emit progress event for successful response
70
+ if (progressTracker.isEnabled()) {
71
+ analyzeAndEmitApiResponse(progressTracker, response);
72
+ }
73
+ return response;
74
+ })
75
+ .catch((error) => {
76
+ // Emit progress event for error
77
+ if (progressTracker.isEnabled()) {
78
+ progressTracker.emitError(error.name || 'API_ERROR', error.message);
79
+ }
80
+ throw error;
81
+ });
82
+ return withSpinner(spinnerConfig, () => wrappedPromise);
83
+ }
84
+ return result;
85
+ };
86
+ }
87
+ }
88
+ return originalMethod;
89
+ },
90
+ });
91
+ }
92
+ function analyzeAndEmitApiResponse(progressTracker, response) {
93
+ // For paginated responses, extract metadata
94
+ if (response && typeof response === 'object' && response !== null) {
95
+ const resp = response;
96
+ // Check if it's a paginated response with results array
97
+ if ('results' in resp && Array.isArray(resp.results)) {
98
+ progressTracker.emitApiResponse(resp.results.length, Boolean(resp.nextCursor), typeof resp.nextCursor === 'string' ? resp.nextCursor : null);
99
+ return;
100
+ }
101
+ // For array responses (legacy or simple lists)
102
+ if (Array.isArray(response)) {
103
+ progressTracker.emitApiResponse(response.length, false, null);
104
+ return;
105
+ }
106
+ }
107
+ // For other responses, emit minimal info
108
+ progressTracker.emitApiResponse(1, false, null);
109
+ }
110
+ export async function getApi() {
111
+ if (!apiClient) {
112
+ const token = await getApiToken();
113
+ const rawApi = new TodoistApi(token);
114
+ apiClient = createSpinnerWrappedApi(rawApi);
115
+ }
116
+ return apiClient;
117
+ }
118
+ export function isWorkspaceProject(project) {
119
+ return 'workspaceId' in project && project.workspaceId !== undefined;
120
+ }
121
+ export function isPersonalProject(project) {
122
+ return !isWorkspaceProject(project);
123
+ }
124
+ let currentUserIdCache = null;
125
+ export async function getCurrentUserId() {
126
+ if (currentUserIdCache)
127
+ return currentUserIdCache;
128
+ const api = await getApi();
129
+ const user = await api.getUser();
130
+ currentUserIdCache = user.id;
131
+ return currentUserIdCache;
132
+ }
133
+ export function clearCurrentUserCache() {
134
+ currentUserIdCache = null;
135
+ }
136
+ export async function completeTaskForever(taskId) {
137
+ const api = await getApi();
138
+ await api.sync({
139
+ commands: [
140
+ createCommand('item_complete', {
141
+ id: taskId,
142
+ completedAt: new Date().toISOString(),
143
+ }),
144
+ ],
145
+ });
146
+ }
147
+ export function buildRescheduleDate(inputDate, existingDue) {
148
+ const isInputDateOnly = !inputDate.includes('T');
149
+ if (isInputDateOnly && existingDue.datetime) {
150
+ const timePart = existingDue.datetime.substring(10);
151
+ return inputDate + timePart;
152
+ }
153
+ return inputDate;
154
+ }
155
+ export async function rescheduleTask(taskId, newDate, existingDue) {
156
+ const api = await getApi();
157
+ const finalDate = buildRescheduleDate(newDate, existingDue);
158
+ await api.sync({
159
+ commands: [
160
+ createCommand('item_update', {
161
+ id: taskId,
162
+ due: {
163
+ date: finalDate,
164
+ string: existingDue.isRecurring ? existingDue.string : finalDate,
165
+ isRecurring: existingDue.isRecurring,
166
+ timezone: existingDue.timezone ?? undefined,
167
+ lang: existingDue.lang ?? undefined,
168
+ },
169
+ }),
170
+ ],
171
+ });
172
+ }
173
+ export function pickDefined(obj) {
174
+ return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined));
175
+ }
176
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/lib/api/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type ColorKey, type Filter as SdkFilter } from '@doist/todoist-api-typescript';
2
+ export type Filter = SdkFilter;
3
+ export interface AddFilterArgs {
4
+ name: string;
5
+ query: string;
6
+ color?: ColorKey;
7
+ isFavorite?: boolean;
8
+ }
9
+ export declare function fetchFilters(): Promise<Filter[]>;
10
+ export declare function addFilter(args: AddFilterArgs): Promise<Filter>;
11
+ export interface UpdateFilterArgs {
12
+ name?: string;
13
+ query?: string;
14
+ color?: ColorKey;
15
+ isFavorite?: boolean;
16
+ }
17
+ export declare function updateFilter(id: string, args: UpdateFilterArgs): Promise<void>;
18
+ export declare function deleteFilter(id: string): Promise<void>;
19
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/lib/api/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,QAAQ,EACb,KAAK,MAAM,IAAI,SAAS,EAC3B,MAAM,+BAA+B,CAAA;AAGtC,MAAM,MAAM,MAAM,GAAG,SAAS,CAAA;AAE9B,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAOtD;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BpE;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAepF;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D"}
@@ -0,0 +1,60 @@
1
+ import { createCommand, } from '@doist/todoist-api-typescript';
2
+ import { getApi, pickDefined } from './core.js';
3
+ export async function fetchFilters() {
4
+ const api = await getApi();
5
+ const response = await api.sync({
6
+ resourceTypes: ['filters'],
7
+ syncToken: '*',
8
+ });
9
+ return (response.filters ?? []).filter((f) => !f.isDeleted);
10
+ }
11
+ export async function addFilter(args) {
12
+ const api = await getApi();
13
+ const tempId = crypto.randomUUID();
14
+ const response = await api.sync({
15
+ commands: [
16
+ createCommand('filter_add', {
17
+ name: args.name,
18
+ query: args.query,
19
+ ...pickDefined({
20
+ color: args.color,
21
+ isFavorite: args.isFavorite,
22
+ }),
23
+ }, tempId),
24
+ ],
25
+ });
26
+ const id = response.tempIdMapping?.[tempId] ?? tempId;
27
+ return {
28
+ id,
29
+ name: args.name,
30
+ query: args.query,
31
+ color: args.color ?? 'charcoal',
32
+ isFavorite: args.isFavorite ?? false,
33
+ isDeleted: false,
34
+ isFrozen: false,
35
+ itemOrder: 0,
36
+ };
37
+ }
38
+ export async function updateFilter(id, args) {
39
+ const api = await getApi();
40
+ await api.sync({
41
+ commands: [
42
+ createCommand('filter_update', {
43
+ id,
44
+ ...pickDefined({
45
+ name: args.name,
46
+ query: args.query,
47
+ color: args.color,
48
+ isFavorite: args.isFavorite,
49
+ }),
50
+ }),
51
+ ],
52
+ });
53
+ }
54
+ export async function deleteFilter(id) {
55
+ const api = await getApi();
56
+ await api.sync({
57
+ commands: [createCommand('filter_delete', { id })],
58
+ });
59
+ }
60
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/lib/api/filters.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,GAGhB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAW/C,MAAM,CAAC,KAAK,UAAU,YAAY;IAC9B,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAC1B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;QAC5B,aAAa,EAAE,CAAC,SAAS,CAAC;QAC1B,SAAS,EAAE,GAAG;KACjB,CAAC,CAAA;IACF,OAAO,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IAC/C,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IAClC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;QAC5B,QAAQ,EAAE;YACN,aAAa,CACT,YAAY,EACZ;gBACI,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,GAAG,WAAW,CAAC;oBACX,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;iBAC9B,CAAC;aACL,EACD,MAAM,CACT;SACJ;KACJ,CAAC,CAAA;IAEF,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;IACrD,OAAO;QACH,EAAE;QACF,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,UAAU;QAC/B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,KAAK;QACpC,SAAS,EAAE,KAAK;QAChB,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,CAAC;KACf,CAAA;AACL,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAU,EAAE,IAAsB;IACjE,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAC1B,MAAM,GAAG,CAAC,IAAI,CAAC;QACX,QAAQ,EAAE;YACN,aAAa,CAAC,eAAe,EAAE;gBAC3B,EAAE;gBACF,GAAG,WAAW,CAAC;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;iBAC9B,CAAC;aACL,CAAC;SACL;KACJ,CAAC,CAAA;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAU;IACzC,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;IAC1B,MAAM,GAAG,CAAC,IAAI,CAAC;QACX,QAAQ,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;KACrD,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,33 @@
1
+ export type NotificationType = 'share_invitation_sent' | 'share_invitation_accepted' | 'share_invitation_rejected' | 'user_left_project' | 'user_removed_from_project' | 'item_assigned' | 'item_completed' | 'item_uncompleted' | 'note_added' | 'project_archived' | 'project_unarchived' | 'karma_daily_goal' | 'karma_weekly_goal' | 'biz_trial_will_end' | 'biz_payment_failed' | 'biz_account_disabled' | string;
2
+ export interface NotificationUser {
3
+ id: string;
4
+ name: string;
5
+ email: string;
6
+ }
7
+ export interface NotificationProject {
8
+ id: string;
9
+ name: string;
10
+ }
11
+ export interface NotificationTask {
12
+ id: string;
13
+ content: string;
14
+ }
15
+ export interface Notification {
16
+ id: string;
17
+ type: NotificationType;
18
+ isUnread: boolean;
19
+ isDeleted: boolean;
20
+ createdAt: string;
21
+ fromUser?: NotificationUser;
22
+ project?: NotificationProject;
23
+ task?: NotificationTask;
24
+ invitationId?: string;
25
+ invitationSecret?: string;
26
+ }
27
+ export declare function fetchNotifications(): Promise<Notification[]>;
28
+ export declare function markNotificationRead(id: string): Promise<void>;
29
+ export declare function markNotificationUnread(id: string): Promise<void>;
30
+ export declare function markAllNotificationsRead(): Promise<void>;
31
+ export declare function acceptInvitation(invitationId: string, secret: string): Promise<void>;
32
+ export declare function rejectInvitation(invitationId: string, secret: string): Promise<void>;
33
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../src/lib/api/notifications.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,gBAAgB,GACtB,uBAAuB,GACvB,2BAA2B,GAC3B,2BAA2B,GAC3B,mBAAmB,GACnB,2BAA2B,GAC3B,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,YAAY,GACZ,kBAAkB,GAClB,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,GACpB,sBAAsB,GACtB,MAAM,CAAA;AAEZ,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,gBAAgB,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAA;IAC3B,OAAO,CAAC,EAAE,mBAAmB,CAAA;IAC7B,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AA8CD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBlE;AAED,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE;AAED,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtE;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK9D;AAED,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1F;AAED,wBAAsB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1F"}
@@ -0,0 +1,94 @@
1
+ import { createCommand } from '@doist/todoist-api-typescript';
2
+ import { getApi } from './core.js';
3
+ function parseNotification(n) {
4
+ // The SDK type uses passthrough() so extra fields are preserved
5
+ const raw = n;
6
+ let fromUser;
7
+ if (n.fromUid) {
8
+ const fromUserData = raw.from_user;
9
+ fromUser = {
10
+ id: String(n.fromUid),
11
+ name: String(fromUserData?.full_name ?? fromUserData?.name ?? ''),
12
+ email: String(fromUserData?.email ?? ''),
13
+ };
14
+ }
15
+ let project;
16
+ if (n.projectId) {
17
+ project = {
18
+ id: String(n.projectId),
19
+ name: String(raw.project_name ?? ''),
20
+ };
21
+ }
22
+ let task;
23
+ if (n.itemId) {
24
+ task = {
25
+ id: String(n.itemId),
26
+ content: String(n.itemContent ?? ''),
27
+ };
28
+ }
29
+ return {
30
+ id: String(n.id),
31
+ type: n.notificationType,
32
+ isUnread: n.isUnread,
33
+ isDeleted: Boolean(raw.is_deleted ?? false),
34
+ createdAt: n.createdAt,
35
+ fromUser,
36
+ project,
37
+ task,
38
+ invitationId: n.invitationId ? String(n.invitationId) : undefined,
39
+ invitationSecret: raw.invitation_secret ? String(raw.invitation_secret) : undefined,
40
+ };
41
+ }
42
+ export async function fetchNotifications() {
43
+ const api = await getApi();
44
+ const response = await api.sync({
45
+ resourceTypes: ['live_notifications'],
46
+ syncToken: '*',
47
+ });
48
+ const notifications = (response.liveNotifications ?? [])
49
+ .map(parseNotification)
50
+ .filter((n) => !n.isDeleted);
51
+ notifications.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
52
+ return notifications;
53
+ }
54
+ export async function markNotificationRead(id) {
55
+ const api = await getApi();
56
+ await api.sync({
57
+ commands: [createCommand('live_notifications_mark_read', { ids: [id] })],
58
+ });
59
+ }
60
+ export async function markNotificationUnread(id) {
61
+ const api = await getApi();
62
+ await api.sync({
63
+ commands: [createCommand('live_notifications_mark_unread', { ids: [id] })],
64
+ });
65
+ }
66
+ export async function markAllNotificationsRead() {
67
+ const api = await getApi();
68
+ await api.sync({
69
+ commands: [createCommand('live_notifications_mark_read_all', {})],
70
+ });
71
+ }
72
+ export async function acceptInvitation(invitationId, secret) {
73
+ const api = await getApi();
74
+ await api.sync({
75
+ commands: [
76
+ createCommand('accept_invitation', {
77
+ invitationId,
78
+ invitationSecret: secret,
79
+ }),
80
+ ],
81
+ });
82
+ }
83
+ export async function rejectInvitation(invitationId, secret) {
84
+ const api = await getApi();
85
+ await api.sync({
86
+ commands: [
87
+ createCommand('reject_invitation', {
88
+ invitationId,
89
+ invitationSecret: secret,
90
+ }),
91
+ ],
92
+ });
93
+ }
94
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../src/lib/api/notifications.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface ReminderDue {
2
+ date: string;
3
+ timezone?: string;
4
+ isRecurring?: boolean;
5
+ string?: string;
6
+ lang?: string;
7
+ }
8
+ export interface Reminder {
9
+ id: string;
10
+ itemId: string;
11
+ type: 'absolute' | 'relative' | 'location';
12
+ due?: ReminderDue;
13
+ minuteOffset?: number;
14
+ isDeleted: boolean;
15
+ }
16
+ export declare function fetchReminders(): Promise<Reminder[]>;
17
+ export declare function getTaskReminders(taskId: string): Promise<Reminder[]>;
18
+ export interface AddReminderArgs {
19
+ itemId: string;
20
+ minuteOffset?: number;
21
+ due?: ReminderDue;
22
+ }
23
+ export declare function addReminder(args: AddReminderArgs): Promise<string>;
24
+ export interface UpdateReminderArgs {
25
+ minuteOffset?: number;
26
+ due?: ReminderDue;
27
+ }
28
+ export declare function updateReminder(id: string, args: UpdateReminderArgs): Promise<void>;
29
+ export declare function deleteReminder(id: string): Promise<void>;
30
+ //# sourceMappingURL=reminders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminders.d.ts","sourceRoot":"","sources":["../../../src/lib/api/reminders.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAA;IAC1C,GAAG,CAAC,EAAE,WAAW,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,OAAO,CAAA;CACrB;AAcD,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAO1D;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAG1E;AAED,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,WAAW,CAAA;CACpB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBxE;AAED,MAAM,WAAW,kBAAkB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,WAAW,CAAA;CACpB;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAexF;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9D"}
@@ -0,0 +1,65 @@
1
+ import { createCommand } from '@doist/todoist-api-typescript';
2
+ import { getApi, pickDefined } from './core.js';
3
+ function toReminder(r) {
4
+ return {
5
+ id: r.id,
6
+ itemId: r.itemId,
7
+ type: r.type,
8
+ due: 'due' in r && r.due ? r.due : undefined,
9
+ minuteOffset: 'minuteOffset' in r ? r.minuteOffset : undefined,
10
+ isDeleted: r.isDeleted,
11
+ };
12
+ }
13
+ export async function fetchReminders() {
14
+ const api = await getApi();
15
+ const response = await api.sync({
16
+ resourceTypes: ['reminders'],
17
+ syncToken: '*',
18
+ });
19
+ return (response.reminders ?? []).map(toReminder).filter((r) => !r.isDeleted);
20
+ }
21
+ export async function getTaskReminders(taskId) {
22
+ const reminders = await fetchReminders();
23
+ return reminders.filter((r) => r.itemId === taskId);
24
+ }
25
+ export async function addReminder(args) {
26
+ const api = await getApi();
27
+ const tempId = crypto.randomUUID();
28
+ const type = args.minuteOffset !== undefined ? 'relative' : 'absolute';
29
+ const response = await api.sync({
30
+ commands: [
31
+ createCommand('reminder_add', {
32
+ type,
33
+ itemId: args.itemId,
34
+ ...pickDefined({
35
+ minuteOffset: args.minuteOffset,
36
+ due: args.due,
37
+ }),
38
+ }, tempId),
39
+ ],
40
+ });
41
+ return response.tempIdMapping?.[tempId] ?? tempId;
42
+ }
43
+ export async function updateReminder(id, args) {
44
+ const api = await getApi();
45
+ const type = args.minuteOffset !== undefined ? 'relative' : 'absolute';
46
+ await api.sync({
47
+ commands: [
48
+ createCommand('reminder_update', {
49
+ id,
50
+ type,
51
+ ...pickDefined({
52
+ minuteOffset: args.minuteOffset,
53
+ due: args.due,
54
+ }),
55
+ }),
56
+ ],
57
+ });
58
+ }
59
+ export async function deleteReminder(id) {
60
+ const api = await getApi();
61
+ await api.sync({
62
+ commands: [createCommand('reminder_delete', { id })],
63
+ });
64
+ }
65
+ //# sourceMappingURL=reminders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reminders.js","sourceRoot":"","sources":["../../../src/lib/api/reminders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface Streak {
2
+ count: number;
3
+ start: string;
4
+ end: string;
5
+ }
6
+ export interface ProductivityStats {
7
+ karma: number;
8
+ karmaTrend: string;
9
+ karmaLastUpdate: number;
10
+ completedCount: number;
11
+ daysItems: Array<{
12
+ date: string;
13
+ totalCompleted: number;
14
+ }>;
15
+ weekItems: Array<{
16
+ from: string;
17
+ to: string;
18
+ totalCompleted: number;
19
+ }>;
20
+ goals: {
21
+ dailyGoal: number;
22
+ weeklyGoal: number;
23
+ currentDailyStreak: Streak;
24
+ currentWeeklyStreak: Streak;
25
+ maxDailyStreak: Streak;
26
+ maxWeeklyStreak: Streak;
27
+ vacationMode: boolean;
28
+ karmaDisabled: boolean;
29
+ ignoreDays: number[];
30
+ };
31
+ }
32
+ export declare function fetchProductivityStats(): Promise<ProductivityStats>;
33
+ export interface UpdateGoalsArgs {
34
+ dailyGoal?: number;
35
+ weeklyGoal?: number;
36
+ vacationMode?: boolean;
37
+ karmaDisabled?: boolean;
38
+ ignoreDays?: number[];
39
+ }
40
+ export declare function updateGoals(args: UpdateGoalsArgs): Promise<void>;
41
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../../src/lib/api/stats.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1D,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACtE,KAAK,EAAE;QACH,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,mBAAmB,EAAE,MAAM,CAAA;QAC3B,cAAc,EAAE,MAAM,CAAA;QACtB,eAAe,EAAE,MAAM,CAAA;QACvB,YAAY,EAAE,OAAO,CAAA;QACrB,aAAa,EAAE,OAAO,CAAA;QACtB,UAAU,EAAE,MAAM,EAAE,CAAA;KACvB,CAAA;CACJ;AAcD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CA+CzE;AAED,MAAM,WAAW,eAAe;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBtE"}
@@ -0,0 +1,74 @@
1
+ import { createCommand } from '@doist/todoist-api-typescript';
2
+ import { getApiToken } from '../auth.js';
3
+ import { getApi, pickDefined } from './core.js';
4
+ const defaultStreak = { count: 0, start: '', end: '' };
5
+ function parseStreak(s) {
6
+ if (!s || typeof s !== 'object')
7
+ return defaultStreak;
8
+ const obj = s;
9
+ return {
10
+ count: Number(obj.count ?? 0),
11
+ start: String(obj.start ?? ''),
12
+ end: String(obj.end ?? ''),
13
+ };
14
+ }
15
+ export async function fetchProductivityStats() {
16
+ const token = await getApiToken();
17
+ const response = await fetch('https://api.todoist.com/api/v1/tasks/completed/stats', {
18
+ method: 'GET',
19
+ headers: {
20
+ Authorization: `Bearer ${token}`,
21
+ },
22
+ });
23
+ if (!response.ok) {
24
+ throw new Error(`Failed to fetch productivity stats: ${response.status}`);
25
+ }
26
+ const data = await response.json();
27
+ if (data.error) {
28
+ throw new Error(`Productivity stats API error: ${data.error}`);
29
+ }
30
+ const goals = data.goals ?? {};
31
+ return {
32
+ karma: Number(data.karma ?? 0),
33
+ karmaTrend: String(data.karma_trend ?? 'none'),
34
+ karmaLastUpdate: Number(data.karma_last_update ?? 0),
35
+ completedCount: Number(data.completed_count ?? 0),
36
+ daysItems: (data.days_items ?? []).map((d) => ({
37
+ date: d.date,
38
+ totalCompleted: d.total_completed,
39
+ })),
40
+ weekItems: (data.week_items ?? []).map((w) => ({
41
+ from: w.from,
42
+ to: w.to,
43
+ totalCompleted: w.total_completed,
44
+ })),
45
+ goals: {
46
+ dailyGoal: Number(goals.daily_goal ?? 0),
47
+ weeklyGoal: Number(goals.weekly_goal ?? 0),
48
+ currentDailyStreak: parseStreak(goals.current_daily_streak),
49
+ currentWeeklyStreak: parseStreak(goals.current_weekly_streak),
50
+ maxDailyStreak: parseStreak(goals.max_daily_streak),
51
+ maxWeeklyStreak: parseStreak(goals.max_weekly_streak),
52
+ vacationMode: Boolean(goals.vacation_mode),
53
+ karmaDisabled: Boolean(goals.karma_disabled),
54
+ ignoreDays: (goals.ignore_days ?? []),
55
+ },
56
+ };
57
+ }
58
+ export async function updateGoals(args) {
59
+ const goalsArgs = pickDefined({
60
+ dailyGoal: args.dailyGoal,
61
+ weeklyGoal: args.weeklyGoal,
62
+ vacationMode: args.vacationMode,
63
+ karmaDisabled: args.karmaDisabled,
64
+ ignoreDays: args.ignoreDays,
65
+ });
66
+ if (Object.keys(goalsArgs).length === 0) {
67
+ throw new Error('No goals to update');
68
+ }
69
+ const api = await getApi();
70
+ await api.sync({
71
+ commands: [createCommand('update_goals', goalsArgs)],
72
+ });
73
+ }
74
+ //# sourceMappingURL=stats.js.map