notebooklm-mcp-ultimate 2.2.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 +21 -0
- package/README.md +420 -0
- package/dist/api/batch-execute-client.d.ts +232 -0
- package/dist/api/batch-execute-client.d.ts.map +1 -0
- package/dist/api/batch-execute-client.js +672 -0
- package/dist/api/batch-execute-client.js.map +1 -0
- package/dist/api/content-types.d.ts +44 -0
- package/dist/api/content-types.d.ts.map +1 -0
- package/dist/api/content-types.js +89 -0
- package/dist/api/content-types.js.map +1 -0
- package/dist/api/csrf-manager.d.ts +94 -0
- package/dist/api/csrf-manager.d.ts.map +1 -0
- package/dist/api/csrf-manager.js +178 -0
- package/dist/api/csrf-manager.js.map +1 -0
- package/dist/api/index.d.ts +27 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +56 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/operation-poller.d.ts +67 -0
- package/dist/api/operation-poller.d.ts.map +1 -0
- package/dist/api/operation-poller.js +132 -0
- package/dist/api/operation-poller.js.map +1 -0
- package/dist/api/request-builder.d.ts +196 -0
- package/dist/api/request-builder.d.ts.map +1 -0
- package/dist/api/request-builder.js +371 -0
- package/dist/api/request-builder.js.map +1 -0
- package/dist/api/response-parser.d.ts +124 -0
- package/dist/api/response-parser.d.ts.map +1 -0
- package/dist/api/response-parser.js +595 -0
- package/dist/api/response-parser.js.map +1 -0
- package/dist/api/rpc-ids.d.ts +92 -0
- package/dist/api/rpc-ids.d.ts.map +1 -0
- package/dist/api/rpc-ids.js +138 -0
- package/dist/api/rpc-ids.js.map +1 -0
- package/dist/api/streaming-chat-client.d.ts +50 -0
- package/dist/api/streaming-chat-client.d.ts.map +1 -0
- package/dist/api/streaming-chat-client.js +198 -0
- package/dist/api/streaming-chat-client.js.map +1 -0
- package/dist/api/types.d.ts +318 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +22 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth/auth-manager.d.ts +163 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +1055 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/auth/cookie-store.d.ts +121 -0
- package/dist/auth/cookie-store.d.ts.map +1 -0
- package/dist/auth/cookie-store.js +283 -0
- package/dist/auth/cookie-store.js.map +1 -0
- package/dist/config.d.ts +89 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +217 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +439 -0
- package/dist/index.js.map +1 -0
- package/dist/library/notebook-library.d.ts +79 -0
- package/dist/library/notebook-library.d.ts.map +1 -0
- package/dist/library/notebook-library.js +296 -0
- package/dist/library/notebook-library.js.map +1 -0
- package/dist/library/types.d.ts +67 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +8 -0
- package/dist/library/types.js.map +1 -0
- package/dist/operations/content-operations.d.ts +78 -0
- package/dist/operations/content-operations.d.ts.map +1 -0
- package/dist/operations/content-operations.js +162 -0
- package/dist/operations/content-operations.js.map +1 -0
- package/dist/operations/hybrid-executor.d.ts +47 -0
- package/dist/operations/hybrid-executor.d.ts.map +1 -0
- package/dist/operations/hybrid-executor.js +114 -0
- package/dist/operations/hybrid-executor.js.map +1 -0
- package/dist/operations/notebook-crud-operations.d.ts +52 -0
- package/dist/operations/notebook-crud-operations.d.ts.map +1 -0
- package/dist/operations/notebook-crud-operations.js +248 -0
- package/dist/operations/notebook-crud-operations.js.map +1 -0
- package/dist/operations/research-operations.d.ts +42 -0
- package/dist/operations/research-operations.d.ts.map +1 -0
- package/dist/operations/research-operations.js +189 -0
- package/dist/operations/research-operations.js.map +1 -0
- package/dist/operations/source-operations.d.ts +59 -0
- package/dist/operations/source-operations.d.ts.map +1 -0
- package/dist/operations/source-operations.js +280 -0
- package/dist/operations/source-operations.js.map +1 -0
- package/dist/operations/studio-operations.d.ts +98 -0
- package/dist/operations/studio-operations.d.ts.map +1 -0
- package/dist/operations/studio-operations.js +309 -0
- package/dist/operations/studio-operations.js.map +1 -0
- package/dist/resources/resource-handlers.d.ts +22 -0
- package/dist/resources/resource-handlers.d.ts.map +1 -0
- package/dist/resources/resource-handlers.js +216 -0
- package/dist/resources/resource-handlers.js.map +1 -0
- package/dist/session/browser-session.d.ts +113 -0
- package/dist/session/browser-session.d.ts.map +1 -0
- package/dist/session/browser-session.js +670 -0
- package/dist/session/browser-session.js.map +1 -0
- package/dist/session/session-manager.d.ts +88 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +314 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/shared-context-manager.d.ts +107 -0
- package/dist/session/shared-context-manager.d.ts.map +1 -0
- package/dist/session/shared-context-manager.js +447 -0
- package/dist/session/shared-context-manager.js.map +1 -0
- package/dist/tools/definitions/ask-question.d.ts +8 -0
- package/dist/tools/definitions/ask-question.d.ts.map +1 -0
- package/dist/tools/definitions/ask-question.js +213 -0
- package/dist/tools/definitions/ask-question.js.map +1 -0
- package/dist/tools/definitions/content-generation.d.ts +52 -0
- package/dist/tools/definitions/content-generation.d.ts.map +1 -0
- package/dist/tools/definitions/content-generation.js +236 -0
- package/dist/tools/definitions/content-generation.js.map +1 -0
- package/dist/tools/definitions/notebook-crud.d.ts +9 -0
- package/dist/tools/definitions/notebook-crud.d.ts.map +1 -0
- package/dist/tools/definitions/notebook-crud.js +156 -0
- package/dist/tools/definitions/notebook-crud.js.map +1 -0
- package/dist/tools/definitions/notebook-management.d.ts +3 -0
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
- package/dist/tools/definitions/notebook-management.js +243 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -0
- package/dist/tools/definitions/research.d.ts +23 -0
- package/dist/tools/definitions/research.d.ts.map +1 -0
- package/dist/tools/definitions/research.js +108 -0
- package/dist/tools/definitions/research.js.map +1 -0
- package/dist/tools/definitions/session-management.d.ts +3 -0
- package/dist/tools/definitions/session-management.d.ts.map +1 -0
- package/dist/tools/definitions/session-management.js +41 -0
- package/dist/tools/definitions/session-management.js.map +1 -0
- package/dist/tools/definitions/source-management.d.ts +39 -0
- package/dist/tools/definitions/source-management.d.ts.map +1 -0
- package/dist/tools/definitions/source-management.js +224 -0
- package/dist/tools/definitions/source-management.js.map +1 -0
- package/dist/tools/definitions/studio.d.ts +36 -0
- package/dist/tools/definitions/studio.d.ts.map +1 -0
- package/dist/tools/definitions/studio.js +153 -0
- package/dist/tools/definitions/studio.js.map +1 -0
- package/dist/tools/definitions/system.d.ts +3 -0
- package/dist/tools/definitions/system.d.ts.map +1 -0
- package/dist/tools/definitions/system.js +143 -0
- package/dist/tools/definitions/system.js.map +1 -0
- package/dist/tools/definitions.d.ts +12 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +36 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers/content-handlers.d.ts +287 -0
- package/dist/tools/handlers/content-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/content-handlers.js +244 -0
- package/dist/tools/handlers/content-handlers.js.map +1 -0
- package/dist/tools/handlers/notebook-crud-handlers.d.ts +69 -0
- package/dist/tools/handlers/notebook-crud-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/notebook-crud-handlers.js +117 -0
- package/dist/tools/handlers/notebook-crud-handlers.js.map +1 -0
- package/dist/tools/handlers/research-handlers.d.ts +37 -0
- package/dist/tools/handlers/research-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/research-handlers.js +87 -0
- package/dist/tools/handlers/research-handlers.js.map +1 -0
- package/dist/tools/handlers/source-handlers.d.ts +52 -0
- package/dist/tools/handlers/source-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/source-handlers.js +177 -0
- package/dist/tools/handlers/source-handlers.js.map +1 -0
- package/dist/tools/handlers/studio-handlers.d.ts +125 -0
- package/dist/tools/handlers/studio-handlers.d.ts.map +1 -0
- package/dist/tools/handlers/studio-handlers.js +183 -0
- package/dist/tools/handlers/studio-handlers.js.map +1 -0
- package/dist/tools/handlers.d.ts +629 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +833 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +133 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +673 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/cli-handler.d.ts +16 -0
- package/dist/utils/cli-handler.d.ts.map +1 -0
- package/dist/utils/cli-handler.js +102 -0
- package/dist/utils/cli-handler.js.map +1 -0
- package/dist/utils/logger.d.ts +61 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/page-utils.d.ts +54 -0
- package/dist/utils/page-utils.d.ts.map +1 -0
- package/dist/utils/page-utils.js +405 -0
- package/dist/utils/page-utils.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +37 -0
- package/dist/utils/settings-manager.d.ts.map +1 -0
- package/dist/utils/settings-manager.js +120 -0
- package/dist/utils/settings-manager.js.map +1 -0
- package/dist/utils/stealth-utils.d.ts +135 -0
- package/dist/utils/stealth-utils.d.ts.map +1 -0
- package/dist/utils/stealth-utils.js +398 -0
- package/dist/utils/stealth-utils.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response Parser for NotebookLM batchexecute API
|
|
3
|
+
* PARSER VERSION: v3-fixed-unwrap (2026-03-21 15:05)
|
|
4
|
+
*
|
|
5
|
+
* Parses the specific response format used by Google's batchexecute endpoint.
|
|
6
|
+
* The format is a custom streaming protocol with multiple lines of JSON.
|
|
7
|
+
*
|
|
8
|
+
* Response format:
|
|
9
|
+
* )]}'\n
|
|
10
|
+
* [length]\n
|
|
11
|
+
* [[json_array]]\n
|
|
12
|
+
* [length]\n
|
|
13
|
+
* [[json_array]]\n
|
|
14
|
+
* ...
|
|
15
|
+
*
|
|
16
|
+
* Each JSON array contains response data for one or more RPC calls.
|
|
17
|
+
*/
|
|
18
|
+
import { log } from '../utils/logger.js';
|
|
19
|
+
/**
|
|
20
|
+
* Parse a batchexecute response
|
|
21
|
+
*
|
|
22
|
+
* @param responseText - Raw response text from the API
|
|
23
|
+
* @returns Parsed response with individual RPC results
|
|
24
|
+
*/
|
|
25
|
+
export function parseBatchExecuteResponse(responseText) {
|
|
26
|
+
const responses = new Map();
|
|
27
|
+
try {
|
|
28
|
+
// Remove the security prefix )]}' if present
|
|
29
|
+
let cleaned = responseText;
|
|
30
|
+
if (cleaned.startsWith(")]}'")) {
|
|
31
|
+
cleaned = cleaned.slice(4);
|
|
32
|
+
}
|
|
33
|
+
cleaned = cleaned.trim();
|
|
34
|
+
// Split into lines and try to parse each as JSON
|
|
35
|
+
// The format is: length\nJSON\nlength\nJSON\n...
|
|
36
|
+
// But length indicators can be unreliable after split, so we
|
|
37
|
+
// simply try to parse every non-numeric line as JSON.
|
|
38
|
+
const lines = cleaned.split('\n');
|
|
39
|
+
for (const line of lines) {
|
|
40
|
+
const trimmed = line.trim();
|
|
41
|
+
if (!trimmed)
|
|
42
|
+
continue;
|
|
43
|
+
// Skip pure numeric lines (length indicators)
|
|
44
|
+
if (/^\d+$/.test(trimmed))
|
|
45
|
+
continue;
|
|
46
|
+
// Try to parse as JSON
|
|
47
|
+
try {
|
|
48
|
+
const parsed = JSON.parse(trimmed);
|
|
49
|
+
processResponseChunk(parsed, responses);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Not valid JSON, skip
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
success: responses.size > 0,
|
|
57
|
+
responses,
|
|
58
|
+
rawResponse: responseText,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return {
|
|
63
|
+
success: false,
|
|
64
|
+
responses,
|
|
65
|
+
rawResponse: responseText,
|
|
66
|
+
error: `Parse error: ${error}`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Process a single response chunk
|
|
72
|
+
*
|
|
73
|
+
* @param data - Parsed JSON data
|
|
74
|
+
* @param responses - Map to store responses
|
|
75
|
+
*/
|
|
76
|
+
function processResponseChunk(data, responses) {
|
|
77
|
+
if (!Array.isArray(data)) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Response format varies:
|
|
81
|
+
// Single-wrapped: [["wrb.fr","rpcId","[data]",...], ["di",N], ...]
|
|
82
|
+
// Double-wrapped: [[["wrb.fr","rpcId","[data]",...], ["di",N], ...]]
|
|
83
|
+
// Detect by checking if data[0][0] is a string (single) or array (double)
|
|
84
|
+
const firstElement = data[0];
|
|
85
|
+
const items = Array.isArray(firstElement) && typeof firstElement[0] === 'string'
|
|
86
|
+
? data // single-wrapped: data itself contains the items
|
|
87
|
+
: (Array.isArray(firstElement) ? firstElement : data); // double-wrapped: unwrap one level
|
|
88
|
+
for (const item of items) {
|
|
89
|
+
if (!Array.isArray(item)) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// Check for the "wrb.fr" marker which indicates a response
|
|
93
|
+
if (item[0] === 'wrb.fr') {
|
|
94
|
+
const rpcId = item[1];
|
|
95
|
+
const responseJson = item[2];
|
|
96
|
+
if (typeof rpcId === 'string') {
|
|
97
|
+
try {
|
|
98
|
+
const responseData = typeof responseJson === 'string'
|
|
99
|
+
? JSON.parse(responseJson)
|
|
100
|
+
: responseJson;
|
|
101
|
+
responses.set(rpcId, {
|
|
102
|
+
success: true,
|
|
103
|
+
data: responseData,
|
|
104
|
+
rawData: item,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
responses.set(rpcId, {
|
|
109
|
+
success: true,
|
|
110
|
+
data: responseJson,
|
|
111
|
+
rawData: item,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Check for error responses
|
|
117
|
+
if (item[0] === 'er') {
|
|
118
|
+
const rpcId = item[1];
|
|
119
|
+
const errorInfo = item[2];
|
|
120
|
+
if (typeof rpcId === 'string') {
|
|
121
|
+
responses.set(rpcId, {
|
|
122
|
+
success: false,
|
|
123
|
+
error: `RPC error: ${JSON.stringify(errorInfo)}`,
|
|
124
|
+
rawData: item,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Check for di.dr (another response format)
|
|
129
|
+
if (item[0] === 'di' && Array.isArray(item[1])) {
|
|
130
|
+
// Direct response data
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Extract a specific response from a BatchExecuteResponse
|
|
136
|
+
*
|
|
137
|
+
* @param response - The batch response
|
|
138
|
+
* @param rpcId - The RPC ID to extract
|
|
139
|
+
* @returns The specific RPC response or undefined
|
|
140
|
+
*/
|
|
141
|
+
export function extractResponse(response, rpcId) {
|
|
142
|
+
return response.responses.get(rpcId);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get first successful response from a BatchExecuteResponse
|
|
146
|
+
*
|
|
147
|
+
* @param response - The batch response
|
|
148
|
+
* @returns First successful response or undefined
|
|
149
|
+
*/
|
|
150
|
+
export function getFirstSuccessfulResponse(response) {
|
|
151
|
+
for (const [, rpcResponse] of response.responses) {
|
|
152
|
+
if (rpcResponse.success) {
|
|
153
|
+
return rpcResponse;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
// ============================================================================
|
|
159
|
+
// Notebook Parsing
|
|
160
|
+
// ============================================================================
|
|
161
|
+
/**
|
|
162
|
+
* Parse notebook list response
|
|
163
|
+
*
|
|
164
|
+
* @param data - Raw response data
|
|
165
|
+
* @returns Array of notebooks
|
|
166
|
+
*/
|
|
167
|
+
export function parseNotebookList(data) {
|
|
168
|
+
const notebooks = [];
|
|
169
|
+
if (!Array.isArray(data)) {
|
|
170
|
+
return notebooks;
|
|
171
|
+
}
|
|
172
|
+
// Notebook list is typically in the first array element
|
|
173
|
+
const notebookArray = data[0];
|
|
174
|
+
if (!Array.isArray(notebookArray)) {
|
|
175
|
+
return notebooks;
|
|
176
|
+
}
|
|
177
|
+
for (const item of notebookArray) {
|
|
178
|
+
if (!Array.isArray(item)) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const notebook = parseNotebookItem(item);
|
|
182
|
+
if (notebook) {
|
|
183
|
+
notebooks.push(notebook);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return notebooks;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Parse a single notebook item from the response
|
|
190
|
+
*
|
|
191
|
+
* @param item - Raw notebook data array
|
|
192
|
+
* @returns Parsed notebook or null
|
|
193
|
+
*/
|
|
194
|
+
export function parseNotebookItem(item) {
|
|
195
|
+
try {
|
|
196
|
+
// Typical structure: [id, title, null, null, timestamp_created, timestamp_modified, ...]
|
|
197
|
+
const id = item[0];
|
|
198
|
+
const title = item[1] || 'Untitled notebook';
|
|
199
|
+
if (typeof id !== 'string') {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
const notebook = {
|
|
203
|
+
id,
|
|
204
|
+
title: String(title),
|
|
205
|
+
};
|
|
206
|
+
// Try to extract timestamps (positions may vary)
|
|
207
|
+
// They're typically in microseconds
|
|
208
|
+
if (typeof item[4] === 'number') {
|
|
209
|
+
notebook.createdAt = item[4];
|
|
210
|
+
}
|
|
211
|
+
if (typeof item[5] === 'number') {
|
|
212
|
+
notebook.modifiedAt = item[5];
|
|
213
|
+
}
|
|
214
|
+
// Try to find source count
|
|
215
|
+
for (let i = 6; i < item.length; i++) {
|
|
216
|
+
const element = item[i];
|
|
217
|
+
if (Array.isArray(element) && typeof element[0] === 'number') {
|
|
218
|
+
notebook.sourceCount = element[0];
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return notebook;
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Parse notebook creation response
|
|
230
|
+
*
|
|
231
|
+
* @param data - Raw response data
|
|
232
|
+
* @returns Created notebook ID or null
|
|
233
|
+
*/
|
|
234
|
+
export function parseCreateNotebookResponse(data) {
|
|
235
|
+
if (!Array.isArray(data)) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
// Notebook ID is at index 2 (index 0 is title, which can be empty string)
|
|
239
|
+
if (typeof data[2] === 'string' && data[2].length > 0) {
|
|
240
|
+
return data[2];
|
|
241
|
+
}
|
|
242
|
+
// Fallback: check index 0 if non-empty
|
|
243
|
+
if (typeof data[0] === 'string' && data[0].length > 0) {
|
|
244
|
+
return data[0];
|
|
245
|
+
}
|
|
246
|
+
// Fallback: nested array
|
|
247
|
+
if (Array.isArray(data[0]) && typeof data[0][0] === 'string') {
|
|
248
|
+
return data[0][0];
|
|
249
|
+
}
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
// ============================================================================
|
|
253
|
+
// Source Parsing
|
|
254
|
+
// ============================================================================
|
|
255
|
+
/**
|
|
256
|
+
* Parse source list response
|
|
257
|
+
*
|
|
258
|
+
* @param data - Raw response data
|
|
259
|
+
* @returns Array of sources
|
|
260
|
+
*/
|
|
261
|
+
export function parseSourceList(data) {
|
|
262
|
+
const sources = [];
|
|
263
|
+
if (!Array.isArray(data)) {
|
|
264
|
+
return sources;
|
|
265
|
+
}
|
|
266
|
+
// Sources are typically in the first array
|
|
267
|
+
const sourceArray = data[0];
|
|
268
|
+
if (!Array.isArray(sourceArray)) {
|
|
269
|
+
return sources;
|
|
270
|
+
}
|
|
271
|
+
for (const item of sourceArray) {
|
|
272
|
+
if (!Array.isArray(item)) {
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const source = parseSourceItem(item);
|
|
276
|
+
if (source) {
|
|
277
|
+
sources.push(source);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return sources;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Parse a single source item
|
|
284
|
+
*
|
|
285
|
+
* @param item - Raw source data array
|
|
286
|
+
* @returns Parsed source or null
|
|
287
|
+
*/
|
|
288
|
+
export function parseSourceItem(item) {
|
|
289
|
+
try {
|
|
290
|
+
const id = item[0];
|
|
291
|
+
const title = item[1] || item[2] || 'Untitled source';
|
|
292
|
+
if (typeof id !== 'string') {
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
// Determine source type from various indicators
|
|
296
|
+
let type = 'text';
|
|
297
|
+
let url;
|
|
298
|
+
// Check for URL-like content
|
|
299
|
+
for (const field of item) {
|
|
300
|
+
if (typeof field === 'string') {
|
|
301
|
+
if (field.startsWith('http://') || field.startsWith('https://')) {
|
|
302
|
+
url = field;
|
|
303
|
+
if (field.includes('youtube.com') || field.includes('youtu.be')) {
|
|
304
|
+
type = 'youtube';
|
|
305
|
+
}
|
|
306
|
+
else if (field.includes('drive.google.com')) {
|
|
307
|
+
type = 'drive';
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
type = 'url';
|
|
311
|
+
}
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Check for type indicators — use the FIRST numeric field after index 1 (the ID/title
|
|
317
|
+
// positions) and stop after the first match to avoid later numbers overwriting the type.
|
|
318
|
+
for (let i = 2; i < item.length; i++) {
|
|
319
|
+
const field = item[i];
|
|
320
|
+
if (typeof field === 'number' && field >= 1 && field <= 5) {
|
|
321
|
+
switch (field) {
|
|
322
|
+
case 1:
|
|
323
|
+
type = 'pdf';
|
|
324
|
+
break;
|
|
325
|
+
case 2:
|
|
326
|
+
type = 'url';
|
|
327
|
+
break;
|
|
328
|
+
case 3:
|
|
329
|
+
type = 'youtube';
|
|
330
|
+
break;
|
|
331
|
+
case 4:
|
|
332
|
+
type = 'drive';
|
|
333
|
+
break;
|
|
334
|
+
case 5:
|
|
335
|
+
type = 'text';
|
|
336
|
+
break;
|
|
337
|
+
}
|
|
338
|
+
break; // Use first match only — later numbers are not type codes
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Determine status
|
|
342
|
+
let status = 'ready';
|
|
343
|
+
// Check for status indicators (typically numeric codes)
|
|
344
|
+
for (const field of item) {
|
|
345
|
+
if (Array.isArray(field) && field.length > 0) {
|
|
346
|
+
const statusCode = field[0];
|
|
347
|
+
if (statusCode === 0 || statusCode === 1) {
|
|
348
|
+
status = 'processing';
|
|
349
|
+
}
|
|
350
|
+
else if (statusCode === 2) {
|
|
351
|
+
status = 'ready';
|
|
352
|
+
}
|
|
353
|
+
else if (statusCode === 3 || statusCode === -1) {
|
|
354
|
+
status = 'error';
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
const source = {
|
|
359
|
+
id,
|
|
360
|
+
title: String(title),
|
|
361
|
+
type,
|
|
362
|
+
url,
|
|
363
|
+
status,
|
|
364
|
+
};
|
|
365
|
+
return source;
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// ============================================================================
|
|
372
|
+
// Audio Parsing
|
|
373
|
+
// ============================================================================
|
|
374
|
+
/**
|
|
375
|
+
* Parse audio status response
|
|
376
|
+
*
|
|
377
|
+
* @param data - Raw response data
|
|
378
|
+
* @returns Audio overview status
|
|
379
|
+
*/
|
|
380
|
+
export function parseAudioStatus(data) {
|
|
381
|
+
const result = {
|
|
382
|
+
status: 'not_created',
|
|
383
|
+
};
|
|
384
|
+
if (!Array.isArray(data)) {
|
|
385
|
+
return result;
|
|
386
|
+
}
|
|
387
|
+
try {
|
|
388
|
+
// Check for audio ID
|
|
389
|
+
if (typeof data[0] === 'string' && data[0].length > 0) {
|
|
390
|
+
result.id = data[0];
|
|
391
|
+
result.status = 'ready';
|
|
392
|
+
}
|
|
393
|
+
// Check for status code
|
|
394
|
+
for (const field of data) {
|
|
395
|
+
if (typeof field === 'number') {
|
|
396
|
+
switch (field) {
|
|
397
|
+
case 0:
|
|
398
|
+
result.status = 'not_created';
|
|
399
|
+
break;
|
|
400
|
+
case 1:
|
|
401
|
+
result.status = 'generating';
|
|
402
|
+
break;
|
|
403
|
+
case 2:
|
|
404
|
+
result.status = 'ready';
|
|
405
|
+
break;
|
|
406
|
+
case 3:
|
|
407
|
+
result.status = 'error';
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// Check for audio URL
|
|
413
|
+
for (const field of data) {
|
|
414
|
+
if (typeof field === 'string' && field.includes('googleusercontent.com')) {
|
|
415
|
+
result.audioUrl = field;
|
|
416
|
+
result.status = 'ready';
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// Check for progress
|
|
420
|
+
for (const field of data) {
|
|
421
|
+
if (Array.isArray(field) && typeof field[0] === 'number') {
|
|
422
|
+
result.progress = field[0];
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// Check for duration
|
|
426
|
+
for (const field of data) {
|
|
427
|
+
if (typeof field === 'number' && field > 60 && field < 3600) {
|
|
428
|
+
// Likely duration in seconds
|
|
429
|
+
result.durationSeconds = field;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return result;
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
return result;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Parse audio download URL response
|
|
440
|
+
*
|
|
441
|
+
* @param data - Raw response data
|
|
442
|
+
* @returns Audio URL or null
|
|
443
|
+
*/
|
|
444
|
+
export function parseAudioURL(data) {
|
|
445
|
+
if (!Array.isArray(data)) {
|
|
446
|
+
return null;
|
|
447
|
+
}
|
|
448
|
+
// Search for URL in the response
|
|
449
|
+
const findUrl = (arr) => {
|
|
450
|
+
for (const item of arr) {
|
|
451
|
+
if (typeof item === 'string' && item.includes('googleusercontent.com')) {
|
|
452
|
+
return item;
|
|
453
|
+
}
|
|
454
|
+
if (Array.isArray(item)) {
|
|
455
|
+
const found = findUrl(item);
|
|
456
|
+
if (found)
|
|
457
|
+
return found;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return null;
|
|
461
|
+
};
|
|
462
|
+
return findUrl(data);
|
|
463
|
+
}
|
|
464
|
+
// ============================================================================
|
|
465
|
+
// Content Generation Parsing
|
|
466
|
+
// ============================================================================
|
|
467
|
+
/**
|
|
468
|
+
* Parse generated content response
|
|
469
|
+
*
|
|
470
|
+
* @param data - Raw response data
|
|
471
|
+
* @returns Generated content string or null
|
|
472
|
+
*/
|
|
473
|
+
export function parseGeneratedContent(data) {
|
|
474
|
+
if (!Array.isArray(data)) {
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
// Content is typically a long string in the response.
|
|
478
|
+
// Skip URLs and JSON-like strings that could be false positives.
|
|
479
|
+
const findContent = (arr) => {
|
|
480
|
+
for (const item of arr) {
|
|
481
|
+
if (typeof item === 'string' && item.length > 100) {
|
|
482
|
+
// Skip URLs and serialized JSON — not generated content
|
|
483
|
+
if (item.startsWith('http://') ||
|
|
484
|
+
item.startsWith('https://') ||
|
|
485
|
+
item.startsWith('{') ||
|
|
486
|
+
item.startsWith('[')) {
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
return item;
|
|
490
|
+
}
|
|
491
|
+
if (Array.isArray(item)) {
|
|
492
|
+
const found = findContent(item);
|
|
493
|
+
if (found)
|
|
494
|
+
return found;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return null;
|
|
498
|
+
};
|
|
499
|
+
return findContent(data);
|
|
500
|
+
}
|
|
501
|
+
// ============================================================================
|
|
502
|
+
// Q&A Parsing
|
|
503
|
+
// ============================================================================
|
|
504
|
+
/**
|
|
505
|
+
* Parse suggested questions response
|
|
506
|
+
*
|
|
507
|
+
* @param data - Raw response data
|
|
508
|
+
* @returns Array of suggested questions
|
|
509
|
+
*/
|
|
510
|
+
export function parseSuggestedQuestions(data) {
|
|
511
|
+
const questions = [];
|
|
512
|
+
if (!Array.isArray(data)) {
|
|
513
|
+
return questions;
|
|
514
|
+
}
|
|
515
|
+
const findQuestions = (arr) => {
|
|
516
|
+
for (const item of arr) {
|
|
517
|
+
if (typeof item === 'string' && item.endsWith('?') && item.length > 10) {
|
|
518
|
+
questions.push(item);
|
|
519
|
+
}
|
|
520
|
+
if (Array.isArray(item)) {
|
|
521
|
+
findQuestions(item);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
findQuestions(data);
|
|
526
|
+
return questions;
|
|
527
|
+
}
|
|
528
|
+
// ============================================================================
|
|
529
|
+
// Error Parsing
|
|
530
|
+
// ============================================================================
|
|
531
|
+
/**
|
|
532
|
+
* Check if response indicates an authentication error
|
|
533
|
+
*
|
|
534
|
+
* @param response - The batch response
|
|
535
|
+
* @returns True if auth error detected
|
|
536
|
+
*/
|
|
537
|
+
export function isAuthError(response) {
|
|
538
|
+
// Check raw response for auth-related errors using specific phrases only,
|
|
539
|
+
// not bare numeric codes like "401" which can appear in IDs or timestamps.
|
|
540
|
+
if (response.rawResponse) {
|
|
541
|
+
const raw = response.rawResponse.toLowerCase();
|
|
542
|
+
if (raw.includes('unauthorized') ||
|
|
543
|
+
raw.includes('login required') ||
|
|
544
|
+
raw.includes('not authenticated')) {
|
|
545
|
+
return true;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
// Check individual responses for errors
|
|
549
|
+
for (const [, rpcResponse] of response.responses) {
|
|
550
|
+
if (rpcResponse.error) {
|
|
551
|
+
const error = rpcResponse.error.toLowerCase();
|
|
552
|
+
if (error.includes('auth') ||
|
|
553
|
+
error.includes('login') ||
|
|
554
|
+
error.includes('permission')) {
|
|
555
|
+
return true;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
return false;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Check if response indicates a rate limit error
|
|
563
|
+
*
|
|
564
|
+
* @param response - The batch response
|
|
565
|
+
* @returns True if rate limited
|
|
566
|
+
*/
|
|
567
|
+
export function isRateLimited(response) {
|
|
568
|
+
// Use specific phrases only — not bare "429" which can match IDs or timestamps.
|
|
569
|
+
if (response.rawResponse) {
|
|
570
|
+
const raw = response.rawResponse.toLowerCase();
|
|
571
|
+
if (raw.includes('rate limit') ||
|
|
572
|
+
raw.includes('too many requests') ||
|
|
573
|
+
raw.includes('quota exceeded')) {
|
|
574
|
+
return true;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
return false;
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Log response for debugging
|
|
581
|
+
*
|
|
582
|
+
* @param response - The batch response
|
|
583
|
+
*/
|
|
584
|
+
export function logResponse(response) {
|
|
585
|
+
log.dim(`📥 Received response (success: ${response.success})`);
|
|
586
|
+
log.dim(` Responses: ${response.responses.size}`);
|
|
587
|
+
for (const [rpcId, rpcResponse] of response.responses) {
|
|
588
|
+
const status = rpcResponse.success ? '✓' : '✗';
|
|
589
|
+
log.dim(` ${status} ${rpcId}`);
|
|
590
|
+
if (rpcResponse.error) {
|
|
591
|
+
log.dim(` Error: ${rpcResponse.error}`);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=response-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-parser.js","sourceRoot":"","sources":["../../src/api/response-parser.ts"],"names":[],"mappings":"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"}
|