@pan-sec/notebooklm-mcp 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/config.d.ts +4 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +10 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/events/event-emitter.d.ts +45 -0
  6. package/dist/events/event-emitter.d.ts.map +1 -0
  7. package/dist/events/event-emitter.js +100 -0
  8. package/dist/events/event-emitter.js.map +1 -0
  9. package/dist/events/event-types.d.ts +124 -0
  10. package/dist/events/event-types.d.ts.map +1 -0
  11. package/dist/events/event-types.js +18 -0
  12. package/dist/events/event-types.js.map +1 -0
  13. package/dist/gemini/gemini-client.d.ts +45 -0
  14. package/dist/gemini/gemini-client.d.ts.map +1 -0
  15. package/dist/gemini/gemini-client.js +211 -0
  16. package/dist/gemini/gemini-client.js.map +1 -0
  17. package/dist/gemini/index.d.ts +8 -0
  18. package/dist/gemini/index.d.ts.map +1 -0
  19. package/dist/gemini/index.js +8 -0
  20. package/dist/gemini/index.js.map +1 -0
  21. package/dist/gemini/types.d.ts +136 -0
  22. package/dist/gemini/types.d.ts.map +1 -0
  23. package/dist/gemini/types.js +10 -0
  24. package/dist/gemini/types.js.map +1 -0
  25. package/dist/index.js +76 -3
  26. package/dist/index.js.map +1 -1
  27. package/dist/library/notebook-library.d.ts +25 -2
  28. package/dist/library/notebook-library.d.ts.map +1 -1
  29. package/dist/library/notebook-library.js +142 -2
  30. package/dist/library/notebook-library.js.map +1 -1
  31. package/dist/library/types.d.ts +15 -0
  32. package/dist/library/types.d.ts.map +1 -1
  33. package/dist/notebook-creation/audio-manager.d.ts +56 -0
  34. package/dist/notebook-creation/audio-manager.d.ts.map +1 -0
  35. package/dist/notebook-creation/audio-manager.js +335 -0
  36. package/dist/notebook-creation/audio-manager.js.map +1 -0
  37. package/dist/notebook-creation/discover-creation-flow.d.ts +8 -0
  38. package/dist/notebook-creation/discover-creation-flow.d.ts.map +1 -0
  39. package/dist/notebook-creation/discover-creation-flow.js +177 -0
  40. package/dist/notebook-creation/discover-creation-flow.js.map +1 -0
  41. package/dist/notebook-creation/discover-quota.d.ts +8 -0
  42. package/dist/notebook-creation/discover-quota.d.ts.map +1 -0
  43. package/dist/notebook-creation/discover-quota.js +195 -0
  44. package/dist/notebook-creation/discover-quota.js.map +1 -0
  45. package/dist/notebook-creation/discover-source-dialog.d.ts +8 -0
  46. package/dist/notebook-creation/discover-source-dialog.d.ts.map +1 -0
  47. package/dist/notebook-creation/discover-source-dialog.js +134 -0
  48. package/dist/notebook-creation/discover-source-dialog.js.map +1 -0
  49. package/dist/notebook-creation/discover-sources.d.ts +8 -0
  50. package/dist/notebook-creation/discover-sources.d.ts.map +1 -0
  51. package/dist/notebook-creation/discover-sources.js +273 -0
  52. package/dist/notebook-creation/discover-sources.js.map +1 -0
  53. package/dist/notebook-creation/discover-text-input.d.ts +7 -0
  54. package/dist/notebook-creation/discover-text-input.d.ts.map +1 -0
  55. package/dist/notebook-creation/discover-text-input.js +135 -0
  56. package/dist/notebook-creation/discover-text-input.js.map +1 -0
  57. package/dist/notebook-creation/index.d.ts +12 -0
  58. package/dist/notebook-creation/index.d.ts.map +1 -0
  59. package/dist/notebook-creation/index.js +12 -0
  60. package/dist/notebook-creation/index.js.map +1 -0
  61. package/dist/notebook-creation/notebook-creator.d.ts +95 -0
  62. package/dist/notebook-creation/notebook-creator.d.ts.map +1 -0
  63. package/dist/notebook-creation/notebook-creator.js +689 -0
  64. package/dist/notebook-creation/notebook-creator.js.map +1 -0
  65. package/dist/notebook-creation/notebook-sync.d.ts +93 -0
  66. package/dist/notebook-creation/notebook-sync.d.ts.map +1 -0
  67. package/dist/notebook-creation/notebook-sync.js +370 -0
  68. package/dist/notebook-creation/notebook-sync.js.map +1 -0
  69. package/dist/notebook-creation/run-discovery.d.ts +11 -0
  70. package/dist/notebook-creation/run-discovery.d.ts.map +1 -0
  71. package/dist/notebook-creation/run-discovery.js +151 -0
  72. package/dist/notebook-creation/run-discovery.js.map +1 -0
  73. package/dist/notebook-creation/selector-discovery.d.ts +65 -0
  74. package/dist/notebook-creation/selector-discovery.d.ts.map +1 -0
  75. package/dist/notebook-creation/selector-discovery.js +421 -0
  76. package/dist/notebook-creation/selector-discovery.js.map +1 -0
  77. package/dist/notebook-creation/selectors.d.ts +150 -0
  78. package/dist/notebook-creation/selectors.d.ts.map +1 -0
  79. package/dist/notebook-creation/selectors.js +225 -0
  80. package/dist/notebook-creation/selectors.js.map +1 -0
  81. package/dist/notebook-creation/source-manager.d.ts +73 -0
  82. package/dist/notebook-creation/source-manager.d.ts.map +1 -0
  83. package/dist/notebook-creation/source-manager.js +486 -0
  84. package/dist/notebook-creation/source-manager.js.map +1 -0
  85. package/dist/notebook-creation/test-create.d.ts +8 -0
  86. package/dist/notebook-creation/test-create.d.ts.map +1 -0
  87. package/dist/notebook-creation/test-create.js +72 -0
  88. package/dist/notebook-creation/test-create.js.map +1 -0
  89. package/dist/notebook-creation/types.d.ts +173 -0
  90. package/dist/notebook-creation/types.d.ts.map +1 -0
  91. package/dist/notebook-creation/types.js +5 -0
  92. package/dist/notebook-creation/types.js.map +1 -0
  93. package/dist/quota/index.d.ts +8 -0
  94. package/dist/quota/index.d.ts.map +1 -0
  95. package/dist/quota/index.js +8 -0
  96. package/dist/quota/index.js.map +1 -0
  97. package/dist/quota/quota-manager.d.ts +125 -0
  98. package/dist/quota/quota-manager.d.ts.map +1 -0
  99. package/dist/quota/quota-manager.js +330 -0
  100. package/dist/quota/quota-manager.js.map +1 -0
  101. package/dist/session/session-manager.d.ts +5 -0
  102. package/dist/session/session-manager.d.ts.map +1 -1
  103. package/dist/session/session-manager.js +6 -0
  104. package/dist/session/session-manager.js.map +1 -1
  105. package/dist/tools/definitions/gemini.d.ts +12 -0
  106. package/dist/tools/definitions/gemini.d.ts.map +1 -0
  107. package/dist/tools/definitions/gemini.js +135 -0
  108. package/dist/tools/definitions/gemini.js.map +1 -0
  109. package/dist/tools/definitions/notebook-management.d.ts.map +1 -1
  110. package/dist/tools/definitions/notebook-management.js +525 -0
  111. package/dist/tools/definitions/notebook-management.js.map +1 -1
  112. package/dist/tools/definitions/system.d.ts.map +1 -1
  113. package/dist/tools/definitions/system.js +158 -0
  114. package/dist/tools/definitions/system.js.map +1 -1
  115. package/dist/tools/definitions.d.ts.map +1 -1
  116. package/dist/tools/definitions.js +2 -0
  117. package/dist/tools/definitions.js.map +1 -1
  118. package/dist/tools/handlers.d.ts +257 -0
  119. package/dist/tools/handlers.d.ts.map +1 -1
  120. package/dist/tools/handlers.js +1097 -0
  121. package/dist/tools/handlers.js.map +1 -1
  122. package/dist/webhooks/index.d.ts +8 -0
  123. package/dist/webhooks/index.d.ts.map +1 -0
  124. package/dist/webhooks/index.js +8 -0
  125. package/dist/webhooks/index.js.map +1 -0
  126. package/dist/webhooks/types.d.ts +57 -0
  127. package/dist/webhooks/types.d.ts.map +1 -0
  128. package/dist/webhooks/types.js +5 -0
  129. package/dist/webhooks/types.js.map +1 -0
  130. package/dist/webhooks/webhook-dispatcher.d.ts +120 -0
  131. package/dist/webhooks/webhook-dispatcher.d.ts.map +1 -0
  132. package/dist/webhooks/webhook-dispatcher.js +519 -0
  133. package/dist/webhooks/webhook-dispatcher.js.map +1 -0
  134. package/package.json +2 -1
