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.
Files changed (100) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +4102 -0
  3. package/dist/src/auth/auth.d.ts +46 -0
  4. package/dist/src/auth/auth.d.ts.map +1 -0
  5. package/dist/src/auth/auth.js +323 -0
  6. package/dist/src/auth/auth.js.map +1 -0
  7. package/dist/src/auth/refresh.d.ts +150 -0
  8. package/dist/src/auth/refresh.d.ts.map +1 -0
  9. package/dist/src/auth/refresh.js +433 -0
  10. package/dist/src/auth/refresh.js.map +1 -0
  11. package/dist/src/client/notebooklm-client.d.ts +372 -0
  12. package/dist/src/client/notebooklm-client.d.ts.map +1 -0
  13. package/dist/src/client/notebooklm-client.js +550 -0
  14. package/dist/src/client/notebooklm-client.js.map +1 -0
  15. package/dist/src/index.d.ts +50 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/src/index.js +45 -0
  18. package/dist/src/index.js.map +1 -0
  19. package/dist/src/rpc/rpc-client.d.ts +48 -0
  20. package/dist/src/rpc/rpc-client.d.ts.map +1 -0
  21. package/dist/src/rpc/rpc-client.js +94 -0
  22. package/dist/src/rpc/rpc-client.js.map +1 -0
  23. package/dist/src/rpc/rpc-methods.d.ts +127 -0
  24. package/dist/src/rpc/rpc-methods.d.ts.map +1 -0
  25. package/dist/src/rpc/rpc-methods.js +169 -0
  26. package/dist/src/rpc/rpc-methods.js.map +1 -0
  27. package/dist/src/services/artifacts.d.ts +1017 -0
  28. package/dist/src/services/artifacts.d.ts.map +1 -0
  29. package/dist/src/services/artifacts.js +5413 -0
  30. package/dist/src/services/artifacts.js.map +1 -0
  31. package/dist/src/services/generation.d.ts +147 -0
  32. package/dist/src/services/generation.d.ts.map +1 -0
  33. package/dist/src/services/generation.js +479 -0
  34. package/dist/src/services/generation.js.map +1 -0
  35. package/dist/src/services/notebook-language.d.ts +109 -0
  36. package/dist/src/services/notebook-language.d.ts.map +1 -0
  37. package/dist/src/services/notebook-language.js +204 -0
  38. package/dist/src/services/notebook-language.js.map +1 -0
  39. package/dist/src/services/notebooks.d.ts +26 -0
  40. package/dist/src/services/notebooks.d.ts.map +1 -0
  41. package/dist/src/services/notebooks.js +539 -0
  42. package/dist/src/services/notebooks.js.map +1 -0
  43. package/dist/src/services/notes.d.ts +72 -0
  44. package/dist/src/services/notes.d.ts.map +1 -0
  45. package/dist/src/services/notes.js +340 -0
  46. package/dist/src/services/notes.js.map +1 -0
  47. package/dist/src/services/sources.d.ts +1085 -0
  48. package/dist/src/services/sources.d.ts.map +1 -0
  49. package/dist/src/services/sources.js +2675 -0
  50. package/dist/src/services/sources.js.map +1 -0
  51. package/dist/src/types/artifact.d.ts +258 -0
  52. package/dist/src/types/artifact.d.ts.map +1 -0
  53. package/dist/src/types/artifact.js +42 -0
  54. package/dist/src/types/artifact.js.map +1 -0
  55. package/dist/src/types/common.d.ts +226 -0
  56. package/dist/src/types/common.d.ts.map +1 -0
  57. package/dist/src/types/common.js +80 -0
  58. package/dist/src/types/common.js.map +1 -0
  59. package/dist/src/types/languages.d.ts +179 -0
  60. package/dist/src/types/languages.d.ts.map +1 -0
  61. package/dist/src/types/languages.js +254 -0
  62. package/dist/src/types/languages.js.map +1 -0
  63. package/dist/src/types/note.d.ts +41 -0
  64. package/dist/src/types/note.d.ts.map +1 -0
  65. package/dist/src/types/note.js +12 -0
  66. package/dist/src/types/note.js.map +1 -0
  67. package/dist/src/types/notebook.d.ts +81 -0
  68. package/dist/src/types/notebook.d.ts.map +1 -0
  69. package/dist/src/types/notebook.js +5 -0
  70. package/dist/src/types/notebook.js.map +1 -0
  71. package/dist/src/types/source.d.ts +241 -0
  72. package/dist/src/types/source.d.ts.map +1 -0
  73. package/dist/src/types/source.js +60 -0
  74. package/dist/src/types/source.js.map +1 -0
  75. package/dist/src/utils/batch-execute.d.ts +58 -0
  76. package/dist/src/utils/batch-execute.d.ts.map +1 -0
  77. package/dist/src/utils/batch-execute.js +398 -0
  78. package/dist/src/utils/batch-execute.js.map +1 -0
  79. package/dist/src/utils/chunked-decoder.d.ts +11 -0
  80. package/dist/src/utils/chunked-decoder.d.ts.map +1 -0
  81. package/dist/src/utils/chunked-decoder.js +326 -0
  82. package/dist/src/utils/chunked-decoder.js.map +1 -0
  83. package/dist/src/utils/chunked-parser.d.ts +61 -0
  84. package/dist/src/utils/chunked-parser.d.ts.map +1 -0
  85. package/dist/src/utils/chunked-parser.js +609 -0
  86. package/dist/src/utils/chunked-parser.js.map +1 -0
  87. package/dist/src/utils/errors.d.ts +58 -0
  88. package/dist/src/utils/errors.d.ts.map +1 -0
  89. package/dist/src/utils/errors.js +357 -0
  90. package/dist/src/utils/errors.js.map +1 -0
  91. package/dist/src/utils/quota.d.ts +213 -0
  92. package/dist/src/utils/quota.d.ts.map +1 -0
  93. package/dist/src/utils/quota.js +518 -0
  94. package/dist/src/utils/quota.js.map +1 -0
  95. package/dist/src/utils/streaming-client.d.ts +129 -0
  96. package/dist/src/utils/streaming-client.d.ts.map +1 -0
  97. package/dist/src/utils/streaming-client.js +559 -0
  98. package/dist/src/utils/streaming-client.js.map +1 -0
  99. package/package.json +85 -7
  100. package/index.js +0 -2
