crewly 1.20.105 → 1.20.106
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/config/skills/agent/core/todo-add/SKILL.md +64 -0
- package/config/skills/agent/core/todo-add/execute.sh +84 -0
- package/config/skills/agent/core/todo-add/execute.test.sh +76 -0
- package/config/skills/agent/core/todo-lists/SKILL.md +58 -0
- package/config/skills/agent/core/todo-lists/execute.sh +70 -0
- package/config/skills/agent/core/todo-lists/execute.test.sh +77 -0
- package/config/skills/agent/core/todo-tasks/SKILL.md +59 -0
- package/config/skills/agent/core/todo-tasks/execute.sh +78 -0
- package/config/skills/agent/core/todo-tasks/execute.test.sh +74 -0
- package/config/skills/agent/core/todo-update/SKILL.md +63 -0
- package/config/skills/agent/core/todo-update/execute.sh +115 -0
- package/config/skills/agent/core/todo-update/execute.test.sh +82 -0
- package/dist/backend/backend/src/constants.d.ts +65 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +65 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts +51 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +223 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +42 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -0
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +3 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/connector/connector-access.service.d.ts +2 -2
- package/dist/backend/backend/src/services/connector/connector-access.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/connector-access.service.js +2 -2
- package/dist/backend/backend/src/services/connector/connector-access.service.js.map +1 -1
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts +250 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +367 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +116 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +220 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +65 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +65 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/frontend/dist/assets/{index-1fd45a2a.js → index-488339c1.js} +103 -103
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MicrosoftTodoService — Microsoft To Do over Graph v1.0 on the owner's grant.
|
|
3
|
+
*
|
|
4
|
+
* What agents can do: list task lists (and create one), list the tasks of a
|
|
5
|
+
* list (open ones by default), add a task (note, due date, importance),
|
|
6
|
+
* update a task (complete / reopen, retitle, re-date) and delete one.
|
|
7
|
+
*
|
|
8
|
+
* Lists are named by id or by display name (case-insensitive); no name at
|
|
9
|
+
* all means the owner's default list ("Tasks", `wellknownListName:
|
|
10
|
+
* defaultList`). Every call resolves the name against `GET /me/todo/lists`
|
|
11
|
+
* so the answer can say which list it acted on.
|
|
12
|
+
*
|
|
13
|
+
* Graph failures map to stable codes: 401 refreshes the token once, 429 is
|
|
14
|
+
* waited out once when `Retry-After` is short and otherwise returned as
|
|
15
|
+
* `rate_limited` with the delay, 403 → `forbidden`, 404 → `not_found`.
|
|
16
|
+
*
|
|
17
|
+
* @module services/microsoft/microsoft-todo.service
|
|
18
|
+
*/
|
|
19
|
+
/** Token provider slice. */
|
|
20
|
+
export interface MicrosoftTokenProvider {
|
|
21
|
+
getAccessToken(): Promise<string>;
|
|
22
|
+
clearCache(): void;
|
|
23
|
+
}
|
|
24
|
+
/** Service dependencies. */
|
|
25
|
+
export interface MicrosoftTodoDeps {
|
|
26
|
+
tokens: MicrosoftTokenProvider;
|
|
27
|
+
fetchImpl?: typeof fetch;
|
|
28
|
+
/** Wait before a 429 retry (injectable for tests). */
|
|
29
|
+
sleep?: (ms: number) => Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/** A task list, trimmed. */
|
|
32
|
+
export interface TodoList {
|
|
33
|
+
id: string;
|
|
34
|
+
name: string;
|
|
35
|
+
/** True for the owner's default list ("Tasks"). */
|
|
36
|
+
isDefault?: boolean;
|
|
37
|
+
isShared?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/** A task, trimmed for agents. */
|
|
40
|
+
export interface TodoTask {
|
|
41
|
+
id: string;
|
|
42
|
+
title: string;
|
|
43
|
+
/** `notStarted` | `inProgress` | `completed` | `waitingOnOthers` | `deferred` */
|
|
44
|
+
status: string;
|
|
45
|
+
/** Present when not `normal`. */
|
|
46
|
+
importance?: string;
|
|
47
|
+
/** `YYYY-MM-DD` */
|
|
48
|
+
due?: string;
|
|
49
|
+
/** Note text (plain), truncated. */
|
|
50
|
+
note?: string;
|
|
51
|
+
/** `YYYY-MM-DD`, completed tasks only. */
|
|
52
|
+
completedAt?: string;
|
|
53
|
+
}
|
|
54
|
+
/** `listTasks` input. */
|
|
55
|
+
export interface TodoListTasksInput {
|
|
56
|
+
/** List id or name; empty = default list. */
|
|
57
|
+
list?: string;
|
|
58
|
+
/** Include completed tasks (default: open only). */
|
|
59
|
+
includeCompleted?: boolean;
|
|
60
|
+
limit?: number;
|
|
61
|
+
}
|
|
62
|
+
/** `addTask` input. */
|
|
63
|
+
export interface TodoAddTaskInput {
|
|
64
|
+
list?: string;
|
|
65
|
+
title: string;
|
|
66
|
+
note?: string;
|
|
67
|
+
/** `YYYY-MM-DD` */
|
|
68
|
+
due?: string;
|
|
69
|
+
importance?: string;
|
|
70
|
+
}
|
|
71
|
+
/** `updateTask` input. `due: null` clears the due date. */
|
|
72
|
+
export interface TodoUpdateTaskInput {
|
|
73
|
+
list?: string;
|
|
74
|
+
taskId: string;
|
|
75
|
+
title?: string;
|
|
76
|
+
note?: string;
|
|
77
|
+
due?: string | null;
|
|
78
|
+
importance?: string;
|
|
79
|
+
/** true → completed, false → reopened (notStarted). */
|
|
80
|
+
complete?: boolean;
|
|
81
|
+
}
|
|
82
|
+
/** Reference to the list an operation acted on. */
|
|
83
|
+
export interface TodoListRef {
|
|
84
|
+
id: string;
|
|
85
|
+
name: string;
|
|
86
|
+
}
|
|
87
|
+
interface WireDateTimeTimeZone {
|
|
88
|
+
dateTime?: string;
|
|
89
|
+
timeZone?: string;
|
|
90
|
+
}
|
|
91
|
+
interface WireList {
|
|
92
|
+
id?: string;
|
|
93
|
+
displayName?: string;
|
|
94
|
+
isShared?: boolean;
|
|
95
|
+
isOwner?: boolean;
|
|
96
|
+
wellknownListName?: string;
|
|
97
|
+
}
|
|
98
|
+
interface WireTask {
|
|
99
|
+
id?: string;
|
|
100
|
+
title?: string;
|
|
101
|
+
status?: string;
|
|
102
|
+
importance?: string;
|
|
103
|
+
body?: {
|
|
104
|
+
content?: string;
|
|
105
|
+
contentType?: string;
|
|
106
|
+
};
|
|
107
|
+
dueDateTime?: WireDateTimeTimeZone | null;
|
|
108
|
+
completedDateTime?: WireDateTimeTimeZone | null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Trim a Graph `todoTaskList`.
|
|
112
|
+
*
|
|
113
|
+
* @param l - Wire list
|
|
114
|
+
* @returns Trimmed list
|
|
115
|
+
*/
|
|
116
|
+
export declare function toList(l: WireList): TodoList;
|
|
117
|
+
/**
|
|
118
|
+
* Plain text of a task body (HTML bodies come from Outlook-created tasks).
|
|
119
|
+
*
|
|
120
|
+
* @param body - Wire body
|
|
121
|
+
* @returns Collapsed text, truncated to the preview length, or undefined
|
|
122
|
+
*/
|
|
123
|
+
export declare function noteText(body: WireTask['body']): string | undefined;
|
|
124
|
+
/**
|
|
125
|
+
* Trim a Graph `todoTask`.
|
|
126
|
+
*
|
|
127
|
+
* @param t - Wire task
|
|
128
|
+
* @returns Trimmed task
|
|
129
|
+
*/
|
|
130
|
+
export declare function toTask(t: WireTask): TodoTask;
|
|
131
|
+
/**
|
|
132
|
+
* Validate a `YYYY-MM-DD` date and turn it into Graph's `dueDateTime`.
|
|
133
|
+
*
|
|
134
|
+
* @param value - Date text
|
|
135
|
+
* @returns `{ dateTime, timeZone }`
|
|
136
|
+
* @throws MicrosoftError(400, validation) for a malformed or impossible date
|
|
137
|
+
*/
|
|
138
|
+
export declare function toDueDateTime(value: string): {
|
|
139
|
+
dateTime: string;
|
|
140
|
+
timeZone: string;
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Validate an importance value.
|
|
144
|
+
*
|
|
145
|
+
* @param value - Candidate
|
|
146
|
+
* @returns Lower-cased importance
|
|
147
|
+
* @throws MicrosoftError(400, validation) when unknown
|
|
148
|
+
*/
|
|
149
|
+
export declare function toImportance(value: string): string;
|
|
150
|
+
/**
|
|
151
|
+
* Pick the list a reference names: exact id, then case-insensitive name,
|
|
152
|
+
* then `default` (or nothing) → the default list.
|
|
153
|
+
*
|
|
154
|
+
* @param lists - All lists
|
|
155
|
+
* @param ref - Id or name (may be empty)
|
|
156
|
+
* @returns The list
|
|
157
|
+
* @throws MicrosoftError(404, not_found) when nothing matches; (400, validation) when a name is ambiguous
|
|
158
|
+
*/
|
|
159
|
+
export declare function pickList(lists: TodoList[], ref: string | undefined): TodoList;
|
|
160
|
+
/**
|
|
161
|
+
* Microsoft To Do calls.
|
|
162
|
+
*/
|
|
163
|
+
export declare class MicrosoftTodoService {
|
|
164
|
+
private readonly deps;
|
|
165
|
+
private readonly base;
|
|
166
|
+
/**
|
|
167
|
+
* @param deps - Token provider, fetch, sleep
|
|
168
|
+
*/
|
|
169
|
+
constructor(deps: MicrosoftTodoDeps);
|
|
170
|
+
/**
|
|
171
|
+
* `GET /me/todo/lists` (following `@odata.nextLink`).
|
|
172
|
+
*
|
|
173
|
+
* @returns Every list
|
|
174
|
+
*/
|
|
175
|
+
listLists(): Promise<TodoList[]>;
|
|
176
|
+
/**
|
|
177
|
+
* `POST /me/todo/lists`.
|
|
178
|
+
*
|
|
179
|
+
* @param name - Display name
|
|
180
|
+
* @returns The new list
|
|
181
|
+
* @throws MicrosoftError(400, validation) for an empty name
|
|
182
|
+
*/
|
|
183
|
+
createList(name: string): Promise<TodoList>;
|
|
184
|
+
/**
|
|
185
|
+
* Resolve a list reference (id, name, `default`, or empty).
|
|
186
|
+
*
|
|
187
|
+
* @param ref - Reference
|
|
188
|
+
* @returns The list
|
|
189
|
+
*/
|
|
190
|
+
resolveList(ref: string | undefined): Promise<TodoList>;
|
|
191
|
+
/**
|
|
192
|
+
* `GET /me/todo/lists/{id}/tasks` — open tasks unless `includeCompleted`.
|
|
193
|
+
*
|
|
194
|
+
* @param input - List, completed flag, limit
|
|
195
|
+
* @returns The list, its tasks, and whether more exist
|
|
196
|
+
*/
|
|
197
|
+
listTasks(input?: TodoListTasksInput): Promise<{
|
|
198
|
+
list: TodoListRef;
|
|
199
|
+
tasks: TodoTask[];
|
|
200
|
+
hasMore: boolean;
|
|
201
|
+
}>;
|
|
202
|
+
/**
|
|
203
|
+
* `POST /me/todo/lists/{id}/tasks`.
|
|
204
|
+
*
|
|
205
|
+
* @param input - List, title, note, due, importance
|
|
206
|
+
* @returns The list and the new task
|
|
207
|
+
* @throws MicrosoftError(400, validation) for a missing title / bad due / bad importance
|
|
208
|
+
*/
|
|
209
|
+
addTask(input: TodoAddTaskInput): Promise<{
|
|
210
|
+
list: TodoListRef;
|
|
211
|
+
task: TodoTask;
|
|
212
|
+
}>;
|
|
213
|
+
/**
|
|
214
|
+
* `PATCH /me/todo/lists/{id}/tasks/{taskId}`.
|
|
215
|
+
*
|
|
216
|
+
* @param input - List, task id, and the fields to change
|
|
217
|
+
* @returns The list and the updated task
|
|
218
|
+
* @throws MicrosoftError(400, validation) when nothing is changed or a value is bad
|
|
219
|
+
*/
|
|
220
|
+
updateTask(input: TodoUpdateTaskInput): Promise<{
|
|
221
|
+
list: TodoListRef;
|
|
222
|
+
task: TodoTask;
|
|
223
|
+
}>;
|
|
224
|
+
/**
|
|
225
|
+
* `DELETE /me/todo/lists/{id}/tasks/{taskId}`.
|
|
226
|
+
*
|
|
227
|
+
* @param listRef - List id or name
|
|
228
|
+
* @param taskId - Task id
|
|
229
|
+
* @returns What was deleted
|
|
230
|
+
*/
|
|
231
|
+
deleteTask(listRef: string | undefined, taskId: string): Promise<{
|
|
232
|
+
list: TodoListRef;
|
|
233
|
+
taskId: string;
|
|
234
|
+
deleted: true;
|
|
235
|
+
}>;
|
|
236
|
+
/**
|
|
237
|
+
* Authenticated Graph call.
|
|
238
|
+
*
|
|
239
|
+
* 401 → drop the cached token and retry once; still 401 → `unauthorized`.
|
|
240
|
+
* 429 → wait out a short `Retry-After` once, else `rate_limited`.
|
|
241
|
+
* 400 → `validation`, 403 → `forbidden`, 404 → `not_found`, others → 502.
|
|
242
|
+
*
|
|
243
|
+
* @param url - Absolute URL
|
|
244
|
+
* @param init - Method / JSON body
|
|
245
|
+
* @returns Parsed JSON (`{}` for 204)
|
|
246
|
+
*/
|
|
247
|
+
private request;
|
|
248
|
+
}
|
|
249
|
+
export {};
|
|
250
|
+
//# sourceMappingURL=microsoft-todo.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsoft-todo.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/microsoft/microsoft-todo.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MicrosoftTodoService — Microsoft To Do over Graph v1.0 on the owner's grant.
|
|
3
|
+
*
|
|
4
|
+
* What agents can do: list task lists (and create one), list the tasks of a
|
|
5
|
+
* list (open ones by default), add a task (note, due date, importance),
|
|
6
|
+
* update a task (complete / reopen, retitle, re-date) and delete one.
|
|
7
|
+
*
|
|
8
|
+
* Lists are named by id or by display name (case-insensitive); no name at
|
|
9
|
+
* all means the owner's default list ("Tasks", `wellknownListName:
|
|
10
|
+
* defaultList`). Every call resolves the name against `GET /me/todo/lists`
|
|
11
|
+
* so the answer can say which list it acted on.
|
|
12
|
+
*
|
|
13
|
+
* Graph failures map to stable codes: 401 refreshes the token once, 429 is
|
|
14
|
+
* waited out once when `Retry-After` is short and otherwise returned as
|
|
15
|
+
* `rate_limited` with the delay, 403 → `forbidden`, 404 → `not_found`.
|
|
16
|
+
*
|
|
17
|
+
* @module services/microsoft/microsoft-todo.service
|
|
18
|
+
*/
|
|
19
|
+
import { MICROSOFT_TODO_CONSTANTS } from '../../constants.js';
|
|
20
|
+
import { MicrosoftError } from './microsoft-token.service.js';
|
|
21
|
+
const CODES = MICROSOFT_TODO_CONSTANTS.ERROR_CODES;
|
|
22
|
+
/** Upper bound on `@odata.nextLink` pages followed when listing lists. */
|
|
23
|
+
const MAX_LIST_PAGES = 10;
|
|
24
|
+
const HTTP_NO_CONTENT = 204;
|
|
25
|
+
const MS_PER_SECOND = 1000;
|
|
26
|
+
/**
|
|
27
|
+
* Trim a Graph `todoTaskList`.
|
|
28
|
+
*
|
|
29
|
+
* @param l - Wire list
|
|
30
|
+
* @returns Trimmed list
|
|
31
|
+
*/
|
|
32
|
+
export function toList(l) {
|
|
33
|
+
return {
|
|
34
|
+
id: l.id ?? '',
|
|
35
|
+
name: l.displayName ?? '',
|
|
36
|
+
...(l.wellknownListName === MICROSOFT_TODO_CONSTANTS.DEFAULT_LIST_WELLKNOWN ? { isDefault: true } : {}),
|
|
37
|
+
...(l.isShared ? { isShared: true } : {}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Plain text of a task body (HTML bodies come from Outlook-created tasks).
|
|
42
|
+
*
|
|
43
|
+
* @param body - Wire body
|
|
44
|
+
* @returns Collapsed text, truncated to the preview length, or undefined
|
|
45
|
+
*/
|
|
46
|
+
export function noteText(body) {
|
|
47
|
+
let text = body?.content ?? '';
|
|
48
|
+
if ((body?.contentType ?? '').toLowerCase() === 'html') {
|
|
49
|
+
text = text.replace(/<[^>]*>/g, ' ').replace(/ /g, ' ').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
50
|
+
}
|
|
51
|
+
text = text.replace(/\s+/g, ' ').trim();
|
|
52
|
+
if (!text)
|
|
53
|
+
return undefined;
|
|
54
|
+
const max = MICROSOFT_TODO_CONSTANTS.NOTE_PREVIEW_LENGTH;
|
|
55
|
+
return text.length > max ? `${text.slice(0, max)}…` : text;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Trim a Graph `todoTask`.
|
|
59
|
+
*
|
|
60
|
+
* @param t - Wire task
|
|
61
|
+
* @returns Trimmed task
|
|
62
|
+
*/
|
|
63
|
+
export function toTask(t) {
|
|
64
|
+
const note = noteText(t.body);
|
|
65
|
+
const due = t.dueDateTime?.dateTime?.slice(0, 10);
|
|
66
|
+
const completedAt = t.status === 'completed' ? t.completedDateTime?.dateTime?.slice(0, 10) : undefined;
|
|
67
|
+
return {
|
|
68
|
+
id: t.id ?? '',
|
|
69
|
+
title: t.title ?? '',
|
|
70
|
+
status: t.status ?? 'notStarted',
|
|
71
|
+
...(t.importance && t.importance !== 'normal' ? { importance: t.importance } : {}),
|
|
72
|
+
...(due ? { due } : {}),
|
|
73
|
+
...(note ? { note } : {}),
|
|
74
|
+
...(completedAt ? { completedAt } : {}),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Validate a `YYYY-MM-DD` date and turn it into Graph's `dueDateTime`.
|
|
79
|
+
*
|
|
80
|
+
* @param value - Date text
|
|
81
|
+
* @returns `{ dateTime, timeZone }`
|
|
82
|
+
* @throws MicrosoftError(400, validation) for a malformed or impossible date
|
|
83
|
+
*/
|
|
84
|
+
export function toDueDateTime(value) {
|
|
85
|
+
const text = value.trim();
|
|
86
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(text);
|
|
87
|
+
const parsed = match ? new Date(Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]))) : null;
|
|
88
|
+
if (!match || !parsed || parsed.toISOString().slice(0, 10) !== text) {
|
|
89
|
+
throw new MicrosoftError(400, CODES.VALIDATION, `due must be a real date as YYYY-MM-DD (got "${value}")`);
|
|
90
|
+
}
|
|
91
|
+
return { dateTime: `${text}T00:00:00`, timeZone: MICROSOFT_TODO_CONSTANTS.DUE_TIME_ZONE };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Validate an importance value.
|
|
95
|
+
*
|
|
96
|
+
* @param value - Candidate
|
|
97
|
+
* @returns Lower-cased importance
|
|
98
|
+
* @throws MicrosoftError(400, validation) when unknown
|
|
99
|
+
*/
|
|
100
|
+
export function toImportance(value) {
|
|
101
|
+
const v = value.trim().toLowerCase();
|
|
102
|
+
if (!MICROSOFT_TODO_CONSTANTS.IMPORTANCE_VALUES.includes(v)) {
|
|
103
|
+
throw new MicrosoftError(400, CODES.VALIDATION, `importance must be one of ${MICROSOFT_TODO_CONSTANTS.IMPORTANCE_VALUES.join(', ')}`);
|
|
104
|
+
}
|
|
105
|
+
return v;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Pick the list a reference names: exact id, then case-insensitive name,
|
|
109
|
+
* then `default` (or nothing) → the default list.
|
|
110
|
+
*
|
|
111
|
+
* @param lists - All lists
|
|
112
|
+
* @param ref - Id or name (may be empty)
|
|
113
|
+
* @returns The list
|
|
114
|
+
* @throws MicrosoftError(404, not_found) when nothing matches; (400, validation) when a name is ambiguous
|
|
115
|
+
*/
|
|
116
|
+
export function pickList(lists, ref) {
|
|
117
|
+
const wanted = (ref ?? '').trim();
|
|
118
|
+
if (wanted) {
|
|
119
|
+
const byId = lists.find((l) => l.id === wanted);
|
|
120
|
+
if (byId)
|
|
121
|
+
return byId;
|
|
122
|
+
const byName = lists.filter((l) => l.name.trim().toLowerCase() === wanted.toLowerCase());
|
|
123
|
+
if (byName.length === 1)
|
|
124
|
+
return byName[0];
|
|
125
|
+
if (byName.length > 1) {
|
|
126
|
+
throw new MicrosoftError(400, CODES.VALIDATION, `Several lists are called "${wanted}"; pass the list id instead (${byName.map((l) => l.id).join(', ')})`);
|
|
127
|
+
}
|
|
128
|
+
if (wanted.toLowerCase() !== 'default') {
|
|
129
|
+
const names = lists.map((l) => l.name).join(', ');
|
|
130
|
+
throw new MicrosoftError(404, CODES.NOT_FOUND, `No To Do list called "${wanted}". Lists: ${names || '(none)'}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const fallback = lists.find((l) => l.isDefault) ?? lists[0];
|
|
134
|
+
if (!fallback)
|
|
135
|
+
throw new MicrosoftError(404, CODES.NOT_FOUND, 'This Microsoft account has no To Do lists.');
|
|
136
|
+
return fallback;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Microsoft To Do calls.
|
|
140
|
+
*/
|
|
141
|
+
export class MicrosoftTodoService {
|
|
142
|
+
deps;
|
|
143
|
+
base = `${MICROSOFT_TODO_CONSTANTS.GRAPH_BASE}/me/todo/lists`;
|
|
144
|
+
/**
|
|
145
|
+
* @param deps - Token provider, fetch, sleep
|
|
146
|
+
*/
|
|
147
|
+
constructor(deps) {
|
|
148
|
+
this.deps = {
|
|
149
|
+
...deps,
|
|
150
|
+
fetchImpl: deps.fetchImpl ?? fetch,
|
|
151
|
+
sleep: deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms))),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* `GET /me/todo/lists` (following `@odata.nextLink`).
|
|
156
|
+
*
|
|
157
|
+
* @returns Every list
|
|
158
|
+
*/
|
|
159
|
+
async listLists() {
|
|
160
|
+
const out = [];
|
|
161
|
+
let url = this.base;
|
|
162
|
+
for (let page = 0; url && page < MAX_LIST_PAGES; page += 1) {
|
|
163
|
+
const data = await this.request(url);
|
|
164
|
+
out.push(...(data.value ?? []).map(toList));
|
|
165
|
+
url = data['@odata.nextLink'];
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* `POST /me/todo/lists`.
|
|
171
|
+
*
|
|
172
|
+
* @param name - Display name
|
|
173
|
+
* @returns The new list
|
|
174
|
+
* @throws MicrosoftError(400, validation) for an empty name
|
|
175
|
+
*/
|
|
176
|
+
async createList(name) {
|
|
177
|
+
const displayName = (name ?? '').trim().slice(0, MICROSOFT_TODO_CONSTANTS.TITLE_MAX_LENGTH);
|
|
178
|
+
if (!displayName)
|
|
179
|
+
throw new MicrosoftError(400, CODES.VALIDATION, '"name" is required');
|
|
180
|
+
return toList(await this.request(this.base, { method: 'POST', body: { displayName } }));
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Resolve a list reference (id, name, `default`, or empty).
|
|
184
|
+
*
|
|
185
|
+
* @param ref - Reference
|
|
186
|
+
* @returns The list
|
|
187
|
+
*/
|
|
188
|
+
async resolveList(ref) {
|
|
189
|
+
return pickList(await this.listLists(), ref);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* `GET /me/todo/lists/{id}/tasks` — open tasks unless `includeCompleted`.
|
|
193
|
+
*
|
|
194
|
+
* @param input - List, completed flag, limit
|
|
195
|
+
* @returns The list, its tasks, and whether more exist
|
|
196
|
+
*/
|
|
197
|
+
async listTasks(input = {}) {
|
|
198
|
+
const list = await this.resolveList(input.list);
|
|
199
|
+
const limit = Math.min(Math.max(1, Math.floor(input.limit ?? MICROSOFT_TODO_CONSTANTS.TASKS_DEFAULT_LIMIT) || MICROSOFT_TODO_CONSTANTS.TASKS_DEFAULT_LIMIT), MICROSOFT_TODO_CONSTANTS.TASKS_LIMIT_CEILING);
|
|
200
|
+
const url = new URL(`${this.base}/${encodeURIComponent(list.id)}/tasks`);
|
|
201
|
+
url.searchParams.set('$top', String(limit));
|
|
202
|
+
if (!input.includeCompleted)
|
|
203
|
+
url.searchParams.set('$filter', "status ne 'completed'");
|
|
204
|
+
const data = await this.request(url.toString());
|
|
205
|
+
return { list: { id: list.id, name: list.name }, tasks: (data.value ?? []).map(toTask), hasMore: Boolean(data['@odata.nextLink']) };
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* `POST /me/todo/lists/{id}/tasks`.
|
|
209
|
+
*
|
|
210
|
+
* @param input - List, title, note, due, importance
|
|
211
|
+
* @returns The list and the new task
|
|
212
|
+
* @throws MicrosoftError(400, validation) for a missing title / bad due / bad importance
|
|
213
|
+
*/
|
|
214
|
+
async addTask(input) {
|
|
215
|
+
const title = (input.title ?? '').trim().slice(0, MICROSOFT_TODO_CONSTANTS.TITLE_MAX_LENGTH);
|
|
216
|
+
if (!title)
|
|
217
|
+
throw new MicrosoftError(400, CODES.VALIDATION, '"title" is required');
|
|
218
|
+
const body = { title };
|
|
219
|
+
const note = (input.note ?? '').trim();
|
|
220
|
+
if (note)
|
|
221
|
+
body.body = { content: note.slice(0, MICROSOFT_TODO_CONSTANTS.NOTE_MAX_LENGTH), contentType: 'text' };
|
|
222
|
+
if (input.due?.trim())
|
|
223
|
+
body.dueDateTime = toDueDateTime(input.due);
|
|
224
|
+
if (input.importance?.trim())
|
|
225
|
+
body.importance = toImportance(input.importance);
|
|
226
|
+
const list = await this.resolveList(input.list);
|
|
227
|
+
const task = await this.request(`${this.base}/${encodeURIComponent(list.id)}/tasks`, { method: 'POST', body });
|
|
228
|
+
return { list: { id: list.id, name: list.name }, task: toTask(task) };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* `PATCH /me/todo/lists/{id}/tasks/{taskId}`.
|
|
232
|
+
*
|
|
233
|
+
* @param input - List, task id, and the fields to change
|
|
234
|
+
* @returns The list and the updated task
|
|
235
|
+
* @throws MicrosoftError(400, validation) when nothing is changed or a value is bad
|
|
236
|
+
*/
|
|
237
|
+
async updateTask(input) {
|
|
238
|
+
const taskId = (input.taskId ?? '').trim();
|
|
239
|
+
if (!taskId)
|
|
240
|
+
throw new MicrosoftError(400, CODES.VALIDATION, '"taskId" is required');
|
|
241
|
+
const body = {};
|
|
242
|
+
if (input.title !== undefined) {
|
|
243
|
+
const title = input.title.trim().slice(0, MICROSOFT_TODO_CONSTANTS.TITLE_MAX_LENGTH);
|
|
244
|
+
if (!title)
|
|
245
|
+
throw new MicrosoftError(400, CODES.VALIDATION, '"title" cannot be empty');
|
|
246
|
+
body.title = title;
|
|
247
|
+
}
|
|
248
|
+
if (input.note !== undefined)
|
|
249
|
+
body.body = { content: input.note.trim().slice(0, MICROSOFT_TODO_CONSTANTS.NOTE_MAX_LENGTH), contentType: 'text' };
|
|
250
|
+
if (input.due === null)
|
|
251
|
+
body.dueDateTime = null;
|
|
252
|
+
else if (input.due !== undefined)
|
|
253
|
+
body.dueDateTime = toDueDateTime(input.due);
|
|
254
|
+
if (input.importance !== undefined)
|
|
255
|
+
body.importance = toImportance(input.importance);
|
|
256
|
+
if (input.complete !== undefined)
|
|
257
|
+
body.status = input.complete ? 'completed' : 'notStarted';
|
|
258
|
+
if (Object.keys(body).length === 0) {
|
|
259
|
+
throw new MicrosoftError(400, CODES.VALIDATION, 'nothing to change: give complete, title, note, due or importance');
|
|
260
|
+
}
|
|
261
|
+
const list = await this.resolveList(input.list);
|
|
262
|
+
const task = await this.request(`${this.base}/${encodeURIComponent(list.id)}/tasks/${encodeURIComponent(taskId)}`, { method: 'PATCH', body });
|
|
263
|
+
return { list: { id: list.id, name: list.name }, task: toTask(task) };
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* `DELETE /me/todo/lists/{id}/tasks/{taskId}`.
|
|
267
|
+
*
|
|
268
|
+
* @param listRef - List id or name
|
|
269
|
+
* @param taskId - Task id
|
|
270
|
+
* @returns What was deleted
|
|
271
|
+
*/
|
|
272
|
+
async deleteTask(listRef, taskId) {
|
|
273
|
+
const id = (taskId ?? '').trim();
|
|
274
|
+
if (!id)
|
|
275
|
+
throw new MicrosoftError(400, CODES.VALIDATION, '"taskId" is required');
|
|
276
|
+
const list = await this.resolveList(listRef);
|
|
277
|
+
await this.request(`${this.base}/${encodeURIComponent(list.id)}/tasks/${encodeURIComponent(id)}`, { method: 'DELETE' });
|
|
278
|
+
return { list: { id: list.id, name: list.name }, taskId: id, deleted: true };
|
|
279
|
+
}
|
|
280
|
+
// -------------------------------------------------------------------------
|
|
281
|
+
// Internals
|
|
282
|
+
// -------------------------------------------------------------------------
|
|
283
|
+
/**
|
|
284
|
+
* Authenticated Graph call.
|
|
285
|
+
*
|
|
286
|
+
* 401 → drop the cached token and retry once; still 401 → `unauthorized`.
|
|
287
|
+
* 429 → wait out a short `Retry-After` once, else `rate_limited`.
|
|
288
|
+
* 400 → `validation`, 403 → `forbidden`, 404 → `not_found`, others → 502.
|
|
289
|
+
*
|
|
290
|
+
* @param url - Absolute URL
|
|
291
|
+
* @param init - Method / JSON body
|
|
292
|
+
* @returns Parsed JSON (`{}` for 204)
|
|
293
|
+
*/
|
|
294
|
+
async request(url, init = {}) {
|
|
295
|
+
let retriedAuth = false;
|
|
296
|
+
let retriedThrottle = false;
|
|
297
|
+
for (;;) {
|
|
298
|
+
const token = await this.deps.tokens.getAccessToken();
|
|
299
|
+
let res;
|
|
300
|
+
try {
|
|
301
|
+
res = await this.deps.fetchImpl(url, {
|
|
302
|
+
method: init.method ?? 'GET',
|
|
303
|
+
headers: {
|
|
304
|
+
Authorization: `Bearer ${token}`,
|
|
305
|
+
Accept: 'application/json',
|
|
306
|
+
...(init.body !== undefined ? { 'Content-Type': 'application/json' } : {}),
|
|
307
|
+
},
|
|
308
|
+
body: init.body !== undefined ? JSON.stringify(init.body) : undefined,
|
|
309
|
+
signal: AbortSignal.timeout(MICROSOFT_TODO_CONSTANTS.REQUEST_TIMEOUT_MS),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
throw new MicrosoftError(502, CODES.NETWORK, `Microsoft Graph unreachable: ${err instanceof Error ? err.message : String(err)}`);
|
|
314
|
+
}
|
|
315
|
+
if (res.status === HTTP_NO_CONTENT)
|
|
316
|
+
return {};
|
|
317
|
+
const text = await res.text();
|
|
318
|
+
if (res.ok) {
|
|
319
|
+
if (!text)
|
|
320
|
+
return {};
|
|
321
|
+
try {
|
|
322
|
+
return JSON.parse(text);
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
throw new MicrosoftError(502, CODES.MICROSOFT_ERROR, 'Microsoft Graph returned a non-JSON response.');
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
let message = `Microsoft Graph request failed (${res.status})`;
|
|
329
|
+
let graphCode = '';
|
|
330
|
+
try {
|
|
331
|
+
const parsed = JSON.parse(text);
|
|
332
|
+
graphCode = parsed.error?.code ?? '';
|
|
333
|
+
message = parsed.error?.message || graphCode || message;
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
if (text)
|
|
337
|
+
message = text.slice(0, 200);
|
|
338
|
+
}
|
|
339
|
+
const detail = graphCode && !message.includes(graphCode) ? `${graphCode}: ${message}` : message;
|
|
340
|
+
if (res.status === 401) {
|
|
341
|
+
this.deps.tokens.clearCache();
|
|
342
|
+
if (!retriedAuth) {
|
|
343
|
+
retriedAuth = true;
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
throw new MicrosoftError(401, CODES.UNAUTHORIZED, `Microsoft rejected the access token: ${detail}`);
|
|
347
|
+
}
|
|
348
|
+
if (res.status === 429) {
|
|
349
|
+
const retryAfter = Math.max(1, Number.parseInt(res.headers?.get?.('Retry-After') ?? '', 10) || 1);
|
|
350
|
+
if (!retriedThrottle && retryAfter <= MICROSOFT_TODO_CONSTANTS.RETRY_AFTER_MAX_WAIT_S) {
|
|
351
|
+
retriedThrottle = true;
|
|
352
|
+
await this.deps.sleep(retryAfter * MS_PER_SECOND);
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
throw new MicrosoftError(429, CODES.RATE_LIMITED, `Microsoft Graph is throttling requests; retry after ${retryAfter}s`, retryAfter);
|
|
356
|
+
}
|
|
357
|
+
if (res.status === 400)
|
|
358
|
+
throw new MicrosoftError(400, CODES.VALIDATION, detail);
|
|
359
|
+
if (res.status === 403)
|
|
360
|
+
throw new MicrosoftError(403, CODES.FORBIDDEN, detail);
|
|
361
|
+
if (res.status === 404)
|
|
362
|
+
throw new MicrosoftError(404, CODES.NOT_FOUND, detail);
|
|
363
|
+
throw new MicrosoftError(502, CODES.MICROSOFT_ERROR, detail);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=microsoft-todo.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microsoft-todo.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/microsoft/microsoft-todo.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AA+G9D,MAAM,KAAK,GAAG,wBAAwB,CAAC,WAAW,CAAC;AACnD,0EAA0E;AAC1E,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,CAAW;IAChC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;QACzB,GAAG,CAAC,CAAC,CAAC,iBAAiB,KAAK,wBAAwB,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAsB;IAC7C,IAAI,IAAI,GAAG,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QACvD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClI,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,GAAG,GAAG,wBAAwB,CAAC,mBAAmB,CAAC;IACzD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,CAAW;IAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE;QACd,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,YAAY;QAChC,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3G,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QACpE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,+CAA+C,KAAK,IAAI,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,WAAW,EAAE,QAAQ,EAAE,wBAAwB,CAAC,aAAa,EAAE,CAAC;AAC5F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,6BAA6B,wBAAwB,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxI,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAiB,EAAE,GAAuB;IACjE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACzF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,6BAA6B,MAAM,gCAAgC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5J,CAAC;QACD,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,yBAAyB,MAAM,aAAa,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,4CAA4C,CAAC,CAAC;IAC5G,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACd,IAAI,CAA+E;IACnF,IAAI,GAAG,GAAG,wBAAwB,CAAC,UAAU,gBAAgB,CAAC;IAE/E;;OAEG;IACH,YAAY,IAAuB;QACjC,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACrE,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,IAAI,GAAG,GAAuB,IAAI,CAAC,IAAI,CAAC;QACxC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,cAAc,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAuB,MAAM,IAAI,CAAC,OAAO,CAAqB,GAAG,CAAC,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,WAAW,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QAC5F,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAW,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,GAAuB;QACvC,OAAO,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,QAA4B,EAAE;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,wBAAwB,CAAC,mBAAmB,CAAC,IAAI,wBAAwB,CAAC,mBAAmB,CAAC,EACpI,wBAAwB,CAAC,mBAAmB,CAC7C,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACzE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,CAAC,gBAAgB;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAqB,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;IACtI,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,KAAuB;QACnC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;QAC7F,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QACnF,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAChH,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAAE,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;YAAE,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAW,GAAG,IAAI,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACzH,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACxE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,KAA0B;QACzC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;QACrF,MAAM,IAAI,GAA4B,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;YACrF,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;YACvF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACjJ,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;aAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;YAAE,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrF,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAC5F,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,kEAAkE,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAW,GAAG,IAAI,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxJ,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACxE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,OAA2B,EAAE,MAAc;QAC1D,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,OAAO,CAAU,GAAG,IAAI,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjI,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/E,CAAC;IAED,4EAA4E;IAC5E,YAAY;IACZ,4EAA4E;IAE5E;;;;;;;;;;OAUG;IACK,KAAK,CAAC,OAAO,CAAI,GAAW,EAAE,OAAyE,EAAE;QAC/G,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACtD,IAAI,GAAa,CAAC;YAClB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;oBACnC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;oBAC5B,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,KAAK,EAAE;wBAChC,MAAM,EAAE,kBAAkB;wBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC3E;oBACD,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBACrE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,wBAAwB,CAAC,kBAAkB,CAAC;iBACzE,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnI,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,eAAe;gBAAE,OAAO,EAAO,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAO,CAAC;gBAC1B,IAAI,CAAC;oBACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,EAAE,+CAA+C,CAAC,CAAC;gBACxG,CAAC;YACH,CAAC;YAED,IAAI,OAAO,GAAG,mCAAmC,GAAG,CAAC,MAAM,GAAG,CAAC;YAC/D,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;gBAC7C,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;gBACrC,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS,IAAI,OAAO,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,IAAI;oBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAEhG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,WAAW,GAAG,IAAI,CAAC;oBACnB,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,wCAAwC,MAAM,EAAE,CAAC,CAAC;YACtG,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBAClG,IAAI,CAAC,eAAe,IAAI,UAAU,IAAI,wBAAwB,CAAC,sBAAsB,EAAE,CAAC;oBACtF,eAAe,GAAG,IAAI,CAAC;oBACvB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,aAAa,CAAC,CAAC;oBAClD,SAAS;gBACX,CAAC;gBACD,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,EAAE,uDAAuD,UAAU,GAAG,EAAE,UAAU,CAAC,CAAC;YACtI,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAChF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC/E,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC/E,MAAM,IAAI,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
|