@@ -64,4 +64,19 @@ export interface LibraryStats {
64
64
  total_queries: number;
65
65
  last_modified: string;
66
66
  }
67
+ /**
68
+ * Project information for per-project library support
69
+ */
70
+ export interface ProjectInfo {
71
+ id: string;
72
+ name: string;
73
+ path: string;
74
+ type: "git" | "npm" | "directory";
75
+ }
76
+ /**
77
+ * Extended library with project context
78
+ */
79
+ export interface ProjectLibrary extends Library {
80
+ project?: ProjectInfo;
81
+ }
67
82
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAE5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAGb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IAGpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAGlB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAE5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAGb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IAGpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAGlB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,OAAO;IAC7C,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Audio Manager
3
+ *
4
+ * Manages audio overview generation in NotebookLM notebooks.
5
+ * Audio overviews are AI-generated podcast-style summaries of notebook content.
6
+ */
7
+ import { AuthManager } from "../auth/auth-manager.js";
8
+ import { SharedContextManager } from "../session/shared-context-manager.js";
9
+ export interface AudioStatus {
10
+ status: "not_started" | "generating" | "ready" | "failed" | "unknown";
11
+ progress?: number;
12
+ duration?: number;
13
+ estimatedTimeRemaining?: number;
14
+ }
15
+ export interface GenerateAudioResult {
16
+ success: boolean;
17
+ status: AudioStatus;
18
+ error?: string;
19
+ }
20
+ export interface DownloadAudioResult {
21
+ success: boolean;
22
+ filePath?: string;
23
+ size?: number;
24
+ error?: string;
25
+ }
26
+ export declare class AudioManager {
27
+ private authManager;
28
+ private contextManager;
29
+ private page;
30
+ constructor(authManager: AuthManager, contextManager: SharedContextManager);
31
+ /**
32
+ * Navigate to a notebook and ensure we're on the right page
33
+ */
34
+ private navigateToNotebook;
35
+ /**
36
+ * Generate an audio overview for a notebook
37
+ */
38
+ generateAudioOverview(notebookUrl: string): Promise<GenerateAudioResult>;
39
+ /**
40
+ * Check the current audio status for a notebook
41
+ */
42
+ getAudioStatus(notebookUrl: string): Promise<AudioStatus>;
43
+ /**
44
+ * Internal: Check audio status on current page
45
+ */
46
+ private checkAudioStatusInternal;
47
+ /**
48
+ * Download the generated audio file
49
+ */
50
+ downloadAudio(notebookUrl: string, outputPath?: string): Promise<DownloadAudioResult>;
51
+ /**
52
+ * Close the page if open
53
+ */
54
+ private closePage;
55
+ }
56
+ //# sourceMappingURL=audio-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-manager.d.ts","sourceRoot":"","sources":["../../src/notebook-creation/audio-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAM5E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,GAAG,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiCD,qBAAa,YAAY;IAIrB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,cAAc;IAJxB,OAAO,CAAC,IAAI,CAAqB;gBAGvB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,oBAAoB;IAG9C;;OAEG;YACW,kBAAkB;IAgBhC;;OAEG;IACG,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmG9E;;OAEG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAc/D;;OAEG;YACW,wBAAwB;IA2DtC;;OAEG;IACG,aAAa,CACjB,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,CAAC;IA4G/B;;OAEG;YACW,SAAS;CAUxB"}
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Audio Manager
3
+ *
4
+ * Manages audio overview generation in NotebookLM notebooks.
5
+ * Audio overviews are AI-generated podcast-style summaries of notebook content.
6
+ */
7
+ import { log } from "../utils/logger.js";
8
+ import { randomDelay } from "../utils/stealth-utils.js";
9
+ import fs from "fs";
10
+ import path from "path";
11
+ // Selectors for audio controls (may need refinement based on actual UI)
12
+ const AUDIO_SELECTORS = {
13
+ // Generate button
14
+ generateButton: {
15
+ primary: 'button[aria-label*="audio" i], button[aria-label*="podcast" i]',
16
+ fallbacks: [
17
+ 'button:has-text("Audio Overview")',
18
+ 'button:has-text("Generate")',
19
+ '[class*="audio-generate"]',
20
+ '[data-testid*="audio"]',
21
+ ],
22
+ },
23
+ // Status indicators
24
+ status: {
25
+ generating: '[class*="generating"], [class*="processing"], [role="progressbar"]',
26
+ ready: '[class*="audio-ready"], [class*="play-button"], audio',
27
+ failed: '[class*="error"], [class*="failed"]',
28
+ },
29
+ // Audio player
30
+ player: {
31
+ container: '[class*="audio-player"], audio, [role="audio"]',
32
+ playButton: 'button[aria-label*="play" i]',
33
+ downloadButton: 'button[aria-label*="download" i], a[download]',
34
+ },
35
+ // Progress
36
+ progress: {
37
+ bar: '[role="progressbar"]',
38
+ text: '[class*="progress-text"], [class*="eta"]',
39
+ },
40
+ };
41
+ export class AudioManager {
42
+ authManager;
43
+ contextManager;
44
+ page = null;
45
+ constructor(authManager, contextManager) {
46
+ this.authManager = authManager;
47
+ this.contextManager = contextManager;
48
+ }
49
+ /**
50
+ * Navigate to a notebook and ensure we're on the right page
51
+ */
52
+ async navigateToNotebook(notebookUrl) {
53
+ const context = await this.contextManager.getOrCreateContext(true);
54
+ const isAuth = await this.authManager.validateCookiesExpiry(context);
55
+ if (!isAuth) {
56
+ throw new Error("Not authenticated. Run setup_auth first.");
57
+ }
58
+ this.page = await context.newPage();
59
+ await this.page.goto(notebookUrl, { waitUntil: "domcontentloaded" });
60
+ await this.page.waitForLoadState("networkidle").catch(() => { });
61
+ await randomDelay(1500, 2500);
62
+ return this.page;
63
+ }
64
+ /**
65
+ * Generate an audio overview for a notebook
66
+ */
67
+ async generateAudioOverview(notebookUrl) {
68
+ log.info(`🎙️ Generating audio overview for: ${notebookUrl}`);
69
+ const page = await this.navigateToNotebook(notebookUrl);
70
+ try {
71
+ // First, check current status
72
+ const currentStatus = await this.checkAudioStatusInternal(page);
73
+ if (currentStatus.status === "generating") {
74
+ log.info(" ⏳ Audio generation already in progress");
75
+ return {
76
+ success: true,
77
+ status: currentStatus,
78
+ };
79
+ }
80
+ if (currentStatus.status === "ready") {
81
+ log.info(" ✅ Audio already generated");
82
+ return {
83
+ success: true,
84
+ status: currentStatus,
85
+ };
86
+ }
87
+ // Try to find and click the generate button
88
+ let generateClicked = false;
89
+ // Try primary selector first
90
+ const primaryBtn = await page.$(AUDIO_SELECTORS.generateButton.primary);
91
+ if (primaryBtn) {
92
+ await primaryBtn.click();
93
+ generateClicked = true;
94
+ }
95
+ else {
96
+ // Try fallbacks
97
+ for (const selector of AUDIO_SELECTORS.generateButton.fallbacks) {
98
+ try {
99
+ const btn = await page.$(selector);
100
+ if (btn) {
101
+ await btn.click();
102
+ generateClicked = true;
103
+ break;
104
+ }
105
+ }
106
+ catch {
107
+ // Continue trying
108
+ }
109
+ }
110
+ }
111
+ // Also try finding by text content
112
+ if (!generateClicked) {
113
+ generateClicked = await page.evaluate(() => {
114
+ // @ts-expect-error - DOM types
115
+ const buttons = document.querySelectorAll("button");
116
+ for (const btn of buttons) {
117
+ const text = btn.textContent?.toLowerCase() || "";
118
+ if (text.includes("audio") || text.includes("podcast") || text.includes("generate")) {
119
+ if (!text.includes("stop") && !text.includes("cancel")) {
120
+ btn.click();
121
+ return true;
122
+ }
123
+ }
124
+ }
125
+ return false;
126
+ });
127
+ }
128
+ if (!generateClicked) {
129
+ log.warning(" ⚠️ Could not find audio generation button");
130
+ return {
131
+ success: false,
132
+ status: { status: "unknown" },
133
+ error: "Could not find audio generation button. The feature may not be available for this notebook.",
134
+ };
135
+ }
136
+ await randomDelay(2000, 3000);
137
+ // Check if generation started
138
+ const newStatus = await this.checkAudioStatusInternal(page);
139
+ if (newStatus.status === "generating" || newStatus.status === "ready") {
140
+ log.success(` ✅ Audio generation ${newStatus.status === "ready" ? "completed" : "started"}`);
141
+ return {
142
+ success: true,
143
+ status: newStatus,
144
+ };
145
+ }
146
+ return {
147
+ success: false,
148
+ status: newStatus,
149
+ error: "Audio generation may have failed to start. Try again or check the notebook.",
150
+ };
151
+ }
152
+ finally {
153
+ await this.closePage();
154
+ }
155
+ }
156
+ /**
157
+ * Check the current audio status for a notebook
158
+ */
159
+ async getAudioStatus(notebookUrl) {
160
+ log.info(`🔍 Checking audio status for: ${notebookUrl}`);
161
+ const page = await this.navigateToNotebook(notebookUrl);
162
+ try {
163
+ const status = await this.checkAudioStatusInternal(page);
164
+ log.info(` Status: ${status.status}`);
165
+ return status;
166
+ }
167
+ finally {
168
+ await this.closePage();
169
+ }
170
+ }
171
+ /**
172
+ * Internal: Check audio status on current page
173
+ */
174
+ async checkAudioStatusInternal(page) {
175
+ return await page.evaluate(() => {
176
+ // Check for generating state
177
+ // @ts-expect-error - DOM types
178
+ const generating = document.querySelector('[class*="generating"], [class*="processing"]');
179
+ // @ts-expect-error - DOM types
180
+ const progressBar = document.querySelector('[role="progressbar"]');
181
+ if (generating || progressBar) {
182
+ let progress = 0;
183
+ if (progressBar) {
184
+ const value = progressBar.getAttribute("aria-valuenow");
185
+ if (value) {
186
+ progress = parseInt(value, 10);
187
+ }
188
+ }
189
+ return {
190
+ status: "generating",
191
+ progress,
192
+ };
193
+ }
194
+ // Check for ready state (audio player or download button)
195
+ // @ts-expect-error - DOM types
196
+ const audioElement = document.querySelector("audio");
197
+ // @ts-expect-error - DOM types
198
+ const playButton = document.querySelector('button[aria-label*="play" i]');
199
+ // @ts-expect-error - DOM types
200
+ const downloadButton = document.querySelector('button[aria-label*="download" i], a[download]');
201
+ if (audioElement || playButton || downloadButton) {
202
+ let duration = 0;
203
+ if (audioElement) {
204
+ duration = audioElement.duration || 0;
205
+ }
206
+ return {
207
+ status: "ready",
208
+ duration,
209
+ };
210
+ }
211
+ // Check for failed state
212
+ // @ts-expect-error - DOM types
213
+ const errorElement = document.querySelector('[class*="error"], [class*="failed"]');
214
+ if (errorElement) {
215
+ return { status: "failed" };
216
+ }
217
+ // Check if audio section exists but not started
218
+ // @ts-expect-error - DOM types
219
+ const audioSection = document.querySelector('[class*="audio"], [aria-label*="audio" i]');
220
+ if (audioSection) {
221
+ return { status: "not_started" };
222
+ }
223
+ return { status: "unknown" };
224
+ });
225
+ }
226
+ /**
227
+ * Download the generated audio file
228
+ */
229
+ async downloadAudio(notebookUrl, outputPath) {
230
+ log.info(`⬇️ Downloading audio from: ${notebookUrl}`);
231
+ const page = await this.navigateToNotebook(notebookUrl);
232
+ try {
233
+ // First check if audio is ready
234
+ const status = await this.checkAudioStatusInternal(page);
235
+ if (status.status !== "ready") {
236
+ return {
237
+ success: false,
238
+ error: `Audio not ready. Current status: ${status.status}`,
239
+ };
240
+ }
241
+ // Look for download button or audio element
242
+ const downloadInfo = await page.evaluate(() => {
243
+ // Look for download button
244
+ // @ts-expect-error - DOM types
245
+ const downloadBtn = document.querySelector('button[aria-label*="download" i], a[download]');
246
+ if (downloadBtn) {
247
+ const href = downloadBtn.href || downloadBtn.getAttribute("data-url");
248
+ return { type: "button", url: href };
249
+ }
250
+ // Look for audio element source
251
+ // @ts-expect-error - DOM types
252
+ const audio = document.querySelector("audio");
253
+ if (audio) {
254
+ const src = audio.src || audio.currentSrc;
255
+ return { type: "audio", url: src };
256
+ }
257
+ return null;
258
+ });
259
+ if (!downloadInfo || !downloadInfo.url) {
260
+ // Try clicking download button directly
261
+ const clicked = await page.evaluate(() => {
262
+ // @ts-expect-error - DOM types
263
+ const buttons = document.querySelectorAll("button, a");
264
+ for (const btn of buttons) {
265
+ const text = btn.textContent?.toLowerCase() || "";
266
+ const aria = btn.getAttribute("aria-label")?.toLowerCase() || "";
267
+ if (text.includes("download") || aria.includes("download")) {
268
+ btn.click();
269
+ return true;
270
+ }
271
+ }
272
+ return false;
273
+ });
274
+ if (clicked) {
275
+ // Wait for download to start
276
+ await randomDelay(2000, 3000);
277
+ // Note: Actual file download handling would require more complex logic
278
+ return {
279
+ success: true,
280
+ error: "Download initiated. Check your downloads folder.",
281
+ };
282
+ }
283
+ return {
284
+ success: false,
285
+ error: "Could not find download button or audio source",
286
+ };
287
+ }
288
+ // Generate output path if not provided
289
+ const finalPath = outputPath || path.join(process.env.HOME || process.env.USERPROFILE || ".", `notebooklm-audio-${Date.now()}.mp3`);
290
+ // Download the file using the page context
291
+ const response = await page.goto(downloadInfo.url);
292
+ if (!response) {
293
+ return {
294
+ success: false,
295
+ error: "Failed to fetch audio file",
296
+ };
297
+ }
298
+ const buffer = await response.body();
299
+ fs.writeFileSync(finalPath, buffer);
300
+ const stats = fs.statSync(finalPath);
301
+ log.success(` ✅ Audio downloaded: ${finalPath} (${stats.size} bytes)`);
302
+ return {
303
+ success: true,
304
+ filePath: finalPath,
305
+ size: stats.size,
306
+ };
307
+ }
308
+ catch (error) {
309
+ const msg = error instanceof Error ? error.message : String(error);
310
+ log.error(` ❌ Failed to download audio: ${msg}`);
311
+ return {
312
+ success: false,
313
+ error: msg,
314
+ };
315
+ }
316
+ finally {
317
+ await this.closePage();
318
+ }
319
+ }
320
+ /**
321
+ * Close the page if open
322
+ */
323
+ async closePage() {
324
+ if (this.page) {
325
+ try {
326
+ await this.page.close();
327
+ }
328
+ catch {
329
+ // Ignore close errors
330
+ }
331
+ this.page = null;
332
+ }
333
+ }
334
+ }
335
+ //# sourceMappingURL=audio-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-manager.js","sourceRoot":"","sources":["../../src/notebook-creation/audio-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Discover Creation Flow
3
+ *
4
+ * Walks through the notebook creation flow step by step,
5
+ * dumping UI elements at each stage to find the correct selectors.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=discover-creation-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-creation-flow.d.ts","sourceRoot":"","sources":["../../src/notebook-creation/discover-creation-flow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Discover Creation Flow
3
+ *
4
+ * Walks through the notebook creation flow step by step,
5
+ * dumping UI elements at each stage to find the correct selectors.
6
+ */
7
+ import { AuthManager } from "../auth/auth-manager.js";
8
+ import { SharedContextManager } from "../session/shared-context-manager.js";
9
+ import { log } from "../utils/logger.js";
10
+ const NOTEBOOKLM_URL = "https://notebooklm.google.com/";
11
+ async function dumpElements(page, description) {
12
+ log.info(`\n📋 ${description}:`);
13
+ const elements = await page.evaluate(() => {
14
+ const results = [];
15
+ // @ts-expect-error - DOM types
16
+ const els = document.querySelectorAll('button, input, textarea, [role="button"], [role="menuitem"], [role="option"], [role="tab"], a, [contenteditable="true"]');
17
+ for (const el of els) {
18
+ const text = el.textContent?.trim().substring(0, 50) || "";
19
+ // Skip empty or icon-only elements
20
+ if (!text && !el.getAttribute("aria-label"))
21
+ continue;
22
+ results.push({
23
+ tag: el.tagName,
24
+ text: text,
25
+ classes: el.className?.substring?.(0, 100) || "",
26
+ id: el.id || "",
27
+ ariaLabel: el.getAttribute("aria-label") || "",
28
+ role: el.getAttribute("role") || "",
29
+ type: el.getAttribute("type") || "",
30
+ placeholder: el.getAttribute("placeholder") || "",
31
+ dataAttrs: Object.fromEntries(Array.from(el.attributes || [])
32
+ .filter((a) => a.name.startsWith("data-"))
33
+ .map((a) => [a.name, a.value?.substring(0, 50)])),
34
+ });
35
+ }
36
+ return results;
37
+ });
38
+ // Log interesting elements
39
+ for (const el of elements) {
40
+ const info = [];
41
+ if (el.text)
42
+ info.push(`"${el.text}"`);
43
+ if (el.ariaLabel)
44
+ info.push(`aria="${el.ariaLabel}"`);
45
+ if (el.role)
46
+ info.push(`role=${el.role}`);
47
+ if (el.type)
48
+ info.push(`type=${el.type}`);
49
+ if (el.placeholder)
50
+ info.push(`placeholder="${el.placeholder}"`);
51
+ if (el.id)
52
+ info.push(`id=${el.id}`);
53
+ if (info.length > 0) {
54
+ log.dim(` ${el.tag}: ${info.join(", ")}`);
55
+ }
56
+ }
57
+ return elements;
58
+ }
59
+ async function findAndClick(page, textPatterns, description) {
60
+ log.info(`\n🖱️ Looking for: ${description}`);
61
+ for (const pattern of textPatterns) {
62
+ const clicked = await page.evaluate((p) => {
63
+ // @ts-expect-error - DOM types
64
+ const els = document.querySelectorAll('button, [role="button"], [role="menuitem"], [role="tab"], a');
65
+ for (const el of els) {
66
+ const text = el.textContent?.toLowerCase() || "";
67
+ const aria = el.getAttribute("aria-label")?.toLowerCase() || "";
68
+ if (text.includes(p.toLowerCase()) || aria.includes(p.toLowerCase())) {
69
+ el.click();
70
+ return true;
71
+ }
72
+ }
73
+ return false;
74
+ }, pattern);
75
+ if (clicked) {
76
+ log.success(` ✅ Clicked element with "${pattern}"`);
77
+ await page.waitForTimeout(2000);
78
+ return true;
79
+ }
80
+ }
81
+ log.warning(` ⚠️ Could not find element matching: ${textPatterns.join(", ")}`);
82
+ return false;
83
+ }
84
+ async function main() {
85
+ log.info("🔍 Starting Creation Flow Discovery...\n");
86
+ const authManager = new AuthManager();
87
+ const contextManager = new SharedContextManager(authManager);
88
+ try {
89
+ // Get browser context with visible window
90
+ const context = await contextManager.getOrCreateContext(true);
91
+ // Check auth
92
+ const isAuth = await authManager.validateCookiesExpiry(context);
93
+ if (!isAuth) {
94
+ log.error("❌ Not authenticated. Run setup_auth first.");
95
+ return;
96
+ }
97
+ const page = await context.newPage();
98
+ // Step 1: Navigate to NotebookLM
99
+ log.info("📍 Step 1: Navigate to NotebookLM homepage");
100
+ await page.goto(NOTEBOOKLM_URL, { waitUntil: "domcontentloaded" });
101
+ await page.waitForLoadState("networkidle").catch(() => { });
102
+ await page.waitForTimeout(3000);
103
+ await dumpElements(page, "Homepage elements");
104
+ // Step 2: Click "Create new" or "New notebook"
105
+ log.info("\n📍 Step 2: Click to create new notebook");
106
+ const createClicked = await findAndClick(page, ["Create new", "New notebook", "Create", "New"], "Create new notebook button");
107
+ if (createClicked) {
108
+ await page.waitForTimeout(3000);
109
+ await dumpElements(page, "After clicking Create - looking for name input");
110
+ // Check current URL - might have navigated to notebook
111
+ log.info(` Current URL: ${page.url()}`);
112
+ }
113
+ // Step 3: Look for name input or skip if auto-created
114
+ log.info("\n📍 Step 3: Look for notebook name input");
115
+ const inputs = await page.evaluate(() => {
116
+ // @ts-expect-error - DOM types
117
+ const els = document.querySelectorAll('input, textarea, [contenteditable="true"]');
118
+ return Array.from(els).map((el) => ({
119
+ tag: el.tagName,
120
+ type: el.type,
121
+ placeholder: el.placeholder,
122
+ ariaLabel: el.getAttribute("aria-label"),
123
+ value: el.value,
124
+ classes: el.className?.substring(0, 100),
125
+ }));
126
+ });
127
+ log.info(" Input elements found:");
128
+ for (const inp of inputs) {
129
+ log.dim(` ${inp.tag}: type=${inp.type}, placeholder="${inp.placeholder}", aria="${inp.ariaLabel}"`);
130
+ }
131
+ // Step 4: Find "Add source" button
132
+ log.info("\n📍 Step 4: Look for Add source button");
133
+ await dumpElements(page, "Looking for Add source");
134
+ const addSourceClicked = await findAndClick(page, ["Add source", "Add", "+"], "Add source button");
135
+ if (addSourceClicked) {
136
+ await page.waitForTimeout(2000);
137
+ await dumpElements(page, "After clicking Add source - source type options");
138
+ }
139
+ // Step 5: Look for source type options (URL, File, Text)
140
+ log.info("\n📍 Step 5: Look for URL/Website source option");
141
+ const urlClicked = await findAndClick(page, ["Website", "URL", "Link", "Web"], "URL source option");
142
+ if (urlClicked) {
143
+ await page.waitForTimeout(2000);
144
+ await dumpElements(page, "After selecting URL - looking for input field");
145
+ // Specifically look for input fields
146
+ const urlInputs = await page.evaluate(() => {
147
+ // @ts-expect-error - DOM types
148
+ const els = document.querySelectorAll('input[type="url"], input[type="text"], input:not([type]), textarea');
149
+ return Array.from(els).map((el) => ({
150
+ tag: el.tagName,
151
+ type: el.type,
152
+ placeholder: el.placeholder,
153
+ ariaLabel: el.getAttribute("aria-label"),
154
+ classes: el.className?.substring(0, 100),
155
+ visible: el.offsetParent !== null,
156
+ }));
157
+ });
158
+ log.info(" URL Input candidates:");
159
+ for (const inp of urlInputs) {
160
+ if (inp.visible) {
161
+ log.dim(` ${inp.tag}: type=${inp.type}, placeholder="${inp.placeholder}", aria="${inp.ariaLabel}"`);
162
+ }
163
+ }
164
+ }
165
+ // Keep browser open for manual inspection
166
+ log.info("\n✅ Discovery complete. Browser will stay open for 60 seconds for manual inspection.");
167
+ await page.waitForTimeout(60000);
168
+ }
169
+ catch (error) {
170
+ log.error(`❌ Error: ${error}`);
171
+ }
172
+ finally {
173
+ await contextManager.closeContext();
174
+ }
175
+ }
176
+ main().catch(console.error);
177
+ //# sourceMappingURL=discover-creation-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-creation-flow.js","sourceRoot":"","sources":["../../src/notebook-creation/discover-creation-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Discover Quota/License UI Elements
3
+ *
4
+ * Finds where license tier and usage limits are displayed in NotebookLM.
5
+ * Run: node dist/notebook-creation/discover-quota.js
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=discover-quota.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover-quota.d.ts","sourceRoot":"","sources":["../../src/notebook-creation/discover-quota.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}