notebooklm-kit 0.0.1 → 2.1.1
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/LICENSE +22 -0
- package/README.md +4102 -0
- package/dist/src/auth/auth.d.ts +46 -0
- package/dist/src/auth/auth.d.ts.map +1 -0
- package/dist/src/auth/auth.js +323 -0
- package/dist/src/auth/auth.js.map +1 -0
- package/dist/src/auth/refresh.d.ts +150 -0
- package/dist/src/auth/refresh.d.ts.map +1 -0
- package/dist/src/auth/refresh.js +433 -0
- package/dist/src/auth/refresh.js.map +1 -0
- package/dist/src/client/notebooklm-client.d.ts +372 -0
- package/dist/src/client/notebooklm-client.d.ts.map +1 -0
- package/dist/src/client/notebooklm-client.js +550 -0
- package/dist/src/client/notebooklm-client.js.map +1 -0
- package/dist/src/index.d.ts +50 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/rpc/rpc-client.d.ts +48 -0
- package/dist/src/rpc/rpc-client.d.ts.map +1 -0
- package/dist/src/rpc/rpc-client.js +94 -0
- package/dist/src/rpc/rpc-client.js.map +1 -0
- package/dist/src/rpc/rpc-methods.d.ts +127 -0
- package/dist/src/rpc/rpc-methods.d.ts.map +1 -0
- package/dist/src/rpc/rpc-methods.js +169 -0
- package/dist/src/rpc/rpc-methods.js.map +1 -0
- package/dist/src/services/artifacts.d.ts +1017 -0
- package/dist/src/services/artifacts.d.ts.map +1 -0
- package/dist/src/services/artifacts.js +5413 -0
- package/dist/src/services/artifacts.js.map +1 -0
- package/dist/src/services/generation.d.ts +147 -0
- package/dist/src/services/generation.d.ts.map +1 -0
- package/dist/src/services/generation.js +479 -0
- package/dist/src/services/generation.js.map +1 -0
- package/dist/src/services/notebook-language.d.ts +109 -0
- package/dist/src/services/notebook-language.d.ts.map +1 -0
- package/dist/src/services/notebook-language.js +204 -0
- package/dist/src/services/notebook-language.js.map +1 -0
- package/dist/src/services/notebooks.d.ts +26 -0
- package/dist/src/services/notebooks.d.ts.map +1 -0
- package/dist/src/services/notebooks.js +539 -0
- package/dist/src/services/notebooks.js.map +1 -0
- package/dist/src/services/notes.d.ts +72 -0
- package/dist/src/services/notes.d.ts.map +1 -0
- package/dist/src/services/notes.js +340 -0
- package/dist/src/services/notes.js.map +1 -0
- package/dist/src/services/sources.d.ts +1085 -0
- package/dist/src/services/sources.d.ts.map +1 -0
- package/dist/src/services/sources.js +2675 -0
- package/dist/src/services/sources.js.map +1 -0
- package/dist/src/types/artifact.d.ts +258 -0
- package/dist/src/types/artifact.d.ts.map +1 -0
- package/dist/src/types/artifact.js +42 -0
- package/dist/src/types/artifact.js.map +1 -0
- package/dist/src/types/common.d.ts +226 -0
- package/dist/src/types/common.d.ts.map +1 -0
- package/dist/src/types/common.js +80 -0
- package/dist/src/types/common.js.map +1 -0
- package/dist/src/types/languages.d.ts +179 -0
- package/dist/src/types/languages.d.ts.map +1 -0
- package/dist/src/types/languages.js +254 -0
- package/dist/src/types/languages.js.map +1 -0
- package/dist/src/types/note.d.ts +41 -0
- package/dist/src/types/note.d.ts.map +1 -0
- package/dist/src/types/note.js +12 -0
- package/dist/src/types/note.js.map +1 -0
- package/dist/src/types/notebook.d.ts +81 -0
- package/dist/src/types/notebook.d.ts.map +1 -0
- package/dist/src/types/notebook.js +5 -0
- package/dist/src/types/notebook.js.map +1 -0
- package/dist/src/types/source.d.ts +241 -0
- package/dist/src/types/source.d.ts.map +1 -0
- package/dist/src/types/source.js +60 -0
- package/dist/src/types/source.js.map +1 -0
- package/dist/src/utils/batch-execute.d.ts +58 -0
- package/dist/src/utils/batch-execute.d.ts.map +1 -0
- package/dist/src/utils/batch-execute.js +398 -0
- package/dist/src/utils/batch-execute.js.map +1 -0
- package/dist/src/utils/chunked-decoder.d.ts +11 -0
- package/dist/src/utils/chunked-decoder.d.ts.map +1 -0
- package/dist/src/utils/chunked-decoder.js +326 -0
- package/dist/src/utils/chunked-decoder.js.map +1 -0
- package/dist/src/utils/chunked-parser.d.ts +61 -0
- package/dist/src/utils/chunked-parser.d.ts.map +1 -0
- package/dist/src/utils/chunked-parser.js +609 -0
- package/dist/src/utils/chunked-parser.js.map +1 -0
- package/dist/src/utils/errors.d.ts +58 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +357 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/quota.d.ts +213 -0
- package/dist/src/utils/quota.d.ts.map +1 -0
- package/dist/src/utils/quota.js +518 -0
- package/dist/src/utils/quota.js.map +1 -0
- package/dist/src/utils/streaming-client.d.ts +129 -0
- package/dist/src/utils/streaming-client.d.ts.map +1 -0
- package/dist/src/utils/streaming-client.js +559 -0
- package/dist/src/utils/streaming-client.js.map +1 -0
- package/package.json +85 -7
- package/index.js +0 -2
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import * as RPC from '../rpc/rpc-methods.js';
|
|
2
|
+
import { NotebookLMError } from '../types/common.js';
|
|
3
|
+
import { APIError } from '../utils/errors.js';
|
|
4
|
+
import { createChunkedParser } from '../utils/chunked-parser.js';
|
|
5
|
+
export class NotebooksService {
|
|
6
|
+
rpc;
|
|
7
|
+
quota;
|
|
8
|
+
constructor(rpc, quota) {
|
|
9
|
+
this.rpc = rpc;
|
|
10
|
+
this.quota = quota;
|
|
11
|
+
}
|
|
12
|
+
async list() {
|
|
13
|
+
// Use wXbhsf RPC for listing my notebooks (recently viewed)
|
|
14
|
+
// Args format: [null, 1, null, [2]]
|
|
15
|
+
const args = [null, 1, null, [2]];
|
|
16
|
+
const response = await this.rpc.call(RPC.RPC_LIST_MY_NOTEBOOKS, args);
|
|
17
|
+
const notebooks = this.parseListResponse(response);
|
|
18
|
+
// Filter out "OpenStax's Biology" notebook (not in user's expected list)
|
|
19
|
+
return notebooks.filter(nb => !nb.title.includes("OpenStax's Biology"));
|
|
20
|
+
}
|
|
21
|
+
async get(notebookId) {
|
|
22
|
+
if (!notebookId || typeof notebookId !== 'string') {
|
|
23
|
+
throw new APIError('Invalid notebook ID format', undefined, 400);
|
|
24
|
+
}
|
|
25
|
+
// Call both RPCs in parallel to get full notebook data + sharing details
|
|
26
|
+
const [projectResponse, sharingResponse] = await Promise.all([
|
|
27
|
+
this.rpc.call(RPC.RPC_GET_PROJECT, [notebookId, null, [2], null, 0], notebookId),
|
|
28
|
+
this.rpc.call(RPC.RPC_GET_SHARING_DETAILS, [notebookId, [2]], notebookId).catch(() => null), // Sharing data is optional, don't fail if unavailable
|
|
29
|
+
]);
|
|
30
|
+
return this.parseGetResponse(projectResponse, notebookId, sharingResponse);
|
|
31
|
+
}
|
|
32
|
+
async create(options) {
|
|
33
|
+
let { title = '', emoji } = options;
|
|
34
|
+
if (!title || title.trim() === '') {
|
|
35
|
+
title = `Untitled Notebook ${new Date().toLocaleDateString()}`;
|
|
36
|
+
}
|
|
37
|
+
if (title.length > 100) {
|
|
38
|
+
throw new APIError('Notebook title exceeds maximum length (100 characters)', undefined, 400);
|
|
39
|
+
}
|
|
40
|
+
this.quota?.checkQuota('createNotebook');
|
|
41
|
+
const response = await this.rpc.call(RPC.RPC_CREATE_PROJECT, [title, null, null, [2], [1, null, null, null, null, null, null, null, null, [1]]]);
|
|
42
|
+
const notebook = this.parseCreateResponse(response, title);
|
|
43
|
+
this.quota?.recordUsage('createNotebook');
|
|
44
|
+
// Set emoji if provided
|
|
45
|
+
if (emoji) {
|
|
46
|
+
await this.setEmoji(notebook.projectId, emoji);
|
|
47
|
+
notebook.emoji = emoji;
|
|
48
|
+
}
|
|
49
|
+
return notebook;
|
|
50
|
+
}
|
|
51
|
+
async update(notebookId, options) {
|
|
52
|
+
// Trim notebook ID to remove any trailing spaces
|
|
53
|
+
notebookId = notebookId.trim();
|
|
54
|
+
if (!notebookId || typeof notebookId !== 'string') {
|
|
55
|
+
throw new APIError('Invalid notebook ID format', undefined, 400);
|
|
56
|
+
}
|
|
57
|
+
// Validate: at least one field must be provided (title, description, or emoji)
|
|
58
|
+
if (!options.title && !options.description && !options.emoji) {
|
|
59
|
+
throw new APIError('At least one field (title, description, or emoji) must be provided', undefined, 400);
|
|
60
|
+
}
|
|
61
|
+
if (options.title && options.title.length > 100) {
|
|
62
|
+
throw new APIError('Notebook title exceeds maximum length (100 characters)', undefined, 400);
|
|
63
|
+
}
|
|
64
|
+
// Set emoji if provided (supports: emoji only, title + emoji, or emoji + description)
|
|
65
|
+
if (options.emoji !== undefined) {
|
|
66
|
+
await this.setEmoji(notebookId, options.emoji);
|
|
67
|
+
}
|
|
68
|
+
// Update title and/or description if provided (supports: title only, description only, or title + description)
|
|
69
|
+
if (options.title !== undefined || options.description !== undefined) {
|
|
70
|
+
const updateArray = [null, null, null, null];
|
|
71
|
+
if (options.title !== undefined) {
|
|
72
|
+
updateArray[3] = [null, options.title];
|
|
73
|
+
}
|
|
74
|
+
const updates = [updateArray];
|
|
75
|
+
const response = await this.rpc.call(RPC.RPC_UPDATE_PROJECT, [notebookId, updates], notebookId);
|
|
76
|
+
const notebook = this.parseGetResponse(response, notebookId, null);
|
|
77
|
+
// Ensure emoji is set in the returned notebook if it was updated
|
|
78
|
+
if (options.emoji !== undefined) {
|
|
79
|
+
notebook.emoji = options.emoji;
|
|
80
|
+
}
|
|
81
|
+
return notebook;
|
|
82
|
+
}
|
|
83
|
+
// If only emoji was updated (no title or description), fetch the notebook and update emoji in response
|
|
84
|
+
const notebook = await this.get(notebookId);
|
|
85
|
+
if (options.emoji !== undefined) {
|
|
86
|
+
notebook.emoji = options.emoji;
|
|
87
|
+
}
|
|
88
|
+
return notebook;
|
|
89
|
+
}
|
|
90
|
+
async delete(notebookIds) {
|
|
91
|
+
const ids = Array.isArray(notebookIds) ? notebookIds : [notebookIds];
|
|
92
|
+
for (const id of ids) {
|
|
93
|
+
if (!id || typeof id !== 'string') {
|
|
94
|
+
throw new APIError('Invalid notebook ID format', undefined, 400);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
await this.rpc.call(RPC.RPC_DELETE_PROJECTS, [ids, [2]]);
|
|
98
|
+
return {
|
|
99
|
+
deleted: ids,
|
|
100
|
+
count: ids.length,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async share(notebookId, options) {
|
|
104
|
+
if (!notebookId || typeof notebookId !== 'string') {
|
|
105
|
+
throw new APIError('Invalid notebook ID format', undefined, 400);
|
|
106
|
+
}
|
|
107
|
+
// Trim notebookId to prevent issues with trailing spaces
|
|
108
|
+
const trimmedNotebookId = notebookId.trim();
|
|
109
|
+
// accessType: 1 = anyone with link, 2 = restricted (default)
|
|
110
|
+
// Default to restricted (2) unless explicitly set to anyone with link (1)
|
|
111
|
+
const accessType = options.accessType || 2;
|
|
112
|
+
// Notify should only be used when there are user permission changes (adding/removing/updating users)
|
|
113
|
+
// When only changing access type (restricted vs anyone with link), notify is not relevant
|
|
114
|
+
const hasUserChanges = options.users && options.users.length > 0;
|
|
115
|
+
const notify = hasUserChanges ? (options.notify !== false ? 1 : 0) : 0;
|
|
116
|
+
// Validate: must have users OR accessType === 1 (anyone with link)
|
|
117
|
+
if (!options.users && accessType !== 1) {
|
|
118
|
+
throw new APIError('At least one sharing option (users or accessType=1 for anyone with link) must be provided', undefined, 400);
|
|
119
|
+
}
|
|
120
|
+
let shareData;
|
|
121
|
+
if (options.users && options.users.length > 0) {
|
|
122
|
+
const users = [];
|
|
123
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
124
|
+
for (const user of options.users) {
|
|
125
|
+
if (!user.email || typeof user.email !== 'string') {
|
|
126
|
+
throw new APIError('Invalid user email format', undefined, 400);
|
|
127
|
+
}
|
|
128
|
+
if (!emailRegex.test(user.email.trim())) {
|
|
129
|
+
throw new APIError(`Invalid email address: ${user.email}`, undefined, 400);
|
|
130
|
+
}
|
|
131
|
+
if (![2, 3, 4].includes(user.role)) {
|
|
132
|
+
throw new APIError('Invalid user role. Must be 2 (editor), 3 (viewer), or 4 (remove)', undefined, 400);
|
|
133
|
+
}
|
|
134
|
+
users.push([user.email.trim(), null, user.role]);
|
|
135
|
+
}
|
|
136
|
+
shareData = [trimmedNotebookId, users];
|
|
137
|
+
}
|
|
138
|
+
else if (accessType === 1) {
|
|
139
|
+
// Structure: [notebookId, null, [1]] where [1] enables link sharing
|
|
140
|
+
shareData = [trimmedNotebookId, null, [1]];
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
throw new APIError('Invalid share options', undefined, 400);
|
|
144
|
+
}
|
|
145
|
+
// Call JFMDGd first to get sharing details (prerequisite for sharing)
|
|
146
|
+
// This initializes the sharing state for the notebook
|
|
147
|
+
try {
|
|
148
|
+
await this.rpc.call(RPC.RPC_GET_SHARING_DETAILS, [trimmedNotebookId, [2]], trimmedNotebookId);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Ignore errors from the prerequisite call - it may not always be necessary
|
|
152
|
+
// but we call it to match the browser behavior
|
|
153
|
+
}
|
|
154
|
+
const args = [[shareData], notify, null, [accessType]];
|
|
155
|
+
const response = await this.rpc.call(RPC.RPC_SHARE_PROJECT, args, trimmedNotebookId);
|
|
156
|
+
// QDyure response can be:
|
|
157
|
+
// - Empty array [] = success (no share URL in response, construct from notebook ID)
|
|
158
|
+
// - Array with share URL = success with URL
|
|
159
|
+
// - Error response = failure
|
|
160
|
+
let shareUrl = '';
|
|
161
|
+
let success = false;
|
|
162
|
+
if (Array.isArray(response)) {
|
|
163
|
+
if (response.length === 0) {
|
|
164
|
+
// Empty array means success - construct share URL from notebook ID
|
|
165
|
+
success = true;
|
|
166
|
+
shareUrl = `https://notebooklm.google.com/notebook/${trimmedNotebookId}`;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Response contains data
|
|
170
|
+
const data = response[0];
|
|
171
|
+
if (Array.isArray(data)) {
|
|
172
|
+
shareUrl = data[0] || '';
|
|
173
|
+
success = data[1] === true || (data.length > 0 && data[0] !== null);
|
|
174
|
+
}
|
|
175
|
+
else if (typeof data === 'string') {
|
|
176
|
+
shareUrl = data;
|
|
177
|
+
success = true;
|
|
178
|
+
}
|
|
179
|
+
else if (data?.shareUrl) {
|
|
180
|
+
shareUrl = data.shareUrl;
|
|
181
|
+
success = data.success !== false;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// Fallback: construct from notebook ID
|
|
185
|
+
shareUrl = `https://notebooklm.google.com/notebook/${trimmedNotebookId}`;
|
|
186
|
+
success = true;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
else if (response && typeof response === 'object') {
|
|
191
|
+
shareUrl = response.shareUrl || `https://notebooklm.google.com/notebook/${trimmedNotebookId}`;
|
|
192
|
+
success = response.success !== false;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// Fallback: construct from notebook ID
|
|
196
|
+
shareUrl = `https://notebooklm.google.com/notebook/${trimmedNotebookId}`;
|
|
197
|
+
success = true;
|
|
198
|
+
}
|
|
199
|
+
// If shareUrl is still empty, construct from notebook ID
|
|
200
|
+
if (!shareUrl) {
|
|
201
|
+
shareUrl = `https://notebooklm.google.com/notebook/${trimmedNotebookId}`;
|
|
202
|
+
}
|
|
203
|
+
// If share failed, return minimal result
|
|
204
|
+
if (!success) {
|
|
205
|
+
return {
|
|
206
|
+
shareUrl,
|
|
207
|
+
success: false,
|
|
208
|
+
notebookId: trimmedNotebookId,
|
|
209
|
+
accessType,
|
|
210
|
+
isShared: false,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Fetch updated sharing details after successful share
|
|
214
|
+
let sharingDetails = {
|
|
215
|
+
shareUrl,
|
|
216
|
+
success: true,
|
|
217
|
+
notebookId: trimmedNotebookId,
|
|
218
|
+
accessType,
|
|
219
|
+
isShared: accessType === 1 || !!(options.users && options.users.length > 0),
|
|
220
|
+
};
|
|
221
|
+
try {
|
|
222
|
+
const sharingResponse = await this.rpc.call(RPC.RPC_GET_SHARING_DETAILS, [trimmedNotebookId, [2]], trimmedNotebookId);
|
|
223
|
+
const parsedSharing = this.parseSharingResponse(sharingResponse, trimmedNotebookId);
|
|
224
|
+
sharingDetails = {
|
|
225
|
+
...sharingDetails,
|
|
226
|
+
...parsedSharing,
|
|
227
|
+
shareUrl: parsedSharing.shareUrl || shareUrl, // Use parsed URL if available, otherwise use constructed one
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
// If we can't fetch sharing details, return what we have
|
|
232
|
+
// The share operation succeeded, so we return success with basic info
|
|
233
|
+
}
|
|
234
|
+
return sharingDetails;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Parse sharing details response from JFMDGd RPC
|
|
238
|
+
*/
|
|
239
|
+
parseSharingResponse(response, notebookId) {
|
|
240
|
+
try {
|
|
241
|
+
let sharingData = response;
|
|
242
|
+
// Handle different response formats
|
|
243
|
+
if (Array.isArray(response)) {
|
|
244
|
+
if (response.length > 0 && Array.isArray(response[0])) {
|
|
245
|
+
sharingData = response[0];
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
sharingData = response;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Extract sharing information
|
|
252
|
+
// Structure: [[users], [isShared], 1000] or [users_array, isShared_array, ...]
|
|
253
|
+
// Users array: [["email", role, [], ["name", "avatar"]], ...]
|
|
254
|
+
// Each user: ["email", role, [], ["name", "avatar"]]
|
|
255
|
+
let usersData = [];
|
|
256
|
+
let isShared = false;
|
|
257
|
+
let accessType = 2;
|
|
258
|
+
// Handle structure: [[users], [isShared], 1000]
|
|
259
|
+
if (Array.isArray(sharingData) && sharingData.length >= 2) {
|
|
260
|
+
// First element is users array
|
|
261
|
+
if (Array.isArray(sharingData[0])) {
|
|
262
|
+
usersData = sharingData[0];
|
|
263
|
+
}
|
|
264
|
+
// Second element is [isShared] or isShared boolean
|
|
265
|
+
if (Array.isArray(sharingData[1])) {
|
|
266
|
+
isShared = sharingData[1][0] === true;
|
|
267
|
+
}
|
|
268
|
+
else if (typeof sharingData[1] === 'boolean') {
|
|
269
|
+
isShared = sharingData[1];
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Fallback: try to extract from object format
|
|
273
|
+
if (usersData.length === 0 && sharingData?.users) {
|
|
274
|
+
usersData = Array.isArray(sharingData.users) ? sharingData.users : [];
|
|
275
|
+
}
|
|
276
|
+
if (!isShared && sharingData?.isShared) {
|
|
277
|
+
isShared = sharingData.isShared === true;
|
|
278
|
+
}
|
|
279
|
+
// Extract shareUrl - may not be in this response, construct from notebookId
|
|
280
|
+
const shareUrl = sharingData?.shareUrl || `https://notebooklm.google.com/notebook/${notebookId}`;
|
|
281
|
+
// Access type: 1 = anyone with link, 2 = restricted
|
|
282
|
+
// We need to infer from the sharing state - if there are users and link is enabled
|
|
283
|
+
// For now, default to restricted (2) unless we can determine otherwise
|
|
284
|
+
const accessTypeRaw = sharingData?.accessType || sharingData?.[3] || 2;
|
|
285
|
+
accessType = (accessTypeRaw === 1 || accessTypeRaw === 2) ? accessTypeRaw : 2;
|
|
286
|
+
// Parse users array
|
|
287
|
+
// Format: [["email", role, [], ["name", "avatar"]], ...]
|
|
288
|
+
// Role is at index 1, not index 2!
|
|
289
|
+
const users = [];
|
|
290
|
+
if (Array.isArray(usersData)) {
|
|
291
|
+
for (const userEntry of usersData) {
|
|
292
|
+
if (Array.isArray(userEntry) && userEntry.length >= 2) {
|
|
293
|
+
// Format: ["email", role, [], ["name", "avatar"]]
|
|
294
|
+
const email = userEntry[0];
|
|
295
|
+
const role = userEntry[1]; // Role is at index 1!
|
|
296
|
+
if (typeof email === 'string' && (role === 1 || role === 2 || role === 3)) {
|
|
297
|
+
// Map role: 1 = owner, 2 = editor, 3 = viewer
|
|
298
|
+
// We only return editor (2) or viewer (3), not owner (1)
|
|
299
|
+
if (role === 2 || role === 3) {
|
|
300
|
+
users.push({ email, role: role });
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else if (typeof userEntry === 'object' && userEntry?.email) {
|
|
305
|
+
// Format: { email, role, ... }
|
|
306
|
+
const email = userEntry.email;
|
|
307
|
+
const role = userEntry.role;
|
|
308
|
+
if (typeof email === 'string' && (role === 2 || role === 3)) {
|
|
309
|
+
users.push({ email, role });
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
shareUrl,
|
|
316
|
+
accessType,
|
|
317
|
+
isShared,
|
|
318
|
+
users: users.length > 0 ? users : undefined,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
// Return minimal info if parsing fails
|
|
323
|
+
return {
|
|
324
|
+
shareUrl: `https://notebooklm.google.com/notebook/${notebookId}`,
|
|
325
|
+
accessType: 2,
|
|
326
|
+
isShared: false,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
parseListResponse(response) {
|
|
331
|
+
try {
|
|
332
|
+
let responseStr = '';
|
|
333
|
+
if (typeof response === 'string') {
|
|
334
|
+
responseStr = response;
|
|
335
|
+
}
|
|
336
|
+
else if (Array.isArray(response) && response.length > 0) {
|
|
337
|
+
if (typeof response[0] === 'string') {
|
|
338
|
+
responseStr = response[0];
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
responseStr = JSON.stringify(response);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
responseStr = JSON.stringify(response);
|
|
346
|
+
}
|
|
347
|
+
// Enable debug mode for notebook list parsing (can be disabled with NOTEBOOKLM_DEBUG=false)
|
|
348
|
+
const debugMode = process.env.NOTEBOOKLM_DEBUG !== 'false';
|
|
349
|
+
const parser = createChunkedParser(responseStr, debugMode);
|
|
350
|
+
const projects = parser.parseListProjectsResponse();
|
|
351
|
+
return projects.map((p) => ({
|
|
352
|
+
projectId: p.projectId || '',
|
|
353
|
+
title: p.title || '',
|
|
354
|
+
emoji: p.emoji || '📄',
|
|
355
|
+
sourceCount: p.sourceCount !== undefined ? p.sourceCount : 0,
|
|
356
|
+
}));
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
throw new NotebookLMError(`Failed to parse notebooks list: ${error.message}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
parseGetResponse(response, notebookId, sharingResponse) {
|
|
363
|
+
try {
|
|
364
|
+
let parsedResponse = response;
|
|
365
|
+
if (typeof response === 'string') {
|
|
366
|
+
parsedResponse = JSON.parse(response);
|
|
367
|
+
}
|
|
368
|
+
if (Array.isArray(parsedResponse) && parsedResponse.length > 0) {
|
|
369
|
+
let data = parsedResponse;
|
|
370
|
+
if (Array.isArray(parsedResponse[0])) {
|
|
371
|
+
data = parsedResponse[0];
|
|
372
|
+
}
|
|
373
|
+
const title = data[0] || '';
|
|
374
|
+
const emoji = data[1] || '📄';
|
|
375
|
+
const sources = [];
|
|
376
|
+
if (Array.isArray(data[1])) {
|
|
377
|
+
for (const sourceData of data[1]) {
|
|
378
|
+
if (Array.isArray(sourceData) && sourceData.length > 0) {
|
|
379
|
+
if (Array.isArray(sourceData[0]) && sourceData[0].length > 0) {
|
|
380
|
+
const sourceId = sourceData[0][0];
|
|
381
|
+
const filename = sourceData[1] || 'Untitled';
|
|
382
|
+
if (typeof sourceId === 'string') {
|
|
383
|
+
sources.push({
|
|
384
|
+
sourceId,
|
|
385
|
+
title: filename,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Extract analytics data
|
|
393
|
+
const sourceCount = sources.length;
|
|
394
|
+
// Try to extract lastAccessed from various possible locations in the response
|
|
395
|
+
let lastAccessed;
|
|
396
|
+
// Check metadata field (data[5] or data[6] based on proto)
|
|
397
|
+
if (data[5] && typeof data[5] === 'object') {
|
|
398
|
+
const metadata = data[5];
|
|
399
|
+
// Check for modified_time (field 6) or last_accessed
|
|
400
|
+
if (metadata[6] && typeof metadata[6] === 'number') {
|
|
401
|
+
// Timestamp in seconds
|
|
402
|
+
lastAccessed = new Date(metadata[6] * 1000).toISOString();
|
|
403
|
+
}
|
|
404
|
+
else if (metadata.lastAccessed) {
|
|
405
|
+
lastAccessed = typeof metadata.lastAccessed === 'string'
|
|
406
|
+
? metadata.lastAccessed
|
|
407
|
+
: new Date(metadata.lastAccessed).toISOString();
|
|
408
|
+
}
|
|
409
|
+
else if (metadata.modified_time) {
|
|
410
|
+
lastAccessed = typeof metadata.modified_time === 'string'
|
|
411
|
+
? metadata.modified_time
|
|
412
|
+
: new Date(metadata.modified_time).toISOString();
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// Check if lastAccessed is directly in the data array
|
|
416
|
+
if (!lastAccessed && data.length > 6) {
|
|
417
|
+
const possibleTimestamp = data[6] || data[7];
|
|
418
|
+
if (possibleTimestamp) {
|
|
419
|
+
if (typeof possibleTimestamp === 'number') {
|
|
420
|
+
lastAccessed = new Date(possibleTimestamp * 1000).toISOString();
|
|
421
|
+
}
|
|
422
|
+
else if (typeof possibleTimestamp === 'string') {
|
|
423
|
+
lastAccessed = possibleTimestamp;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
// Parse sharing data if available
|
|
428
|
+
let sharing;
|
|
429
|
+
if (sharingResponse) {
|
|
430
|
+
const sharingData = Array.isArray(sharingResponse) ? sharingResponse[0] : sharingResponse;
|
|
431
|
+
if (sharingData) {
|
|
432
|
+
sharing = {
|
|
433
|
+
isShared: sharingData[0] === true || sharingData?.isShared === true,
|
|
434
|
+
shareUrl: sharingData[1] || sharingData?.shareUrl,
|
|
435
|
+
shareId: sharingData?.shareId,
|
|
436
|
+
publicAccess: sharingData?.publicAccess,
|
|
437
|
+
allowedUsers: sharingData[2] || sharingData?.permissions || sharingData?.allowedUsers,
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// Return optimized notebook data
|
|
442
|
+
// Don't include sources array - use sources service for that
|
|
443
|
+
// Only include sourceCount for analytics
|
|
444
|
+
return {
|
|
445
|
+
projectId: notebookId,
|
|
446
|
+
title,
|
|
447
|
+
emoji,
|
|
448
|
+
sourceCount: sourceCount > 0 ? sourceCount : undefined,
|
|
449
|
+
lastAccessed,
|
|
450
|
+
sharing,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
return {
|
|
454
|
+
projectId: notebookId,
|
|
455
|
+
title: '',
|
|
456
|
+
emoji: '📄',
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
catch (error) {
|
|
460
|
+
throw new NotebookLMError(`Failed to parse notebook data: ${error.message}`);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Set emoji for a notebook using the s0tc2d RPC
|
|
465
|
+
* Based on mm40.txt: emoji is set via s0tc2d with args [notebookId, [[null, null, null, [null, null, emoji]]]]
|
|
466
|
+
*/
|
|
467
|
+
async setEmoji(notebookId, emoji) {
|
|
468
|
+
if (!emoji || typeof emoji !== 'string') {
|
|
469
|
+
throw new APIError('Invalid emoji format', undefined, 400);
|
|
470
|
+
}
|
|
471
|
+
// Emoji should be a single Unicode character (can be a multi-byte emoji)
|
|
472
|
+
// Validate it's not empty after trimming
|
|
473
|
+
const trimmedEmoji = emoji.trim();
|
|
474
|
+
if (!trimmedEmoji) {
|
|
475
|
+
throw new APIError('Emoji cannot be empty', undefined, 400);
|
|
476
|
+
}
|
|
477
|
+
// RPC call structure from mm40.txt:
|
|
478
|
+
// s0tc2d RPC with args: [notebookId, [[null, null, null, [null, null, emoji]]]]
|
|
479
|
+
const args = [notebookId, [[null, null, null, [null, null, trimmedEmoji]]]];
|
|
480
|
+
try {
|
|
481
|
+
await this.rpc.call(RPC.RPC_UPDATE_PROJECT, args, notebookId);
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
throw new APIError(`Failed to set emoji: ${error.message}`, undefined, 500);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
parseCreateResponse(response, title) {
|
|
488
|
+
try {
|
|
489
|
+
let projectId = '';
|
|
490
|
+
let emoji = '📄';
|
|
491
|
+
let parsedResponse = response;
|
|
492
|
+
if (typeof response === 'string') {
|
|
493
|
+
try {
|
|
494
|
+
parsedResponse = JSON.parse(response);
|
|
495
|
+
}
|
|
496
|
+
catch {
|
|
497
|
+
parsedResponse = response;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if (Array.isArray(parsedResponse)) {
|
|
501
|
+
if (parsedResponse.length > 2 && typeof parsedResponse[2] === 'string') {
|
|
502
|
+
projectId = parsedResponse[2];
|
|
503
|
+
}
|
|
504
|
+
else {
|
|
505
|
+
const findId = (data) => {
|
|
506
|
+
if (typeof data === 'string' && data.match(/^[a-f0-9-]{36}$/)) {
|
|
507
|
+
return data;
|
|
508
|
+
}
|
|
509
|
+
if (Array.isArray(data)) {
|
|
510
|
+
for (const item of data) {
|
|
511
|
+
const id = findId(item);
|
|
512
|
+
if (id)
|
|
513
|
+
return id;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return null;
|
|
517
|
+
};
|
|
518
|
+
projectId = findId(parsedResponse) || '';
|
|
519
|
+
}
|
|
520
|
+
// Extract emoji from response if available (typically at index 3)
|
|
521
|
+
if (parsedResponse.length > 3 && typeof parsedResponse[3] === 'string') {
|
|
522
|
+
emoji = parsedResponse[3];
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
if (!projectId) {
|
|
526
|
+
throw new Error('Could not extract project ID from response');
|
|
527
|
+
}
|
|
528
|
+
return {
|
|
529
|
+
projectId,
|
|
530
|
+
title,
|
|
531
|
+
emoji,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
catch (error) {
|
|
535
|
+
throw new NotebookLMError(`Failed to parse created notebook: ${error.message}`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
//# sourceMappingURL=notebooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notebooks.js","sourceRoot":"","sources":["../../../src/services/notebooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,uBAAuB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,OAAO,gBAAgB;IAEjB;IACA;IAFV,YACU,GAAc,EACd,KAAgD;QADhD,QAAG,GAAH,GAAG,CAAW;QACd,UAAK,GAAL,KAAK,CAA2C;IACvD,CAAC;IAEJ,KAAK,CAAC,IAAI;QACR,4DAA4D;QAC5D,oCAAoC;QACpC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACnD,yEAAyE;QACzE,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,UAAkB;QAC1B,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,QAAQ,CAAC,4BAA4B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,yEAAyE;QACzE,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3D,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,GAAG,CAAC,eAAe,EACnB,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAChC,UAAU,CACX;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CACX,GAAG,CAAC,uBAAuB,EAC3B,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EACjB,UAAU,CACX,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,sDAAsD;SAC5E,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAA8B;QACzC,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAEpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,KAAK,GAAG,qBAAqB,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,EAAE,CAAC;QACjE,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC,wDAAwD,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAClC,GAAG,CAAC,kBAAkB,EACtB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CACnF,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAE1C,wBAAwB;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC/C,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACzB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAkB,EAAE,OAA8B;QAC7D,iDAAiD;QACjD,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAE/B,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,QAAQ,CAAC,4BAA4B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,+EAA+E;QAC/E,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7D,MAAM,IAAI,QAAQ,CAAC,oEAAoE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC3G,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAChD,MAAM,IAAI,QAAQ,CAAC,wDAAwD,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/F,CAAC;QAED,sFAAsF;QACtF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;QAED,+GAA+G;QAC/G,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACrE,MAAM,WAAW,GAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAEpD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAChC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC;YAE9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAClC,GAAG,CAAC,kBAAkB,EACtB,CAAC,UAAU,EAAE,OAAO,CAAC,EACrB,UAAU,CACX,CAAC;YAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAEnE,iEAAiE;YACjE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAChC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YACjC,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,uGAAuG;QACvG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACjC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAA8B;QACzC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAErE,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,IAAI,QAAQ,CAAC,4BAA4B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzD,OAAO;YACL,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,GAAG,CAAC,MAAM;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAAkB,EAAE,OAA6B;QAC3D,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,QAAQ,CAAC,4BAA4B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,yDAAyD;QACzD,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAE5C,6DAA6D;QAC7D,0EAA0E;QAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAE3C,qGAAqG;QACrG,0FAA0F;QAC1F,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,mEAAmE;QACnE,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,QAAQ,CAAC,2FAA2F,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAClI,CAAC;QAED,IAAI,SAAgB,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAU,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,4BAA4B,CAAC;YAEhD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAClD,MAAM,IAAI,QAAQ,CAAC,2BAA2B,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBAClE,CAAC;gBAED,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACxC,MAAM,IAAI,QAAQ,CAAC,0BAA0B,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC7E,CAAC;gBAED,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,QAAQ,CAAC,kEAAkE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBACzG,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,SAAS,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YAC5B,oEAAoE;YACpE,SAAS,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,sEAAsE;QACtE,sDAAsD;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACjB,GAAG,CAAC,uBAAuB,EAC3B,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,EACxB,iBAAiB,CAClB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4EAA4E;YAC5E,+CAA+C;QACjD,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAClC,GAAG,CAAC,iBAAiB,EACrB,IAAI,EACJ,iBAAiB,CAClB,CAAC;QAEF,0BAA0B;QAC1B,oFAAoF;QACpF,4CAA4C;QAC5C,6BAA6B;QAC7B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,mEAAmE;gBACnE,OAAO,GAAG,IAAI,CAAC;gBACf,QAAQ,GAAG,0CAA0C,iBAAiB,EAAE,CAAC;YAC3E,CAAC;iBAAM,CAAC;gBACN,yBAAyB;gBACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzB,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;gBACtE,CAAC;qBAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACpC,QAAQ,GAAG,IAAI,CAAC;oBAChB,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;qBAAM,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAC1B,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;oBACzB,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC;gBACnC,CAAC;qBAAM,CAAC;oBACN,uCAAuC;oBACvC,QAAQ,GAAG,0CAA0C,iBAAiB,EAAE,CAAC;oBACzE,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACpD,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,0CAA0C,iBAAiB,EAAE,CAAC;YAC9F,OAAO,GAAG,QAAQ,CAAC,OAAO,KAAK,KAAK,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,uCAAuC;YACvC,QAAQ,GAAG,0CAA0C,iBAAiB,EAAE,CAAC;YACzE,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,yDAAyD;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,0CAA0C,iBAAiB,EAAE,CAAC;QAC3E,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,QAAQ;gBACR,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,iBAAiB;gBAC7B,UAAU;gBACV,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;QAED,uDAAuD;QACvD,IAAI,cAAc,GAAwB;YACxC,QAAQ;YACR,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,iBAAiB;YAC7B,UAAU;YACV,QAAQ,EAAE,UAAU,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SAC5E,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACzC,GAAG,CAAC,uBAAuB,EAC3B,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,EACxB,iBAAiB,CAClB,CAAC;YAEF,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;YACpF,cAAc,GAAG;gBACf,GAAG,cAAc;gBACjB,GAAG,aAAa;gBAChB,QAAQ,EAAE,aAAa,CAAC,QAAQ,IAAI,QAAQ,EAAE,6DAA6D;aAC5G,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yDAAyD;YACzD,sEAAsE;QACxE,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,QAAa,EAAE,UAAkB;QAC5D,IAAI,CAAC;YACH,IAAI,WAAW,GAAQ,QAAQ,CAAC;YAEhC,oCAAoC;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtD,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,QAAQ,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,8BAA8B;YAC9B,+EAA+E;YAC/E,8DAA8D;YAC9D,qDAAqD;YAErD,IAAI,SAAS,GAAU,EAAE,CAAC;YAC1B,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,UAAU,GAAU,CAAC,CAAC;YAE1B,gDAAgD;YAChD,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC1D,+BAA+B;gBAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;gBAED,mDAAmD;gBACnD,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClC,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;gBACxC,CAAC;qBAAM,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBAC/C,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,8CAA8C;YAC9C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,EAAE,KAAK,EAAE,CAAC;gBACjD,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,CAAC;YACD,IAAI,CAAC,QAAQ,IAAI,WAAW,EAAE,QAAQ,EAAE,CAAC;gBACvC,QAAQ,GAAG,WAAW,CAAC,QAAQ,KAAK,IAAI,CAAC;YAC3C,CAAC;YAED,4EAA4E;YAC5E,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,0CAA0C,UAAU,EAAE,CAAC;YAEjG,oDAAoD;YACpD,mFAAmF;YACnF,uEAAuE;YACvE,MAAM,aAAa,GAAG,WAAW,EAAE,UAAU,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvE,UAAU,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,aAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzF,oBAAoB;YACpB,yDAAyD;YACzD,mCAAmC;YACnC,MAAM,KAAK,GAA0C,EAAE,CAAC;YACxD,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,KAAK,MAAM,SAAS,IAAI,SAAS,EAAE,CAAC;oBAClC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;wBACtD,kDAAkD;wBAClD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;wBAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;wBACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;4BAC1E,8CAA8C;4BAC9C,yDAAyD;4BACzD,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gCAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,CAAC;4BAC7C,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,EAAE,KAAK,EAAE,CAAC;wBAC7D,+BAA+B;wBAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;wBAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;wBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;4BAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,QAAQ;gBACR,UAAU;gBACV,QAAQ;gBACR,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aAC5C,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uCAAuC;YACvC,OAAO;gBACL,QAAQ,EAAE,0CAA0C,UAAU,EAAE;gBAChE,UAAU,EAAE,CAAC;gBACb,QAAQ,EAAE,KAAK;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAIO,iBAAiB,CAAC,QAAa;QACrC,IAAI,CAAC;YACH,IAAI,WAAW,GAAG,EAAE,CAAC;YAErB,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,WAAW,GAAG,QAAQ,CAAC;YACzB,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1D,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACpC,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YAED,4FAA4F;YAC5F,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,OAAO,CAAC;YAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,yBAAyB,EAAE,CAAC;YACpD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBAC/B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;gBAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;gBACpB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;aAC7D,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,eAAe,CAAC,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,QAAa,EAAE,UAAkB,EAAE,eAAqB;QAC/E,IAAI,CAAC;YACH,IAAI,cAAc,GAAG,QAAQ,CAAC;YAC9B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/D,IAAI,IAAI,GAAG,cAAc,CAAC;gBAE1B,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrC,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;gBAE9B,MAAM,OAAO,GAAU,EAAE,CAAC;gBAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;wBACjC,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACvD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gCAClC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC;gCAC7C,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oCACjC,OAAO,CAAC,IAAI,CAAC;wCACX,QAAQ;wCACR,KAAK,EAAE,QAAQ;qCAChB,CAAC,CAAC;gCACL,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,yBAAyB;gBACzB,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;gBAEnC,8EAA8E;gBAC9E,IAAI,YAAgC,CAAC;gBAErC,2DAA2D;gBAC3D,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBACzB,qDAAqD;oBACrD,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;wBACnD,uBAAuB;wBACvB,YAAY,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC5D,CAAC;yBAAM,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;wBACjC,YAAY,GAAG,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ;4BACtD,CAAC,CAAC,QAAQ,CAAC,YAAY;4BACvB,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;oBACpD,CAAC;yBAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;wBAClC,YAAY,GAAG,OAAO,QAAQ,CAAC,aAAa,KAAK,QAAQ;4BACvD,CAAC,CAAC,QAAQ,CAAC,aAAa;4BACxB,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;oBACrD,CAAC;gBACH,CAAC;gBAED,sDAAsD;gBACtD,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrC,MAAM,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC7C,IAAI,iBAAiB,EAAE,CAAC;wBACtB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;4BAC1C,YAAY,GAAG,IAAI,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;wBAClE,CAAC;6BAAM,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;4BACjD,YAAY,GAAG,iBAAiB,CAAC;wBACnC,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,kCAAkC;gBAClC,IAAI,OAAoC,CAAC;gBACzC,IAAI,eAAe,EAAE,CAAC;oBACpB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;oBAC1F,IAAI,WAAW,EAAE,CAAC;wBAChB,OAAO,GAAG;4BACR,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,WAAW,EAAE,QAAQ,KAAK,IAAI;4BACnE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,QAAQ;4BACjD,OAAO,EAAE,WAAW,EAAE,OAAO;4BAC7B,YAAY,EAAE,WAAW,EAAE,YAAY;4BACvC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,WAAW,IAAI,WAAW,EAAE,YAAY;yBACtF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,iCAAiC;gBACjC,6DAA6D;gBAC7D,yCAAyC;gBACzC,OAAO;oBACL,SAAS,EAAE,UAAU;oBACrB,KAAK;oBACL,KAAK;oBACL,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;oBACtD,YAAY;oBACZ,OAAO;iBACR,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,UAAU;gBACrB,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,eAAe,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,QAAQ,CAAC,UAAkB,EAAE,KAAa;QACtD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,yEAAyE;QACzE,yCAAyC;QACzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC;QAED,oCAAoC;QACpC,gFAAgF;QAChF,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,QAAQ,CAAC,wBAAyB,KAAe,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,QAAa,EAAE,KAAa;QACtD,IAAI,CAAC;YACH,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,IAAI,cAAc,GAAG,QAAQ,CAAC;YAE9B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,cAAc,GAAG,QAAQ,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAClC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACvE,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,CAAC,IAAS,EAAiB,EAAE;wBAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;4BAC9D,OAAO,IAAI,CAAC;wBACd,CAAC;wBACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;4BACxB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gCACxB,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;gCACxB,IAAI,EAAE;oCAAE,OAAO,EAAE,CAAC;4BACpB,CAAC;wBACH,CAAC;wBACD,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC;oBAEF,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBAC3C,CAAC;gBAED,kEAAkE;gBAClE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,cAAc,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACvE,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,OAAO;gBACL,SAAS;gBACT,KAAK;gBACL,KAAK;aACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,eAAe,CAAC,qCAAsC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Notes service
|
|
3
|
+
* Handles note operations
|
|
4
|
+
*/
|
|
5
|
+
import { RPCClient } from '../rpc/rpc-client.js';
|
|
6
|
+
import type { Note, CreateNoteOptions, UpdateNoteOptions } from '../types/note.js';
|
|
7
|
+
/**
|
|
8
|
+
* Service for note operations
|
|
9
|
+
*/
|
|
10
|
+
export declare class NotesService {
|
|
11
|
+
private rpc;
|
|
12
|
+
private quota?;
|
|
13
|
+
constructor(rpc: RPCClient, quota?: import("../utils/quota.js").QuotaManager | undefined);
|
|
14
|
+
/**
|
|
15
|
+
* Get notes for a notebook
|
|
16
|
+
*
|
|
17
|
+
* @param notebookId - The notebook ID
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const notes = await client.notes.list('notebook-id');
|
|
22
|
+
* console.log(`Found ${notes.length} notes`);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
list(notebookId: string): Promise<Note[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Create a new note
|
|
28
|
+
*
|
|
29
|
+
* @param notebookId - The notebook ID
|
|
30
|
+
* @param options - Note options
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const note = await client.notes.create('notebook-id', {
|
|
35
|
+
* title: 'My Note',
|
|
36
|
+
* content: 'Note content here',
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
create(notebookId: string, options: CreateNoteOptions): Promise<Note>;
|
|
41
|
+
/**
|
|
42
|
+
* Update a note
|
|
43
|
+
*
|
|
44
|
+
* @param notebookId - The notebook ID
|
|
45
|
+
* @param noteId - The note ID
|
|
46
|
+
* @param options - Update options
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const note = await client.notes.update('notebook-id', 'note-id', {
|
|
51
|
+
* title: 'Updated Title',
|
|
52
|
+
* content: 'Updated content',
|
|
53
|
+
* });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
update(notebookId: string, noteId: string, options: UpdateNoteOptions): Promise<Note>;
|
|
57
|
+
/**
|
|
58
|
+
* Delete notes
|
|
59
|
+
*
|
|
60
|
+
* @param notebookId - The notebook ID
|
|
61
|
+
* @param noteIds - Note IDs to delete
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* await client.notes.delete('notebook-id', ['note-id-1', 'note-id-2']);
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
delete(notebookId: string, noteIds: string | string[]): Promise<void>;
|
|
69
|
+
private parseListResponse;
|
|
70
|
+
private parseNoteResponse;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=notes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../../src/services/notes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGnF;;GAEG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,KAAK,CAAC;gBADN,GAAG,EAAE,SAAS,EACd,KAAK,CAAC,EAAE,OAAO,mBAAmB,EAAE,YAAY,YAAA;IAG1D;;;;;;;;;;OAUG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAU/C;;;;;;;;;;;;;OAaG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3E;;;;;;;;;;;;;;OAcG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB3F;;;;;;;;;;OAUG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3E,OAAO,CAAC,iBAAiB;IAmIzB,OAAO,CAAC,iBAAiB;CAmH1B"}
|