@@ -0,0 +1,609 @@
1
+ /**
2
+ * Chunked response parser for NotebookLM's special response format
3
+ * Handles the complex chunked format used by NotebookLM API responses
4
+ */
5
+ import { NotebookLMParseError } from '../types/common.js';
6
+ /**
7
+ * Chunked response parser
8
+ * Specialized parser for NotebookLM's chunked response format
9
+ */
10
+ export class ChunkedResponseParser {
11
+ raw;
12
+ debug;
13
+ rawChunks = [];
14
+ cleanedData = '';
15
+ constructor(raw, debug = false) {
16
+ this.raw = raw;
17
+ this.debug = debug;
18
+ }
19
+ /**
20
+ * Parse list of projects from response
21
+ */
22
+ parseListProjectsResponse() {
23
+ // Initialize chunks
24
+ this.rawChunks = this.extractChunks();
25
+ // Try different parsing methods
26
+ // Step 1: Standard JSON (preferred method for wXbhsf)
27
+ try {
28
+ const projects = this.parseStandardJSON();
29
+ if (projects.length >= 0) { // Allow empty arrays
30
+ return projects;
31
+ }
32
+ }
33
+ catch (error) {
34
+ this.logDebug(`Standard JSON parsing failed: ${error.message}, trying regex method`);
35
+ }
36
+ // Step 2: Regex-based extraction
37
+ try {
38
+ const projects = this.parseWithRegex();
39
+ if (projects.length > 0) {
40
+ this.logDebug(`Successfully parsed ${projects.length} projects using regex method`);
41
+ return projects;
42
+ }
43
+ }
44
+ catch (error) {
45
+ this.logDebug(`Regex parsing failed: ${error.message}, trying direct scan method`);
46
+ }
47
+ // Step 3: Direct scanning (last resort - may extract sources, so we filter)
48
+ try {
49
+ const allProjects = this.parseDirectScan();
50
+ if (allProjects.length > 0) {
51
+ // Filter out sources: only keep items where projectId matches a notebook ID pattern
52
+ // Notebooks have titles, sources don't (or have different structure)
53
+ const projects = allProjects.filter((p) => {
54
+ // If title is empty or looks like a source title, skip it
55
+ if (!p.title || p.title.trim() === '')
56
+ return false;
57
+ // If title looks like a file name (has extension), might be a source
58
+ if (/\.(pdf|png|jpg|jpeg|mp3|mp4|txt)$/i.test(p.title))
59
+ return false;
60
+ return true;
61
+ });
62
+ this.logDebug(`Successfully parsed ${projects.length} projects using direct scan method (filtered from ${allProjects.length} total)`);
63
+ return projects;
64
+ }
65
+ }
66
+ catch (error) {
67
+ this.logDebug(`Direct scan failed: ${error.message}`);
68
+ }
69
+ // Step 4: Check if response indicates empty list (metadata-only response)
70
+ try {
71
+ if (this.checkEmptyResponse()) {
72
+ this.logDebug('Response appears to be empty list (metadata only)');
73
+ return [];
74
+ }
75
+ }
76
+ catch (error) {
77
+ this.logDebug(`Empty response check failed: ${error.message}`);
78
+ }
79
+ throw new NotebookLMParseError('Failed to parse projects response with all methods');
80
+ }
81
+ /**
82
+ * Check if response is an empty list (metadata-only)
83
+ */
84
+ checkEmptyResponse() {
85
+ // Look for metadata-only response patterns
86
+ // Pattern: [null, [pagination], [metadata], ...] without actual project data
87
+ for (const chunk of this.rawChunks) {
88
+ if (chunk.includes('"wrb.fr"') && (chunk.includes('"hT54vc"') || chunk.includes('"ozz5Z"'))) {
89
+ try {
90
+ const parsed = JSON.parse(chunk);
91
+ if (Array.isArray(parsed) && parsed.length >= 3 && typeof parsed[2] === 'string') {
92
+ const innerData = JSON.parse(JSON.parse(`"${parsed[2]}"`));
93
+ // Check if it's a metadata-only structure (no project arrays)
94
+ if (Array.isArray(innerData) && innerData.length > 0) {
95
+ // If first element is null and structure looks like metadata, likely empty
96
+ if (innerData[0] === null && !this.containsProjectData(innerData)) {
97
+ return true;
98
+ }
99
+ }
100
+ }
101
+ }
102
+ catch {
103
+ // Continue to other checks
104
+ }
105
+ }
106
+ }
107
+ return false;
108
+ }
109
+ /**
110
+ * Check if data structure contains project-like data
111
+ */
112
+ containsProjectData(data) {
113
+ if (!Array.isArray(data))
114
+ return false;
115
+ // Look for arrays that look like projects: [title, ..., projectId, emoji, ...]
116
+ for (const item of data) {
117
+ if (Array.isArray(item) && item.length >= 3) {
118
+ // Check if it has a UUID-like projectId at position 2
119
+ const possibleId = item[2];
120
+ if (typeof possibleId === 'string' && /^[a-f0-9-]{36}$/i.test(possibleId)) {
121
+ return true;
122
+ }
123
+ }
124
+ // Recursively check nested arrays
125
+ if (Array.isArray(item) && this.containsProjectData(item)) {
126
+ return true;
127
+ }
128
+ }
129
+ return false;
130
+ }
131
+ /**
132
+ * Extract and clean chunks from raw response
133
+ */
134
+ extractChunks() {
135
+ // Remove typical chunked response header
136
+ let cleanedResponse = this.raw.trim().replace(/^\)\]\}'/, '');
137
+ // Handle trailing digits (chunk size indicators)
138
+ if (cleanedResponse.length > 0) {
139
+ cleanedResponse = cleanedResponse.replace(/\n\d+$/, '');
140
+ }
141
+ this.cleanedData = cleanedResponse;
142
+ // Split by newline
143
+ const chunks = cleanedResponse.split('\n');
144
+ // Filter out numeric-only chunks (chunk size indicators)
145
+ return chunks.filter(chunk => !this.isNumeric(chunk.trim()));
146
+ }
147
+ /**
148
+ * Parse using standard JSON techniques
149
+ */
150
+ parseStandardJSON() {
151
+ let jsonSection = '';
152
+ // First, check if the raw response is already a valid JSON array (direct JSON, not chunked)
153
+ try {
154
+ const directParse = JSON.parse(this.raw.trim());
155
+ if (Array.isArray(directParse)) {
156
+ // This is a direct JSON array - parse it directly
157
+ // Handle different nesting structures:
158
+ // - [[[notebook]]] - single notebook triple-nested
159
+ // - [[[notebook1], [notebook2], ...]] - multiple notebooks triple-nested
160
+ // - [[notebook1], [notebook2], ...] - multiple notebooks double-nested
161
+ let projectsData = directParse;
162
+ // Check if triple-nested: [[[notebook(s)]]]
163
+ if (Array.isArray(directParse) && directParse.length === 1 && Array.isArray(directParse[0])) {
164
+ const innerArray = directParse[0];
165
+ // Check if inner array contains a single notebook or multiple notebooks
166
+ // Single notebook: [["title", [sources], "id", "emoji", null]]
167
+ // Multiple notebooks: [[["title1", ...], ["title2", ...], ...]]
168
+ if (innerArray.length === 1 && Array.isArray(innerArray[0])) {
169
+ // Check if this is a notebook array (has structure [title, sources, id, emoji])
170
+ const firstItem = innerArray[0];
171
+ if (Array.isArray(firstItem) && firstItem.length >= 3) {
172
+ const hasTitle = typeof firstItem[0] === 'string';
173
+ const hasSourcesOrId = Array.isArray(firstItem[1]) || firstItem[1] === null;
174
+ const hasId = typeof firstItem[2] === 'string' && /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(firstItem[2]);
175
+ if (hasTitle && (hasSourcesOrId || hasId)) {
176
+ // This is a single notebook: wrap it in an array for consistent processing
177
+ projectsData = [firstItem];
178
+ }
179
+ else {
180
+ // This might be an array of notebooks
181
+ projectsData = innerArray;
182
+ }
183
+ }
184
+ else {
185
+ projectsData = innerArray;
186
+ }
187
+ }
188
+ else {
189
+ // Multiple items in inner array - could be notebooks or sources
190
+ projectsData = innerArray;
191
+ }
192
+ }
193
+ return this.parseProjectsArray(projectsData);
194
+ }
195
+ }
196
+ catch (error) {
197
+ // Not a direct JSON array, continue with chunked parsing
198
+ this.logDebug(`Direct JSON parse failed: ${error.message}`);
199
+ }
200
+ // Look for chunk containing "wrb.fr" with project list RPCs
201
+ for (const chunk of this.rawChunks) {
202
+ if (chunk.includes('"wrb.fr"') && (chunk.includes('"hT54vc"') || chunk.includes('"wXbhsf"') || chunk.includes('"ozz5Z"'))) {
203
+ jsonSection = chunk;
204
+ break;
205
+ }
206
+ }
207
+ if (!jsonSection) {
208
+ throw new Error('Failed to find JSON section containing wrb.fr');
209
+ }
210
+ // Try to parse as JSON
211
+ let wrbResponse;
212
+ try {
213
+ wrbResponse = JSON.parse(jsonSection);
214
+ }
215
+ catch {
216
+ // Try extracting just the array part
217
+ const arrayStart = jsonSection.indexOf('[[');
218
+ const arrayEnd = jsonSection.lastIndexOf(']]');
219
+ if (arrayStart >= 0 && arrayEnd > arrayStart) {
220
+ const arrayString = jsonSection.substring(arrayStart, arrayEnd + 2);
221
+ wrbResponse = JSON.parse(arrayString);
222
+ }
223
+ else {
224
+ throw new Error('Failed to parse JSON');
225
+ }
226
+ }
227
+ if (wrbResponse.length < 3) {
228
+ throw new Error(`Unexpected response format: array too short (len=${wrbResponse.length})`);
229
+ }
230
+ // Extract projects data from position 2
231
+ let projectsRaw;
232
+ if (typeof wrbResponse[2] === 'string') {
233
+ projectsRaw = wrbResponse[2];
234
+ }
235
+ else {
236
+ throw new Error(`Unexpected type for project data: ${typeof wrbResponse[2]}`);
237
+ }
238
+ // Unescape the JSON string
239
+ let unescaped;
240
+ try {
241
+ unescaped = JSON.parse(`"${projectsRaw}"`);
242
+ }
243
+ catch {
244
+ throw new Error('Failed to unescape project data');
245
+ }
246
+ // Parse as array
247
+ let projectsData;
248
+ try {
249
+ projectsData = JSON.parse(unescaped);
250
+ }
251
+ catch (error) {
252
+ // Try parsing as object
253
+ if (error.message.includes('cannot unmarshal object')) {
254
+ return this.parseAsObject(unescaped);
255
+ }
256
+ throw new Error('Failed to parse project data as array');
257
+ }
258
+ // Check if this is a metadata-only response (empty list)
259
+ if (Array.isArray(projectsData) && projectsData.length >= 2) {
260
+ // Empty list response pattern: [null, [pagination], [metadata], ...]
261
+ // First element is null, second is pagination [1,100,50,500000], third is metadata
262
+ if (projectsData[0] === null &&
263
+ Array.isArray(projectsData[1]) &&
264
+ projectsData[1].length === 4 &&
265
+ typeof projectsData[1][0] === 'number') {
266
+ // This is a valid empty list response - return empty array
267
+ this.logDebug('Recognized empty list response (metadata-only structure)');
268
+ return [];
269
+ }
270
+ }
271
+ // Parse the projects data array
272
+ return this.parseProjectsArray(projectsData);
273
+ }
274
+ /**
275
+ * Parse projects array into notebook objects
276
+ */
277
+ parseProjectsArray(projectsData) {
278
+ // Handle different response structures
279
+ const projects = [];
280
+ // Helper to check if a string looks like a UUID (notebook ID)
281
+ const isUUIDLike = (str) => {
282
+ if (typeof str !== 'string')
283
+ return false;
284
+ // UUID format: 8-4-4-4-12 hex digits with dashes
285
+ return /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(str);
286
+ };
287
+ // Handle different structures:
288
+ // - [[notebook]] - single notebook double-nested (from parseStandardJSON)
289
+ // - [[notebook1], [notebook2], ...] - multiple notebooks double-nested
290
+ // - [notebook] - single notebook array directly (edge case)
291
+ let notebooksArray = projectsData;
292
+ // Check if projectsData is a direct notebook array (not wrapped in another array)
293
+ // This should only happen in edge cases, not from parseStandardJSON
294
+ if (Array.isArray(projectsData) && projectsData.length >= 3) {
295
+ const firstIsString = typeof projectsData[0] === 'string';
296
+ const secondIsArrayOrNull = Array.isArray(projectsData[1]) || projectsData[1] === null;
297
+ const thirdIsUUID = typeof projectsData[2] === 'string' && /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(projectsData[2]);
298
+ // Only wrap if:
299
+ // 1. It looks like a notebook array (title, sources/id, id)
300
+ // 2. AND the first element is NOT an array (if first element is array, it's already wrapped)
301
+ // 3. AND projectsData.length is small (if it's large, it's likely already an array of notebooks)
302
+ if (firstIsString && (secondIsArrayOrNull || thirdIsUUID) &&
303
+ !Array.isArray(projectsData[0]) && projectsData.length < 10) {
304
+ this.logDebug('Detected direct notebook array (not wrapped), wrapping it');
305
+ notebooksArray = [projectsData];
306
+ }
307
+ }
308
+ // Case 1: notebooksArray is an array of notebook arrays
309
+ if (Array.isArray(notebooksArray)) {
310
+ for (let i = 0; i < notebooksArray.length; i++) {
311
+ const item = notebooksArray[i];
312
+ if (!Array.isArray(item) || item.length < 3) {
313
+ this.logDebug(`Skipping item ${i}: not array or too short (len=${Array.isArray(item) ? item.length : typeof item})`);
314
+ continue;
315
+ }
316
+ // wXbhsf structure: [title, [sources...] or null, notebook_id, emoji, ...]
317
+ // CRITICAL: Skip if this looks like a source array (nested inside notebook)
318
+ // Sources have structure: [[source_id], source_title, ...] where source_id is at index 0
319
+ // OR: [source_title, ..., source_id, ...] where source_id is at a later index
320
+ // Notebooks have structure: [title, [sources...] or null, notebook_id, emoji] where title is at index 0
321
+ const firstElement = item[0];
322
+ // If first element is an array containing a UUID (source ID), this is a source, skip it
323
+ if (Array.isArray(firstElement) && firstElement.length > 0 && isUUIDLike(firstElement[0])) {
324
+ this.logDebug(`Skipping source: first element is array with UUID ${firstElement[0]}`);
325
+ continue; // This is a source, not a notebook
326
+ }
327
+ const title = item[0];
328
+ const sourcesOrId = item[1];
329
+ const possibleId = item[2];
330
+ const emoji = item[3];
331
+ // Pattern 1: [title, [sources...] or null, notebook_id, emoji] - wXbhsf format
332
+ // This is the PRIMARY pattern for notebooks - they MUST have sources array or null at index 1
333
+ // Validate:
334
+ // - index 0 (title) must be a string (can be empty)
335
+ // - index 1 (sourcesOrId) must be an array (sources) OR null
336
+ // - index 2 (possibleId) must be a valid UUID (notebook ID)
337
+ // - index 3 (emoji) is optional
338
+ if (typeof title === 'string' && (Array.isArray(sourcesOrId) || sourcesOrId === null) && isUUIDLike(possibleId)) {
339
+ // Additional validation: if sourcesOrId is an array, verify it contains source structures
340
+ // Sources have structure: [[source_id], source_title, ...]
341
+ if (Array.isArray(sourcesOrId) && sourcesOrId.length > 0) {
342
+ const firstSource = sourcesOrId[0];
343
+ // If first source doesn't look like a source array ([[source_id], ...]), skip
344
+ if (!Array.isArray(firstSource) || firstSource.length === 0 || !Array.isArray(firstSource[0])) {
345
+ this.logDebug(`Skipping item: sources array doesn't contain valid source structures`);
346
+ continue;
347
+ }
348
+ }
349
+ // Count sources: sourcesOrId is either null or an array of sources
350
+ const sourceCount = Array.isArray(sourcesOrId) ? sourcesOrId.length : 0;
351
+ const project = {
352
+ title: title.trim() || 'Untitled notebook',
353
+ projectId: possibleId,
354
+ emoji: typeof emoji === 'string' && emoji.trim() ? emoji : '📄',
355
+ sourceCount,
356
+ };
357
+ projects.push(project);
358
+ continue; // Skip to next item
359
+ }
360
+ // Pattern 2: [title, ..., projectId, emoji] - simpler format (no nested sources, sourcesOrId is not an array)
361
+ // CRITICAL: This pattern is DEPRECATED and should rarely match
362
+ // The API should primarily return Pattern 1 (with sources array or null)
363
+ // Only accept Pattern 2 if:
364
+ // 1. Index 1 is NOT an array and NOT null (different from notebook pattern)
365
+ // 2. AND the title doesn't look like a source (URLs, file extensions, malformed JSON)
366
+ // 3. AND we have strong indicators it's a notebook (emoji at index 3, proper title length)
367
+ // 4. AND the title is not empty and looks like a real notebook title
368
+ if (typeof title === 'string' && !Array.isArray(sourcesOrId) && sourcesOrId !== null && isUUIDLike(possibleId)) {
369
+ const titleStr = String(title).trim();
370
+ // STRICT filtering to exclude sources:
371
+ // - Sources often have URLs as titles (start with http:// or https://)
372
+ // - Sources often have file extensions in titles
373
+ // - Sources might have malformed titles (like the ones in the terminal output)
374
+ // - Sources might have very short or very long titles
375
+ const looksLikeSource = !titleStr || // Empty title
376
+ titleStr.startsWith('http://') ||
377
+ titleStr.startsWith('https://') ||
378
+ /\.(pdf|png|jpg|jpeg|mp3|mp4|txt|doc|docx)$/i.test(titleStr) ||
379
+ titleStr.length > 200 || // Very long titles are likely sources
380
+ titleStr.length < 3 || // Very short titles are suspicious
381
+ /^[,\[\]]/.test(titleStr) || // Starts with JSON-like characters (malformed)
382
+ /\]\]/.test(titleStr) || // Contains closing brackets (malformed JSON)
383
+ /^\[null/.test(titleStr) || // Starts with [null (malformed JSON)
384
+ /null,/.test(titleStr); // Contains null, (malformed JSON)
385
+ if (looksLikeSource) {
386
+ this.logDebug(`Skipping source: title looks like a source (${titleStr.substring(0, 50)}...)`);
387
+ continue;
388
+ }
389
+ // Additional checks for notebook indicators:
390
+ // - Must have at least 4 elements (title, something, id, emoji)
391
+ // - Should have an emoji at index 3 (notebooks typically have emojis)
392
+ if (item.length < 4) {
393
+ this.logDebug(`Skipping item: too short to be a notebook (len=${item.length})`);
394
+ continue;
395
+ }
396
+ // If no emoji and title is suspicious, skip it
397
+ if (!emoji || (typeof emoji !== 'string')) {
398
+ this.logDebug(`Skipping item: no emoji indicator, likely a source`);
399
+ continue;
400
+ }
401
+ // No sources in this format
402
+ const project = {
403
+ title: titleStr || 'Untitled notebook',
404
+ projectId: possibleId,
405
+ emoji: typeof emoji === 'string' && emoji.trim() ? emoji : '📄',
406
+ sourceCount: 0,
407
+ };
408
+ this.logDebug(`Extracted notebook (pattern 2 - rare case): ${project.title} (${possibleId}) with 0 sources`);
409
+ projects.push(project);
410
+ }
411
+ else {
412
+ this.logDebug(`Skipping item: doesn't match notebook pattern (title=${typeof title}, sourcesOrId=${typeof sourcesOrId}, possibleId=${typeof possibleId})`);
413
+ }
414
+ }
415
+ }
416
+ // If no projects found, return empty array (valid empty list)
417
+ return projects;
418
+ }
419
+ /**
420
+ * Parse as object format
421
+ */
422
+ parseAsObject(data) {
423
+ const projectMap = JSON.parse(data);
424
+ const projects = [];
425
+ for (const [key, value] of Object.entries(projectMap)) {
426
+ if (this.isUUIDLike(key)) {
427
+ const proj = {
428
+ projectId: key,
429
+ title: '',
430
+ emoji: '📄',
431
+ };
432
+ if (typeof value === 'object' && value !== null) {
433
+ const objValue = value;
434
+ proj.title = objValue.title || objValue.name || `Project ${key.substring(0, 8)}`;
435
+ if (objValue.emoji) {
436
+ proj.emoji = objValue.emoji;
437
+ }
438
+ }
439
+ projects.push(proj);
440
+ }
441
+ }
442
+ if (projects.length === 0) {
443
+ throw new Error('No projects found in object format');
444
+ }
445
+ return projects;
446
+ }
447
+ /**
448
+ * Parse using regex patterns
449
+ */
450
+ parseWithRegex() {
451
+ // Find wrb.fr section (supports hT54vc, wXbhsf, and ozz5Z RPC IDs)
452
+ const wrbfrPattern = /\[\["wrb\.fr","(?:hT54vc|wXbhsf|ozz5Z)","(.*?)",/;
453
+ const matches = this.cleanedData.match(wrbfrPattern);
454
+ if (!matches || matches.length < 2) {
455
+ throw new Error('Could not find project data section in response');
456
+ }
457
+ // Unescape
458
+ let projectDataStr = matches[1];
459
+ projectDataStr = projectDataStr.replace(/\\"/g, '"').replace(/\\\\/g, '\\');
460
+ this.logDebug(`Project data string (first 100 chars): ${projectDataStr.substring(0, 100)}`);
461
+ // Find projects
462
+ const projects = [];
463
+ const titlePattern = /\[\[\["([^"]+?)"/g;
464
+ let match;
465
+ while ((match = titlePattern.exec(projectDataStr)) !== null) {
466
+ const title = match[1];
467
+ if (!title)
468
+ continue;
469
+ // Look for project ID near title
470
+ const idPattern = new RegExp(`\\["${this.escapeRegex(title)}"[^\\]]*?,[^\\]]*?,"([a-zA-Z0-9-]+)"`);
471
+ const idMatch = projectDataStr.match(idPattern);
472
+ let projectId = '';
473
+ if (idMatch && idMatch[1]) {
474
+ projectId = idMatch[1];
475
+ }
476
+ else {
477
+ // Try to find UUID-like pattern nearby
478
+ const uuidPattern = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/;
479
+ const titleIndex = projectDataStr.indexOf(title);
480
+ if (titleIndex > 0) {
481
+ const searchEnd = Math.min(titleIndex + 500, projectDataStr.length);
482
+ const uuidMatch = projectDataStr.substring(titleIndex, searchEnd).match(uuidPattern);
483
+ if (uuidMatch) {
484
+ projectId = uuidMatch[0];
485
+ }
486
+ }
487
+ }
488
+ if (!projectId)
489
+ continue;
490
+ // Look for emoji
491
+ let emoji = '📄';
492
+ const projectIdIndex = projectDataStr.indexOf(projectId);
493
+ if (projectIdIndex > 0) {
494
+ const searchEnd = Math.min(projectIdIndex + 100, projectDataStr.length);
495
+ const emojiPattern = /"([^"]{1,5})"/g;
496
+ const emojiSection = projectDataStr.substring(projectIdIndex, searchEnd);
497
+ let emojiMatch;
498
+ while ((emojiMatch = emojiPattern.exec(emojiSection)) !== null) {
499
+ if (emojiMatch[1] && emojiMatch[1].length <= 2) {
500
+ emoji = emojiMatch[1];
501
+ break;
502
+ }
503
+ }
504
+ }
505
+ projects.push({ title, projectId, emoji });
506
+ }
507
+ if (projects.length === 0) {
508
+ throw new Error('No projects found using regex patterns');
509
+ }
510
+ return projects;
511
+ }
512
+ /**
513
+ * Parse using direct scanning
514
+ * NOTE: This is a fallback method and should use strict filtering to avoid including sources
515
+ */
516
+ parseDirectScan() {
517
+ // Find all UUID patterns
518
+ const uuidPattern = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/g;
519
+ const uuidMatches = this.cleanedData.match(uuidPattern) || [];
520
+ if (uuidMatches.length === 0) {
521
+ throw new Error('No UUID-like project IDs found in the response');
522
+ }
523
+ // Deduplicate
524
+ const uniqueIds = Array.from(new Set(uuidMatches));
525
+ const projects = [];
526
+ this.logDebug(`Direct scan: Found ${uniqueIds.length} unique UUIDs, applying strict filtering...`);
527
+ for (const id of uniqueIds) {
528
+ const project = {
529
+ projectId: id,
530
+ title: '',
531
+ emoji: '📄',
532
+ };
533
+ // Find title near ID
534
+ const idIndex = this.cleanedData.indexOf(id);
535
+ if (idIndex > 0) {
536
+ const beforeStart = Math.max(0, idIndex - 500);
537
+ const beforeText = this.cleanedData.substring(beforeStart, idIndex);
538
+ // Look for title in quotes
539
+ const titlePattern = /"([^"]{3,200})"/g;
540
+ const titleMatches = [];
541
+ let titleMatch;
542
+ while ((titleMatch = titlePattern.exec(beforeText)) !== null) {
543
+ if (titleMatch[1]) {
544
+ titleMatches.push(titleMatch[1]);
545
+ }
546
+ }
547
+ if (titleMatches.length > 0) {
548
+ project.title = titleMatches[titleMatches.length - 1]; // Closest to ID
549
+ }
550
+ // Look for emoji after ID
551
+ const afterEnd = Math.min(this.cleanedData.length, idIndex + 100);
552
+ const afterText = this.cleanedData.substring(idIndex, afterEnd);
553
+ const emojiPattern = /"([^"]{1,2})"/;
554
+ const emojiMatch = afterText.match(emojiPattern);
555
+ if (emojiMatch && emojiMatch[1]) {
556
+ project.emoji = emojiMatch[1];
557
+ }
558
+ }
559
+ if (!project.title) {
560
+ project.title = `Notebook ${id.substring(0, 8)}`;
561
+ }
562
+ // Apply the same strict filtering as parseProjectsArray Pattern 2
563
+ const titleStr = String(project.title).trim();
564
+ const looksLikeSource = !titleStr || // Empty title
565
+ titleStr.startsWith('http://') ||
566
+ titleStr.startsWith('https://') ||
567
+ /\.(pdf|png|jpg|jpeg|mp3|mp4|txt|doc|docx)$/i.test(titleStr) ||
568
+ titleStr.length > 200 || // Very long titles are likely sources
569
+ titleStr.length < 3 || // Very short titles are suspicious
570
+ /^[,\[\]]/.test(titleStr) || // Starts with JSON-like characters (malformed)
571
+ /\]\]/.test(titleStr) || // Contains closing brackets (malformed JSON)
572
+ /^\[null/.test(titleStr) || // Starts with [null (malformed JSON)
573
+ /null,/.test(titleStr) || // Contains null, (malformed JSON)
574
+ titleStr === `Notebook ${id.substring(0, 8)}`; // Generated title (no real title found)
575
+ if (looksLikeSource) {
576
+ this.logDebug(`Direct scan: Skipping source ${id}: title looks like a source (${titleStr.substring(0, 50)}...)`);
577
+ continue;
578
+ }
579
+ this.logDebug(`Direct scan: Accepting notebook ${id}: "${titleStr.substring(0, 50)}${titleStr.length > 50 ? '...' : ''}"`);
580
+ projects.push(project);
581
+ }
582
+ this.logDebug(`Direct scan: Filtered ${uniqueIds.length} UUIDs down to ${projects.length} notebooks`);
583
+ return projects;
584
+ }
585
+ // ========================================================================
586
+ // Helper methods
587
+ // ========================================================================
588
+ isNumeric(s) {
589
+ return /^\d+$/.test(s.trim());
590
+ }
591
+ isUUIDLike(s) {
592
+ return /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(s);
593
+ }
594
+ escapeRegex(str) {
595
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
596
+ }
597
+ logDebug(message) {
598
+ if (this.debug && typeof console !== 'undefined') {
599
+ console.log(`[ChunkedParser] ${message}`);
600
+ }
601
+ }
602
+ }
603
+ /**
604
+ * Create a chunked response parser
605
+ */
606
+ export function createChunkedParser(raw, debug = false) {
607
+ return new ChunkedResponseParser(raw, debug);
608
+ }
609
+ //# sourceMappingURL=chunked-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunked-parser.js","sourceRoot":"","sources":["../../../src/utils/chunked-parser.ts"],"names":[],"mappings":"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"}