@m4ykeldev/notebooklm-mcp 0.1.22 → 0.1.23
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/dist/cli.js +21 -4
- package/dist/cli.js.map +1 -1
- package/package.json +4 -2
package/dist/cli.js
CHANGED
|
@@ -459,10 +459,19 @@ async function getDebuggerUrl(port) {
|
|
|
459
459
|
const maxRetries = 20;
|
|
460
460
|
for (let i = 0; i < maxRetries; i++) {
|
|
461
461
|
try {
|
|
462
|
-
const response = await fetch(`http://localhost:${port}/json/
|
|
462
|
+
const response = await fetch(`http://localhost:${port}/json/list`);
|
|
463
463
|
if (response.ok) {
|
|
464
464
|
const data = await response.json();
|
|
465
|
-
|
|
465
|
+
if (Array.isArray(data)) {
|
|
466
|
+
const notebookTab = data.find(
|
|
467
|
+
(target) => target?.type === "page" && typeof target?.url === "string" && target.url.startsWith(BASE_URL) && typeof target?.webSocketDebuggerUrl === "string"
|
|
468
|
+
);
|
|
469
|
+
if (notebookTab) return notebookTab.webSocketDebuggerUrl;
|
|
470
|
+
const firstPage = data.find(
|
|
471
|
+
(target) => target?.type === "page" && typeof target?.webSocketDebuggerUrl === "string"
|
|
472
|
+
);
|
|
473
|
+
if (firstPage) return firstPage.webSocketDebuggerUrl;
|
|
474
|
+
}
|
|
466
475
|
}
|
|
467
476
|
} catch {
|
|
468
477
|
}
|
|
@@ -480,7 +489,6 @@ async function launchChrome(headless) {
|
|
|
480
489
|
const userDataDir = join2(homedir2(), ".notebooklm-mcp", "chrome-profile");
|
|
481
490
|
mkdirSync2(userDataDir, { recursive: true });
|
|
482
491
|
const args = [
|
|
483
|
-
"%U",
|
|
484
492
|
`--remote-debugging-port=${CDP_PORT}`,
|
|
485
493
|
`--user-data-dir=${userDataDir}`,
|
|
486
494
|
"--no-first-run",
|
|
@@ -504,6 +512,7 @@ async function extractCookiesViaCDP(timeoutMs, showProgress) {
|
|
|
504
512
|
let messageId = 0;
|
|
505
513
|
let timer;
|
|
506
514
|
let globalTimeout;
|
|
515
|
+
let lastCdpError = null;
|
|
507
516
|
const cleanup = () => {
|
|
508
517
|
clearInterval(timer);
|
|
509
518
|
clearTimeout(globalTimeout);
|
|
@@ -516,7 +525,11 @@ async function extractCookiesViaCDP(timeoutMs, showProgress) {
|
|
|
516
525
|
};
|
|
517
526
|
globalTimeout = setTimeout(() => {
|
|
518
527
|
cleanup();
|
|
519
|
-
reject(
|
|
528
|
+
reject(
|
|
529
|
+
new Error(
|
|
530
|
+
lastCdpError ? `Authentication timed out after ${timeoutMs / 1e3}s (CDP error: ${lastCdpError}).` : `Authentication timed out after ${timeoutMs / 1e3}s.`
|
|
531
|
+
)
|
|
532
|
+
);
|
|
520
533
|
}, timeoutMs);
|
|
521
534
|
ws.on("open", () => {
|
|
522
535
|
send("Network.enable");
|
|
@@ -539,6 +552,10 @@ async function extractCookiesViaCDP(timeoutMs, showProgress) {
|
|
|
539
552
|
ws.on("message", (data) => {
|
|
540
553
|
try {
|
|
541
554
|
const response = JSON.parse(data.toString());
|
|
555
|
+
if (response.error) {
|
|
556
|
+
lastCdpError = response.error.message || JSON.stringify(response.error);
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
542
559
|
if (response.result && response.result.cookies) {
|
|
543
560
|
const cookies = {};
|
|
544
561
|
for (const c of response.result.cookies) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/constants.ts","../src/auth.ts","../src/browser-auth.ts","../src/client.ts","../src/tools/index.ts","../src/tools/auth.ts","../src/tools/query.ts","../src/tools/research.ts","../src/tools/notebook.ts","../src/tools/source.ts","../src/tools/studio.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runAuthFlow, runFileImport, showTokens } from \"./auth.js\";\nimport { runBrowserAuthFlow } from \"./browser-auth.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"notebooklm-mcp\")\n .description(\"MCP server for Google NotebookLM\")\n .version(\"0.1.22\");\n\nprogram\n .command(\"serve\")\n .description(\"Start the MCP server (stdio transport)\")\n .option(\"--debug\", \"Enable debug logging\")\n .option(\"--query-timeout <ms>\", \"Query timeout in milliseconds\", \"120000\")\n .action(async (opts) => {\n const queryTimeout = parseInt(opts.queryTimeout, 10);\n const server = createServer(queryTimeout);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n });\n\nprogram\n .command(\"auth\")\n .description(\"Authenticate with NotebookLM (automated Chrome integration)\")\n .option(\"--manual\", \"Use manual cookie copy-paste instead\")\n .option(\"--file <path>\", \"Import cookies from a file instead\")\n .option(\"--show-tokens\", \"Show cached token info (no secrets)\")\n .action(async (opts) => {\n if (opts.showTokens) {\n showTokens();\n return;\n }\n\n if (opts.file) {\n await runFileImport(opts.file);\n return;\n }\n\n if (opts.manual) {\n await runAuthFlow();\n return;\n }\n\n try {\n await runBrowserAuthFlow();\n } catch (error) {\n console.log(`\\n⚠️ Smart Authentication failed: ${(error as Error).message}`);\n console.log(\"Falling back to manual authentication flow...\\n\");\n await runAuthFlow();\n }\n });\n\n// Default command: serve (for npx compatibility)\nif (process.argv.length <= 2) {\n process.argv.push(\"serve\");\n}\n\nprogram.parse();\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"./client.js\";\nimport { loadTokens, saveTokens } from \"./auth.js\";\nimport type { AuthTokens, ToolResult } from \"./types.js\";\nimport { registerTools } from \"./tools/index.js\";\nimport { authTools } from \"./tools/auth.js\";\nimport { queryTools } from \"./tools/query.js\";\nimport { researchTools } from \"./tools/research.js\";\nimport { notebookTools } from \"./tools/notebook.js\";\nimport { sourceTools } from \"./tools/source.js\";\nimport { studioTools } from \"./tools/studio.js\";\nlet client: NotebookLMClient | null = null;\n\nfunction getClient(queryTimeout?: number): NotebookLMClient {\n if (!client) {\n const tokens = loadTokens();\n client = new NotebookLMClient(tokens, queryTimeout);\n }\n return client;\n}\n\nexport function createServer(queryTimeout?: number): McpServer {\n const server = new McpServer({\n name: \"notebooklm\",\n version: \"0.1.0\",\n });\n\n // ─── Refactored Tool Registration ─────────────────────\n \n registerTools(server, [\n ...notebookTools,\n ...sourceTools,\n ...studioTools,\n ...authTools,\n ...queryTools,\n ...researchTools,\n ], getClient, { \n queryTimeout,\n onClientReset: () => { client = null; }\n });\n\n return server;\n}\n","export class CodeMapper {\n private nameToCode: Map<string, number>;\n private codeToName: Map<number, string>;\n private unknownLabel: string;\n private displayNames: string[];\n\n constructor(mapping: Record<string, number>, unknownLabel = \"unknown\") {\n this.nameToCode = new Map(\n Object.entries(mapping).map(([k, v]) => [k.toLowerCase(), v]),\n );\n this.codeToName = new Map(\n Object.entries(mapping).map(([k, v]) => [v, k]),\n );\n this.unknownLabel = unknownLabel;\n this.displayNames = Object.keys(mapping).sort();\n }\n\n getCode(name: string): number {\n const code = this.nameToCode.get(name.toLowerCase());\n if (code === undefined) {\n throw new Error(\n `Invalid value \"${name}\". Valid options: ${this.optionsStr()}`,\n );\n }\n return code;\n }\n\n getName(code: number | null): string {\n if (code === null) return this.unknownLabel;\n return this.codeToName.get(code) ?? this.unknownLabel;\n }\n\n optionsStr(): string {\n return this.displayNames.join(\", \");\n }\n\n names(): string[] {\n return [...this.displayNames];\n }\n}\n\n// RPC IDs\nexport const RPC_IDS = {\n LIST_NOTEBOOKS: \"wXbhsf\",\n GET_NOTEBOOK: \"rLM1Ne\",\n CREATE_NOTEBOOK: \"CCqFvf\",\n RENAME_NOTEBOOK: \"s0tc2d\",\n DELETE_NOTEBOOK: \"WWINqb\",\n ADD_SOURCE: \"izAoDd\",\n GET_SOURCE: \"hizoJc\",\n CHECK_FRESHNESS: \"yR9Yof\",\n SYNC_DRIVE: \"FLmJqe\",\n DELETE_SOURCE: \"tGMBJ\",\n GET_CONVERSATIONS: \"hPTbtc\",\n PREFERENCES: \"hT54vc\",\n SUBSCRIPTION: \"ozz5Z\",\n SETTINGS: \"ZwVcOc\",\n GET_SUMMARY: \"VfAZjd\",\n GET_SOURCE_GUIDE: \"tr032e\",\n START_FAST_RESEARCH: \"Ljjv0c\",\n START_DEEP_RESEARCH: \"QA9ei\",\n POLL_RESEARCH: \"e3bVqc\",\n IMPORT_RESEARCH: \"LBwxtb\",\n CREATE_STUDIO: \"R7cb6c\",\n POLL_STUDIO: \"gArtLc\",\n DELETE_STUDIO: \"V5N4be\",\n GENERATE_MIND_MAP: \"yyryJe\",\n SAVE_MIND_MAP: \"CYK0Xb\",\n LIST_MIND_MAPS: \"cFji9\",\n DELETE_MIND_MAP: \"AH0mwd\",\n} as const;\n\n// Ownership\nexport const OWNERSHIP_MINE = 1;\nexport const OWNERSHIP_SHARED = 2;\n\n// Chat\nexport const CHAT_GOALS = new CodeMapper({\n default: 1,\n custom: 2,\n learning_guide: 3,\n});\n\nexport const CHAT_RESPONSE_LENGTHS = new CodeMapper({\n default: 1,\n longer: 4,\n shorter: 5,\n});\n\n// Research\nexport const RESEARCH_SOURCES = new CodeMapper({ web: 1, drive: 2 });\nexport const RESEARCH_MODES = new CodeMapper({ fast: 1, deep: 5 });\nexport const RESULT_TYPES = new CodeMapper({\n web: 1,\n google_doc: 2,\n google_slides: 3,\n deep_report: 5,\n google_sheets: 8,\n});\n\n// Source Types\nexport const SOURCE_TYPES = new CodeMapper({\n google_docs: 1,\n google_slides_sheets: 2,\n pdf: 3,\n pasted_text: 4,\n web_page: 5,\n generated_text: 8,\n youtube: 9,\n uploaded_file: 11,\n image: 13,\n word_doc: 14,\n});\n\n// Studio Types\nexport const STUDIO_TYPES = new CodeMapper({\n audio: 1,\n report: 2,\n video: 3,\n flashcards: 4,\n infographic: 7,\n slide_deck: 8,\n data_table: 9,\n});\n\n// Audio\nexport const AUDIO_FORMATS = new CodeMapper({\n deep_dive: 1,\n brief: 2,\n critique: 3,\n debate: 4,\n});\n\nexport const AUDIO_LENGTHS = new CodeMapper({\n short: 1,\n default: 2,\n long: 3,\n});\n\n// Video\nexport const VIDEO_FORMATS = new CodeMapper({ explainer: 1, brief: 2 });\n\nexport const VIDEO_STYLES = new CodeMapper({\n auto_select: 1,\n custom: 2,\n classic: 3,\n whiteboard: 4,\n kawaii: 5,\n anime: 6,\n watercolor: 7,\n retro_print: 8,\n heritage: 9,\n paper_craft: 10,\n});\n\n// Infographic\nexport const INFOGRAPHIC_ORIENTATIONS = new CodeMapper({\n landscape: 1,\n portrait: 2,\n square: 3,\n});\n\nexport const INFOGRAPHIC_DETAILS = new CodeMapper({\n concise: 1,\n standard: 2,\n detailed: 3,\n});\n\n// Slide Deck\nexport const SLIDE_DECK_FORMATS = new CodeMapper({\n detailed_deck: 1,\n presenter_slides: 2,\n});\n\nexport const SLIDE_DECK_LENGTHS = new CodeMapper({\n short: 1,\n default: 3,\n});\n\n// Flashcards/Quiz\nexport const FLASHCARD_DIFFICULTIES = new CodeMapper({\n easy: 1,\n medium: 2,\n hard: 3,\n});\n\nexport const FLASHCARD_COUNT_DEFAULT = 2;\n\n// Report Formats\nexport const REPORT_FORMATS: Record<\n string,\n { title: string; description: string; prompt: string }\n> = {\n \"Briefing Doc\": {\n title: \"Briefing Doc\",\n description: \"A comprehensive briefing document\",\n prompt: \"Create a briefing document\",\n },\n \"Study Guide\": {\n title: \"Study Guide\",\n description: \"A study guide for the material\",\n prompt: \"Create a study guide\",\n },\n \"Blog Post\": {\n title: \"Blog Post\",\n description: \"A blog post about the material\",\n prompt: \"Create a blog post\",\n },\n \"Create Your Own\": {\n title: \"Create Your Own\",\n description: \"Custom report format\",\n prompt: \"\",\n },\n};\n\n// Base URL\nexport const BASE_URL = \"https://notebooklm.google.com\";\nexport const BATCHEXECUTE_PATH = \"/_/LabsTailwindUi/data/batchexecute\";\nexport const QUERY_PATH =\n \"/_/LabsTailwindUi/data/google.internal.labs.tailwind.orchestration.v1.LabsTailwindOrchestrationService/GenerateFreeFormStreamed\";\n\nexport const DEFAULT_BL = \"boq_labs-tailwind-frontend_20260108.06_p0\";\n\nexport const REQUIRED_COOKIES = [\n \"SID\",\n \"HSID\",\n \"SSID\",\n \"APISID\",\n \"SAPISID\",\n];\n\nexport const USER_AGENT =\n \"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\";\n\nexport const DEFAULT_TIMEOUT = 30_000;\nexport const EXTENDED_TIMEOUT = 120_000;\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AuthTokens } from \"./types.js\";\nimport { REQUIRED_COOKIES, BASE_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".notebooklm-mcp\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\nconst CHROME_PROFILE = join(CONFIG_DIR, \"chrome-profile\");\n\nexport function validateCookies(cookies: Record<string, string>): boolean {\n return REQUIRED_COOKIES.every((name) => name in cookies);\n}\n\nexport function buildCookieHeader(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n\nexport function extractCsrfFromPage(html: string): string | null {\n const patterns = [\n /\"SNlM0e\":\"([^\"]+)\"/,\n /at=([^&\"]+)/,\n /\"FdrFJe\":\"([^\"]+)\"/,\n ];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function extractSessionIdFromPage(html: string): string | null {\n const patterns = [/\"FdrFJe\":\"([^\"]+)\"/, /f\\.sid=(\\d+)/];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function saveTokens(tokens: AuthTokens): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(AUTH_FILE, JSON.stringify(tokens, null, 2), \"utf-8\");\n}\n\nexport function loadTokensFromCache(): AuthTokens | null {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = JSON.parse(readFileSync(AUTH_FILE, \"utf-8\"));\n if (data.cookies && validateCookies(data.cookies)) {\n return {\n cookies: data.cookies,\n csrf_token: data.csrf_token || \"\",\n session_id: data.session_id || \"\",\n extracted_at: data.extracted_at || 0,\n };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function loadTokensFromEnv(): AuthTokens | null {\n const cookieStr = process.env.NOTEBOOKLM_COOKIES;\n if (!cookieStr) return null;\n\n const cookies: Record<string, string> = {};\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n\n if (!validateCookies(cookies)) return null;\n\n return {\n cookies,\n csrf_token: process.env.NOTEBOOKLM_CSRF_TOKEN || \"\",\n session_id: process.env.NOTEBOOKLM_SESSION_ID || \"\",\n extracted_at: Date.now() / 1000,\n };\n}\n\nexport function loadTokens(): AuthTokens {\n const fromEnv = loadTokensFromEnv();\n if (fromEnv) return fromEnv;\n\n const fromCache = loadTokensFromCache();\n if (fromCache) return fromCache;\n\n throw new Error(\n \"No authentication tokens found. Run `npx @m4ykeldev/notebooklm-mcp auth` to authenticate, \" +\n \"or set NOTEBOOKLM_COOKIES environment variable.\",\n );\n}\n\nfunction parseCookieString(raw: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n for (const part of trimmed.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n }\n return cookies;\n}\n\nexport async function runFileImport(filePath?: string): Promise<AuthTokens> {\n if (!filePath) {\n console.log(`\nTo authenticate via file:\n1. Open Chrome and navigate to https://notebooklm.google.com\n2. Open DevTools (F12) > Network tab\n3. Type \"batchexecute\" in the filter\n4. Click on any batchexecute request\n5. Find \"cookie:\" in Request Headers\n6. Copy the full cookie VALUE (not the header name)\n7. Save to a file and provide the path\n`);\n throw new Error(\"Provide a cookie file path with --file <path>\");\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const cookies = parseCookieString(raw);\n\n if (!validateCookies(cookies)) {\n throw new Error(\n `Missing required cookies. Need: ${REQUIRED_COOKIES.join(\", \")}`,\n );\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n console.log(\"Authentication tokens saved successfully.\");\n return tokens;\n}\n\nfunction readLineFromStdin(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(prompt, (answer: string) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction openInBrowser(url: string): void {\n const platform = process.platform;\n try {\n if (platform === \"linux\") {\n execSync(`xdg-open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"darwin\") {\n execSync(`open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"win32\") {\n execSync(`start \"\" \"${url}\"`, { stdio: \"ignore\" });\n }\n } catch {\n console.log(`Could not open browser automatically. Open this URL manually:\\n${url}`);\n }\n}\n\nexport async function runAuthFlow(): Promise<AuthTokens> {\n console.log(\"╔══════════════════════════════════════════════════════════╗\");\n console.log(\"║ NotebookLM MCP — Authentication Setup ║\");\n console.log(\"╚══════════════════════════════════════════════════════════╝\\n\");\n\n console.log(\"Opening NotebookLM in your browser...\\n\");\n openInBrowser(BASE_URL);\n\n console.log(\"Follow these steps:\\n\");\n console.log(\" 1. NotebookLM should open in your browser (you're already logged in)\");\n console.log(\" 2. Press F12 to open DevTools\");\n console.log(\" 3. Go to the Network tab\");\n console.log(\" 4. Type 'batchexecute' in the filter box\");\n console.log(\" 5. Click on any request that appears in the list\");\n console.log(\" 6. In the Headers panel, find 'cookie:' under Request Headers\");\n console.log(\" 7. Right-click the cookie value → Copy value\\n\");\n console.log(\" Tip: If no requests appear, refresh the page (F5) with DevTools open.\\n\");\n\n const cookieStr = await readLineFromStdin(\"Paste the cookie value here: \");\n\n if (!cookieStr) {\n throw new Error(\"No cookie string provided.\");\n }\n\n const cookies = parseCookieString(cookieStr);\n\n if (!validateCookies(cookies)) {\n console.log(\"\\n❌ Missing required cookies.\");\n console.log(` Need: ${REQUIRED_COOKIES.join(\", \")}`);\n console.log(` Got: ${Object.keys(cookies).join(\", \")}`);\n throw new Error(\"Invalid cookie string. Make sure you copied the full cookie value.\");\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n\n console.log(`\\n✅ Authentication saved successfully!`);\n console.log(` ${Object.keys(cookies).length} cookies extracted`);\n console.log(` Stored in: ~/.notebooklm-mcp/auth.json`);\n console.log(`\\n CSRF token and session ID will be auto-extracted on first use.`);\n\n return tokens;\n}\n\nexport function showTokens(): void {\n const tokens = loadTokensFromCache();\n if (!tokens) {\n console.log(\"No cached tokens found.\");\n return;\n }\n\n const cookieNames = Object.keys(tokens.cookies);\n const hasRequired = REQUIRED_COOKIES.every((c) => cookieNames.includes(c));\n const age = tokens.extracted_at\n ? Math.round((Date.now() / 1000 - tokens.extracted_at) / 3600)\n : \"unknown\";\n\n console.log(`Cached tokens:`);\n console.log(` Cookies: ${cookieNames.length} (${cookieNames.join(\", \")})`);\n console.log(` Required cookies present: ${hasRequired ? \"yes\" : \"NO\"}`);\n console.log(` CSRF token: ${tokens.csrf_token ? \"present\" : \"missing\"}`);\n console.log(` Session ID: ${tokens.session_id ? \"present\" : \"missing\"}`);\n console.log(` Age: ${age} hours`);\n console.log(` File: ${AUTH_FILE}`);\n}\n","import { execSync, spawn } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport WebSocket from \"ws\";\nimport type { AuthTokens } from \"./types.js\";\nimport { BASE_URL, REQUIRED_COOKIES } from \"./constants.js\";\nimport { validateCookies, saveTokens } from \"./auth.js\";\n\nconst CDP_PORT = 9229;\n\nexport function findChrome(): string | null {\n const candidates: string[] = [];\n\n if (process.platform === \"darwin\") {\n candidates.push(\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n );\n } else if (process.platform === \"linux\") {\n candidates.push(\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium\",\n \"chromium-browser\",\n \"/usr/bin/google-chrome\",\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n );\n } else if (process.platform === \"win32\") {\n candidates.push(\n \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n \"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n `${process.env.LOCALAPPDATA}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n `${process.env.LOCALAPPDATA}\\\\Chromium\\\\Application\\\\chrome.exe`,\n );\n }\n\n for (const candidate of candidates) {\n try {\n const cmd =\n process.platform === \"win32\"\n ? `\"${candidate}\" --version`\n : `\"${candidate}\" --version`;\n execSync(cmd, { stdio: \"ignore\" });\n return candidate;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\nasync function getDebuggerUrl(port: number): Promise<string> {\n const maxRetries = 20;\n for (let i = 0; i < maxRetries; i++) {\n try {\n const response = await fetch(`http://localhost:${port}/json/version`);\n if (response.ok) {\n const data = (await response.json()) as any;\n return data.webSocketDebuggerUrl;\n }\n } catch {\n // wait and retry\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new Error(\"Could not connect to Chrome remote debugging port.\");\n}\n\nexport async function launchChrome(headless: boolean) {\n const chromePath = findChrome();\n if (!chromePath) {\n throw new Error(\n \"Could not find Google Chrome or Chromium. Please use manual auth.\",\n );\n }\n\n const userDataDir = join(homedir(), \".notebooklm-mcp\", \"chrome-profile\");\n mkdirSync(userDataDir, { recursive: true });\n\n const args = [\n \"%U\",\n `--remote-debugging-port=${CDP_PORT}`,\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n BASE_URL,\n ];\n\n if (headless) {\n args.push(\"--headless=new\");\n }\n\n const chromeProcess = spawn(chromePath, args, {\n detached: true,\n stdio: \"ignore\",\n });\n chromeProcess.unref();\n return chromeProcess;\n}\n\nasync function extractCookiesViaCDP(\n timeoutMs: number,\n showProgress: boolean,\n): Promise<AuthTokens> {\n const wsUrl = await getDebuggerUrl(CDP_PORT);\n const ws = new WebSocket(wsUrl);\n\n return new Promise((resolve, reject) => {\n let messageId = 0;\n let timer: NodeJS.Timeout;\n let globalTimeout: NodeJS.Timeout;\n\n const cleanup = () => {\n clearInterval(timer);\n clearTimeout(globalTimeout);\n ws.close();\n };\n\n const send = (method: string, params: any = {}) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ id: ++messageId, method, params }));\n }\n };\n\n globalTimeout = setTimeout(() => {\n cleanup();\n reject(new Error(`Authentication timed out after ${timeoutMs / 1000}s.`));\n }, timeoutMs);\n\n ws.on(\"open\", () => {\n send(\"Network.enable\");\n timer = setInterval(() => {\n send(\"Network.getCookies\", { urls: [BASE_URL, \"https://google.com\"] });\n }, 2000);\n });\n\n ws.on(\"close\", () => {\n cleanup();\n reject(\n new Error(\n \"Browser connection closed before authentication was complete.\",\n ),\n );\n });\n\n ws.on(\"error\", (err) => {\n cleanup();\n reject(err);\n });\n\n ws.on(\"message\", (data) => {\n try {\n const response = JSON.parse(data.toString());\n if (response.result && response.result.cookies) {\n const cookies: Record<string, string> = {};\n for (const c of response.result.cookies) {\n cookies[c.name] = c.value;\n }\n\n if (validateCookies(cookies)) {\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n cleanup();\n resolve(tokens);\n } else if (showProgress) {\n process.stdout.write(\".\");\n }\n }\n } catch (e) {\n // ignore parse errors\n }\n });\n });\n}\n\nexport async function refreshCookiesHeadless(): Promise<AuthTokens> {\n console.log(\"🔄 Attempting background session refresh...\");\n const chromeProcess = await launchChrome(true);\n\n try {\n const tokens = await extractCookiesViaCDP(15000, false);\n console.log(\"✅ Background refresh successful.\");\n return tokens;\n } catch (error) {\n throw error;\n } finally {\n // Kill the headless process when done\n chromeProcess.kill();\n }\n}\n\nexport async function runBrowserAuthFlow(): Promise<AuthTokens> {\n console.log(\"✨ Initializing Smart Authentication... (Setting up a secure session)\");\n console.log(\n \" (A dedicated profile will be used at ~/.notebooklm-mcp/chrome-profile)\",\n );\n\n const chromeProcess = await launchChrome(false);\n\n try {\n console.log(\"\\n🔓 Ready for login! If you're already signed into Google, we'll handle the rest automatically.\\n\");\n\n const tokens = await extractCookiesViaCDP(120000, true);\n console.log(\"\\n✅ Connection secured! Your NotebookLM session is now synchronized.\");\n return tokens;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Smart Auth failed: ${error.message}\\nTry manual auth instead.`,\n );\n }\n throw error;\n } finally {\n chromeProcess.kill();\n }\n}\n","import type {\n AuthTokens,\n Notebook,\n SourceSummary,\n SourceDetail,\n ResearchResult,\n ResearchSource,\n StudioArtifact,\n QueryResponse,\n} from \"./types.js\";\nimport {\n RPC_IDS,\n BASE_URL,\n BATCHEXECUTE_PATH,\n QUERY_PATH,\n DEFAULT_BL,\n USER_AGENT,\n DEFAULT_TIMEOUT,\n EXTENDED_TIMEOUT,\n OWNERSHIP_MINE,\n SOURCE_TYPES,\n RESULT_TYPES,\n RESEARCH_SOURCES,\n RESEARCH_MODES,\n STUDIO_TYPES,\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n CHAT_GOALS,\n CHAT_RESPONSE_LENGTHS,\n} from \"./constants.js\";\nimport {\n buildCookieHeader,\n extractCsrfFromPage,\n extractSessionIdFromPage,\n saveTokens,\n} from \"./auth.js\";\nimport { refreshCookiesHeadless, runBrowserAuthFlow } from \"./browser-auth.js\";\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotebookLMClient {\n private tokens: AuthTokens;\n private csrfToken: string;\n private sessionId: string;\n private conversationHistory: Map<string, unknown[]> = new Map();\n private queryTimeout: number;\n private reqId = 0;\n\n constructor(tokens: AuthTokens, queryTimeout?: number) {\n this.tokens = tokens;\n this.csrfToken = tokens.csrf_token;\n this.sessionId = tokens.session_id;\n this.queryTimeout = queryTimeout ?? EXTENDED_TIMEOUT;\n }\n\n // ─── Core HTTP/RPC ───────────────────────────────────\n\n private buildRequestBody(rpcId: string, params: unknown): string {\n const paramsJson = JSON.stringify(params);\n const fReq = JSON.stringify([[[rpcId, paramsJson, null, \"generic\"]]]);\n const parts = [`f.req=${encodeURIComponent(fReq)}`];\n if (this.csrfToken) {\n parts.push(`at=${encodeURIComponent(this.csrfToken)}`);\n }\n return parts.join(\"&\") + \"&\";\n }\n\n private buildUrl(rpcId: string, sourcePath = \"/\"): string {\n const params: Record<string, string> = {\n rpcids: rpcId,\n \"source-path\": sourcePath,\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${BATCHEXECUTE_PATH}?${query}`;\n }\n\n private buildQueryUrl(sourcePath = \"/\"): string {\n this.reqId++;\n const params: Record<string, string> = {\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n _reqid: String(this.reqId),\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${QUERY_PATH}?${query}`;\n }\n\n private parseResponse(responseText: string): unknown[] {\n let text = responseText;\n if (text.startsWith(\")]}'\")) {\n text = text.slice(4);\n }\n\n const lines = text.trim().split(\"\\n\");\n const results: unknown[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i].trim();\n if (!line) {\n i++;\n continue;\n }\n\n const maybeByteCount = parseInt(line, 10);\n if (!isNaN(maybeByteCount) && String(maybeByteCount) === line) {\n i++;\n if (i < lines.length) {\n try {\n results.push(JSON.parse(lines[i]));\n } catch {\n // skip unparseable\n }\n i++;\n }\n } else {\n try {\n results.push(JSON.parse(line));\n } catch {\n // skip\n }\n i++;\n }\n }\n\n return results;\n }\n\n private extractRpcResult(parsed: unknown[], rpcId: string): unknown {\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\" && item[1] === rpcId) {\n // Check for auth error (code 16)\n if (\n item.length > 6 &&\n item[6] === \"generic\" &&\n Array.isArray(item[5]) &&\n item[5].includes(16)\n ) {\n throw new AuthenticationError(\n \"Authentication expired. Run `npx @m4ykeldev/notebooklm-mcp auth` to re-authenticate.\",\n );\n }\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n return JSON.parse(resultStr);\n } catch {\n return resultStr;\n }\n }\n return resultStr;\n }\n }\n }\n return null;\n }\n\n private async execute(\n rpcId: string,\n params: unknown,\n sourcePath = \"/\",\n timeout = DEFAULT_TIMEOUT,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n try {\n return this.extractRpcResult(parsed, rpcId);\n } catch (e) {\n if (e instanceof AuthenticationError) {\n console.log(\"🔄 Session expired. Effortlessly restoring your connection in the background...\");\n try {\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"⚠️ Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.\");\n newTokens = await runBrowserAuthFlow();\n }\n\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n\n // Re-extract CSRF/SID from the page using the new cookies\n await this.refreshAuthTokens();\n\n // Retry once\n return this.executeOnce(rpcId, params, sourcePath, timeout);\n } catch (finalError) {\n console.error(\"❌ Authentication failed:\", (finalError as Error).message);\n throw e; // Propagate original AuthenticationError\n }\n }\n throw e;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async executeOnce(\n rpcId: string,\n params: unknown,\n sourcePath: string,\n timeout: number,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n return this.extractRpcResult(parsed, rpcId);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async refreshAuthTokens(): Promise<void> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n try {\n const response = await fetch(BASE_URL, {\n headers: {\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"User-Agent\": USER_AGENT,\n Accept: \"text/html\",\n },\n signal: controller.signal,\n });\n\n const html = await response.text();\n const csrf = extractCsrfFromPage(html);\n const sid = extractSessionIdFromPage(html);\n\n if (csrf) this.csrfToken = csrf;\n if (sid) this.sessionId = sid;\n\n this.tokens.csrf_token = this.csrfToken;\n this.tokens.session_id = this.sessionId;\n saveTokens(this.tokens);\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ─── Notebook Methods ────────────────────────────────\n\n private parseTimestamp(ts: unknown): string | null {\n if (Array.isArray(ts) && ts.length >= 1 && typeof ts[0] === \"number\") {\n return new Date(ts[0] * 1000).toISOString();\n }\n return null;\n }\n\n private parseNotebook(data: unknown): Notebook {\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid notebook data received from Google. This usually happens if the notebook ID is incorrect, it was deleted, or you don't have permission to access it.\",\n );\n }\n const d = data as any[];\n const sources: SourceSummary[] = [];\n if (Array.isArray(d[1])) {\n for (const s of d[1]) {\n if (Array.isArray(s) && s[0]) {\n sources.push({\n id: Array.isArray(s[0]) ? s[0][0] : String(s[0]),\n title: s[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n const meta = d[5] as any[] | undefined;\n return {\n id: d[2] || \"\",\n title: d[0] || \"Untitled\",\n emoji: d[3] || null,\n sources,\n is_shared: meta?.[1] === true,\n ownership: meta?.[0] === OWNERSHIP_MINE ? \"mine\" : \"shared\",\n created_at: meta ? this.parseTimestamp(meta[8]) : null,\n modified_at: meta ? this.parseTimestamp(meta[5]) : null,\n };\n }\n\n async listNotebooks(maxResults = 100): Promise<Notebook[]> {\n const result = await this.execute(\n RPC_IDS.LIST_NOTEBOOKS,\n [null, 1, null, [2]],\n );\n if (!Array.isArray(result) || !Array.isArray(result[0])) return [];\n\n const notebooks: Notebook[] = [];\n for (const item of result[0]) {\n if (Array.isArray(item)) {\n notebooks.push(this.parseNotebook(item));\n }\n }\n return notebooks.slice(0, maxResults);\n }\n\n async getNotebook(notebookId: string): Promise<Notebook> {\n const result = await this.execute(\n RPC_IDS.GET_NOTEBOOK,\n [notebookId, null, [2], null, 0],\n `/notebook/${notebookId}`,\n );\n return this.parseNotebook(result);\n }\n\n async createNotebook(title: string): Promise<Notebook> {\n const result = await this.execute(RPC_IDS.CREATE_NOTEBOOK, [\n title,\n null,\n null,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ]);\n return this.parseNotebook(result);\n }\n\n async renameNotebook(notebookId: string, newTitle: string): Promise<void> {\n await this.execute(\n RPC_IDS.RENAME_NOTEBOOK,\n [notebookId, [[null, null, null, [null, newTitle]]]],\n `/notebook/${notebookId}`,\n );\n }\n\n async deleteNotebook(notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_NOTEBOOK,\n [notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n async describeNotebook(notebookId: string): Promise<string> {\n const result = await this.execute(\n RPC_IDS.GET_SUMMARY,\n [notebookId, null, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n // ─── Source Methods ──────────────────────────────────\n\n async addUrlSource(\n notebookId: string,\n url: string,\n ): Promise<SourceSummary> {\n const isYouTube =\n url.toLowerCase().includes(\"youtube.com\") ||\n url.toLowerCase().includes(\"youtu.be\");\n\n const sourceData = isYouTube\n ? [null, null, null, null, null, null, null, [url], null, null, 1]\n : [null, null, [url], null, null, null, null, null, null, null, 1];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || url,\n type: isYouTube ? \"youtube\" : \"web_page\",\n };\n }\n\n async addTextSource(\n notebookId: string,\n text: string,\n title: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n null,\n [title, text],\n null,\n 2,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"pasted_text\",\n };\n }\n\n async addDriveSource(\n notebookId: string,\n documentId: string,\n title: string,\n mimeType: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n [documentId, mimeType, 1, title],\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"google_docs\",\n };\n }\n\n async getSource(\n sourceId: string,\n notebookId: string,\n ): Promise<SourceDetail> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n id: sourceId,\n title: data?.[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(data?.[3] ?? null),\n content: data?.[4] || null,\n summary: null,\n keywords: [],\n };\n }\n\n async getSourceGuide(\n sourceId: string,\n notebookId: string,\n ): Promise<{ summary: string; keywords: string[] }> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE_GUIDE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n summary: data?.[0] || \"\",\n keywords: Array.isArray(data?.[1]) ? data[1] : [],\n };\n }\n\n async checkFreshness(\n sourceId: string,\n notebookId: string,\n ): Promise<boolean | null> {\n try {\n const result = await this.execute(\n RPC_IDS.CHECK_FRESHNESS,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] === true;\n } catch {\n return null;\n }\n }\n\n async syncDrive(sourceIds: string[], notebookId: string): Promise<void> {\n for (const sourceId of sourceIds) {\n await this.execute(\n RPC_IDS.SYNC_DRIVE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n }\n\n async deleteSource(sourceId: string, notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_SOURCE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n // ─── Query Method ────────────────────────────────────\n\n async query(\n notebookId: string,\n queryText: string,\n sourceIds?: string[],\n conversationId?: string,\n ): Promise<QueryResponse> {\n const sourcesNested = sourceIds\n ? sourceIds.map((sid) => [[sid]])\n : [];\n\n const history = conversationId\n ? this.conversationHistory.get(conversationId) || null\n : null;\n\n const params = [\n sourcesNested,\n queryText,\n history,\n [2, null, [1]],\n conversationId || null,\n ];\n\n const fReq = JSON.stringify([null, JSON.stringify(params)]);\n const body = `f.req=${encodeURIComponent(fReq)}&`;\n\n const url = this.buildQueryUrl(`/notebook/${notebookId}`);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.queryTimeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n // Check for auth error in the response stream\n for (const chunk of parsed) {\n if (Array.isArray(chunk)) {\n for (const item of chunk) {\n if (Array.isArray(item) && item[0] === \"wrb.fr\" && Array.isArray(item[5]) && item[5].includes(16)) {\n console.log(\"🔄 Session expired during query. Effortlessly restoring your connection in the background...\");\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"⚠️ Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.\");\n newTokens = await runBrowserAuthFlow();\n }\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n await this.refreshAuthTokens();\n // Retry once\n return this.query(notebookId, queryText, sourceIds, conversationId);\n }\n }\n }\n }\n\n // Find the longest Type 1 answer chunk\n let bestAnswer = \"\";\n let convId: string | null = conversationId || null;\n\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\") {\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n const data = JSON.parse(resultStr);\n if (Array.isArray(data)) {\n const answer = data[0];\n const type = data[2];\n if (type === 1 && typeof answer === \"string\" && answer.length > bestAnswer.length) {\n bestAnswer = answer;\n }\n if (data[4]) convId = data[4];\n }\n } catch {\n // skip\n }\n }\n }\n }\n }\n\n // Store conversation history for follow-ups\n if (convId) {\n const existing = this.conversationHistory.get(convId) || [];\n existing.push([queryText, null, 1]);\n existing.push([bestAnswer, null, 2]);\n this.conversationHistory.set(convId, existing);\n }\n\n return {\n answer: bestAnswer,\n conversation_id: convId,\n sources_used: sourceIds || [],\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ─── Research Methods ────────────────────────────────\n\n async startResearch(\n notebookId: string,\n queryText: string,\n source = \"web\",\n mode = \"fast\",\n ): Promise<{ taskId: string }> {\n const sourceCode = RESEARCH_SOURCES.getCode(source);\n const modeCode = RESEARCH_MODES.getCode(mode);\n\n let result: unknown;\n if (modeCode === 5) {\n // Deep research\n result = await this.execute(\n RPC_IDS.START_DEEP_RESEARCH,\n [null, [1], [queryText, sourceCode], 5, notebookId],\n `/notebook/${notebookId}`,\n );\n } else {\n // Fast research\n result = await this.execute(\n RPC_IDS.START_FAST_RESEARCH,\n [[queryText, sourceCode], null, 1, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n const data = result as any[];\n return { taskId: data?.[0] || \"\" };\n }\n\n async pollResearch(\n notebookId: string,\n taskId?: string,\n ): Promise<ResearchResult[]> {\n const result = await this.execute(\n RPC_IDS.POLL_RESEARCH,\n [null, null, notebookId],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data?.[0])) return [];\n\n const results: ResearchResult[] = [];\n for (const task of data[0]) {\n if (!Array.isArray(task)) continue;\n const tid = task[0];\n if (taskId && tid !== taskId) continue;\n\n const taskInfo = task[1] as any[];\n const statusCode = taskInfo?.[4];\n const statusMap: Record<number, ResearchResult[\"status\"]> = {\n 1: \"in_progress\",\n 2: \"completed\",\n 6: \"imported\",\n };\n\n const sources: ResearchSource[] = [];\n const sourcesArray = taskInfo?.[3]?.[0];\n if (Array.isArray(sourcesArray)) {\n for (const s of sourcesArray) {\n if (Array.isArray(s)) {\n sources.push({\n url: s[0] || null,\n title: s[1] || \"\",\n description: s[2] || null,\n type: RESULT_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n results.push({\n task_id: tid,\n status: statusMap[statusCode] || \"in_progress\",\n query: taskInfo?.[1]?.[0] || \"\",\n sources,\n summary: taskInfo?.[3]?.[1] || null,\n });\n }\n\n return results;\n }\n\n async importResearch(\n notebookId: string,\n taskId: string,\n sourceIndices?: number[],\n ): Promise<void> {\n const indices = sourceIndices || null;\n await this.execute(\n RPC_IDS.IMPORT_RESEARCH,\n [notebookId, taskId, indices],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n\n // ─── Studio Methods ──────────────────────────────────\n\n private formatSourcesNested(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [[sid]]);\n }\n\n private formatSourcesSimple(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [sid]);\n }\n\n async createAudioOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = AUDIO_FORMATS.getCode(options.format || \"deep_dive\");\n const lengthCode = AUDIO_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const audioOptions = [\n null,\n [\n options.focus_prompt || null,\n lengthCode,\n null,\n sourcesSimple,\n options.language || null,\n null,\n formatCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"audio\"),\n sourcesNested,\n null,\n null,\n audioOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createVideoOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n visual_style?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = VIDEO_FORMATS.getCode(options.format || \"explainer\");\n const styleCode = VIDEO_STYLES.getCode(\n options.visual_style || \"auto_select\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const videoOptions = [\n null,\n null,\n [\n sourcesSimple,\n options.language || null,\n options.focus_prompt || null,\n null,\n formatCode,\n styleCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"video\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n videoOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createInfographic(\n notebookId: string,\n sourceIds: string[],\n options: {\n orientation?: string;\n detail_level?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const orientationCode = INFOGRAPHIC_ORIENTATIONS.getCode(\n options.orientation || \"landscape\",\n );\n const detailCode = INFOGRAPHIC_DETAILS.getCode(\n options.detail_level || \"standard\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const infographicOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n null,\n orientationCode,\n detailCode,\n ],\n ];\n\n // positions 4-13 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"infographic\"),\n sourcesNested,\n ];\n for (let i = 0; i < 10; i++) content.push(null);\n content.push(infographicOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createSlideDeck(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = SLIDE_DECK_FORMATS.getCode(\n options.format || \"detailed_deck\",\n );\n const lengthCode = SLIDE_DECK_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const slideDeckOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n formatCode,\n lengthCode,\n ],\n ];\n\n // positions 4-15 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"slide_deck\"),\n sourcesNested,\n ];\n for (let i = 0; i < 12; i++) content.push(null);\n content.push(slideDeckOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createReport(\n notebookId: string,\n sourceIds: string[],\n options: {\n report_format?: string;\n custom_prompt?: string;\n language?: string;\n } = {},\n ): Promise<string> {\n const formatName = options.report_format || \"Briefing Doc\";\n const fmt = REPORT_FORMATS[formatName] || REPORT_FORMATS[\"Briefing Doc\"];\n const prompt =\n formatName === \"Create Your Own\"\n ? options.custom_prompt || \"\"\n : fmt.prompt;\n\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const reportOptions = [\n null,\n [\n fmt.title,\n fmt.description,\n null,\n sourcesSimple,\n options.language || null,\n prompt,\n null,\n true,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"report\"),\n sourcesNested,\n null,\n null,\n null,\n reportOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createFlashcards(\n notebookId: string,\n sourceIds: string[],\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const flashcardOptions = [\n null,\n [1, null, null, null, null, null, [difficultyCode, FLASHCARD_COUNT_DEFAULT]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n flashcardOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createQuiz(\n notebookId: string,\n sourceIds: string[],\n questionCount = 5,\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const quizOptions = [\n null,\n [2, null, null, null, null, null, null, [questionCount, difficultyCode]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"), // shared type with flashcards\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n quizOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createDataTable(\n notebookId: string,\n sourceIds: string[],\n description: string,\n language?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"data_table\"),\n sourcesNested,\n ];\n // Fill nulls up to position where data_table options go\n for (let i = 0; i < 14; i++) content.push(null);\n content.push([[description, language || null]]);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createMindMap(\n notebookId: string,\n sourceIds: string[],\n title?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n // Step 1: Generate mind map\n const genResult = await this.execute(\n RPC_IDS.GENERATE_MIND_MAP,\n [notebookId, sourcesNested, title || null],\n `/notebook/${notebookId}`,\n );\n\n const genData = genResult as any[];\n const mindMapData = genData?.[0];\n\n // Step 2: Save mind map\n const saveResult = await this.execute(\n RPC_IDS.SAVE_MIND_MAP,\n [notebookId, mindMapData, title || null],\n `/notebook/${notebookId}`,\n );\n\n const saveData = saveResult as any[];\n return saveData?.[0] || \"\";\n }\n\n async pollStudio(notebookId: string): Promise<StudioArtifact[]> {\n const result = await this.execute(\n RPC_IDS.POLL_STUDIO,\n [notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data)) return [];\n\n const artifacts: StudioArtifact[] = [];\n const items = Array.isArray(data[0]) ? data[0] : data;\n\n for (const item of items) {\n if (!Array.isArray(item)) continue;\n const statusMap: Record<number, StudioArtifact[\"status\"]> = {\n 1: \"pending\",\n 2: \"generating\",\n 3: \"completed\",\n 4: \"failed\",\n };\n\n artifacts.push({\n id: item[0] || \"\",\n type: STUDIO_TYPES.getName(item[2] ?? null),\n status: statusMap[item[3]] || \"pending\",\n download_url: item[4] || null,\n });\n }\n\n return artifacts;\n }\n\n async deleteStudio(\n notebookId: string,\n artifactId: string,\n ): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_STUDIO,\n [notebookId, artifactId],\n `/notebook/${notebookId}`,\n );\n }\n\n // ─── Chat Configure ─────────────────────────────────\n\n async chatConfigure(\n notebookId: string,\n goal?: string,\n customPrompt?: string,\n responseLength?: string,\n ): Promise<void> {\n const goalCode = goal ? CHAT_GOALS.getCode(goal) : 1;\n const lengthCode = responseLength\n ? CHAT_RESPONSE_LENGTHS.getCode(responseLength)\n : 1;\n\n await this.execute(\n RPC_IDS.PREFERENCES,\n [notebookId, goalCode, customPrompt || null, lengthCode],\n `/notebook/${notebookId}`,\n );\n }\n\n // ─── Auth Refresh (tool) ─────────────────────────────\n\n async refreshAuth(): Promise<void> {\n await this.refreshAuthTokens();\n }\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"../client.js\";\n\nexport interface McpTool<T extends z.ZodRawShape = z.ZodRawShape> {\n name: string;\n description: string;\n schema?: T; \n execute: (\n client: NotebookLMClient,\n args: z.infer<z.ZodObject<T>>,\n opts: { queryTimeout?: number }\n ) => Promise<any>;\n}\n\nexport function registerTools(\n server: McpServer, \n tools: McpTool<any>[], \n getClient: (timeout?: number) => NotebookLMClient, \n opts?: { queryTimeout?: number, onClientReset?: () => void }\n) {\n for (const tool of tools) {\n const config: any = { description: tool.description };\n if (tool.schema) {\n config.inputSchema = tool.schema;\n }\n server.registerTool(tool.name, config, async (args: any) => {\n try {\n const result = await tool.execute(getClient(opts?.queryTimeout), args, { queryTimeout: opts?.queryTimeout });\n if (result && result._client_action === \"reset\" && opts?.onClientReset) {\n opts.onClientReset();\n delete result._client_action;\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"success\", ...result }, null, 2) }] };\n } catch (e) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"error\", error: String(e) }, null, 2) }], isError: true };\n }\n });\n }\n}\n\n// Re-usable helper for tools that require confirmation\nexport function pendingConfirmation(message: string) {\n return { status: \"pending_confirmation\", message };\n}\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { saveTokens } from \"../auth.js\";\nimport type { AuthTokens } from \"../types.js\";\n\n// We use a special return flag so server.ts knows to reset the client\nexport const authTools: McpTool<any>[] = [\n {\n name: \"refresh_auth\",\n description: \"Reload authentication tokens (re-extract CSRF and session from page)\",\n execute: async (client) => {\n await client.refreshAuth();\n return { message: \"Authentication tokens refreshed\" };\n },\n },\n {\n name: \"save_auth_tokens\",\n description: \"Manually save authentication cookies (fallback method — prefer using CLI auth)\",\n schema: {\n cookies: z.string().optional().describe(\"Cookie header string (SID=xxx; HSID=yyy; ...)\"),\n csrf_token: z.string().optional().describe(\"CSRF token\"),\n session_id: z.string().optional().describe(\"Session ID\"),\n },\n execute: async (client, { cookies: cookieStr, csrf_token, session_id }) => {\n const cookieMap: Record<string, string> = {};\n if (cookieStr) {\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookieMap[part.substring(0, eq).trim()] = part.substring(eq + 1).trim();\n }\n }\n }\n const tokens: AuthTokens = {\n cookies: cookieMap,\n csrf_token: csrf_token || \"\",\n session_id: session_id || \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n \n // We return this special flag so the registerTools wrapper or server.ts can catch it\n return { \n message: \"Tokens saved. Client will use new tokens on next request.\",\n _client_action: \"reset\" \n };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { CHAT_GOALS, CHAT_RESPONSE_LENGTHS } from \"../constants.js\";\n\nexport const queryTools: McpTool<any>[] = [\n {\n name: \"notebook_query\",\n description: \"Ask a question about the sources in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Question to ask\"),\n source_ids: z.array(z.string()).optional().describe(\"Specific source IDs to query (omit for all)\"),\n conversation_id: z.string().optional().describe(\"Conversation ID for follow-up questions\"),\n },\n execute: async (client, { notebook_id, query, source_ids, conversation_id }) => {\n const response = await client.query(notebook_id, query, source_ids, conversation_id);\n return { answer: response.answer, conversation_id: response.conversation_id };\n },\n },\n {\n name: \"chat_configure\",\n description: \"Configure chat behavior (goal and response length)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n goal: z.string().optional().describe(`Chat goal: ${CHAT_GOALS.optionsStr()}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when goal=custom)\"),\n response_length: z.string().optional().describe(`Response length: ${CHAT_RESPONSE_LENGTHS.optionsStr()}`),\n },\n execute: async (client, { notebook_id, goal, custom_prompt, response_length }) => {\n await client.chatConfigure(notebook_id, goal, custom_prompt, response_length);\n return { message: \"Chat configured\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { RESEARCH_SOURCES, RESEARCH_MODES } from \"../constants.js\";\n\nexport const researchTools: McpTool<any>[] = [\n {\n name: \"research_start\",\n description: \"Start a web or Drive research task\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Research query\"),\n source: z.string().optional().describe(`Source: ${RESEARCH_SOURCES.optionsStr()} (default: web)`),\n mode: z.string().optional().describe(`Mode: ${RESEARCH_MODES.optionsStr()} (default: fast)`),\n },\n execute: async (client, { notebook_id, query, source, mode }) => {\n const result = await client.startResearch(notebook_id, query, source, mode);\n return { task_id: result.taskId, message: \"Research started. Use research_status to poll progress.\" };\n },\n },\n {\n name: \"research_status\",\n description: \"Check the status of research tasks\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().optional().describe(\"Specific task ID to check (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id }) => {\n const results = await client.pollResearch(notebook_id, task_id);\n return { results };\n },\n },\n {\n name: \"research_import\",\n description: \"Import discovered sources from a research task into the notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().describe(\"Research task ID\"),\n source_indices: z.array(z.number()).optional().describe(\"Specific source indices to import (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id, source_indices }) => {\n await client.importResearch(notebook_id, task_id, source_indices);\n return { message: \"Research sources imported\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\n\nexport const notebookTools: McpTool<any>[] = [\n {\n name: \"notebook_list\",\n description: \"List all NotebookLM notebooks with metadata (title, sources count, ownership)\",\n schema: {\n max_results: z.number().optional().describe(\"Maximum notebooks to return (default 100)\"),\n },\n execute: async (client, { max_results }) => {\n const notebooks = await client.listNotebooks(max_results);\n return { notebooks, count: notebooks.length };\n },\n },\n {\n name: \"notebook_create\",\n description: \"Create a new NotebookLM notebook\",\n schema: {\n title: z.string().describe(\"Title for the new notebook\"),\n },\n execute: async (client, { title }) => {\n const notebook = await client.createNotebook(title);\n return { notebook };\n },\n },\n {\n name: \"notebook_get\",\n description: \"Get details of a specific notebook including its sources\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n return { notebook };\n },\n },\n {\n name: \"notebook_describe\",\n description: \"Get an AI-generated summary of the notebook content\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const summary = await client.describeNotebook(notebook_id);\n return { summary };\n },\n },\n {\n name: \"notebook_rename\",\n description: \"Rename a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n new_title: z.string().describe(\"New title for the notebook\"),\n },\n execute: async (client, { notebook_id, new_title }) => {\n await client.renameNotebook(notebook_id, new_title);\n return { message: `Notebook renamed to \"${new_title}\"` };\n },\n },\n {\n name: \"notebook_delete\",\n description: \"Delete a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this notebook. This cannot be undone.\");\n await client.deleteNotebook(notebook_id);\n return { message: \"Notebook deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport * as fs from \"fs\";\n\nexport const sourceTools: McpTool<any>[] = [\n {\n name: \"source_describe\",\n description: \"Get metadata for a specific source in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(notebook_id, source_id);\n return { source };\n },\n },\n {\n name: \"source_get_content\",\n description: \"Get the underlying text content of a source (used by grounding tool)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The document ID to retrieve\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(source_id, notebook_id);\n return { text: source.content };\n },\n },\n {\n name: \"notebook_add_url\",\n description: \"Add a website URL source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n url: z.string().describe(\"The URL to add\"),\n },\n execute: async (client, { notebook_id, url }) => {\n await client.addUrlSource(notebook_id, url);\n return { message: \"URL source added\" };\n },\n },\n {\n name: \"notebook_add_text\",\n description: \"Add a text document source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n content: z.string().optional().describe(\"The text content to add\"),\n file_path: z.string().optional().describe(\"Path to local file to read content from\"),\n title: z.string().describe(\"Title for the new source\"),\n },\n execute: async (client, { notebook_id, content, file_path, title }) => {\n let documentContent = content;\n if (!documentContent && file_path) {\n documentContent = fs.readFileSync(file_path, \"utf8\");\n }\n if (!documentContent) {\n throw new Error(\"Must provide either content or file_path\");\n }\n await client.addTextSource(notebook_id, documentContent, title);\n return { message: \"Text source added\" };\n },\n },\n {\n name: \"notebook_add_drive\",\n description: \"Add a Google Drive file source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n file_id: z.string().describe(\"Google Drive file ID\"),\n title: z.string().describe(\"Document title\"),\n doc_type: z.string().describe(\"MIME type (e.g. application/vnd.google-apps.document)\"),\n },\n execute: async (client, { notebook_id, file_id, title, doc_type }) => {\n await client.addDriveSource(notebook_id, file_id, title, doc_type);\n return { message: \"Drive source added\" };\n },\n },\n {\n name: \"source_list_drive\",\n description: \"List sources in a notebook with Drive freshness status\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n const results = [];\n for (const src of notebook.sources) {\n const fresh = await client.checkFreshness(src.id, notebook_id);\n results.push({ ...src, is_fresh: fresh });\n }\n return { sources: results };\n },\n },\n {\n name: \"source_sync_drive\",\n description: \"Sync all Drive sources in a notebook to pull latest changes\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).describe(\"Source IDs to sync\"),\n confirm: z.boolean().describe(\"Must be true to confirm sync\"),\n },\n execute: async (client, { notebook_id, source_ids, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to sync these Drive sources.\");\n await client.syncDrive(source_ids, notebook_id);\n return { message: `Synced ${source_ids.length} sources` };\n },\n },\n {\n name: \"source_delete\",\n description: \"Delete a source from a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, source_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this source. This cannot be undone.\");\n await client.deleteSource(notebook_id, source_id);\n return { message: \"Source deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport {\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n} from \"../constants.js\";\n\nexport const studioTools: McpTool<any>[] = [\n {\n name: \"audio_overview_create\",\n description: \"Generate an audio podcast overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${AUDIO_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${AUDIO_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code (e.g. en, es)\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt for the audio\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate audio overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createAudioOverview(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Audio generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"video_overview_create\",\n description: \"Generate a video overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${VIDEO_FORMATS.optionsStr()}`),\n visual_style: z.string().optional().describe(`Style: ${VIDEO_STYLES.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, visual_style, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate video overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createVideoOverview(notebook_id, ids, { format, visual_style, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Video generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"infographic_create\",\n description: \"Generate an infographic (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n orientation: z.string().optional().describe(`Orientation: ${INFOGRAPHIC_ORIENTATIONS.optionsStr()}`),\n detail_level: z.string().optional().describe(`Details: ${INFOGRAPHIC_DETAILS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, orientation, detail_level, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate infographic.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createInfographic(notebook_id, ids, { orientation, detail_level, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Infographic generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"slide_deck_create\",\n description: \"Generate a slide deck (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${SLIDE_DECK_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${SLIDE_DECK_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate slide deck.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createSlideDeck(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Slide deck generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"report_create\",\n description: \"Generate a text report (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n report_format: z.string().optional().describe(`Format: ${Object.keys(REPORT_FORMATS).join(\", \")}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when format='Create Your Own')\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, report_format, custom_prompt, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate report.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createReport(notebook_id, ids, { report_format, custom_prompt, language });\n return { artifact_id: artifactId, message: \"Report generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"flashcards_create\",\n description: \"Generate flashcards (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate flashcards.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createFlashcards(notebook_id, ids, difficulty);\n return { artifact_id: artifactId, message: \"Flashcards generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"quiz_create\",\n description: \"Generate a quiz (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n question_count: z.number().optional().describe(\"Number of questions (default 5)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, question_count, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate quiz.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createQuiz(notebook_id, ids, question_count, difficulty);\n return { artifact_id: artifactId, message: \"Quiz generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"data_table_create\",\n description: \"Generate a data table (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n description: z.string().describe(\"Description of the table to generate\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, description, source_ids, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate data table.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createDataTable(notebook_id, ids, description, language);\n return { artifact_id: artifactId, message: \"Data table generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"mind_map_create\",\n description: \"Generate a mind map (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n title: z.string().optional().describe(\"Custom title for the mind map\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, title, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate mind map.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createMindMap(notebook_id, ids, title);\n return { artifact_id: artifactId, message: \"Mind map generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"studio_status\",\n description: \"Check the status of generated Studio artifacts\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const artifacts = await client.pollStudio(notebook_id);\n return { artifacts };\n },\n },\n {\n name: \"studio_delete\",\n description: \"Delete a Studio artifact (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n artifact_id: z.string().describe(\"The artifact ID to delete\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, artifact_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this artifact.\");\n await client.deleteStudio(notebook_id, artifact_id);\n return { message: \"Artifact deleted\" };\n },\n },\n];\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,4BAA4B;;;ACDrC,SAAS,iBAAiB;;;ACAnB,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAiC,eAAe,WAAW;AACrE,SAAK,aAAa,IAAI;AAAA,MACpB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC;AAAA,IAC9D;AACA,SAAK,aAAa,IAAI;AAAA,MACpB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAAA,IAChD;AACA,SAAK,eAAe;AACpB,SAAK,eAAe,OAAO,KAAK,OAAO,EAAE,KAAK;AAAA,EAChD;AAAA,EAEA,QAAQ,MAAsB;AAC5B,UAAM,OAAO,KAAK,WAAW,IAAI,KAAK,YAAY,CAAC;AACnD,QAAI,SAAS,QAAW;AACtB,YAAM,IAAI;AAAA,QACR,kBAAkB,IAAI,qBAAqB,KAAK,WAAW,CAAC;AAAA,MAC9D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAA6B;AACnC,QAAI,SAAS,KAAM,QAAO,KAAK;AAC/B,WAAO,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK;AAAA,EAC3C;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK,aAAa,KAAK,IAAI;AAAA,EACpC;AAAA,EAEA,QAAkB;AAChB,WAAO,CAAC,GAAG,KAAK,YAAY;AAAA,EAC9B;AACF;AAGO,IAAM,UAAU;AAAA,EACrB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,UAAU;AAAA,EACV,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAGO,IAAM,iBAAiB;AAIvB,IAAM,aAAa,IAAI,WAAW;AAAA,EACvC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,gBAAgB;AAClB,CAAC;AAEM,IAAM,wBAAwB,IAAI,WAAW;AAAA,EAClD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AACX,CAAC;AAGM,IAAM,mBAAmB,IAAI,WAAW,EAAE,KAAK,GAAG,OAAO,EAAE,CAAC;AAC5D,IAAM,iBAAiB,IAAI,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;AAC1D,IAAM,eAAe,IAAI,WAAW;AAAA,EACzC,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AACjB,CAAC;AAGM,IAAM,eAAe,IAAI,WAAW;AAAA,EACzC,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,KAAK;AAAA,EACL,aAAa;AAAA,EACb,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,eAAe;AAAA,EACf,OAAO;AAAA,EACP,UAAU;AACZ,CAAC;AAGM,IAAM,eAAe,IAAI,WAAW;AAAA,EACzC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AACd,CAAC;AAGM,IAAM,gBAAgB,IAAI,WAAW;AAAA,EAC1C,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AACV,CAAC;AAEM,IAAM,gBAAgB,IAAI,WAAW;AAAA,EAC1C,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR,CAAC;AAGM,IAAM,gBAAgB,IAAI,WAAW,EAAE,WAAW,GAAG,OAAO,EAAE,CAAC;AAE/D,IAAM,eAAe,IAAI,WAAW;AAAA,EACzC,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,aAAa;AACf,CAAC;AAGM,IAAM,2BAA2B,IAAI,WAAW;AAAA,EACrD,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACV,CAAC;AAEM,IAAM,sBAAsB,IAAI,WAAW;AAAA,EAChD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AACZ,CAAC;AAGM,IAAM,qBAAqB,IAAI,WAAW;AAAA,EAC/C,eAAe;AAAA,EACf,kBAAkB;AACpB,CAAC;AAEM,IAAM,qBAAqB,IAAI,WAAW;AAAA,EAC/C,OAAO;AAAA,EACP,SAAS;AACX,CAAC;AAGM,IAAM,yBAAyB,IAAI,WAAW;AAAA,EACnD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR,CAAC;AAEM,IAAM,0BAA0B;AAGhC,IAAM,iBAGT;AAAA,EACF,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACF;AAGO,IAAM,WAAW;AACjB,IAAM,oBAAoB;AAC1B,IAAM,aACX;AAEK,IAAM,aAAa;AAEnB,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,aACX;AAEK,IAAM,kBAAkB;AACxB,IAAM,mBAAmB;;;AC3OhC,SAAS,eAAe;AACxB,SAAS,YAAY;AACrB,SAAS,cAAc,eAAe,WAAW,kBAAkB;AACnE,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAIhC,IAAM,aAAa,KAAK,QAAQ,GAAG,iBAAiB;AACpD,IAAM,YAAY,KAAK,YAAY,WAAW;AAC9C,IAAM,iBAAiB,KAAK,YAAY,gBAAgB;AAEjD,SAAS,gBAAgB,SAA0C;AACxE,SAAO,iBAAiB,MAAM,CAAC,SAAS,QAAQ,OAAO;AACzD;AAEO,SAAS,kBAAkB,SAAyC;AACzE,SAAO,OAAO,QAAQ,OAAO,EAC1B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAC3B,KAAK,IAAI;AACd;AAEO,SAAS,oBAAoB,MAA6B;AAC/D,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAI,MAAO,QAAO,MAAM,CAAC;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,MAA6B;AACpE,QAAM,WAAW,CAAC,sBAAsB,cAAc;AACtD,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAI,MAAO,QAAO,MAAM,CAAC;AAAA,EAC3B;AACA,SAAO;AACT;AAEO,SAAS,WAAW,QAA0B;AACnD,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,gBAAc,WAAW,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACnE;AAEO,SAAS,sBAAyC;AACvD,MAAI,CAAC,WAAW,SAAS,EAAG,QAAO;AACnC,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,aAAa,WAAW,OAAO,CAAC;AACxD,QAAI,KAAK,WAAW,gBAAgB,KAAK,OAAO,GAAG;AACjD,aAAO;AAAA,QACL,SAAS,KAAK;AAAA,QACd,YAAY,KAAK,cAAc;AAAA,QAC/B,YAAY,KAAK,cAAc;AAAA,QAC/B,cAAc,KAAK,gBAAgB;AAAA,MACrC;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAuC;AACrD,QAAM,YAAY,QAAQ,IAAI;AAC9B,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,UAAU,MAAM,GAAG,GAAG;AACvC,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,QAAI,KAAK,GAAG;AACV,cAAQ,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB,OAAO,EAAG,QAAO;AAEtC,SAAO;AAAA,IACL;AAAA,IACA,YAAY,QAAQ,IAAI,yBAAyB;AAAA,IACjD,YAAY,QAAQ,IAAI,yBAAyB;AAAA,IACjD,cAAc,KAAK,IAAI,IAAI;AAAA,EAC7B;AACF;AAEO,SAAS,aAAyB;AACvC,QAAM,UAAU,kBAAkB;AAClC,MAAI,QAAS,QAAO;AAEpB,QAAM,YAAY,oBAAoB;AACtC,MAAI,UAAW,QAAO;AAEtB,QAAM,IAAI;AAAA,IACR;AAAA,EAEF;AACF;AAEA,SAAS,kBAAkB,KAAqC;AAC9D,QAAM,UAAkC,CAAC;AACzC,aAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,eAAW,QAAQ,QAAQ,MAAM,GAAG,GAAG;AACrC,YAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,UAAI,KAAK,GAAG;AACV,gBAAQ,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,cAAc,UAAwC;AAC1E,MAAI,CAAC,UAAU;AACb,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CASf;AACG,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAEA,QAAM,MAAM,aAAa,UAAU,OAAO;AAC1C,QAAM,UAAU,kBAAkB,GAAG;AAErC,MAAI,CAAC,gBAAgB,OAAO,GAAG;AAC7B,UAAM,IAAI;AAAA,MACR,mCAAmC,iBAAiB,KAAK,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,QAAM,SAAqB;AAAA,IACzB;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc,KAAK,IAAI,IAAI;AAAA,EAC7B;AAEA,aAAW,MAAM;AACjB,UAAQ,IAAI,2CAA2C;AACvD,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAiC;AAC1D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,gBAAgB;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,OAAG,SAAS,QAAQ,CAAC,WAAmB;AACtC,SAAG,MAAM;AACT,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,cAAc,KAAmB;AACxC,QAAM,WAAW,QAAQ;AACzB,MAAI;AACF,QAAI,aAAa,SAAS;AACxB,eAAS,aAAa,GAAG,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,IACnD,WAAW,aAAa,UAAU;AAChC,eAAS,SAAS,GAAG,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,IAC/C,WAAW,aAAa,SAAS;AAC/B,eAAS,aAAa,GAAG,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,IACnD;AAAA,EACF,QAAQ;AACN,YAAQ,IAAI;AAAA,EAAkE,GAAG,EAAE;AAAA,EACrF;AACF;AAEA,eAAsB,cAAmC;AACvD,UAAQ,IAAI,0WAA8D;AAC1E,UAAQ,IAAI,2EAA4D;AACxE,UAAQ,IAAI,4WAAgE;AAE5E,UAAQ,IAAI,yCAAyC;AACrD,gBAAc,QAAQ;AAEtB,UAAQ,IAAI,uBAAuB;AACnC,UAAQ,IAAI,wEAAwE;AACpF,UAAQ,IAAI,iCAAiC;AAC7C,UAAQ,IAAI,4BAA4B;AACxC,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,oDAAoD;AAChE,UAAQ,IAAI,iEAAiE;AAC7E,UAAQ,IAAI,uDAAkD;AAC9D,UAAQ,IAAI,2EAA2E;AAEvF,QAAM,YAAY,MAAM,kBAAkB,+BAA+B;AAEzE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,QAAM,UAAU,kBAAkB,SAAS;AAE3C,MAAI,CAAC,gBAAgB,OAAO,GAAG;AAC7B,YAAQ,IAAI,oCAA+B;AAC3C,YAAQ,IAAI,YAAY,iBAAiB,KAAK,IAAI,CAAC,EAAE;AACrD,YAAQ,IAAI,YAAY,OAAO,KAAK,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE;AACzD,UAAM,IAAI,MAAM,oEAAoE;AAAA,EACtF;AAEA,QAAM,SAAqB;AAAA,IACzB;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc,KAAK,IAAI,IAAI;AAAA,EAC7B;AAEA,aAAW,MAAM;AAEjB,UAAQ,IAAI;AAAA,0CAAwC;AACpD,UAAQ,IAAI,MAAM,OAAO,KAAK,OAAO,EAAE,MAAM,oBAAoB;AACjE,UAAQ,IAAI,2CAA2C;AACvD,UAAQ,IAAI;AAAA,kEAAqE;AAEjF,SAAO;AACT;AAEO,SAAS,aAAmB;AACjC,QAAM,SAAS,oBAAoB;AACnC,MAAI,CAAC,QAAQ;AACX,YAAQ,IAAI,yBAAyB;AACrC;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,KAAK,OAAO,OAAO;AAC9C,QAAM,cAAc,iBAAiB,MAAM,CAAC,MAAM,YAAY,SAAS,CAAC,CAAC;AACzE,QAAM,MAAM,OAAO,eACf,KAAK,OAAO,KAAK,IAAI,IAAI,MAAO,OAAO,gBAAgB,IAAI,IAC3D;AAEJ,UAAQ,IAAI,gBAAgB;AAC5B,UAAQ,IAAI,cAAc,YAAY,MAAM,KAAK,YAAY,KAAK,IAAI,CAAC,GAAG;AAC1E,UAAQ,IAAI,+BAA+B,cAAc,QAAQ,IAAI,EAAE;AACvE,UAAQ,IAAI,iBAAiB,OAAO,aAAa,YAAY,SAAS,EAAE;AACxE,UAAQ,IAAI,iBAAiB,OAAO,aAAa,YAAY,SAAS,EAAE;AACxE,UAAQ,IAAI,UAAU,GAAG,QAAQ;AACjC,UAAQ,IAAI,WAAW,SAAS,EAAE;AACpC;;;AC3PA,SAAS,YAAAA,WAAU,aAAa;AAChC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,OAAO,eAAe;AAKtB,IAAM,WAAW;AAEV,SAAS,aAA4B;AAC1C,QAAM,aAAuB,CAAC;AAE9B,MAAI,QAAQ,aAAa,UAAU;AACjC,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,QAAQ,aAAa,SAAS;AACvC,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,QAAQ,aAAa,SAAS;AACvC,eAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA,GAAG,QAAQ,IAAI,YAAY;AAAA,MAC3B,GAAG,QAAQ,IAAI,YAAY;AAAA,IAC7B;AAAA,EACF;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI;AACF,YAAM,MACJ,QAAQ,aAAa,UACjB,IAAI,SAAS,gBACb,IAAI,SAAS;AACnB,MAAAC,UAAS,KAAK,EAAE,OAAO,SAAS,CAAC;AACjC,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,eAAe,MAA+B;AAC3D,QAAM,aAAa;AACnB,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,oBAAoB,IAAI,eAAe;AACpE,UAAI,SAAS,IAAI;AACf,cAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,eAAO,KAAK;AAAA,MACd;AAAA,IACF,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,EAC7C;AACA,QAAM,IAAI,MAAM,oDAAoD;AACtE;AAEA,eAAsB,aAAa,UAAmB;AACpD,QAAM,aAAa,WAAW;AAC9B,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAcC,MAAKC,SAAQ,GAAG,mBAAmB,gBAAgB;AACvE,EAAAC,WAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAE1C,QAAM,OAAO;AAAA,IACX;AAAA,IACA,2BAA2B,QAAQ;AAAA,IACnC,mBAAmB,WAAW;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AAEA,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAAA,IAC5C,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,gBAAc,MAAM;AACpB,SAAO;AACT;AAEA,eAAe,qBACb,WACA,cACqB;AACrB,QAAM,QAAQ,MAAM,eAAe,QAAQ;AAC3C,QAAM,KAAK,IAAI,UAAU,KAAK;AAE9B,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,YAAY;AAChB,QAAI;AACJ,QAAI;AAEJ,UAAM,UAAU,MAAM;AACpB,oBAAc,KAAK;AACnB,mBAAa,aAAa;AAC1B,SAAG,MAAM;AAAA,IACX;AAEA,UAAM,OAAO,CAAC,QAAgB,SAAc,CAAC,MAAM;AACjD,UAAI,GAAG,eAAe,UAAU,MAAM;AACpC,WAAG,KAAK,KAAK,UAAU,EAAE,IAAI,EAAE,WAAW,QAAQ,OAAO,CAAC,CAAC;AAAA,MAC7D;AAAA,IACF;AAEA,oBAAgB,WAAW,MAAM;AAC/B,cAAQ;AACR,aAAO,IAAI,MAAM,kCAAkC,YAAY,GAAI,IAAI,CAAC;AAAA,IAC1E,GAAG,SAAS;AAEZ,OAAG,GAAG,QAAQ,MAAM;AAClB,WAAK,gBAAgB;AACrB,cAAQ,YAAY,MAAM;AACxB,aAAK,sBAAsB,EAAE,MAAM,CAAC,UAAU,oBAAoB,EAAE,CAAC;AAAA,MACvE,GAAG,GAAI;AAAA,IACT,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,cAAQ;AACR;AAAA,QACE,IAAI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,CAAC,QAAQ;AACtB,cAAQ;AACR,aAAO,GAAG;AAAA,IACZ,CAAC;AAED,OAAG,GAAG,WAAW,CAAC,SAAS;AACzB,UAAI;AACF,cAAM,WAAW,KAAK,MAAM,KAAK,SAAS,CAAC;AAC3C,YAAI,SAAS,UAAU,SAAS,OAAO,SAAS;AAC9C,gBAAM,UAAkC,CAAC;AACzC,qBAAW,KAAK,SAAS,OAAO,SAAS;AACvC,oBAAQ,EAAE,IAAI,IAAI,EAAE;AAAA,UACtB;AAEA,cAAI,gBAAgB,OAAO,GAAG;AAC5B,kBAAM,SAAqB;AAAA,cACzB;AAAA,cACA,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,cAAc,KAAK,IAAI,IAAI;AAAA,YAC7B;AACA,uBAAW,MAAM;AACjB,oBAAQ;AACR,oBAAQ,MAAM;AAAA,UAChB,WAAW,cAAc;AACvB,oBAAQ,OAAO,MAAM,GAAG;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AAAA,MAEZ;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,yBAA8C;AAClE,UAAQ,IAAI,oDAA6C;AACzD,QAAM,gBAAgB,MAAM,aAAa,IAAI;AAE7C,MAAI;AACF,UAAM,SAAS,MAAM,qBAAqB,MAAO,KAAK;AACtD,YAAQ,IAAI,uCAAkC;AAC9C,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM;AAAA,EACR,UAAE;AAEA,kBAAc,KAAK;AAAA,EACrB;AACF;AAEA,eAAsB,qBAA0C;AAC9D,UAAQ,IAAI,2EAAsE;AAClF,UAAQ;AAAA,IACN;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM,aAAa,KAAK;AAE9C,MAAI;AACF,YAAQ,IAAI,2GAAoG;AAEhH,UAAM,SAAS,MAAM,qBAAqB,MAAQ,IAAI;AACtD,YAAQ,IAAI,2EAAsE;AAClF,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI;AAAA,QACR,sBAAsB,MAAM,OAAO;AAAA;AAAA,MACrC;AAAA,IACF;AACA,UAAM;AAAA,EACR,UAAE;AACA,kBAAc,KAAK;AAAA,EACrB;AACF;;;AChLO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAA8C,oBAAI,IAAI;AAAA,EACtD;AAAA,EACA,QAAQ;AAAA,EAEhB,YAAY,QAAoB,cAAuB;AACrD,SAAK,SAAS;AACd,SAAK,YAAY,OAAO;AACxB,SAAK,YAAY,OAAO;AACxB,SAAK,eAAe,gBAAgB;AAAA,EACtC;AAAA;AAAA,EAIQ,iBAAiB,OAAe,QAAyB;AAC/D,UAAM,aAAa,KAAK,UAAU,MAAM;AACxC,UAAM,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,YAAY,MAAM,SAAS,CAAC,CAAC,CAAC;AACpE,UAAM,QAAQ,CAAC,SAAS,mBAAmB,IAAI,CAAC,EAAE;AAClD,QAAI,KAAK,WAAW;AAClB,YAAM,KAAK,MAAM,mBAAmB,KAAK,SAAS,CAAC,EAAE;AAAA,IACvD;AACA,WAAO,MAAM,KAAK,GAAG,IAAI;AAAA,EAC3B;AAAA,EAEQ,SAAS,OAAe,aAAa,KAAa;AACxD,UAAM,SAAiC;AAAA,MACrC,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,IAAI,QAAQ,IAAI,iBAAiB;AAAA,MACjC,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AACA,QAAI,KAAK,WAAW;AAClB,aAAO,OAAO,IAAI,KAAK;AAAA,IACzB;AACA,UAAM,QAAQ,IAAI,gBAAgB,MAAM,EAAE,SAAS;AACnD,WAAO,GAAG,QAAQ,GAAG,iBAAiB,IAAI,KAAK;AAAA,EACjD;AAAA,EAEQ,cAAc,aAAa,KAAa;AAC9C,SAAK;AACL,UAAM,SAAiC;AAAA,MACrC,IAAI,QAAQ,IAAI,iBAAiB;AAAA,MACjC,IAAI;AAAA,MACJ,QAAQ,OAAO,KAAK,KAAK;AAAA,MACzB,IAAI;AAAA,IACN;AACA,QAAI,KAAK,WAAW;AAClB,aAAO,OAAO,IAAI,KAAK;AAAA,IACzB;AACA,UAAM,QAAQ,IAAI,gBAAgB,MAAM,EAAE,SAAS;AACnD,WAAO,GAAG,QAAQ,GAAG,UAAU,IAAI,KAAK;AAAA,EAC1C;AAAA,EAEQ,cAAc,cAAiC;AACrD,QAAI,OAAO;AACX,QAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,aAAO,KAAK,MAAM,CAAC;AAAA,IACrB;AAEA,UAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,IAAI;AACpC,UAAM,UAAqB,CAAC;AAC5B,QAAI,IAAI;AAER,WAAO,IAAI,MAAM,QAAQ;AACvB,YAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,UAAI,CAAC,MAAM;AACT;AACA;AAAA,MACF;AAEA,YAAM,iBAAiB,SAAS,MAAM,EAAE;AACxC,UAAI,CAAC,MAAM,cAAc,KAAK,OAAO,cAAc,MAAM,MAAM;AAC7D;AACA,YAAI,IAAI,MAAM,QAAQ;AACpB,cAAI;AACF,oBAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC;AAAA,UACnC,QAAQ;AAAA,UAER;AACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI;AACF,kBAAQ,KAAK,KAAK,MAAM,IAAI,CAAC;AAAA,QAC/B,QAAQ;AAAA,QAER;AACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,QAAmB,OAAwB;AAClE,eAAW,SAAS,QAAQ;AAC1B,UAAI,CAAC,MAAM,QAAQ,KAAK,EAAG;AAC3B,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAG;AAC7C,YAAI,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,MAAM,OAAO;AAE7C,cACE,KAAK,SAAS,KACd,KAAK,CAAC,MAAM,aACZ,MAAM,QAAQ,KAAK,CAAC,CAAC,KACrB,KAAK,CAAC,EAAE,SAAS,EAAE,GACnB;AACA,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,gBAAM,YAAY,KAAK,CAAC;AACxB,cAAI,OAAO,cAAc,UAAU;AACjC,gBAAI;AACF,qBAAO,KAAK,MAAM,SAAS;AAAA,YAC7B,QAAQ;AACN,qBAAO;AAAA,YACT;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QACZ,OACA,QACA,aAAa,KACb,UAAU,iBACQ;AAClB,UAAM,MAAM,KAAK,SAAS,OAAO,UAAU;AAC3C,UAAM,OAAO,KAAK,iBAAiB,OAAO,MAAM;AAEhD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAE1D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,SAAS,GAAG,QAAQ;AAAA,UACpB,QAAQ,kBAAkB,KAAK,OAAO,OAAO;AAAA,UAC7C,iBAAiB;AAAA,UACjB,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,SAAS,KAAK,cAAc,IAAI;AAEtC,UAAI;AACF,eAAO,KAAK,iBAAiB,QAAQ,KAAK;AAAA,MAC5C,SAAS,GAAG;AACV,YAAI,aAAa,qBAAqB;AACpC,kBAAQ,IAAI,wFAAiF;AAC7F,cAAI;AACF,gBAAI;AACJ,gBAAI;AACF,0BAAY,MAAM,uBAAuB;AAAA,YAC3C,SAAS,cAAc;AACrB,sBAAQ,IAAI,gHAAsG;AAClH,0BAAY,MAAM,mBAAmB;AAAA,YACvC;AAEA,iBAAK,SAAS;AACd,iBAAK,YAAY,UAAU;AAC3B,iBAAK,YAAY,UAAU;AAG3B,kBAAM,KAAK,kBAAkB;AAG7B,mBAAO,KAAK,YAAY,OAAO,QAAQ,YAAY,OAAO;AAAA,UAC5D,SAAS,YAAY;AACnB,oBAAQ,MAAM,iCAA6B,WAAqB,OAAO;AACvE,kBAAM;AAAA,UACR;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,YACZ,OACA,QACA,YACA,SACkB;AAClB,UAAM,MAAM,KAAK,SAAS,OAAO,UAAU;AAC3C,UAAM,OAAO,KAAK,iBAAiB,OAAO,MAAM;AAEhD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAE1D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,SAAS,GAAG,QAAQ;AAAA,UACpB,QAAQ,kBAAkB,KAAK,OAAO,OAAO;AAAA,UAC7C,iBAAiB;AAAA,UACjB,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,SAAS,KAAK,cAAc,IAAI;AACtC,aAAO,KAAK,iBAAiB,QAAQ,KAAK;AAAA,IAC5C,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,oBAAmC;AAC/C,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,eAAe;AAElE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,UAAU;AAAA,QACrC,SAAS;AAAA,UACP,QAAQ,kBAAkB,KAAK,OAAO,OAAO;AAAA,UAC7C,cAAc;AAAA,UACd,QAAQ;AAAA,QACV;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,OAAO,oBAAoB,IAAI;AACrC,YAAM,MAAM,yBAAyB,IAAI;AAEzC,UAAI,KAAM,MAAK,YAAY;AAC3B,UAAI,IAAK,MAAK,YAAY;AAE1B,WAAK,OAAO,aAAa,KAAK;AAC9B,WAAK,OAAO,aAAa,KAAK;AAC9B,iBAAW,KAAK,MAAM;AAAA,IACxB,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAIQ,eAAe,IAA4B;AACjD,QAAI,MAAM,QAAQ,EAAE,KAAK,GAAG,UAAU,KAAK,OAAO,GAAG,CAAC,MAAM,UAAU;AACpE,aAAO,IAAI,KAAK,GAAG,CAAC,IAAI,GAAI,EAAE,YAAY;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,MAAyB;AAC7C,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,IAAI;AACV,UAAM,UAA2B,CAAC;AAClC,QAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,GAAG;AACvB,iBAAW,KAAK,EAAE,CAAC,GAAG;AACpB,YAAI,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG;AAC5B,kBAAQ,KAAK;AAAA,YACX,IAAI,MAAM,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAAA,YAC/C,OAAO,EAAE,CAAC,KAAK;AAAA,YACf,MAAM,aAAa,QAAQ,EAAE,CAAC,KAAK,IAAI;AAAA,UACzC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,EAAE,CAAC;AAChB,WAAO;AAAA,MACL,IAAI,EAAE,CAAC,KAAK;AAAA,MACZ,OAAO,EAAE,CAAC,KAAK;AAAA,MACf,OAAO,EAAE,CAAC,KAAK;AAAA,MACf;AAAA,MACA,WAAW,OAAO,CAAC,MAAM;AAAA,MACzB,WAAW,OAAO,CAAC,MAAM,iBAAiB,SAAS;AAAA,MACnD,YAAY,OAAO,KAAK,eAAe,KAAK,CAAC,CAAC,IAAI;AAAA,MAClD,aAAa,OAAO,KAAK,eAAe,KAAK,CAAC,CAAC,IAAI;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,aAAa,KAA0B;AACzD,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,IACrB;AACA,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,QAAQ,OAAO,CAAC,CAAC,EAAG,QAAO,CAAC;AAEjE,UAAM,YAAwB,CAAC;AAC/B,eAAW,QAAQ,OAAO,CAAC,GAAG;AAC5B,UAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,kBAAU,KAAK,KAAK,cAAc,IAAI,CAAC;AAAA,MACzC;AAAA,IACF;AACA,WAAO,UAAU,MAAM,GAAG,UAAU;AAAA,EACtC;AAAA,EAEA,MAAM,YAAY,YAAuC;AACvD,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,YAAY,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;AAAA,MAC/B,aAAa,UAAU;AAAA,IACzB;AACA,WAAO,KAAK,cAAc,MAAM;AAAA,EAClC;AAAA,EAEA,MAAM,eAAe,OAAkC;AACrD,UAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,iBAAiB;AAAA,MACzD;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,CAAC;AAAA,MACF,CAAC,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC;AAAA,IAC/D,CAAC;AACD,WAAO,KAAK,cAAc,MAAM;AAAA,EAClC;AAAA,EAEA,MAAM,eAAe,YAAoB,UAAiC;AACxE,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,CAAC,YAAY,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;AAAA,MACnD,aAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,YAAmC;AACtD,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,CAAC,UAAU;AAAA,MACX,aAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,YAAqC;AAC1D,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC;AAAA,MACtB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA;AAAA,EAIA,MAAM,aACJ,YACA,KACwB;AACxB,UAAM,YACJ,IAAI,YAAY,EAAE,SAAS,aAAa,KACxC,IAAI,YAAY,EAAE,SAAS,UAAU;AAEvC,UAAM,aAAa,YACf,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,GAAG,GAAG,MAAM,MAAM,CAAC,IAC/D,CAAC,MAAM,MAAM,CAAC,GAAG,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC;AAEnE,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR;AAAA,QACE,CAAC,UAAU;AAAA,QACX;AAAA,QACA,CAAC,CAAC;AAAA,QACF,CAAC,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC;AAAA,MAC/D;AAAA,MACA,aAAa,UAAU;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,OAAO;AACb,UAAM,SAAS,OAAO,CAAC,IAAI,CAAC;AAC5B,WAAO;AAAA,MACL,IAAI,MAAM,QAAQ,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,MACxE,OAAO,SAAS,CAAC,KAAK;AAAA,MACtB,MAAM,YAAY,YAAY;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,YACA,MACA,OACwB;AACxB,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,CAAC,OAAO,IAAI;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR;AAAA,QACE,CAAC,UAAU;AAAA,QACX;AAAA,QACA,CAAC,CAAC;AAAA,QACF,CAAC,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC;AAAA,MAC/D;AAAA,MACA,aAAa,UAAU;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,OAAO;AACb,UAAM,SAAS,OAAO,CAAC,IAAI,CAAC;AAC5B,WAAO;AAAA,MACL,IAAI,MAAM,QAAQ,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,MACxE,OAAO,SAAS,CAAC,KAAK;AAAA,MACtB,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,YACA,YACA,OACA,UACwB;AACxB,UAAM,aAAa;AAAA,MACjB,CAAC,YAAY,UAAU,GAAG,KAAK;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR;AAAA,QACE,CAAC,UAAU;AAAA,QACX;AAAA,QACA,CAAC,CAAC;AAAA,QACF,CAAC,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC;AAAA,MAC/D;AAAA,MACA,aAAa,UAAU;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,OAAO;AACb,UAAM,SAAS,OAAO,CAAC,IAAI,CAAC;AAC5B,WAAO;AAAA,MACL,IAAI,MAAM,QAAQ,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,SAAS,CAAC,KAAK,EAAE;AAAA,MACxE,OAAO,SAAS,CAAC,KAAK;AAAA,MACtB,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,UACJ,UACA,YACuB;AACvB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,UAAU,YAAY,CAAC,CAAC,CAAC;AAAA,MAC1B,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,OAAO,CAAC,KAAK;AAAA,MACpB,MAAM,aAAa,QAAQ,OAAO,CAAC,KAAK,IAAI;AAAA,MAC5C,SAAS,OAAO,CAAC,KAAK;AAAA,MACtB,SAAS;AAAA,MACT,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,UACA,YACkD;AAClD,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,UAAU,YAAY,CAAC,CAAC,CAAC;AAAA,MAC1B,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO;AAAA,MACL,SAAS,OAAO,CAAC,KAAK;AAAA,MACtB,UAAU,MAAM,QAAQ,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,UACA,YACyB;AACzB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK;AAAA,QACxB,QAAQ;AAAA,QACR,CAAC,UAAU,UAAU;AAAA,QACrB,aAAa,UAAU;AAAA,MACzB;AACA,YAAM,OAAO;AACb,aAAO,OAAO,CAAC,MAAM;AAAA,IACvB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,WAAqB,YAAmC;AACtE,eAAW,YAAY,WAAW;AAChC,YAAM,KAAK;AAAA,QACT,QAAQ;AAAA,QACR,CAAC,UAAU,UAAU;AAAA,QACrB,aAAa,UAAU;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,UAAkB,YAAmC;AACtE,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,CAAC,UAAU,UAAU;AAAA,MACrB,aAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,MACJ,YACA,WACA,WACA,gBACwB;AACxB,UAAM,gBAAgB,YAClB,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAC9B,CAAC;AAEL,UAAM,UAAU,iBACZ,KAAK,oBAAoB,IAAI,cAAc,KAAK,OAChD;AAEJ,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAAA,MACb,kBAAkB;AAAA,IACpB;AAEA,UAAM,OAAO,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,MAAM,CAAC,CAAC;AAC1D,UAAM,OAAO,SAAS,mBAAmB,IAAI,CAAC;AAE9C,UAAM,MAAM,KAAK,cAAc,aAAa,UAAU,EAAE;AACxD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,YAAY;AAEpE,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,SAAS,GAAG,QAAQ;AAAA,UACpB,QAAQ,kBAAkB,KAAK,OAAO,OAAO;AAAA,UAC7C,iBAAiB;AAAA,UACjB,cAAc;AAAA,QAChB;AAAA,QACA;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAM,SAAS,KAAK,cAAc,IAAI;AAGtC,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,qBAAW,QAAQ,OAAO;AACxB,gBAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,MAAM,YAAY,MAAM,QAAQ,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG;AACjG,sBAAQ,IAAI,qGAA8F;AAC1G,kBAAI;AACJ,kBAAI;AACF,4BAAY,MAAM,uBAAuB;AAAA,cAC3C,SAAS,cAAc;AACrB,wBAAQ,IAAI,gHAAsG;AAClH,4BAAY,MAAM,mBAAmB;AAAA,cACvC;AACA,mBAAK,SAAS;AACd,mBAAK,YAAY,UAAU;AAC3B,mBAAK,YAAY,UAAU;AAC3B,oBAAM,KAAK,kBAAkB;AAE7B,qBAAO,KAAK,MAAM,YAAY,WAAW,WAAW,cAAc;AAAA,YACpE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,aAAa;AACjB,UAAI,SAAwB,kBAAkB;AAE9C,iBAAW,SAAS,QAAQ;AAC1B,YAAI,CAAC,MAAM,QAAQ,KAAK,EAAG;AAC3B,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,EAAG;AAC7C,cAAI,KAAK,CAAC,MAAM,UAAU;AACxB,kBAAM,YAAY,KAAK,CAAC;AACxB,gBAAI,OAAO,cAAc,UAAU;AACjC,kBAAI;AACF,sBAAM,OAAO,KAAK,MAAM,SAAS;AACjC,oBAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,wBAAM,SAAS,KAAK,CAAC;AACrB,wBAAM,OAAO,KAAK,CAAC;AACnB,sBAAI,SAAS,KAAK,OAAO,WAAW,YAAY,OAAO,SAAS,WAAW,QAAQ;AACjF,iCAAa;AAAA,kBACf;AACA,sBAAI,KAAK,CAAC,EAAG,UAAS,KAAK,CAAC;AAAA,gBAC9B;AAAA,cACF,QAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,QAAQ;AACV,cAAM,WAAW,KAAK,oBAAoB,IAAI,MAAM,KAAK,CAAC;AAC1D,iBAAS,KAAK,CAAC,WAAW,MAAM,CAAC,CAAC;AAClC,iBAAS,KAAK,CAAC,YAAY,MAAM,CAAC,CAAC;AACnC,aAAK,oBAAoB,IAAI,QAAQ,QAAQ;AAAA,MAC/C;AAEA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,cAAc,aAAa,CAAC;AAAA,MAC9B;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,cACJ,YACA,WACA,SAAS,OACT,OAAO,QACsB;AAC7B,UAAM,aAAa,iBAAiB,QAAQ,MAAM;AAClD,UAAM,WAAW,eAAe,QAAQ,IAAI;AAE5C,QAAI;AACJ,QAAI,aAAa,GAAG;AAElB,eAAS,MAAM,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,UAAU,GAAG,GAAG,UAAU;AAAA,QAClD,aAAa,UAAU;AAAA,MACzB;AAAA,IACF,OAAO;AAEL,eAAS,MAAM,KAAK;AAAA,QAClB,QAAQ;AAAA,QACR,CAAC,CAAC,WAAW,UAAU,GAAG,MAAM,GAAG,UAAU;AAAA,QAC7C,aAAa,UAAU;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,OAAO;AACb,WAAO,EAAE,QAAQ,OAAO,CAAC,KAAK,GAAG;AAAA,EACnC;AAAA,EAEA,MAAM,aACJ,YACA,QAC2B;AAC3B,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,MAAM,MAAM,UAAU;AAAA,MACvB,aAAa,UAAU;AAAA,IACzB;AAEA,UAAM,OAAO;AACb,QAAI,CAAC,MAAM,QAAQ,OAAO,CAAC,CAAC,EAAG,QAAO,CAAC;AAEvC,UAAM,UAA4B,CAAC;AACnC,eAAW,QAAQ,KAAK,CAAC,GAAG;AAC1B,UAAI,CAAC,MAAM,QAAQ,IAAI,EAAG;AAC1B,YAAM,MAAM,KAAK,CAAC;AAClB,UAAI,UAAU,QAAQ,OAAQ;AAE9B,YAAM,WAAW,KAAK,CAAC;AACvB,YAAM,aAAa,WAAW,CAAC;AAC/B,YAAM,YAAsD;AAAA,QAC1D,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAEA,YAAM,UAA4B,CAAC;AACnC,YAAM,eAAe,WAAW,CAAC,IAAI,CAAC;AACtC,UAAI,MAAM,QAAQ,YAAY,GAAG;AAC/B,mBAAW,KAAK,cAAc;AAC5B,cAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,oBAAQ,KAAK;AAAA,cACX,KAAK,EAAE,CAAC,KAAK;AAAA,cACb,OAAO,EAAE,CAAC,KAAK;AAAA,cACf,aAAa,EAAE,CAAC,KAAK;AAAA,cACrB,MAAM,aAAa,QAAQ,EAAE,CAAC,KAAK,IAAI;AAAA,YACzC,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,KAAK;AAAA,QACX,SAAS;AAAA,QACT,QAAQ,UAAU,UAAU,KAAK;AAAA,QACjC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK;AAAA,QAC7B;AAAA,QACA,SAAS,WAAW,CAAC,IAAI,CAAC,KAAK;AAAA,MACjC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eACJ,YACA,QACA,eACe;AACf,UAAM,UAAU,iBAAiB;AACjC,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,CAAC,YAAY,QAAQ,OAAO;AAAA,MAC5B,aAAa,UAAU;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,oBAAoB,WAAgC;AAC1D,WAAO,UAAU,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,EACvC;AAAA,EAEQ,oBAAoB,WAAgC;AAC1D,WAAO,UAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;AAAA,EACrC;AAAA,EAEA,MAAM,oBACJ,YACA,WACA,UAKI,CAAC,GACY;AACjB,UAAM,aAAa,cAAc,QAAQ,QAAQ,UAAU,WAAW;AACtE,UAAM,aAAa,cAAc,QAAQ,QAAQ,UAAU,SAAS;AACpE,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AACxD,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,QACE,QAAQ,gBAAgB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,YAAY;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,oBACJ,YACA,WACA,UAKI,CAAC,GACY;AACjB,UAAM,aAAa,cAAc,QAAQ,QAAQ,UAAU,WAAW;AACtE,UAAM,YAAY,aAAa;AAAA,MAC7B,QAAQ,gBAAgB;AAAA,IAC1B;AACA,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AACxD,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,eAAe;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,QAAQ,YAAY;AAAA,QACpB,QAAQ,gBAAgB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,kBACJ,YACA,WACA,UAKI,CAAC,GACY;AACjB,UAAM,kBAAkB,yBAAyB;AAAA,MAC/C,QAAQ,eAAe;AAAA,IACzB;AACA,UAAM,aAAa,oBAAoB;AAAA,MACrC,QAAQ,gBAAgB;AAAA,IAC1B;AACA,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,qBAAqB;AAAA,MACzB;AAAA,QACE,QAAQ,gBAAgB;AAAA,QACxB,QAAQ,YAAY;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,aAAa;AAAA,MAClC;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,IAAI,IAAK,SAAQ,KAAK,IAAI;AAC9C,YAAQ,KAAK,kBAAkB;AAE/B,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,gBACJ,YACA,WACA,UAKI,CAAC,GACY;AACjB,UAAM,aAAa,mBAAmB;AAAA,MACpC,QAAQ,UAAU;AAAA,IACpB;AACA,UAAM,aAAa,mBAAmB,QAAQ,QAAQ,UAAU,SAAS;AACzE,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,mBAAmB;AAAA,MACvB;AAAA,QACE,QAAQ,gBAAgB;AAAA,QACxB,QAAQ,YAAY;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,YAAY;AAAA,MACjC;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,IAAI,IAAK,SAAQ,KAAK,IAAI;AAC9C,YAAQ,KAAK,gBAAgB;AAE7B,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,aACJ,YACA,WACA,UAII,CAAC,GACY;AACjB,UAAM,aAAa,QAAQ,iBAAiB;AAC5C,UAAM,MAAM,eAAe,UAAU,KAAK,eAAe,cAAc;AACvE,UAAM,SACJ,eAAe,oBACX,QAAQ,iBAAiB,KACzB,IAAI;AAEV,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AACxD,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,QAAQ,YAAY;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,iBACJ,YACA,WACA,aAAa,UACI;AACjB,UAAM,iBAAiB,uBAAuB,QAAQ,UAAU;AAChE,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA,CAAC,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,gBAAgB,uBAAuB,CAAC;AAAA,IAC7E;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,YAAY;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,WACJ,YACA,WACA,gBAAgB,GAChB,aAAa,UACI;AACjB,UAAM,iBAAiB,uBAAuB,QAAQ,UAAU;AAChE,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,CAAC,GAAG,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,CAAC,eAAe,cAAc,CAAC;AAAA,IACzE;AAEA,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,YAAY;AAAA;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,gBACJ,YACA,WACA,aACA,UACiB;AACjB,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAExD,UAAM,UAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,YAAY;AAAA,MACjC;AAAA,IACF;AAEA,aAAS,IAAI,GAAG,IAAI,IAAI,IAAK,SAAQ,KAAK,IAAI;AAC9C,YAAQ,KAAK,CAAC,CAAC,aAAa,YAAY,IAAI,CAAC,CAAC;AAE9C,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,CAAC,CAAC,GAAG,YAAY,OAAO;AAAA,MACzB,aAAa,UAAU;AAAA,IACzB;AACA,UAAM,OAAO;AACb,WAAO,OAAO,CAAC,KAAK;AAAA,EACtB;AAAA,EAEA,MAAM,cACJ,YACA,WACA,OACiB;AACjB,UAAM,gBAAgB,KAAK,oBAAoB,SAAS;AAGxD,UAAM,YAAY,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,CAAC,YAAY,eAAe,SAAS,IAAI;AAAA,MACzC,aAAa,UAAU;AAAA,IACzB;AAEA,UAAM,UAAU;AAChB,UAAM,cAAc,UAAU,CAAC;AAG/B,UAAM,aAAa,MAAM,KAAK;AAAA,MAC5B,QAAQ;AAAA,MACR,CAAC,YAAY,aAAa,SAAS,IAAI;AAAA,MACvC,aAAa,UAAU;AAAA,IACzB;AAEA,UAAM,WAAW;AACjB,WAAO,WAAW,CAAC,KAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,WAAW,YAA+C;AAC9D,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,QAAQ;AAAA,MACR,CAAC,YAAY,CAAC,CAAC,CAAC;AAAA,MAChB,aAAa,UAAU;AAAA,IACzB;AAEA,UAAM,OAAO;AACb,QAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC;AAElC,UAAM,YAA8B,CAAC;AACrC,UAAM,QAAQ,MAAM,QAAQ,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI;AAEjD,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,MAAM,QAAQ,IAAI,EAAG;AAC1B,YAAM,YAAsD;AAAA,QAC1D,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAEA,gBAAU,KAAK;AAAA,QACb,IAAI,KAAK,CAAC,KAAK;AAAA,QACf,MAAM,aAAa,QAAQ,KAAK,CAAC,KAAK,IAAI;AAAA,QAC1C,QAAQ,UAAU,KAAK,CAAC,CAAC,KAAK;AAAA,QAC9B,cAAc,KAAK,CAAC,KAAK;AAAA,MAC3B,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aACJ,YACA,YACe;AACf,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,CAAC,YAAY,UAAU;AAAA,MACvB,aAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,cACJ,YACA,MACA,cACA,gBACe;AACf,UAAM,WAAW,OAAO,WAAW,QAAQ,IAAI,IAAI;AACnD,UAAM,aAAa,iBACf,sBAAsB,QAAQ,cAAc,IAC5C;AAEJ,UAAM,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,CAAC,YAAY,UAAU,gBAAgB,MAAM,UAAU;AAAA,MACvD,aAAa,UAAU;AAAA,IACzB;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,cAA6B;AACjC,UAAM,KAAK,kBAAkB;AAAA,EAC/B;AACF;;;ACzuCO,SAAS,cACd,QACA,OACAC,YACA,MACA;AACA,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAc,EAAE,aAAa,KAAK,YAAY;AACpD,QAAI,KAAK,QAAQ;AACf,aAAO,cAAc,KAAK;AAAA,IAC5B;AACA,WAAO,aAAa,KAAK,MAAM,QAAQ,OAAO,SAAc;AAC1D,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,QAAQA,WAAU,MAAM,YAAY,GAAG,MAAM,EAAE,cAAc,MAAM,aAAa,CAAC;AAC3G,YAAI,UAAU,OAAO,mBAAmB,WAAW,MAAM,eAAe;AACtE,eAAK,cAAc;AACnB,iBAAO,OAAO;AAAA,QAChB;AACA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,QAAQ,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,MACjH,SAAS,GAAG;AACV,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,EAAE,QAAQ,SAAS,OAAO,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,KAAK;AAAA,MACrI;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAGO,SAAS,oBAAoB,SAAiB;AACnD,SAAO,EAAE,QAAQ,wBAAwB,QAAQ;AACnD;;;AC5CA,SAAS,SAAS;AAMX,IAAM,YAA4B;AAAA,EACvC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS,OAAOC,YAAW;AACzB,YAAMA,QAAO,YAAY;AACzB,aAAO,EAAE,SAAS,kCAAkC;AAAA,IACtD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,MACvF,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,MACvD,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY;AAAA,IACzD;AAAA,IACA,SAAS,OAAOA,SAAQ,EAAE,SAAS,WAAW,YAAY,WAAW,MAAM;AACzE,YAAM,YAAoC,CAAC;AAC3C,UAAI,WAAW;AACb,mBAAW,QAAQ,UAAU,MAAM,GAAG,GAAG;AACvC,gBAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,cAAI,KAAK,GAAG;AACV,sBAAU,KAAK,UAAU,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,KAAK,UAAU,KAAK,CAAC,EAAE,KAAK;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AACA,YAAM,SAAqB;AAAA,QACzB,SAAS;AAAA,QACT,YAAY,cAAc;AAAA,QAC1B,YAAY,cAAc;AAAA,QAC1B,cAAc,KAAK,IAAI,IAAI;AAAA,MAC7B;AACA,iBAAW,MAAM;AAGjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;AChDA,SAAS,KAAAC,UAAS;AAIX,IAAM,aAA6B;AAAA,EACxC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaC,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,OAAOA,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAC5C,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,6CAA6C;AAAA,MACjG,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,IAC3F;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,OAAO,YAAY,gBAAgB,MAAM;AAC9E,YAAM,WAAW,MAAMA,QAAO,MAAM,aAAa,OAAO,YAAY,eAAe;AACnF,aAAO,EAAE,QAAQ,SAAS,QAAQ,iBAAiB,SAAS,gBAAgB;AAAA,IAC9E;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc,WAAW,WAAW,CAAC,EAAE;AAAA,MAC5E,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,MAChF,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oBAAoB,sBAAsB,WAAW,CAAC,EAAE;AAAA,IAC1G;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,MAAM,eAAe,gBAAgB,MAAM;AAChF,YAAMA,QAAO,cAAc,aAAa,MAAM,eAAe,eAAe;AAC5E,aAAO,EAAE,SAAS,kBAAkB;AAAA,IACtC;AAAA,EACF;AACF;;;ACjCA,SAAS,KAAAC,UAAS;AAIX,IAAM,gBAAgC;AAAA,EAC3C;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaC,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,OAAOA,GAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,MAC3C,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,iBAAiB,WAAW,CAAC,iBAAiB;AAAA,MAChG,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,eAAe,WAAW,CAAC,kBAAkB;AAAA,IAC7F;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,OAAO,QAAQ,KAAK,MAAM;AAC/D,YAAM,SAAS,MAAMA,QAAO,cAAc,aAAa,OAAO,QAAQ,IAAI;AAC1E,aAAO,EAAE,SAAS,OAAO,QAAQ,SAAS,0DAA0D;AAAA,IACtG;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,IACpF;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,QAAQ,MAAM;AACnD,YAAM,UAAU,MAAMA,QAAO,aAAa,aAAa,OAAO;AAC9D,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,SAASA,GAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,MAC/C,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,IAC5G;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,SAAS,eAAe,MAAM;AACnE,YAAMA,QAAO,eAAe,aAAa,SAAS,cAAc;AAChE,aAAO,EAAE,SAAS,4BAA4B;AAAA,IAChD;AAAA,EACF;AACF;;;AC5CA,SAAS,KAAAC,UAAS;AAGX,IAAM,gBAAgC;AAAA,EAC3C;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaC,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,IACzF;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,YAAY,MAAM;AAC1C,YAAM,YAAY,MAAMA,QAAO,cAAc,WAAW;AACxD,aAAO,EAAE,WAAW,OAAO,UAAU,OAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,OAAOD,GAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,IACzD;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,MAAM,MAAM;AACpC,YAAM,WAAW,MAAMA,QAAO,eAAe,KAAK;AAClD,aAAO,EAAE,SAAS;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,IACpD;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,YAAY,MAAM;AAC1C,YAAM,WAAW,MAAMA,QAAO,YAAY,WAAW;AACrD,aAAO,EAAE,SAAS;AAAA,IACpB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,IACpD;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,YAAY,MAAM;AAC1C,YAAM,UAAU,MAAMA,QAAO,iBAAiB,WAAW;AACzD,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,WAAWA,GAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,IAC7D;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,UAAU,MAAM;AACrD,YAAMA,QAAO,eAAe,aAAa,SAAS;AAClD,aAAO,EAAE,SAAS,wBAAwB,SAAS,IAAI;AAAA,IACzD;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,QAAQ,MAAM;AACnD,UAAI,CAAC,QAAS,QAAO,oBAAoB,kEAAkE;AAC3G,YAAMA,QAAO,eAAe,WAAW;AACvC,aAAO,EAAE,SAAS,mBAAmB;AAAA,IACvC;AAAA,EACF;AACF;;;ACzEA,SAAS,KAAAC,UAAS;AAElB,YAAY,QAAQ;AAEb,IAAM,cAA8B;AAAA,EACzC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaC,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,WAAWA,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,IAChD;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,UAAU,MAAM;AACrD,YAAM,SAAS,MAAMA,QAAO,UAAU,aAAa,SAAS;AAC5D,aAAO,EAAE,OAAO;AAAA,IAClB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,WAAWA,GAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,IAC9D;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,UAAU,MAAM;AACrD,YAAM,SAAS,MAAMA,QAAO,UAAU,WAAW,WAAW;AAC5D,aAAO,EAAE,MAAM,OAAO,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,KAAKA,GAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,IAC3C;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,IAAI,MAAM;AAC/C,YAAMA,QAAO,aAAa,aAAa,GAAG;AAC1C,aAAO,EAAE,SAAS,mBAAmB;AAAA,IACvC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,MACjE,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,MACnF,OAAOA,GAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,IACvD;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,SAAS,WAAW,MAAM,MAAM;AACrE,UAAI,kBAAkB;AACtB,UAAI,CAAC,mBAAmB,WAAW;AACjC,0BAAqB,gBAAa,WAAW,MAAM;AAAA,MACrD;AACA,UAAI,CAAC,iBAAiB;AACpB,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,YAAMA,QAAO,cAAc,aAAa,iBAAiB,KAAK;AAC9D,aAAO,EAAE,SAAS,oBAAoB;AAAA,IACxC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,SAASA,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,MACnD,OAAOA,GAAE,OAAO,EAAE,SAAS,gBAAgB;AAAA,MAC3C,UAAUA,GAAE,OAAO,EAAE,SAAS,uDAAuD;AAAA,IACvF;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,SAAS,OAAO,SAAS,MAAM;AACpE,YAAMA,QAAO,eAAe,aAAa,SAAS,OAAO,QAAQ;AACjE,aAAO,EAAE,SAAS,qBAAqB;AAAA,IACzC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,IACpD;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,YAAY,MAAM;AAC1C,YAAM,WAAW,MAAMA,QAAO,YAAY,WAAW;AACrD,YAAM,UAAU,CAAC;AACjB,iBAAW,OAAO,SAAS,SAAS;AAClC,cAAM,QAAQ,MAAMA,QAAO,eAAe,IAAI,IAAI,WAAW;AAC7D,gBAAQ,KAAK,EAAE,GAAG,KAAK,UAAU,MAAM,CAAC;AAAA,MAC1C;AACA,aAAO,EAAE,SAAS,QAAQ;AAAA,IAC5B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,oBAAoB;AAAA,MAC7D,SAASA,GAAE,QAAQ,EAAE,SAAS,8BAA8B;AAAA,IAC9D;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,QAAQ,MAAM;AAC/D,UAAI,CAAC,QAAS,QAAO,oBAAoB,+CAA+C;AACxF,YAAMA,QAAO,UAAU,YAAY,WAAW;AAC9C,aAAO,EAAE,SAAS,UAAU,WAAW,MAAM,WAAW;AAAA,IAC1D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,WAAWA,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,MAC9C,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,WAAW,QAAQ,MAAM;AAC9D,UAAI,CAAC,QAAS,QAAO,oBAAoB,gEAAgE;AACzG,YAAMA,QAAO,aAAa,aAAa,SAAS;AAChD,aAAO,EAAE,SAAS,iBAAiB;AAAA,IACrC;AAAA,EACF;AACF;;;ACxHA,SAAS,KAAAC,UAAS;AAgBX,IAAM,cAA8B;AAAA,EACzC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaC,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,cAAc,WAAW,CAAC,EAAE;AAAA,MAC9E,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,cAAc,WAAW,CAAC,EAAE;AAAA,MAC9E,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,MAC7E,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,MACzE,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,QAAQ,QAAQ,UAAU,cAAc,QAAQ,MAAM;AACvG,UAAI,CAAC,QAAS,QAAO,oBAAoB,8CAA8C;AACvF,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,oBAAoB,aAAa,KAAK,EAAE,QAAQ,QAAQ,UAAU,aAAa,CAAC;AAChH,aAAO,EAAE,aAAa,YAAY,SAAS,iEAAiE;AAAA,IAC9G;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,cAAc,WAAW,CAAC,EAAE;AAAA,MAC9E,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,UAAU,aAAa,WAAW,CAAC,EAAE;AAAA,MAClF,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MAC/D,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc;AAAA,MAC3D,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,QAAQ,cAAc,UAAU,cAAc,QAAQ,MAAM;AAC7G,UAAI,CAAC,QAAS,QAAO,oBAAoB,8CAA8C;AACvF,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,oBAAoB,aAAa,KAAK,EAAE,QAAQ,cAAc,UAAU,aAAa,CAAC;AACtH,aAAO,EAAE,aAAa,YAAY,SAAS,iEAAiE;AAAA,IAC9G;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB,yBAAyB,WAAW,CAAC,EAAE;AAAA,MACnG,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,YAAY,oBAAoB,WAAW,CAAC,EAAE;AAAA,MAC3F,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MAC/D,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc;AAAA,MAC3D,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,aAAa,cAAc,UAAU,cAAc,QAAQ,MAAM;AAClH,UAAI,CAAC,QAAS,QAAO,oBAAoB,2CAA2C;AACpF,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,kBAAkB,aAAa,KAAK,EAAE,aAAa,cAAc,UAAU,aAAa,CAAC;AACzH,aAAO,EAAE,aAAa,YAAY,SAAS,uEAAuE;AAAA,IACpH;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,mBAAmB,WAAW,CAAC,EAAE;AAAA,MACnF,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,mBAAmB,WAAW,CAAC,EAAE;AAAA,MACnF,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MAC/D,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,cAAc;AAAA,MAC3D,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,QAAQ,QAAQ,UAAU,cAAc,QAAQ,MAAM;AACvG,UAAI,CAAC,QAAS,QAAO,oBAAoB,0CAA0C;AACnF,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,gBAAgB,aAAa,KAAK,EAAE,QAAQ,QAAQ,UAAU,aAAa,CAAC;AAC5G,aAAO,EAAE,aAAa,YAAY,SAAS,sEAAsE;AAAA,IACnH;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,WAAW,OAAO,KAAK,cAAc,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACjG,eAAeA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,MAC7F,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MAC/D,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,eAAe,eAAe,UAAU,QAAQ,MAAM;AACvG,UAAI,CAAC,QAAS,QAAO,oBAAoB,sCAAsC;AAC/E,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,aAAa,aAAa,KAAK,EAAE,eAAe,eAAe,SAAS,CAAC;AACzG,aAAO,EAAE,aAAa,YAAY,SAAS,kEAAkE;AAAA,IAC/G;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe,uBAAuB,WAAW,CAAC,EAAE;AAAA,MAC/F,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,YAAY,QAAQ,MAAM;AAC3E,UAAI,CAAC,QAAS,QAAO,oBAAoB,0CAA0C;AACnF,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,iBAAiB,aAAa,KAAK,UAAU;AAC7E,aAAO,EAAE,aAAa,YAAY,SAAS,sEAAsE;AAAA,IACnH;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,gBAAgBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,MAChF,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,eAAe,uBAAuB,WAAW,CAAC,EAAE;AAAA,MAC/F,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,gBAAgB,YAAY,QAAQ,MAAM;AAC3F,UAAI,CAAC,QAAS,QAAO,oBAAoB,oCAAoC;AAC7E,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,WAAW,aAAa,KAAK,gBAAgB,UAAU;AACvF,aAAO,EAAE,aAAa,YAAY,SAAS,gEAAgE;AAAA,IAC7G;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,aAAaA,GAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,MACvE,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sBAAsB;AAAA,MAC/D,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,aAAa,YAAY,UAAU,QAAQ,MAAM;AACtF,UAAI,CAAC,QAAS,QAAO,oBAAoB,0CAA0C;AACnF,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,gBAAgB,aAAa,KAAK,aAAa,QAAQ;AACvF,aAAO,EAAE,aAAa,YAAY,SAAS,sEAAsE;AAAA,IACnH;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,YAAYA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAC/E,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,MACrE,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,YAAY,OAAO,QAAQ,MAAM;AACtE,UAAI,CAAC,QAAS,QAAO,oBAAoB,wCAAwC;AACjF,YAAM,MAAM,eAAe,MAAMA,QAAO,YAAY,WAAW,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AACzF,YAAM,aAAa,MAAMA,QAAO,cAAc,aAAa,KAAK,KAAK;AACrE,aAAO,EAAE,aAAa,YAAY,SAAS,oEAAoE;AAAA,IACjH;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,IACpD;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,YAAY,MAAM;AAC1C,YAAM,YAAY,MAAMA,QAAO,WAAW,WAAW;AACrD,aAAO,EAAE,UAAU;AAAA,IACrB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,MACN,aAAaD,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,MAClD,aAAaA,GAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA,MAC5D,SAASA,GAAE,QAAQ,EAAE,SAAS,kCAAkC;AAAA,IAClE;AAAA,IACA,SAAS,OAAOC,SAAQ,EAAE,aAAa,aAAa,QAAQ,MAAM;AAChE,UAAI,CAAC,QAAS,QAAO,oBAAoB,2CAA2C;AACpF,YAAMA,QAAO,aAAa,aAAa,WAAW;AAClD,aAAO,EAAE,SAAS,mBAAmB;AAAA,IACvC;AAAA,EACF;AACF;;;AX9LA,IAAI,SAAkC;AAEtC,SAAS,UAAU,cAAyC;AAC1D,MAAI,CAAC,QAAQ;AACX,UAAM,SAAS,WAAW;AAC1B,aAAS,IAAI,iBAAiB,QAAQ,YAAY;AAAA,EACpD;AACA,SAAO;AACT;AAEO,SAAS,aAAa,cAAkC;AAC7D,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AAID,gBAAc,QAAQ;AAAA,IACpB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL,GAAG,WAAW;AAAA,IACZ;AAAA,IACA,eAAe,MAAM;AAAE,eAAS;AAAA,IAAM;AAAA,EACxC,CAAC;AAED,SAAO;AACT;;;ADrCA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,gBAAgB,EACrB,YAAY,kCAAkC,EAC9C,QAAQ,QAAQ;AAEnB,QACG,QAAQ,OAAO,EACf,YAAY,wCAAwC,EACpD,OAAO,WAAW,sBAAsB,EACxC,OAAO,wBAAwB,iCAAiC,QAAQ,EACxE,OAAO,OAAO,SAAS;AACtB,QAAM,eAAe,SAAS,KAAK,cAAc,EAAE;AACnD,QAAM,SAAS,aAAa,YAAY;AACxC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,6DAA6D,EACzE,OAAO,YAAY,sCAAsC,EACzD,OAAO,iBAAiB,oCAAoC,EAC5D,OAAO,iBAAiB,qCAAqC,EAC7D,OAAO,OAAO,SAAS;AACtB,MAAI,KAAK,YAAY;AACnB,eAAW;AACX;AAAA,EACF;AAEA,MAAI,KAAK,MAAM;AACb,UAAM,cAAc,KAAK,IAAI;AAC7B;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ;AACf,UAAM,YAAY;AAClB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,mBAAmB;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,IAAI;AAAA,4CAAsC,MAAgB,OAAO,EAAE;AAC3E,YAAQ,IAAI,iDAAiD;AAC7D,UAAM,YAAY;AAAA,EACpB;AACF,CAAC;AAGH,IAAI,QAAQ,KAAK,UAAU,GAAG;AAC5B,UAAQ,KAAK,KAAK,OAAO;AAC3B;AAEA,QAAQ,MAAM;","names":["execSync","mkdirSync","join","homedir","execSync","join","homedir","mkdirSync","getClient","client","z","z","client","z","z","client","z","z","client","z","z","client","z","z","client"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/server.ts","../src/constants.ts","../src/auth.ts","../src/browser-auth.ts","../src/client.ts","../src/tools/index.ts","../src/tools/auth.ts","../src/tools/query.ts","../src/tools/research.ts","../src/tools/notebook.ts","../src/tools/source.ts","../src/tools/studio.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runAuthFlow, runFileImport, showTokens } from \"./auth.js\";\nimport { runBrowserAuthFlow } from \"./browser-auth.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"notebooklm-mcp\")\n .description(\"MCP server for Google NotebookLM\")\n .version(\"0.1.22\");\n\nprogram\n .command(\"serve\")\n .description(\"Start the MCP server (stdio transport)\")\n .option(\"--debug\", \"Enable debug logging\")\n .option(\"--query-timeout <ms>\", \"Query timeout in milliseconds\", \"120000\")\n .action(async (opts) => {\n const queryTimeout = parseInt(opts.queryTimeout, 10);\n const server = createServer(queryTimeout);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n });\n\nprogram\n .command(\"auth\")\n .description(\"Authenticate with NotebookLM (automated Chrome integration)\")\n .option(\"--manual\", \"Use manual cookie copy-paste instead\")\n .option(\"--file <path>\", \"Import cookies from a file instead\")\n .option(\"--show-tokens\", \"Show cached token info (no secrets)\")\n .action(async (opts) => {\n if (opts.showTokens) {\n showTokens();\n return;\n }\n\n if (opts.file) {\n await runFileImport(opts.file);\n return;\n }\n\n if (opts.manual) {\n await runAuthFlow();\n return;\n }\n\n try {\n await runBrowserAuthFlow();\n } catch (error) {\n console.log(`\\n⚠️ Smart Authentication failed: ${(error as Error).message}`);\n console.log(\"Falling back to manual authentication flow...\\n\");\n await runAuthFlow();\n }\n });\n\n// Default command: serve (for npx compatibility)\nif (process.argv.length <= 2) {\n process.argv.push(\"serve\");\n}\n\nprogram.parse();\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"./client.js\";\nimport { loadTokens, saveTokens } from \"./auth.js\";\nimport type { AuthTokens, ToolResult } from \"./types.js\";\nimport { registerTools } from \"./tools/index.js\";\nimport { authTools } from \"./tools/auth.js\";\nimport { queryTools } from \"./tools/query.js\";\nimport { researchTools } from \"./tools/research.js\";\nimport { notebookTools } from \"./tools/notebook.js\";\nimport { sourceTools } from \"./tools/source.js\";\nimport { studioTools } from \"./tools/studio.js\";\nlet client: NotebookLMClient | null = null;\n\nfunction getClient(queryTimeout?: number): NotebookLMClient {\n if (!client) {\n const tokens = loadTokens();\n client = new NotebookLMClient(tokens, queryTimeout);\n }\n return client;\n}\n\nexport function createServer(queryTimeout?: number): McpServer {\n const server = new McpServer({\n name: \"notebooklm\",\n version: \"0.1.0\",\n });\n\n // ─── Refactored Tool Registration ─────────────────────\n \n registerTools(server, [\n ...notebookTools,\n ...sourceTools,\n ...studioTools,\n ...authTools,\n ...queryTools,\n ...researchTools,\n ], getClient, { \n queryTimeout,\n onClientReset: () => { client = null; }\n });\n\n return server;\n}\n","export class CodeMapper {\n private nameToCode: Map<string, number>;\n private codeToName: Map<number, string>;\n private unknownLabel: string;\n private displayNames: string[];\n\n constructor(mapping: Record<string, number>, unknownLabel = \"unknown\") {\n this.nameToCode = new Map(\n Object.entries(mapping).map(([k, v]) => [k.toLowerCase(), v]),\n );\n this.codeToName = new Map(\n Object.entries(mapping).map(([k, v]) => [v, k]),\n );\n this.unknownLabel = unknownLabel;\n this.displayNames = Object.keys(mapping).sort();\n }\n\n getCode(name: string): number {\n const code = this.nameToCode.get(name.toLowerCase());\n if (code === undefined) {\n throw new Error(\n `Invalid value \"${name}\". Valid options: ${this.optionsStr()}`,\n );\n }\n return code;\n }\n\n getName(code: number | null): string {\n if (code === null) return this.unknownLabel;\n return this.codeToName.get(code) ?? this.unknownLabel;\n }\n\n optionsStr(): string {\n return this.displayNames.join(\", \");\n }\n\n names(): string[] {\n return [...this.displayNames];\n }\n}\n\n// RPC IDs\nexport const RPC_IDS = {\n LIST_NOTEBOOKS: \"wXbhsf\",\n GET_NOTEBOOK: \"rLM1Ne\",\n CREATE_NOTEBOOK: \"CCqFvf\",\n RENAME_NOTEBOOK: \"s0tc2d\",\n DELETE_NOTEBOOK: \"WWINqb\",\n ADD_SOURCE: \"izAoDd\",\n GET_SOURCE: \"hizoJc\",\n CHECK_FRESHNESS: \"yR9Yof\",\n SYNC_DRIVE: \"FLmJqe\",\n DELETE_SOURCE: \"tGMBJ\",\n GET_CONVERSATIONS: \"hPTbtc\",\n PREFERENCES: \"hT54vc\",\n SUBSCRIPTION: \"ozz5Z\",\n SETTINGS: \"ZwVcOc\",\n GET_SUMMARY: \"VfAZjd\",\n GET_SOURCE_GUIDE: \"tr032e\",\n START_FAST_RESEARCH: \"Ljjv0c\",\n START_DEEP_RESEARCH: \"QA9ei\",\n POLL_RESEARCH: \"e3bVqc\",\n IMPORT_RESEARCH: \"LBwxtb\",\n CREATE_STUDIO: \"R7cb6c\",\n POLL_STUDIO: \"gArtLc\",\n DELETE_STUDIO: \"V5N4be\",\n GENERATE_MIND_MAP: \"yyryJe\",\n SAVE_MIND_MAP: \"CYK0Xb\",\n LIST_MIND_MAPS: \"cFji9\",\n DELETE_MIND_MAP: \"AH0mwd\",\n} as const;\n\n// Ownership\nexport const OWNERSHIP_MINE = 1;\nexport const OWNERSHIP_SHARED = 2;\n\n// Chat\nexport const CHAT_GOALS = new CodeMapper({\n default: 1,\n custom: 2,\n learning_guide: 3,\n});\n\nexport const CHAT_RESPONSE_LENGTHS = new CodeMapper({\n default: 1,\n longer: 4,\n shorter: 5,\n});\n\n// Research\nexport const RESEARCH_SOURCES = new CodeMapper({ web: 1, drive: 2 });\nexport const RESEARCH_MODES = new CodeMapper({ fast: 1, deep: 5 });\nexport const RESULT_TYPES = new CodeMapper({\n web: 1,\n google_doc: 2,\n google_slides: 3,\n deep_report: 5,\n google_sheets: 8,\n});\n\n// Source Types\nexport const SOURCE_TYPES = new CodeMapper({\n google_docs: 1,\n google_slides_sheets: 2,\n pdf: 3,\n pasted_text: 4,\n web_page: 5,\n generated_text: 8,\n youtube: 9,\n uploaded_file: 11,\n image: 13,\n word_doc: 14,\n});\n\n// Studio Types\nexport const STUDIO_TYPES = new CodeMapper({\n audio: 1,\n report: 2,\n video: 3,\n flashcards: 4,\n infographic: 7,\n slide_deck: 8,\n data_table: 9,\n});\n\n// Audio\nexport const AUDIO_FORMATS = new CodeMapper({\n deep_dive: 1,\n brief: 2,\n critique: 3,\n debate: 4,\n});\n\nexport const AUDIO_LENGTHS = new CodeMapper({\n short: 1,\n default: 2,\n long: 3,\n});\n\n// Video\nexport const VIDEO_FORMATS = new CodeMapper({ explainer: 1, brief: 2 });\n\nexport const VIDEO_STYLES = new CodeMapper({\n auto_select: 1,\n custom: 2,\n classic: 3,\n whiteboard: 4,\n kawaii: 5,\n anime: 6,\n watercolor: 7,\n retro_print: 8,\n heritage: 9,\n paper_craft: 10,\n});\n\n// Infographic\nexport const INFOGRAPHIC_ORIENTATIONS = new CodeMapper({\n landscape: 1,\n portrait: 2,\n square: 3,\n});\n\nexport const INFOGRAPHIC_DETAILS = new CodeMapper({\n concise: 1,\n standard: 2,\n detailed: 3,\n});\n\n// Slide Deck\nexport const SLIDE_DECK_FORMATS = new CodeMapper({\n detailed_deck: 1,\n presenter_slides: 2,\n});\n\nexport const SLIDE_DECK_LENGTHS = new CodeMapper({\n short: 1,\n default: 3,\n});\n\n// Flashcards/Quiz\nexport const FLASHCARD_DIFFICULTIES = new CodeMapper({\n easy: 1,\n medium: 2,\n hard: 3,\n});\n\nexport const FLASHCARD_COUNT_DEFAULT = 2;\n\n// Report Formats\nexport const REPORT_FORMATS: Record<\n string,\n { title: string; description: string; prompt: string }\n> = {\n \"Briefing Doc\": {\n title: \"Briefing Doc\",\n description: \"A comprehensive briefing document\",\n prompt: \"Create a briefing document\",\n },\n \"Study Guide\": {\n title: \"Study Guide\",\n description: \"A study guide for the material\",\n prompt: \"Create a study guide\",\n },\n \"Blog Post\": {\n title: \"Blog Post\",\n description: \"A blog post about the material\",\n prompt: \"Create a blog post\",\n },\n \"Create Your Own\": {\n title: \"Create Your Own\",\n description: \"Custom report format\",\n prompt: \"\",\n },\n};\n\n// Base URL\nexport const BASE_URL = \"https://notebooklm.google.com\";\nexport const BATCHEXECUTE_PATH = \"/_/LabsTailwindUi/data/batchexecute\";\nexport const QUERY_PATH =\n \"/_/LabsTailwindUi/data/google.internal.labs.tailwind.orchestration.v1.LabsTailwindOrchestrationService/GenerateFreeFormStreamed\";\n\nexport const DEFAULT_BL = \"boq_labs-tailwind-frontend_20260108.06_p0\";\n\nexport const REQUIRED_COOKIES = [\n \"SID\",\n \"HSID\",\n \"SSID\",\n \"APISID\",\n \"SAPISID\",\n];\n\nexport const USER_AGENT =\n \"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\";\n\nexport const DEFAULT_TIMEOUT = 30_000;\nexport const EXTENDED_TIMEOUT = 120_000;\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { createInterface } from \"node:readline\";\nimport type { AuthTokens } from \"./types.js\";\nimport { REQUIRED_COOKIES, BASE_URL } from \"./constants.js\";\n\nconst CONFIG_DIR = join(homedir(), \".notebooklm-mcp\");\nconst AUTH_FILE = join(CONFIG_DIR, \"auth.json\");\nconst CHROME_PROFILE = join(CONFIG_DIR, \"chrome-profile\");\n\nexport function validateCookies(cookies: Record<string, string>): boolean {\n return REQUIRED_COOKIES.every((name) => name in cookies);\n}\n\nexport function buildCookieHeader(cookies: Record<string, string>): string {\n return Object.entries(cookies)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"; \");\n}\n\nexport function extractCsrfFromPage(html: string): string | null {\n const patterns = [\n /\"SNlM0e\":\"([^\"]+)\"/,\n /at=([^&\"]+)/,\n /\"FdrFJe\":\"([^\"]+)\"/,\n ];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function extractSessionIdFromPage(html: string): string | null {\n const patterns = [/\"FdrFJe\":\"([^\"]+)\"/, /f\\.sid=(\\d+)/];\n for (const pattern of patterns) {\n const match = html.match(pattern);\n if (match) return match[1];\n }\n return null;\n}\n\nexport function saveTokens(tokens: AuthTokens): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(AUTH_FILE, JSON.stringify(tokens, null, 2), \"utf-8\");\n}\n\nexport function loadTokensFromCache(): AuthTokens | null {\n if (!existsSync(AUTH_FILE)) return null;\n try {\n const data = JSON.parse(readFileSync(AUTH_FILE, \"utf-8\"));\n if (data.cookies && validateCookies(data.cookies)) {\n return {\n cookies: data.cookies,\n csrf_token: data.csrf_token || \"\",\n session_id: data.session_id || \"\",\n extracted_at: data.extracted_at || 0,\n };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function loadTokensFromEnv(): AuthTokens | null {\n const cookieStr = process.env.NOTEBOOKLM_COOKIES;\n if (!cookieStr) return null;\n\n const cookies: Record<string, string> = {};\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n\n if (!validateCookies(cookies)) return null;\n\n return {\n cookies,\n csrf_token: process.env.NOTEBOOKLM_CSRF_TOKEN || \"\",\n session_id: process.env.NOTEBOOKLM_SESSION_ID || \"\",\n extracted_at: Date.now() / 1000,\n };\n}\n\nexport function loadTokens(): AuthTokens {\n const fromEnv = loadTokensFromEnv();\n if (fromEnv) return fromEnv;\n\n const fromCache = loadTokensFromCache();\n if (fromCache) return fromCache;\n\n throw new Error(\n \"No authentication tokens found. Run `npx @m4ykeldev/notebooklm-mcp auth` to authenticate, \" +\n \"or set NOTEBOOKLM_COOKIES environment variable.\",\n );\n}\n\nfunction parseCookieString(raw: string): Record<string, string> {\n const cookies: Record<string, string> = {};\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n for (const part of trimmed.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookies[part.slice(0, eq).trim()] = part.slice(eq + 1).trim();\n }\n }\n }\n return cookies;\n}\n\nexport async function runFileImport(filePath?: string): Promise<AuthTokens> {\n if (!filePath) {\n console.log(`\nTo authenticate via file:\n1. Open Chrome and navigate to https://notebooklm.google.com\n2. Open DevTools (F12) > Network tab\n3. Type \"batchexecute\" in the filter\n4. Click on any batchexecute request\n5. Find \"cookie:\" in Request Headers\n6. Copy the full cookie VALUE (not the header name)\n7. Save to a file and provide the path\n`);\n throw new Error(\"Provide a cookie file path with --file <path>\");\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const cookies = parseCookieString(raw);\n\n if (!validateCookies(cookies)) {\n throw new Error(\n `Missing required cookies. Need: ${REQUIRED_COOKIES.join(\", \")}`,\n );\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n console.log(\"Authentication tokens saved successfully.\");\n return tokens;\n}\n\nfunction readLineFromStdin(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n rl.question(prompt, (answer: string) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction openInBrowser(url: string): void {\n const platform = process.platform;\n try {\n if (platform === \"linux\") {\n execSync(`xdg-open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"darwin\") {\n execSync(`open \"${url}\"`, { stdio: \"ignore\" });\n } else if (platform === \"win32\") {\n execSync(`start \"\" \"${url}\"`, { stdio: \"ignore\" });\n }\n } catch {\n console.log(`Could not open browser automatically. Open this URL manually:\\n${url}`);\n }\n}\n\nexport async function runAuthFlow(): Promise<AuthTokens> {\n console.log(\"╔══════════════════════════════════════════════════════════╗\");\n console.log(\"║ NotebookLM MCP — Authentication Setup ║\");\n console.log(\"╚══════════════════════════════════════════════════════════╝\\n\");\n\n console.log(\"Opening NotebookLM in your browser...\\n\");\n openInBrowser(BASE_URL);\n\n console.log(\"Follow these steps:\\n\");\n console.log(\" 1. NotebookLM should open in your browser (you're already logged in)\");\n console.log(\" 2. Press F12 to open DevTools\");\n console.log(\" 3. Go to the Network tab\");\n console.log(\" 4. Type 'batchexecute' in the filter box\");\n console.log(\" 5. Click on any request that appears in the list\");\n console.log(\" 6. In the Headers panel, find 'cookie:' under Request Headers\");\n console.log(\" 7. Right-click the cookie value → Copy value\\n\");\n console.log(\" Tip: If no requests appear, refresh the page (F5) with DevTools open.\\n\");\n\n const cookieStr = await readLineFromStdin(\"Paste the cookie value here: \");\n\n if (!cookieStr) {\n throw new Error(\"No cookie string provided.\");\n }\n\n const cookies = parseCookieString(cookieStr);\n\n if (!validateCookies(cookies)) {\n console.log(\"\\n❌ Missing required cookies.\");\n console.log(` Need: ${REQUIRED_COOKIES.join(\", \")}`);\n console.log(` Got: ${Object.keys(cookies).join(\", \")}`);\n throw new Error(\"Invalid cookie string. Make sure you copied the full cookie value.\");\n }\n\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n\n saveTokens(tokens);\n\n console.log(`\\n✅ Authentication saved successfully!`);\n console.log(` ${Object.keys(cookies).length} cookies extracted`);\n console.log(` Stored in: ~/.notebooklm-mcp/auth.json`);\n console.log(`\\n CSRF token and session ID will be auto-extracted on first use.`);\n\n return tokens;\n}\n\nexport function showTokens(): void {\n const tokens = loadTokensFromCache();\n if (!tokens) {\n console.log(\"No cached tokens found.\");\n return;\n }\n\n const cookieNames = Object.keys(tokens.cookies);\n const hasRequired = REQUIRED_COOKIES.every((c) => cookieNames.includes(c));\n const age = tokens.extracted_at\n ? Math.round((Date.now() / 1000 - tokens.extracted_at) / 3600)\n : \"unknown\";\n\n console.log(`Cached tokens:`);\n console.log(` Cookies: ${cookieNames.length} (${cookieNames.join(\", \")})`);\n console.log(` Required cookies present: ${hasRequired ? \"yes\" : \"NO\"}`);\n console.log(` CSRF token: ${tokens.csrf_token ? \"present\" : \"missing\"}`);\n console.log(` Session ID: ${tokens.session_id ? \"present\" : \"missing\"}`);\n console.log(` Age: ${age} hours`);\n console.log(` File: ${AUTH_FILE}`);\n}\n","import { execSync, spawn } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport WebSocket from \"ws\";\nimport type { AuthTokens } from \"./types.js\";\nimport { BASE_URL, REQUIRED_COOKIES } from \"./constants.js\";\nimport { validateCookies, saveTokens } from \"./auth.js\";\n\nconst CDP_PORT = 9229;\n\nexport function findChrome(): string | null {\n const candidates: string[] = [];\n\n if (process.platform === \"darwin\") {\n candidates.push(\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n );\n } else if (process.platform === \"linux\") {\n candidates.push(\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium\",\n \"chromium-browser\",\n \"/usr/bin/google-chrome\",\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n );\n } else if (process.platform === \"win32\") {\n candidates.push(\n \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n \"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n `${process.env.LOCALAPPDATA}\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe`,\n `${process.env.LOCALAPPDATA}\\\\Chromium\\\\Application\\\\chrome.exe`,\n );\n }\n\n for (const candidate of candidates) {\n try {\n const cmd =\n process.platform === \"win32\"\n ? `\"${candidate}\" --version`\n : `\"${candidate}\" --version`;\n execSync(cmd, { stdio: \"ignore\" });\n return candidate;\n } catch {\n // not found, try next\n }\n }\n return null;\n}\n\nasync function getDebuggerUrl(port: number): Promise<string> {\n const maxRetries = 20;\n for (let i = 0; i < maxRetries; i++) {\n try {\n const response = await fetch(`http://localhost:${port}/json/list`);\n if (response.ok) {\n const data = (await response.json()) as any[];\n if (Array.isArray(data)) {\n const notebookTab = data.find(\n (target) =>\n target?.type === \"page\" &&\n typeof target?.url === \"string\" &&\n target.url.startsWith(BASE_URL) &&\n typeof target?.webSocketDebuggerUrl === \"string\",\n );\n if (notebookTab) return notebookTab.webSocketDebuggerUrl;\n\n const firstPage = data.find(\n (target) =>\n target?.type === \"page\" &&\n typeof target?.webSocketDebuggerUrl === \"string\",\n );\n if (firstPage) return firstPage.webSocketDebuggerUrl;\n }\n }\n } catch {\n // wait and retry\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n throw new Error(\"Could not connect to Chrome remote debugging port.\");\n}\n\nexport async function launchChrome(headless: boolean) {\n const chromePath = findChrome();\n if (!chromePath) {\n throw new Error(\n \"Could not find Google Chrome or Chromium. Please use manual auth.\",\n );\n }\n\n const userDataDir = join(homedir(), \".notebooklm-mcp\", \"chrome-profile\");\n mkdirSync(userDataDir, { recursive: true });\n\n const args = [\n `--remote-debugging-port=${CDP_PORT}`,\n `--user-data-dir=${userDataDir}`,\n \"--no-first-run\",\n \"--no-default-browser-check\",\n BASE_URL,\n ];\n\n if (headless) {\n args.push(\"--headless=new\");\n }\n\n const chromeProcess = spawn(chromePath, args, {\n detached: true,\n stdio: \"ignore\",\n });\n chromeProcess.unref();\n return chromeProcess;\n}\n\nasync function extractCookiesViaCDP(\n timeoutMs: number,\n showProgress: boolean,\n): Promise<AuthTokens> {\n const wsUrl = await getDebuggerUrl(CDP_PORT);\n const ws = new WebSocket(wsUrl);\n\n return new Promise((resolve, reject) => {\n let messageId = 0;\n let timer: NodeJS.Timeout;\n let globalTimeout: NodeJS.Timeout;\n let lastCdpError: string | null = null;\n\n const cleanup = () => {\n clearInterval(timer);\n clearTimeout(globalTimeout);\n ws.close();\n };\n\n const send = (method: string, params: any = {}) => {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ id: ++messageId, method, params }));\n }\n };\n\n globalTimeout = setTimeout(() => {\n cleanup();\n reject(\n new Error(\n lastCdpError\n ? `Authentication timed out after ${timeoutMs / 1000}s (CDP error: ${lastCdpError}).`\n : `Authentication timed out after ${timeoutMs / 1000}s.`,\n ),\n );\n }, timeoutMs);\n\n ws.on(\"open\", () => {\n send(\"Network.enable\");\n timer = setInterval(() => {\n send(\"Network.getCookies\", { urls: [BASE_URL, \"https://google.com\"] });\n }, 2000);\n });\n\n ws.on(\"close\", () => {\n cleanup();\n reject(\n new Error(\n \"Browser connection closed before authentication was complete.\",\n ),\n );\n });\n\n ws.on(\"error\", (err) => {\n cleanup();\n reject(err);\n });\n\n ws.on(\"message\", (data) => {\n try {\n const response = JSON.parse(data.toString());\n if (response.error) {\n lastCdpError = response.error.message || JSON.stringify(response.error);\n return;\n }\n if (response.result && response.result.cookies) {\n const cookies: Record<string, string> = {};\n for (const c of response.result.cookies) {\n cookies[c.name] = c.value;\n }\n\n if (validateCookies(cookies)) {\n const tokens: AuthTokens = {\n cookies,\n csrf_token: \"\",\n session_id: \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n cleanup();\n resolve(tokens);\n } else if (showProgress) {\n process.stdout.write(\".\");\n }\n }\n } catch (e) {\n // ignore parse errors\n }\n });\n });\n}\n\nexport async function refreshCookiesHeadless(): Promise<AuthTokens> {\n console.log(\"🔄 Attempting background session refresh...\");\n const chromeProcess = await launchChrome(true);\n\n try {\n const tokens = await extractCookiesViaCDP(15000, false);\n console.log(\"✅ Background refresh successful.\");\n return tokens;\n } catch (error) {\n throw error;\n } finally {\n // Kill the headless process when done\n chromeProcess.kill();\n }\n}\n\nexport async function runBrowserAuthFlow(): Promise<AuthTokens> {\n console.log(\"✨ Initializing Smart Authentication... (Setting up a secure session)\");\n console.log(\n \" (A dedicated profile will be used at ~/.notebooklm-mcp/chrome-profile)\",\n );\n\n const chromeProcess = await launchChrome(false);\n\n try {\n console.log(\"\\n🔓 Ready for login! If you're already signed into Google, we'll handle the rest automatically.\\n\");\n\n const tokens = await extractCookiesViaCDP(120000, true);\n console.log(\"\\n✅ Connection secured! Your NotebookLM session is now synchronized.\");\n return tokens;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(\n `Smart Auth failed: ${error.message}\\nTry manual auth instead.`,\n );\n }\n throw error;\n } finally {\n chromeProcess.kill();\n }\n}\n","import type {\n AuthTokens,\n Notebook,\n SourceSummary,\n SourceDetail,\n ResearchResult,\n ResearchSource,\n StudioArtifact,\n QueryResponse,\n} from \"./types.js\";\nimport {\n RPC_IDS,\n BASE_URL,\n BATCHEXECUTE_PATH,\n QUERY_PATH,\n DEFAULT_BL,\n USER_AGENT,\n DEFAULT_TIMEOUT,\n EXTENDED_TIMEOUT,\n OWNERSHIP_MINE,\n SOURCE_TYPES,\n RESULT_TYPES,\n RESEARCH_SOURCES,\n RESEARCH_MODES,\n STUDIO_TYPES,\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n CHAT_GOALS,\n CHAT_RESPONSE_LENGTHS,\n} from \"./constants.js\";\nimport {\n buildCookieHeader,\n extractCsrfFromPage,\n extractSessionIdFromPage,\n saveTokens,\n} from \"./auth.js\";\nimport { refreshCookiesHeadless, runBrowserAuthFlow } from \"./browser-auth.js\";\n\nexport class AuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"AuthenticationError\";\n }\n}\n\nexport class NotebookLMClient {\n private tokens: AuthTokens;\n private csrfToken: string;\n private sessionId: string;\n private conversationHistory: Map<string, unknown[]> = new Map();\n private queryTimeout: number;\n private reqId = 0;\n\n constructor(tokens: AuthTokens, queryTimeout?: number) {\n this.tokens = tokens;\n this.csrfToken = tokens.csrf_token;\n this.sessionId = tokens.session_id;\n this.queryTimeout = queryTimeout ?? EXTENDED_TIMEOUT;\n }\n\n // ─── Core HTTP/RPC ───────────────────────────────────\n\n private buildRequestBody(rpcId: string, params: unknown): string {\n const paramsJson = JSON.stringify(params);\n const fReq = JSON.stringify([[[rpcId, paramsJson, null, \"generic\"]]]);\n const parts = [`f.req=${encodeURIComponent(fReq)}`];\n if (this.csrfToken) {\n parts.push(`at=${encodeURIComponent(this.csrfToken)}`);\n }\n return parts.join(\"&\") + \"&\";\n }\n\n private buildUrl(rpcId: string, sourcePath = \"/\"): string {\n const params: Record<string, string> = {\n rpcids: rpcId,\n \"source-path\": sourcePath,\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${BATCHEXECUTE_PATH}?${query}`;\n }\n\n private buildQueryUrl(sourcePath = \"/\"): string {\n this.reqId++;\n const params: Record<string, string> = {\n bl: process.env.NOTEBOOKLM_BL || DEFAULT_BL,\n hl: \"en\",\n _reqid: String(this.reqId),\n rt: \"c\",\n };\n if (this.sessionId) {\n params[\"f.sid\"] = this.sessionId;\n }\n const query = new URLSearchParams(params).toString();\n return `${BASE_URL}${QUERY_PATH}?${query}`;\n }\n\n private parseResponse(responseText: string): unknown[] {\n let text = responseText;\n if (text.startsWith(\")]}'\")) {\n text = text.slice(4);\n }\n\n const lines = text.trim().split(\"\\n\");\n const results: unknown[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i].trim();\n if (!line) {\n i++;\n continue;\n }\n\n const maybeByteCount = parseInt(line, 10);\n if (!isNaN(maybeByteCount) && String(maybeByteCount) === line) {\n i++;\n if (i < lines.length) {\n try {\n results.push(JSON.parse(lines[i]));\n } catch {\n // skip unparseable\n }\n i++;\n }\n } else {\n try {\n results.push(JSON.parse(line));\n } catch {\n // skip\n }\n i++;\n }\n }\n\n return results;\n }\n\n private extractRpcResult(parsed: unknown[], rpcId: string): unknown {\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\" && item[1] === rpcId) {\n // Check for auth error (code 16)\n if (\n item.length > 6 &&\n item[6] === \"generic\" &&\n Array.isArray(item[5]) &&\n item[5].includes(16)\n ) {\n throw new AuthenticationError(\n \"Authentication expired. Run `npx @m4ykeldev/notebooklm-mcp auth` to re-authenticate.\",\n );\n }\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n return JSON.parse(resultStr);\n } catch {\n return resultStr;\n }\n }\n return resultStr;\n }\n }\n }\n return null;\n }\n\n private async execute(\n rpcId: string,\n params: unknown,\n sourcePath = \"/\",\n timeout = DEFAULT_TIMEOUT,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n try {\n return this.extractRpcResult(parsed, rpcId);\n } catch (e) {\n if (e instanceof AuthenticationError) {\n console.log(\"🔄 Session expired. Effortlessly restoring your connection in the background...\");\n try {\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"⚠️ Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.\");\n newTokens = await runBrowserAuthFlow();\n }\n\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n\n // Re-extract CSRF/SID from the page using the new cookies\n await this.refreshAuthTokens();\n\n // Retry once\n return this.executeOnce(rpcId, params, sourcePath, timeout);\n } catch (finalError) {\n console.error(\"❌ Authentication failed:\", (finalError as Error).message);\n throw e; // Propagate original AuthenticationError\n }\n }\n throw e;\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async executeOnce(\n rpcId: string,\n params: unknown,\n sourcePath: string,\n timeout: number,\n ): Promise<unknown> {\n const url = this.buildUrl(rpcId, sourcePath);\n const body = this.buildRequestBody(rpcId, params);\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n return this.extractRpcResult(parsed, rpcId);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async refreshAuthTokens(): Promise<void> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), DEFAULT_TIMEOUT);\n\n try {\n const response = await fetch(BASE_URL, {\n headers: {\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"User-Agent\": USER_AGENT,\n Accept: \"text/html\",\n },\n signal: controller.signal,\n });\n\n const html = await response.text();\n const csrf = extractCsrfFromPage(html);\n const sid = extractSessionIdFromPage(html);\n\n if (csrf) this.csrfToken = csrf;\n if (sid) this.sessionId = sid;\n\n this.tokens.csrf_token = this.csrfToken;\n this.tokens.session_id = this.sessionId;\n saveTokens(this.tokens);\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ─── Notebook Methods ────────────────────────────────\n\n private parseTimestamp(ts: unknown): string | null {\n if (Array.isArray(ts) && ts.length >= 1 && typeof ts[0] === \"number\") {\n return new Date(ts[0] * 1000).toISOString();\n }\n return null;\n }\n\n private parseNotebook(data: unknown): Notebook {\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid notebook data received from Google. This usually happens if the notebook ID is incorrect, it was deleted, or you don't have permission to access it.\",\n );\n }\n const d = data as any[];\n const sources: SourceSummary[] = [];\n if (Array.isArray(d[1])) {\n for (const s of d[1]) {\n if (Array.isArray(s) && s[0]) {\n sources.push({\n id: Array.isArray(s[0]) ? s[0][0] : String(s[0]),\n title: s[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n const meta = d[5] as any[] | undefined;\n return {\n id: d[2] || \"\",\n title: d[0] || \"Untitled\",\n emoji: d[3] || null,\n sources,\n is_shared: meta?.[1] === true,\n ownership: meta?.[0] === OWNERSHIP_MINE ? \"mine\" : \"shared\",\n created_at: meta ? this.parseTimestamp(meta[8]) : null,\n modified_at: meta ? this.parseTimestamp(meta[5]) : null,\n };\n }\n\n async listNotebooks(maxResults = 100): Promise<Notebook[]> {\n const result = await this.execute(\n RPC_IDS.LIST_NOTEBOOKS,\n [null, 1, null, [2]],\n );\n if (!Array.isArray(result) || !Array.isArray(result[0])) return [];\n\n const notebooks: Notebook[] = [];\n for (const item of result[0]) {\n if (Array.isArray(item)) {\n notebooks.push(this.parseNotebook(item));\n }\n }\n return notebooks.slice(0, maxResults);\n }\n\n async getNotebook(notebookId: string): Promise<Notebook> {\n const result = await this.execute(\n RPC_IDS.GET_NOTEBOOK,\n [notebookId, null, [2], null, 0],\n `/notebook/${notebookId}`,\n );\n return this.parseNotebook(result);\n }\n\n async createNotebook(title: string): Promise<Notebook> {\n const result = await this.execute(RPC_IDS.CREATE_NOTEBOOK, [\n title,\n null,\n null,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ]);\n return this.parseNotebook(result);\n }\n\n async renameNotebook(notebookId: string, newTitle: string): Promise<void> {\n await this.execute(\n RPC_IDS.RENAME_NOTEBOOK,\n [notebookId, [[null, null, null, [null, newTitle]]]],\n `/notebook/${notebookId}`,\n );\n }\n\n async deleteNotebook(notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_NOTEBOOK,\n [notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n async describeNotebook(notebookId: string): Promise<string> {\n const result = await this.execute(\n RPC_IDS.GET_SUMMARY,\n [notebookId, null, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n // ─── Source Methods ──────────────────────────────────\n\n async addUrlSource(\n notebookId: string,\n url: string,\n ): Promise<SourceSummary> {\n const isYouTube =\n url.toLowerCase().includes(\"youtube.com\") ||\n url.toLowerCase().includes(\"youtu.be\");\n\n const sourceData = isYouTube\n ? [null, null, null, null, null, null, null, [url], null, null, 1]\n : [null, null, [url], null, null, null, null, null, null, null, 1];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || url,\n type: isYouTube ? \"youtube\" : \"web_page\",\n };\n }\n\n async addTextSource(\n notebookId: string,\n text: string,\n title: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n null,\n [title, text],\n null,\n 2,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"pasted_text\",\n };\n }\n\n async addDriveSource(\n notebookId: string,\n documentId: string,\n title: string,\n mimeType: string,\n ): Promise<SourceSummary> {\n const sourceData = [\n [documentId, mimeType, 1, title],\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n 1,\n ];\n\n const result = await this.execute(\n RPC_IDS.ADD_SOURCE,\n [\n [sourceData],\n notebookId,\n [2],\n [1, null, null, null, null, null, null, null, null, null, [1]],\n ],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n\n const data = result as any[];\n const source = data?.[0]?.[0];\n return {\n id: Array.isArray(source?.[0]) ? source[0][0] : String(source?.[0] || \"\"),\n title: source?.[1] || title,\n type: \"google_docs\",\n };\n }\n\n async getSource(\n sourceId: string,\n notebookId: string,\n ): Promise<SourceDetail> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n id: sourceId,\n title: data?.[1] || \"Untitled\",\n type: SOURCE_TYPES.getName(data?.[3] ?? null),\n content: data?.[4] || null,\n summary: null,\n keywords: [],\n };\n }\n\n async getSourceGuide(\n sourceId: string,\n notebookId: string,\n ): Promise<{ summary: string; keywords: string[] }> {\n const result = await this.execute(\n RPC_IDS.GET_SOURCE_GUIDE,\n [sourceId, notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return {\n summary: data?.[0] || \"\",\n keywords: Array.isArray(data?.[1]) ? data[1] : [],\n };\n }\n\n async checkFreshness(\n sourceId: string,\n notebookId: string,\n ): Promise<boolean | null> {\n try {\n const result = await this.execute(\n RPC_IDS.CHECK_FRESHNESS,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] === true;\n } catch {\n return null;\n }\n }\n\n async syncDrive(sourceIds: string[], notebookId: string): Promise<void> {\n for (const sourceId of sourceIds) {\n await this.execute(\n RPC_IDS.SYNC_DRIVE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n }\n\n async deleteSource(sourceId: string, notebookId: string): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_SOURCE,\n [sourceId, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n // ─── Query Method ────────────────────────────────────\n\n async query(\n notebookId: string,\n queryText: string,\n sourceIds?: string[],\n conversationId?: string,\n ): Promise<QueryResponse> {\n const sourcesNested = sourceIds\n ? sourceIds.map((sid) => [[sid]])\n : [];\n\n const history = conversationId\n ? this.conversationHistory.get(conversationId) || null\n : null;\n\n const params = [\n sourcesNested,\n queryText,\n history,\n [2, null, [1]],\n conversationId || null,\n ];\n\n const fReq = JSON.stringify([null, JSON.stringify(params)]);\n const body = `f.req=${encodeURIComponent(fReq)}&`;\n\n const url = this.buildQueryUrl(`/notebook/${notebookId}`);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.queryTimeout);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n Origin: BASE_URL,\n Referer: `${BASE_URL}/`,\n Cookie: buildCookieHeader(this.tokens.cookies),\n \"X-Same-Domain\": \"1\",\n \"User-Agent\": USER_AGENT,\n },\n body,\n signal: controller.signal,\n });\n\n const text = await response.text();\n const parsed = this.parseResponse(text);\n\n // Check for auth error in the response stream\n for (const chunk of parsed) {\n if (Array.isArray(chunk)) {\n for (const item of chunk) {\n if (Array.isArray(item) && item[0] === \"wrb.fr\" && Array.isArray(item[5]) && item[5].includes(16)) {\n console.log(\"🔄 Session expired during query. Effortlessly restoring your connection in the background...\");\n let newTokens: AuthTokens;\n try {\n newTokens = await refreshCookiesHeadless();\n } catch (refreshError) {\n console.log(\"⚠️ Automatic refresh encountered a hiccup. Launching a manual login window to get you back on track.\");\n newTokens = await runBrowserAuthFlow();\n }\n this.tokens = newTokens;\n this.csrfToken = newTokens.csrf_token;\n this.sessionId = newTokens.session_id;\n await this.refreshAuthTokens();\n // Retry once\n return this.query(notebookId, queryText, sourceIds, conversationId);\n }\n }\n }\n }\n\n // Find the longest Type 1 answer chunk\n let bestAnswer = \"\";\n let convId: string | null = conversationId || null;\n\n for (const chunk of parsed) {\n if (!Array.isArray(chunk)) continue;\n for (const item of chunk) {\n if (!Array.isArray(item) || item.length < 3) continue;\n if (item[0] === \"wrb.fr\") {\n const resultStr = item[2];\n if (typeof resultStr === \"string\") {\n try {\n const data = JSON.parse(resultStr);\n if (Array.isArray(data)) {\n const answer = data[0];\n const type = data[2];\n if (type === 1 && typeof answer === \"string\" && answer.length > bestAnswer.length) {\n bestAnswer = answer;\n }\n if (data[4]) convId = data[4];\n }\n } catch {\n // skip\n }\n }\n }\n }\n }\n\n // Store conversation history for follow-ups\n if (convId) {\n const existing = this.conversationHistory.get(convId) || [];\n existing.push([queryText, null, 1]);\n existing.push([bestAnswer, null, 2]);\n this.conversationHistory.set(convId, existing);\n }\n\n return {\n answer: bestAnswer,\n conversation_id: convId,\n sources_used: sourceIds || [],\n };\n } finally {\n clearTimeout(timer);\n }\n }\n\n // ─── Research Methods ────────────────────────────────\n\n async startResearch(\n notebookId: string,\n queryText: string,\n source = \"web\",\n mode = \"fast\",\n ): Promise<{ taskId: string }> {\n const sourceCode = RESEARCH_SOURCES.getCode(source);\n const modeCode = RESEARCH_MODES.getCode(mode);\n\n let result: unknown;\n if (modeCode === 5) {\n // Deep research\n result = await this.execute(\n RPC_IDS.START_DEEP_RESEARCH,\n [null, [1], [queryText, sourceCode], 5, notebookId],\n `/notebook/${notebookId}`,\n );\n } else {\n // Fast research\n result = await this.execute(\n RPC_IDS.START_FAST_RESEARCH,\n [[queryText, sourceCode], null, 1, notebookId],\n `/notebook/${notebookId}`,\n );\n }\n\n const data = result as any[];\n return { taskId: data?.[0] || \"\" };\n }\n\n async pollResearch(\n notebookId: string,\n taskId?: string,\n ): Promise<ResearchResult[]> {\n const result = await this.execute(\n RPC_IDS.POLL_RESEARCH,\n [null, null, notebookId],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data?.[0])) return [];\n\n const results: ResearchResult[] = [];\n for (const task of data[0]) {\n if (!Array.isArray(task)) continue;\n const tid = task[0];\n if (taskId && tid !== taskId) continue;\n\n const taskInfo = task[1] as any[];\n const statusCode = taskInfo?.[4];\n const statusMap: Record<number, ResearchResult[\"status\"]> = {\n 1: \"in_progress\",\n 2: \"completed\",\n 6: \"imported\",\n };\n\n const sources: ResearchSource[] = [];\n const sourcesArray = taskInfo?.[3]?.[0];\n if (Array.isArray(sourcesArray)) {\n for (const s of sourcesArray) {\n if (Array.isArray(s)) {\n sources.push({\n url: s[0] || null,\n title: s[1] || \"\",\n description: s[2] || null,\n type: RESULT_TYPES.getName(s[3] ?? null),\n });\n }\n }\n }\n\n results.push({\n task_id: tid,\n status: statusMap[statusCode] || \"in_progress\",\n query: taskInfo?.[1]?.[0] || \"\",\n sources,\n summary: taskInfo?.[3]?.[1] || null,\n });\n }\n\n return results;\n }\n\n async importResearch(\n notebookId: string,\n taskId: string,\n sourceIndices?: number[],\n ): Promise<void> {\n const indices = sourceIndices || null;\n await this.execute(\n RPC_IDS.IMPORT_RESEARCH,\n [notebookId, taskId, indices],\n `/notebook/${notebookId}`,\n EXTENDED_TIMEOUT,\n );\n }\n\n // ─── Studio Methods ──────────────────────────────────\n\n private formatSourcesNested(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [[sid]]);\n }\n\n private formatSourcesSimple(sourceIds: string[]): unknown[] {\n return sourceIds.map((sid) => [sid]);\n }\n\n async createAudioOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = AUDIO_FORMATS.getCode(options.format || \"deep_dive\");\n const lengthCode = AUDIO_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const audioOptions = [\n null,\n [\n options.focus_prompt || null,\n lengthCode,\n null,\n sourcesSimple,\n options.language || null,\n null,\n formatCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"audio\"),\n sourcesNested,\n null,\n null,\n audioOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createVideoOverview(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n visual_style?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = VIDEO_FORMATS.getCode(options.format || \"explainer\");\n const styleCode = VIDEO_STYLES.getCode(\n options.visual_style || \"auto_select\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const videoOptions = [\n null,\n null,\n [\n sourcesSimple,\n options.language || null,\n options.focus_prompt || null,\n null,\n formatCode,\n styleCode,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"video\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n videoOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createInfographic(\n notebookId: string,\n sourceIds: string[],\n options: {\n orientation?: string;\n detail_level?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const orientationCode = INFOGRAPHIC_ORIENTATIONS.getCode(\n options.orientation || \"landscape\",\n );\n const detailCode = INFOGRAPHIC_DETAILS.getCode(\n options.detail_level || \"standard\",\n );\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const infographicOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n null,\n orientationCode,\n detailCode,\n ],\n ];\n\n // positions 4-13 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"infographic\"),\n sourcesNested,\n ];\n for (let i = 0; i < 10; i++) content.push(null);\n content.push(infographicOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createSlideDeck(\n notebookId: string,\n sourceIds: string[],\n options: {\n format?: string;\n length?: string;\n language?: string;\n focus_prompt?: string;\n } = {},\n ): Promise<string> {\n const formatCode = SLIDE_DECK_FORMATS.getCode(\n options.format || \"detailed_deck\",\n );\n const lengthCode = SLIDE_DECK_LENGTHS.getCode(options.length || \"default\");\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const slideDeckOptions = [\n [\n options.focus_prompt || null,\n options.language || null,\n formatCode,\n lengthCode,\n ],\n ];\n\n // positions 4-15 are null\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"slide_deck\"),\n sourcesNested,\n ];\n for (let i = 0; i < 12; i++) content.push(null);\n content.push(slideDeckOptions);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createReport(\n notebookId: string,\n sourceIds: string[],\n options: {\n report_format?: string;\n custom_prompt?: string;\n language?: string;\n } = {},\n ): Promise<string> {\n const formatName = options.report_format || \"Briefing Doc\";\n const fmt = REPORT_FORMATS[formatName] || REPORT_FORMATS[\"Briefing Doc\"];\n const prompt =\n formatName === \"Create Your Own\"\n ? options.custom_prompt || \"\"\n : fmt.prompt;\n\n const sourcesNested = this.formatSourcesNested(sourceIds);\n const sourcesSimple = this.formatSourcesSimple(sourceIds);\n\n const reportOptions = [\n null,\n [\n fmt.title,\n fmt.description,\n null,\n sourcesSimple,\n options.language || null,\n prompt,\n null,\n true,\n ],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"report\"),\n sourcesNested,\n null,\n null,\n null,\n reportOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createFlashcards(\n notebookId: string,\n sourceIds: string[],\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const flashcardOptions = [\n null,\n [1, null, null, null, null, null, [difficultyCode, FLASHCARD_COUNT_DEFAULT]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"),\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n flashcardOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createQuiz(\n notebookId: string,\n sourceIds: string[],\n questionCount = 5,\n difficulty = \"medium\",\n ): Promise<string> {\n const difficultyCode = FLASHCARD_DIFFICULTIES.getCode(difficulty);\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const quizOptions = [\n null,\n [2, null, null, null, null, null, null, [questionCount, difficultyCode]],\n ];\n\n const content = [\n null,\n null,\n STUDIO_TYPES.getCode(\"flashcards\"), // shared type with flashcards\n sourcesNested,\n null,\n null,\n null,\n null,\n null,\n quizOptions,\n ];\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createDataTable(\n notebookId: string,\n sourceIds: string[],\n description: string,\n language?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n const content: unknown[] = [\n null,\n null,\n STUDIO_TYPES.getCode(\"data_table\"),\n sourcesNested,\n ];\n // Fill nulls up to position where data_table options go\n for (let i = 0; i < 14; i++) content.push(null);\n content.push([[description, language || null]]);\n\n const result = await this.execute(\n RPC_IDS.CREATE_STUDIO,\n [[2], notebookId, content],\n `/notebook/${notebookId}`,\n );\n const data = result as any[];\n return data?.[0] || \"\";\n }\n\n async createMindMap(\n notebookId: string,\n sourceIds: string[],\n title?: string,\n ): Promise<string> {\n const sourcesNested = this.formatSourcesNested(sourceIds);\n\n // Step 1: Generate mind map\n const genResult = await this.execute(\n RPC_IDS.GENERATE_MIND_MAP,\n [notebookId, sourcesNested, title || null],\n `/notebook/${notebookId}`,\n );\n\n const genData = genResult as any[];\n const mindMapData = genData?.[0];\n\n // Step 2: Save mind map\n const saveResult = await this.execute(\n RPC_IDS.SAVE_MIND_MAP,\n [notebookId, mindMapData, title || null],\n `/notebook/${notebookId}`,\n );\n\n const saveData = saveResult as any[];\n return saveData?.[0] || \"\";\n }\n\n async pollStudio(notebookId: string): Promise<StudioArtifact[]> {\n const result = await this.execute(\n RPC_IDS.POLL_STUDIO,\n [notebookId, [2]],\n `/notebook/${notebookId}`,\n );\n\n const data = result as any[];\n if (!Array.isArray(data)) return [];\n\n const artifacts: StudioArtifact[] = [];\n const items = Array.isArray(data[0]) ? data[0] : data;\n\n for (const item of items) {\n if (!Array.isArray(item)) continue;\n const statusMap: Record<number, StudioArtifact[\"status\"]> = {\n 1: \"pending\",\n 2: \"generating\",\n 3: \"completed\",\n 4: \"failed\",\n };\n\n artifacts.push({\n id: item[0] || \"\",\n type: STUDIO_TYPES.getName(item[2] ?? null),\n status: statusMap[item[3]] || \"pending\",\n download_url: item[4] || null,\n });\n }\n\n return artifacts;\n }\n\n async deleteStudio(\n notebookId: string,\n artifactId: string,\n ): Promise<void> {\n await this.execute(\n RPC_IDS.DELETE_STUDIO,\n [notebookId, artifactId],\n `/notebook/${notebookId}`,\n );\n }\n\n // ─── Chat Configure ─────────────────────────────────\n\n async chatConfigure(\n notebookId: string,\n goal?: string,\n customPrompt?: string,\n responseLength?: string,\n ): Promise<void> {\n const goalCode = goal ? CHAT_GOALS.getCode(goal) : 1;\n const lengthCode = responseLength\n ? CHAT_RESPONSE_LENGTHS.getCode(responseLength)\n : 1;\n\n await this.execute(\n RPC_IDS.PREFERENCES,\n [notebookId, goalCode, customPrompt || null, lengthCode],\n `/notebook/${notebookId}`,\n );\n }\n\n // ─── Auth Refresh (tool) ─────────────────────────────\n\n async refreshAuth(): Promise<void> {\n await this.refreshAuthTokens();\n }\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { NotebookLMClient } from \"../client.js\";\n\nexport interface McpTool<T extends z.ZodRawShape = z.ZodRawShape> {\n name: string;\n description: string;\n schema?: T; \n execute: (\n client: NotebookLMClient,\n args: z.infer<z.ZodObject<T>>,\n opts: { queryTimeout?: number }\n ) => Promise<any>;\n}\n\nexport function registerTools(\n server: McpServer, \n tools: McpTool<any>[], \n getClient: (timeout?: number) => NotebookLMClient, \n opts?: { queryTimeout?: number, onClientReset?: () => void }\n) {\n for (const tool of tools) {\n const config: any = { description: tool.description };\n if (tool.schema) {\n config.inputSchema = tool.schema;\n }\n server.registerTool(tool.name, config, async (args: any) => {\n try {\n const result = await tool.execute(getClient(opts?.queryTimeout), args, { queryTimeout: opts?.queryTimeout });\n if (result && result._client_action === \"reset\" && opts?.onClientReset) {\n opts.onClientReset();\n delete result._client_action;\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"success\", ...result }, null, 2) }] };\n } catch (e) {\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ status: \"error\", error: String(e) }, null, 2) }], isError: true };\n }\n });\n }\n}\n\n// Re-usable helper for tools that require confirmation\nexport function pendingConfirmation(message: string) {\n return { status: \"pending_confirmation\", message };\n}\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { saveTokens } from \"../auth.js\";\nimport type { AuthTokens } from \"../types.js\";\n\n// We use a special return flag so server.ts knows to reset the client\nexport const authTools: McpTool<any>[] = [\n {\n name: \"refresh_auth\",\n description: \"Reload authentication tokens (re-extract CSRF and session from page)\",\n execute: async (client) => {\n await client.refreshAuth();\n return { message: \"Authentication tokens refreshed\" };\n },\n },\n {\n name: \"save_auth_tokens\",\n description: \"Manually save authentication cookies (fallback method — prefer using CLI auth)\",\n schema: {\n cookies: z.string().optional().describe(\"Cookie header string (SID=xxx; HSID=yyy; ...)\"),\n csrf_token: z.string().optional().describe(\"CSRF token\"),\n session_id: z.string().optional().describe(\"Session ID\"),\n },\n execute: async (client, { cookies: cookieStr, csrf_token, session_id }) => {\n const cookieMap: Record<string, string> = {};\n if (cookieStr) {\n for (const part of cookieStr.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq > 0) {\n cookieMap[part.substring(0, eq).trim()] = part.substring(eq + 1).trim();\n }\n }\n }\n const tokens: AuthTokens = {\n cookies: cookieMap,\n csrf_token: csrf_token || \"\",\n session_id: session_id || \"\",\n extracted_at: Date.now() / 1000,\n };\n saveTokens(tokens);\n \n // We return this special flag so the registerTools wrapper or server.ts can catch it\n return { \n message: \"Tokens saved. Client will use new tokens on next request.\",\n _client_action: \"reset\" \n };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { CHAT_GOALS, CHAT_RESPONSE_LENGTHS } from \"../constants.js\";\n\nexport const queryTools: McpTool<any>[] = [\n {\n name: \"notebook_query\",\n description: \"Ask a question about the sources in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Question to ask\"),\n source_ids: z.array(z.string()).optional().describe(\"Specific source IDs to query (omit for all)\"),\n conversation_id: z.string().optional().describe(\"Conversation ID for follow-up questions\"),\n },\n execute: async (client, { notebook_id, query, source_ids, conversation_id }) => {\n const response = await client.query(notebook_id, query, source_ids, conversation_id);\n return { answer: response.answer, conversation_id: response.conversation_id };\n },\n },\n {\n name: \"chat_configure\",\n description: \"Configure chat behavior (goal and response length)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n goal: z.string().optional().describe(`Chat goal: ${CHAT_GOALS.optionsStr()}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when goal=custom)\"),\n response_length: z.string().optional().describe(`Response length: ${CHAT_RESPONSE_LENGTHS.optionsStr()}`),\n },\n execute: async (client, { notebook_id, goal, custom_prompt, response_length }) => {\n await client.chatConfigure(notebook_id, goal, custom_prompt, response_length);\n return { message: \"Chat configured\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool } from \"./index.js\";\nimport { RESEARCH_SOURCES, RESEARCH_MODES } from \"../constants.js\";\n\nexport const researchTools: McpTool<any>[] = [\n {\n name: \"research_start\",\n description: \"Start a web or Drive research task\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n query: z.string().describe(\"Research query\"),\n source: z.string().optional().describe(`Source: ${RESEARCH_SOURCES.optionsStr()} (default: web)`),\n mode: z.string().optional().describe(`Mode: ${RESEARCH_MODES.optionsStr()} (default: fast)`),\n },\n execute: async (client, { notebook_id, query, source, mode }) => {\n const result = await client.startResearch(notebook_id, query, source, mode);\n return { task_id: result.taskId, message: \"Research started. Use research_status to poll progress.\" };\n },\n },\n {\n name: \"research_status\",\n description: \"Check the status of research tasks\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().optional().describe(\"Specific task ID to check (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id }) => {\n const results = await client.pollResearch(notebook_id, task_id);\n return { results };\n },\n },\n {\n name: \"research_import\",\n description: \"Import discovered sources from a research task into the notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n task_id: z.string().describe(\"Research task ID\"),\n source_indices: z.array(z.number()).optional().describe(\"Specific source indices to import (omit for all)\"),\n },\n execute: async (client, { notebook_id, task_id, source_indices }) => {\n await client.importResearch(notebook_id, task_id, source_indices);\n return { message: \"Research sources imported\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\n\nexport const notebookTools: McpTool<any>[] = [\n {\n name: \"notebook_list\",\n description: \"List all NotebookLM notebooks with metadata (title, sources count, ownership)\",\n schema: {\n max_results: z.number().optional().describe(\"Maximum notebooks to return (default 100)\"),\n },\n execute: async (client, { max_results }) => {\n const notebooks = await client.listNotebooks(max_results);\n return { notebooks, count: notebooks.length };\n },\n },\n {\n name: \"notebook_create\",\n description: \"Create a new NotebookLM notebook\",\n schema: {\n title: z.string().describe(\"Title for the new notebook\"),\n },\n execute: async (client, { title }) => {\n const notebook = await client.createNotebook(title);\n return { notebook };\n },\n },\n {\n name: \"notebook_get\",\n description: \"Get details of a specific notebook including its sources\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n return { notebook };\n },\n },\n {\n name: \"notebook_describe\",\n description: \"Get an AI-generated summary of the notebook content\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const summary = await client.describeNotebook(notebook_id);\n return { summary };\n },\n },\n {\n name: \"notebook_rename\",\n description: \"Rename a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n new_title: z.string().describe(\"New title for the notebook\"),\n },\n execute: async (client, { notebook_id, new_title }) => {\n await client.renameNotebook(notebook_id, new_title);\n return { message: `Notebook renamed to \"${new_title}\"` };\n },\n },\n {\n name: \"notebook_delete\",\n description: \"Delete a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this notebook. This cannot be undone.\");\n await client.deleteNotebook(notebook_id);\n return { message: \"Notebook deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport * as fs from \"fs\";\n\nexport const sourceTools: McpTool<any>[] = [\n {\n name: \"source_describe\",\n description: \"Get metadata for a specific source in a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(notebook_id, source_id);\n return { source };\n },\n },\n {\n name: \"source_get_content\",\n description: \"Get the underlying text content of a source (used by grounding tool)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The document ID to retrieve\"),\n },\n execute: async (client, { notebook_id, source_id }) => {\n const source = await client.getSource(source_id, notebook_id);\n return { text: source.content };\n },\n },\n {\n name: \"notebook_add_url\",\n description: \"Add a website URL source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n url: z.string().describe(\"The URL to add\"),\n },\n execute: async (client, { notebook_id, url }) => {\n await client.addUrlSource(notebook_id, url);\n return { message: \"URL source added\" };\n },\n },\n {\n name: \"notebook_add_text\",\n description: \"Add a text document source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n content: z.string().optional().describe(\"The text content to add\"),\n file_path: z.string().optional().describe(\"Path to local file to read content from\"),\n title: z.string().describe(\"Title for the new source\"),\n },\n execute: async (client, { notebook_id, content, file_path, title }) => {\n let documentContent = content;\n if (!documentContent && file_path) {\n documentContent = fs.readFileSync(file_path, \"utf8\");\n }\n if (!documentContent) {\n throw new Error(\"Must provide either content or file_path\");\n }\n await client.addTextSource(notebook_id, documentContent, title);\n return { message: \"Text source added\" };\n },\n },\n {\n name: \"notebook_add_drive\",\n description: \"Add a Google Drive file source to a notebook\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n file_id: z.string().describe(\"Google Drive file ID\"),\n title: z.string().describe(\"Document title\"),\n doc_type: z.string().describe(\"MIME type (e.g. application/vnd.google-apps.document)\"),\n },\n execute: async (client, { notebook_id, file_id, title, doc_type }) => {\n await client.addDriveSource(notebook_id, file_id, title, doc_type);\n return { message: \"Drive source added\" };\n },\n },\n {\n name: \"source_list_drive\",\n description: \"List sources in a notebook with Drive freshness status\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const notebook = await client.getNotebook(notebook_id);\n const results = [];\n for (const src of notebook.sources) {\n const fresh = await client.checkFreshness(src.id, notebook_id);\n results.push({ ...src, is_fresh: fresh });\n }\n return { sources: results };\n },\n },\n {\n name: \"source_sync_drive\",\n description: \"Sync all Drive sources in a notebook to pull latest changes\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).describe(\"Source IDs to sync\"),\n confirm: z.boolean().describe(\"Must be true to confirm sync\"),\n },\n execute: async (client, { notebook_id, source_ids, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to sync these Drive sources.\");\n await client.syncDrive(source_ids, notebook_id);\n return { message: `Synced ${source_ids.length} sources` };\n },\n },\n {\n name: \"source_delete\",\n description: \"Delete a source from a notebook (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_id: z.string().describe(\"The source ID\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, source_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this source. This cannot be undone.\");\n await client.deleteSource(notebook_id, source_id);\n return { message: \"Source deleted\" };\n },\n },\n];\n","import { z } from \"zod\";\nimport { McpTool, pendingConfirmation } from \"./index.js\";\nimport {\n AUDIO_FORMATS,\n AUDIO_LENGTHS,\n VIDEO_FORMATS,\n VIDEO_STYLES,\n INFOGRAPHIC_ORIENTATIONS,\n INFOGRAPHIC_DETAILS,\n SLIDE_DECK_FORMATS,\n SLIDE_DECK_LENGTHS,\n FLASHCARD_DIFFICULTIES,\n FLASHCARD_COUNT_DEFAULT,\n REPORT_FORMATS,\n} from \"../constants.js\";\n\nexport const studioTools: McpTool<any>[] = [\n {\n name: \"audio_overview_create\",\n description: \"Generate an audio podcast overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${AUDIO_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${AUDIO_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code (e.g. en, es)\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt for the audio\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate audio overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createAudioOverview(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Audio generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"video_overview_create\",\n description: \"Generate a video overview (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${VIDEO_FORMATS.optionsStr()}`),\n visual_style: z.string().optional().describe(`Style: ${VIDEO_STYLES.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, visual_style, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate video overview.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createVideoOverview(notebook_id, ids, { format, visual_style, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Video generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"infographic_create\",\n description: \"Generate an infographic (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n orientation: z.string().optional().describe(`Orientation: ${INFOGRAPHIC_ORIENTATIONS.optionsStr()}`),\n detail_level: z.string().optional().describe(`Details: ${INFOGRAPHIC_DETAILS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, orientation, detail_level, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate infographic.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createInfographic(notebook_id, ids, { orientation, detail_level, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Infographic generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"slide_deck_create\",\n description: \"Generate a slide deck (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n format: z.string().optional().describe(`Format: ${SLIDE_DECK_FORMATS.optionsStr()}`),\n length: z.string().optional().describe(`Length: ${SLIDE_DECK_LENGTHS.optionsStr()}`),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n focus_prompt: z.string().optional().describe(\"Focus prompt\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, format, length, language, focus_prompt, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate slide deck.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createSlideDeck(notebook_id, ids, { format, length, language, focus_prompt });\n return { artifact_id: artifactId, message: \"Slide deck generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"report_create\",\n description: \"Generate a text report (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n report_format: z.string().optional().describe(`Format: ${Object.keys(REPORT_FORMATS).join(\", \")}`),\n custom_prompt: z.string().optional().describe(\"Custom prompt (when format='Create Your Own')\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, report_format, custom_prompt, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate report.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createReport(notebook_id, ids, { report_format, custom_prompt, language });\n return { artifact_id: artifactId, message: \"Report generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"flashcards_create\",\n description: \"Generate flashcards (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate flashcards.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createFlashcards(notebook_id, ids, difficulty);\n return { artifact_id: artifactId, message: \"Flashcards generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"quiz_create\",\n description: \"Generate a quiz (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n question_count: z.number().optional().describe(\"Number of questions (default 5)\"),\n difficulty: z.string().optional().describe(`Difficulty: ${FLASHCARD_DIFFICULTIES.optionsStr()}`),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, question_count, difficulty, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate quiz.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createQuiz(notebook_id, ids, question_count, difficulty);\n return { artifact_id: artifactId, message: \"Quiz generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"data_table_create\",\n description: \"Generate a data table (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n description: z.string().describe(\"Description of the table to generate\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n language: z.string().optional().describe(\"BCP-47 language code\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, description, source_ids, language, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate data table.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createDataTable(notebook_id, ids, description, language);\n return { artifact_id: artifactId, message: \"Data table generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"mind_map_create\",\n description: \"Generate a mind map (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n source_ids: z.array(z.string()).optional().describe(\"Source IDs (omit for all)\"),\n title: z.string().optional().describe(\"Custom title for the mind map\"),\n confirm: z.boolean().describe(\"Must be true to start generation\"),\n },\n execute: async (client, { notebook_id, source_ids, title, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to generate mind map.\");\n const ids = source_ids || (await client.getNotebook(notebook_id)).sources.map((s) => s.id);\n const artifactId = await client.createMindMap(notebook_id, ids, title);\n return { artifact_id: artifactId, message: \"Mind map generation started. Use studio_status to check progress.\" };\n },\n },\n {\n name: \"studio_status\",\n description: \"Check the status of generated Studio artifacts\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n },\n execute: async (client, { notebook_id }) => {\n const artifacts = await client.pollStudio(notebook_id);\n return { artifacts };\n },\n },\n {\n name: \"studio_delete\",\n description: \"Delete a Studio artifact (requires confirm=true)\",\n schema: {\n notebook_id: z.string().describe(\"The notebook ID\"),\n artifact_id: z.string().describe(\"The artifact ID to delete\"),\n confirm: z.boolean().describe(\"Must be true to confirm deletion\"),\n },\n execute: async (client, { notebook_id, artifact_id, confirm }) => {\n if (!confirm) return pendingConfirmation(\"Set confirm=true to delete this artifact.\");\n await client.deleteStudio(notebook_id, artifact_id);\n return { message: \"Artifact deleted\" };\n },\n },\n];\n"],"mappings":"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","names":["execSync","mkdirSync","join","homedir","execSync","join","homedir","mkdirSync","getClient","client","z","z","client","z","z","client","z","z","client","z","z","client","z","z","client"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@m4ykeldev/notebooklm-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"description": "MCP server for Google NotebookLM — 32 tools for notebooks, sources, research, and studio content generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "tsup",
|
|
14
14
|
"dev": "tsup --watch",
|
|
15
|
-
"prepublishOnly": "npm run build"
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"auth": "node dist/cli.js auth",
|
|
17
|
+
"serve": "node dist/cli.js serve"
|
|
16
18
|
},
|
|
17
19
|
"engines": {
|
|
18
20
|
"node": ">=18"
|