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,559 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming client for NotebookLM chat
|
|
3
|
+
* Handles chunked streaming responses from GenerateFreeFormStreamed endpoint
|
|
4
|
+
*
|
|
5
|
+
* REWRITTEN VERSION with improved buffer draining logic
|
|
6
|
+
* ======================================================
|
|
7
|
+
*
|
|
8
|
+
* Key improvements:
|
|
9
|
+
* 1. Simplified buffer processing logic
|
|
10
|
+
* 2. More aggressive buffer draining after stream ends
|
|
11
|
+
* 3. Better handling of incomplete frames
|
|
12
|
+
* 4. Cleaner code structure with same interfaces
|
|
13
|
+
*
|
|
14
|
+
* CRITICAL FIXES MAINTAINED:
|
|
15
|
+
* ==========================
|
|
16
|
+
* 1. ✅ source-path parameter in URL
|
|
17
|
+
* 2. ✅ Single URL encoding (no double encoding)
|
|
18
|
+
* 3. ✅ notebookId as last parameter in request body
|
|
19
|
+
*
|
|
20
|
+
* Response Format:
|
|
21
|
+
* ----------------
|
|
22
|
+
* Chunks arrive in this format:
|
|
23
|
+
* <byte_count>
|
|
24
|
+
* [["wrb.fr", null, "<escaped_json>"]]
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Streaming client for NotebookLM chat
|
|
28
|
+
* Handles chunked streaming responses with improved buffer draining
|
|
29
|
+
*/
|
|
30
|
+
export class StreamingClient {
|
|
31
|
+
config;
|
|
32
|
+
requestCounter = 3114440;
|
|
33
|
+
buffer = '';
|
|
34
|
+
chunkCount = 0;
|
|
35
|
+
constructor(config) {
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.requestCounter = Math.floor(Math.random() * 9000) + 3114440;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Log message (disabled by default)
|
|
41
|
+
*/
|
|
42
|
+
log(_message) {
|
|
43
|
+
// Debug logging disabled
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Log error (disabled by default)
|
|
47
|
+
*/
|
|
48
|
+
logError(_message) {
|
|
49
|
+
// Debug logging disabled
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Reset parser state for new stream
|
|
53
|
+
*/
|
|
54
|
+
reset() {
|
|
55
|
+
this.buffer = '';
|
|
56
|
+
this.chunkCount = 0;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Stream a chat request
|
|
60
|
+
*
|
|
61
|
+
* @param notebookId - The notebook UUID
|
|
62
|
+
* @param prompt - User's question
|
|
63
|
+
* @param sourceIds - List of source IDs to query
|
|
64
|
+
* @param conversationId - Conversation UUID
|
|
65
|
+
* @param conversationHistory - Message history (always null)
|
|
66
|
+
* @param options - Streaming options
|
|
67
|
+
*/
|
|
68
|
+
async *streamChat(notebookId, prompt, sourceIds, conversationId, conversationHistory, options) {
|
|
69
|
+
const url = this.buildStreamingURL(notebookId);
|
|
70
|
+
const headers = this.buildHeaders();
|
|
71
|
+
const body = this.buildRequestBody(prompt, sourceIds, conversationId, conversationHistory, notebookId);
|
|
72
|
+
if (this.config.debug) {
|
|
73
|
+
const decodedBody = this.decodeRequestBody(body);
|
|
74
|
+
this.log('\n🌊 Streaming Chat Request:');
|
|
75
|
+
this.log('📝 URL: ' + url);
|
|
76
|
+
this.log('📝 Body length: ' + body.length + ' bytes');
|
|
77
|
+
this.log('\n📦 Request Body (decoded):');
|
|
78
|
+
this.log(JSON.stringify(decodedBody, null, 2));
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const response = await fetch(url, {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
headers,
|
|
84
|
+
body,
|
|
85
|
+
});
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
const errorText = await response.text();
|
|
88
|
+
throw new Error(`Streaming request failed: ${response.status} ${response.statusText}\n${errorText}`);
|
|
89
|
+
}
|
|
90
|
+
const reader = response.body?.getReader();
|
|
91
|
+
if (!reader) {
|
|
92
|
+
throw new Error('Response body is not readable');
|
|
93
|
+
}
|
|
94
|
+
const decoder = new TextDecoder();
|
|
95
|
+
this.reset();
|
|
96
|
+
let totalBytesReceived = 0;
|
|
97
|
+
let chunkIndex = 0;
|
|
98
|
+
if (this.config.debug) {
|
|
99
|
+
this.log('\n📥 Starting to receive response chunks...');
|
|
100
|
+
}
|
|
101
|
+
// Main streaming loop
|
|
102
|
+
while (true) {
|
|
103
|
+
const { done, value } = await reader.read();
|
|
104
|
+
if (done) {
|
|
105
|
+
if (this.config.debug && this.buffer.length > 0) {
|
|
106
|
+
this.log(`\n📥 Stream ended, buffer has ${this.buffer.length} bytes remaining`);
|
|
107
|
+
}
|
|
108
|
+
// Decode any remaining data from decoder
|
|
109
|
+
try {
|
|
110
|
+
const remainingDecoded = decoder.decode(undefined, { stream: false });
|
|
111
|
+
if (remainingDecoded) {
|
|
112
|
+
totalBytesReceived += remainingDecoded.length;
|
|
113
|
+
this.buffer += remainingDecoded;
|
|
114
|
+
if (this.config.debug) {
|
|
115
|
+
this.log(`📥 Decoded ${remainingDecoded.length} remaining bytes from decoder`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (decodeError) {
|
|
120
|
+
// Ignore decode errors
|
|
121
|
+
}
|
|
122
|
+
// ✅ CRITICAL: Aggressively drain ALL remaining buffer
|
|
123
|
+
// Keep processing until no more complete frames can be extracted
|
|
124
|
+
let drainIterations = 0;
|
|
125
|
+
const MAX_DRAIN_ITERATIONS = 100;
|
|
126
|
+
if (this.config.debug) {
|
|
127
|
+
this.log(`\n🔄 Starting aggressive buffer drain (buffer size: ${this.buffer.length} bytes)`);
|
|
128
|
+
}
|
|
129
|
+
while (drainIterations < MAX_DRAIN_ITERATIONS) {
|
|
130
|
+
const chunks = this.extractCompleteFrames();
|
|
131
|
+
if (chunks.length === 0) {
|
|
132
|
+
// No more complete frames found
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
if (this.config.debug) {
|
|
136
|
+
this.log(`🔄 Drain iteration ${drainIterations + 1}: extracted ${chunks.length} chunk(s)`);
|
|
137
|
+
}
|
|
138
|
+
for (const parsed of chunks) {
|
|
139
|
+
this.chunkCount++;
|
|
140
|
+
const streamChunk = this.createStreamChunk(parsed);
|
|
141
|
+
if (options?.onChunk) {
|
|
142
|
+
options.onChunk(streamChunk);
|
|
143
|
+
}
|
|
144
|
+
yield streamChunk;
|
|
145
|
+
}
|
|
146
|
+
drainIterations++;
|
|
147
|
+
}
|
|
148
|
+
if (this.config.debug) {
|
|
149
|
+
this.log(`\n✅ Buffer drain complete after ${drainIterations} iterations`);
|
|
150
|
+
this.log(` Final buffer size: ${this.buffer.length} bytes`);
|
|
151
|
+
if (this.buffer.length > 0) {
|
|
152
|
+
this.log(` Remaining buffer: ${this.buffer.substring(0, 200)}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
// Process incoming data
|
|
158
|
+
if (value && value.length > 0) {
|
|
159
|
+
const newData = decoder.decode(value, { stream: true });
|
|
160
|
+
totalBytesReceived += value.length;
|
|
161
|
+
this.buffer += newData;
|
|
162
|
+
if (this.config.debug) {
|
|
163
|
+
this.log(`\n📥 Received chunk #${++chunkIndex}: ${value.length} bytes (total: ${totalBytesReceived} bytes)`);
|
|
164
|
+
}
|
|
165
|
+
// Extract and yield complete frames from buffer
|
|
166
|
+
const chunks = this.extractCompleteFrames();
|
|
167
|
+
for (const parsed of chunks) {
|
|
168
|
+
this.chunkCount++;
|
|
169
|
+
const streamChunk = this.createStreamChunk(parsed);
|
|
170
|
+
if (this.config.debug) {
|
|
171
|
+
this.log(`\n📦 Parsed Chunk #${this.chunkCount}:`);
|
|
172
|
+
this.log(` Text Length: ${parsed.text?.length || 0}`);
|
|
173
|
+
this.log(` Citations: [${parsed.citations?.join(', ') || 'none'}]`);
|
|
174
|
+
}
|
|
175
|
+
if (options?.onChunk) {
|
|
176
|
+
options.onChunk(streamChunk);
|
|
177
|
+
}
|
|
178
|
+
yield streamChunk;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (this.config.debug) {
|
|
183
|
+
this.log(`\n✅ Stream complete: ${this.chunkCount} chunks received, ${totalBytesReceived} total bytes`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (this.config.debug) {
|
|
188
|
+
this.logError(`\n❌ Streaming Error: ${error}`);
|
|
189
|
+
}
|
|
190
|
+
throw error;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Extract all complete frames from buffer
|
|
195
|
+
* This is the core buffer processing logic - simplified and foolproof
|
|
196
|
+
*/
|
|
197
|
+
extractCompleteFrames() {
|
|
198
|
+
const frames = [];
|
|
199
|
+
// Remove XSSI prefix if present
|
|
200
|
+
if (this.buffer.startsWith(")]}'")) {
|
|
201
|
+
this.buffer = this.buffer.substring(4).trimStart();
|
|
202
|
+
}
|
|
203
|
+
// Keep extracting frames until buffer is exhausted
|
|
204
|
+
let iterations = 0;
|
|
205
|
+
const MAX_ITERATIONS = 1000;
|
|
206
|
+
while (this.buffer.length > 0 && iterations < MAX_ITERATIONS) {
|
|
207
|
+
iterations++;
|
|
208
|
+
// Trim leading whitespace
|
|
209
|
+
this.buffer = this.buffer.trimStart();
|
|
210
|
+
if (this.buffer.length === 0) {
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
// Look for byte count pattern: digits followed by newline
|
|
214
|
+
const byteCountMatch = this.buffer.match(/^(\d+)\n/);
|
|
215
|
+
if (!byteCountMatch) {
|
|
216
|
+
// No valid frame header at start - try to find next frame
|
|
217
|
+
const nextFrameMatch = this.buffer.match(/(\d+)\n\[\["wrb\.fr"/);
|
|
218
|
+
if (nextFrameMatch && nextFrameMatch.index !== undefined && nextFrameMatch.index > 0) {
|
|
219
|
+
// Skip invalid content before next frame
|
|
220
|
+
if (this.config.debug) {
|
|
221
|
+
this.log(`⚠️ Skipping ${nextFrameMatch.index} bytes of invalid content`);
|
|
222
|
+
}
|
|
223
|
+
this.buffer = this.buffer.substring(nextFrameMatch.index);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
// No more frames found
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const byteCount = parseInt(byteCountMatch[1], 10);
|
|
232
|
+
const headerLength = byteCountMatch[0].length;
|
|
233
|
+
const requiredLength = headerLength + byteCount;
|
|
234
|
+
// Check if we have the complete frame
|
|
235
|
+
if (this.buffer.length < requiredLength) {
|
|
236
|
+
// Incomplete frame - wait for more data
|
|
237
|
+
if (this.config.debug) {
|
|
238
|
+
this.log(`⏳ Incomplete frame: need ${requiredLength} bytes, have ${this.buffer.length} bytes`);
|
|
239
|
+
}
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
// Extract the complete frame
|
|
243
|
+
const frameText = this.buffer.substring(headerLength, requiredLength);
|
|
244
|
+
// Parse the frame
|
|
245
|
+
try {
|
|
246
|
+
const parsed = this.parseFrame(byteCount, frameText);
|
|
247
|
+
if (parsed) {
|
|
248
|
+
frames.push(parsed);
|
|
249
|
+
if (this.config.debug) {
|
|
250
|
+
this.log(`✅ Parsed frame: ${parsed.text?.length || 0} chars`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
// Incomplete frame (incremental update) - skip it
|
|
255
|
+
if (this.config.debug) {
|
|
256
|
+
this.log(`⏭️ Skipping incomplete frame (${byteCount} bytes)`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
// Parsing error - log and continue
|
|
262
|
+
if (this.config.debug) {
|
|
263
|
+
this.logError(`❌ Error parsing frame: ${error}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
// ALWAYS remove the frame from buffer (even if parsing failed)
|
|
267
|
+
this.buffer = this.buffer.substring(requiredLength).trimStart();
|
|
268
|
+
}
|
|
269
|
+
return frames;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Parse a single frame
|
|
273
|
+
* Returns null for incomplete frames (incremental updates)
|
|
274
|
+
*/
|
|
275
|
+
parseFrame(byteCount, frameText) {
|
|
276
|
+
try {
|
|
277
|
+
// Trim trailing whitespace
|
|
278
|
+
let jsonText = frameText.trimEnd();
|
|
279
|
+
// Try to find valid JSON by removing trailing protocol markers
|
|
280
|
+
try {
|
|
281
|
+
JSON.parse(jsonText);
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
// Try removing trailing digits/whitespace (protocol markers)
|
|
285
|
+
let testText = jsonText;
|
|
286
|
+
let foundValid = false;
|
|
287
|
+
for (let i = 0; i < 10 && testText.length > 0; i++) {
|
|
288
|
+
const lastChar = testText[testText.length - 1];
|
|
289
|
+
if (/[\d\n\r\s]/.test(lastChar)) {
|
|
290
|
+
testText = testText.slice(0, -1);
|
|
291
|
+
try {
|
|
292
|
+
JSON.parse(testText);
|
|
293
|
+
jsonText = testText;
|
|
294
|
+
foundValid = true;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Continue
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (!foundValid) {
|
|
306
|
+
// Check if it's an incomplete frame
|
|
307
|
+
if (e instanceof SyntaxError &&
|
|
308
|
+
(e.message.includes('Unterminated string') ||
|
|
309
|
+
e.message.includes('Unexpected non-whitespace'))) {
|
|
310
|
+
return null; // Skip incomplete frame
|
|
311
|
+
}
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Parse outer wrapper: [["wrb.fr", null, "<escaped_json>"]]
|
|
316
|
+
const outerParsed = JSON.parse(jsonText);
|
|
317
|
+
if (!Array.isArray(outerParsed) || outerParsed.length === 0) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const wrbFrame = outerParsed[0];
|
|
321
|
+
if (!Array.isArray(wrbFrame) || wrbFrame[0] !== 'wrb.fr') {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
// Extract escaped JSON
|
|
325
|
+
const escapedJson = wrbFrame[2];
|
|
326
|
+
if (typeof escapedJson !== 'string') {
|
|
327
|
+
// Check for error frames
|
|
328
|
+
if (wrbFrame.length > 5 && Array.isArray(wrbFrame[5]) && wrbFrame[5].length > 0) {
|
|
329
|
+
return {
|
|
330
|
+
byteCount,
|
|
331
|
+
text: '',
|
|
332
|
+
thinking: [],
|
|
333
|
+
response: '',
|
|
334
|
+
isError: true,
|
|
335
|
+
errorCode: wrbFrame[5][0],
|
|
336
|
+
citations: [],
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
// Parse inner JSON
|
|
342
|
+
let innerData;
|
|
343
|
+
try {
|
|
344
|
+
innerData = JSON.parse(escapedJson);
|
|
345
|
+
}
|
|
346
|
+
catch (parseError) {
|
|
347
|
+
if (parseError instanceof SyntaxError &&
|
|
348
|
+
(parseError.message.includes('Unterminated string') ||
|
|
349
|
+
parseError.message.includes('Unexpected non-whitespace'))) {
|
|
350
|
+
return null; // Skip incomplete frame
|
|
351
|
+
}
|
|
352
|
+
throw parseError;
|
|
353
|
+
}
|
|
354
|
+
if (!Array.isArray(innerData) || innerData.length === 0) {
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
// Extract data
|
|
358
|
+
const dataArray = innerData[0];
|
|
359
|
+
if (!Array.isArray(dataArray) || dataArray.length === 0) {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
// Extract text (full accumulated text)
|
|
363
|
+
let text = dataArray[0] || '';
|
|
364
|
+
if (typeof text !== 'string') {
|
|
365
|
+
text = text === null || text === undefined ? '' : String(text);
|
|
366
|
+
}
|
|
367
|
+
const metadata = dataArray[2];
|
|
368
|
+
const formatting = dataArray[4];
|
|
369
|
+
const statusCode = dataArray[8];
|
|
370
|
+
// Extract metadata
|
|
371
|
+
let conversationId;
|
|
372
|
+
let messageId;
|
|
373
|
+
let timestamp;
|
|
374
|
+
if (Array.isArray(metadata) && metadata.length >= 3) {
|
|
375
|
+
conversationId = metadata[0];
|
|
376
|
+
messageId = metadata[1];
|
|
377
|
+
timestamp = metadata[2];
|
|
378
|
+
}
|
|
379
|
+
// Extract thinking headers (**Header**)
|
|
380
|
+
const thinking = [];
|
|
381
|
+
const thinkingMatches = text.match(/\*\*([^*]+)\*\*/g);
|
|
382
|
+
if (thinkingMatches) {
|
|
383
|
+
for (const match of thinkingMatches) {
|
|
384
|
+
thinking.push(match.slice(2, -2).trim());
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// Extract response (non-bold text)
|
|
388
|
+
const response = text.replace(/\*\*[^*]+\*\*/g, '');
|
|
389
|
+
// Extract citations [1], [2], etc.
|
|
390
|
+
const citations = [];
|
|
391
|
+
const citationMatches = text.match(/\[(\d+)\]/g);
|
|
392
|
+
if (citationMatches) {
|
|
393
|
+
for (const match of citationMatches) {
|
|
394
|
+
const num = parseInt(match.slice(1, -1), 10);
|
|
395
|
+
if (!citations.includes(num)) {
|
|
396
|
+
citations.push(num);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return {
|
|
401
|
+
byteCount,
|
|
402
|
+
text,
|
|
403
|
+
thinking,
|
|
404
|
+
response,
|
|
405
|
+
metadata: conversationId && messageId && timestamp ? [conversationId, messageId, timestamp] : undefined,
|
|
406
|
+
messageIds: conversationId && messageId ? [conversationId, messageId] : undefined,
|
|
407
|
+
timestamp,
|
|
408
|
+
isThinking: thinking.length > 0,
|
|
409
|
+
isResponse: response.length > 0,
|
|
410
|
+
formatting,
|
|
411
|
+
citations: citations.length > 0 ? citations : undefined,
|
|
412
|
+
rawData: innerData,
|
|
413
|
+
isError: statusCode === 4 || statusCode === 139,
|
|
414
|
+
errorCode: statusCode,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
// Check for incomplete frame
|
|
419
|
+
if (error instanceof SyntaxError &&
|
|
420
|
+
(error.message.includes('Unterminated string') ||
|
|
421
|
+
error.message.includes('Unexpected non-whitespace'))) {
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
if (this.config.debug) {
|
|
425
|
+
this.logError(`Error parsing frame: ${error}`);
|
|
426
|
+
}
|
|
427
|
+
throw error;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Create StreamChunk from ParsedChunk
|
|
432
|
+
*/
|
|
433
|
+
createStreamChunk(parsed) {
|
|
434
|
+
return {
|
|
435
|
+
chunkNumber: this.chunkCount,
|
|
436
|
+
byteCount: parsed.byteCount,
|
|
437
|
+
text: parsed.text || '',
|
|
438
|
+
thinking: parsed.thinking || [],
|
|
439
|
+
response: parsed.response || '',
|
|
440
|
+
metadata: parsed.metadata,
|
|
441
|
+
messageIds: parsed.messageIds,
|
|
442
|
+
timestamp: parsed.timestamp,
|
|
443
|
+
isThinking: parsed.isThinking,
|
|
444
|
+
isResponse: parsed.isResponse,
|
|
445
|
+
formatting: parsed.formatting,
|
|
446
|
+
citations: parsed.citations || [],
|
|
447
|
+
rawData: parsed.rawData,
|
|
448
|
+
isError: parsed.isError,
|
|
449
|
+
errorCode: parsed.errorCode,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Build streaming URL
|
|
454
|
+
*/
|
|
455
|
+
buildStreamingURL(notebookId) {
|
|
456
|
+
this.requestCounter++;
|
|
457
|
+
const batchClient = this.config.batchClient;
|
|
458
|
+
// Default fSid value (fallback if not provided via config)
|
|
459
|
+
// This is a public constant used by Google's streaming API
|
|
460
|
+
let fSid = '-7958112141384765164';
|
|
461
|
+
if (batchClient?.config?.urlParams?.['f.sid']) {
|
|
462
|
+
fSid = batchClient.config.urlParams['f.sid'];
|
|
463
|
+
}
|
|
464
|
+
else if (this.config.urlParams?.['f.sid']) {
|
|
465
|
+
fSid = this.config.urlParams['f.sid'];
|
|
466
|
+
}
|
|
467
|
+
const sourcePath = `/notebook/${notebookId}`;
|
|
468
|
+
const params = new URLSearchParams({
|
|
469
|
+
bl: 'boq_labs-tailwind-frontend_20260101.17_p0',
|
|
470
|
+
'f.sid': fSid,
|
|
471
|
+
hl: 'en',
|
|
472
|
+
authuser: this.config.authUser || '0',
|
|
473
|
+
pageId: 'none',
|
|
474
|
+
_reqid: this.requestCounter.toString(),
|
|
475
|
+
rt: 'c',
|
|
476
|
+
'source-path': sourcePath,
|
|
477
|
+
});
|
|
478
|
+
return `https://notebooklm.google.com/_/LabsTailwindUi/data/google.internal.labs.tailwind.orchestration.v1.LabsTailwindOrchestrationService/GenerateFreeFormStreamed?${params.toString()}`;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Build request headers
|
|
482
|
+
*/
|
|
483
|
+
buildHeaders() {
|
|
484
|
+
return {
|
|
485
|
+
'accept': '*/*',
|
|
486
|
+
'accept-language': 'en-US,en;q=0.9',
|
|
487
|
+
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
|
488
|
+
'origin': 'https://notebooklm.google.com',
|
|
489
|
+
'referer': 'https://notebooklm.google.com/',
|
|
490
|
+
'sec-fetch-dest': 'empty',
|
|
491
|
+
'sec-fetch-mode': 'cors',
|
|
492
|
+
'sec-fetch-site': 'same-origin',
|
|
493
|
+
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
|
|
494
|
+
'x-goog-ext-353267353-jspb': '[null,null,null,282611]',
|
|
495
|
+
'x-same-domain': '1',
|
|
496
|
+
'cookie': this.config.cookies,
|
|
497
|
+
...this.config.headers,
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Build request body
|
|
502
|
+
*/
|
|
503
|
+
buildRequestBody(prompt, sourceIds, conversationId, conversationHistory, notebookId) {
|
|
504
|
+
const contextItems = [];
|
|
505
|
+
if (sourceIds && sourceIds.length > 0) {
|
|
506
|
+
for (const sourceId of sourceIds) {
|
|
507
|
+
contextItems.push([[sourceId]]);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
contextItems.push([[conversationId]]);
|
|
512
|
+
}
|
|
513
|
+
const innerRequest = [
|
|
514
|
+
contextItems,
|
|
515
|
+
prompt,
|
|
516
|
+
null,
|
|
517
|
+
[2, null, [1]],
|
|
518
|
+
notebookId,
|
|
519
|
+
];
|
|
520
|
+
const fReq = [null, JSON.stringify(innerRequest)];
|
|
521
|
+
const formData = new URLSearchParams();
|
|
522
|
+
formData.append('f.req', JSON.stringify(fReq));
|
|
523
|
+
formData.append('at', this.config.authToken);
|
|
524
|
+
return formData.toString();
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Decode request body for logging
|
|
528
|
+
*/
|
|
529
|
+
decodeRequestBody(body) {
|
|
530
|
+
try {
|
|
531
|
+
const params = new URLSearchParams(body);
|
|
532
|
+
const fReqStr = params.get('f.req');
|
|
533
|
+
if (fReqStr) {
|
|
534
|
+
const fReq = JSON.parse(fReqStr);
|
|
535
|
+
if (Array.isArray(fReq) && fReq.length >= 2 && typeof fReq[1] === 'string') {
|
|
536
|
+
const innerRequest = JSON.parse(fReq[1]);
|
|
537
|
+
return {
|
|
538
|
+
'f.req': fReq,
|
|
539
|
+
'at': params.get('at')?.substring(0, 20) + '...',
|
|
540
|
+
decoded: {
|
|
541
|
+
innerRequest: innerRequest,
|
|
542
|
+
contextItems: innerRequest[0],
|
|
543
|
+
prompt: innerRequest[1],
|
|
544
|
+
thirdParam: innerRequest[2],
|
|
545
|
+
metadata: innerRequest[3],
|
|
546
|
+
notebookId: innerRequest[4],
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
return { 'f.req': fReq, 'at': params.get('at')?.substring(0, 20) + '...' };
|
|
551
|
+
}
|
|
552
|
+
return { raw: body };
|
|
553
|
+
}
|
|
554
|
+
catch (error) {
|
|
555
|
+
return { error: 'Failed to decode', raw: body.substring(0, 500) };
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
//# sourceMappingURL=streaming-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-client.js","sourceRoot":"","sources":["../../../src/utils/streaming-client.ts"],"names":[],"mappings":"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"}
|