@roomi-fields/notebooklm-mcp 1.5.2 → 1.5.7

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 (294) hide show
  1. package/LICENSE +22 -22
  2. package/README.md +219 -201
  3. package/deployment/INDEX.md +0 -0
  4. package/deployment/PACKAGE-FILES.txt +180 -180
  5. package/deployment/QUICK-START.md +0 -0
  6. package/deployment/docs/01-INSTALL.md +0 -0
  7. package/deployment/docs/02-CONFIGURATION.md +0 -0
  8. package/deployment/docs/03-API.md +99 -13
  9. package/deployment/docs/04-N8N-INTEGRATION.md +0 -0
  10. package/deployment/docs/05-TROUBLESHOOTING.md +0 -0
  11. package/deployment/docs/06-NOTEBOOK-LIBRARY.md +0 -0
  12. package/deployment/docs/07-AUTO-DISCOVERY.md +0 -0
  13. package/deployment/docs/08-DOCKER.md +303 -0
  14. package/deployment/docs/08-WSL-USAGE.md +0 -0
  15. package/deployment/docs/09-MULTI-INTERFACE.md +0 -0
  16. package/deployment/docs/10-CONTENT-MANAGEMENT.md +0 -0
  17. package/deployment/docs/11-MULTI-ACCOUNT.md +0 -0
  18. package/deployment/docs/README.md +9 -2
  19. package/deployment/scripts/README.md +0 -0
  20. package/deployment/scripts/install.ps1 +114 -114
  21. package/deployment/scripts/setup-auth.ps1 +217 -217
  22. package/deployment/scripts/start-server.ps1 +72 -72
  23. package/deployment/scripts/stop-server.ps1 +51 -51
  24. package/deployment/scripts/test-api.ps1 +651 -651
  25. package/deployment/scripts/test-auth.ps1 +0 -0
  26. package/deployment/scripts/test-auto-discovery.ps1 +295 -295
  27. package/deployment/scripts/test-cors.ps1 +398 -398
  28. package/deployment/scripts/test-errors.ps1 +581 -581
  29. package/deployment/scripts/test-server.ps1 +140 -140
  30. package/deployment/scripts/test-sessions.ps1 +426 -426
  31. package/deployment/scripts/test-validation.ps1 +299 -299
  32. package/dist/accounts/account-manager.d.ts +15 -0
  33. package/dist/accounts/account-manager.d.ts.map +1 -1
  34. package/dist/accounts/account-manager.js +104 -0
  35. package/dist/accounts/account-manager.js.map +1 -1
  36. package/dist/accounts/auto-login-manager.d.ts +0 -0
  37. package/dist/accounts/auto-login-manager.d.ts.map +1 -1
  38. package/dist/accounts/auto-login-manager.js +45 -28
  39. package/dist/accounts/auto-login-manager.js.map +1 -1
  40. package/dist/accounts/crypto.d.ts +0 -0
  41. package/dist/accounts/crypto.d.ts.map +0 -0
  42. package/dist/accounts/crypto.js +0 -0
  43. package/dist/accounts/crypto.js.map +0 -0
  44. package/dist/accounts/index.d.ts +0 -0
  45. package/dist/accounts/index.d.ts.map +0 -0
  46. package/dist/accounts/index.js +0 -0
  47. package/dist/accounts/index.js.map +0 -0
  48. package/dist/accounts/types.d.ts +0 -0
  49. package/dist/accounts/types.d.ts.map +0 -0
  50. package/dist/accounts/types.js +0 -0
  51. package/dist/accounts/types.js.map +0 -0
  52. package/dist/auth/auth-manager.d.ts +1 -1
  53. package/dist/auth/auth-manager.d.ts.map +1 -1
  54. package/dist/auth/auth-manager.js +33 -13
  55. package/dist/auth/auth-manager.js.map +1 -1
  56. package/dist/auto-discovery/auto-discovery.d.ts +0 -0
  57. package/dist/auto-discovery/auto-discovery.d.ts.map +0 -0
  58. package/dist/auto-discovery/auto-discovery.js +0 -0
  59. package/dist/auto-discovery/auto-discovery.js.map +0 -0
  60. package/dist/cli/accounts.d.ts +0 -0
  61. package/dist/cli/accounts.d.ts.map +0 -0
  62. package/dist/cli/accounts.js +0 -0
  63. package/dist/cli/accounts.js.map +0 -0
  64. package/dist/cli/de-auth.d.ts +0 -0
  65. package/dist/cli/de-auth.d.ts.map +0 -0
  66. package/dist/cli/de-auth.js +0 -0
  67. package/dist/cli/de-auth.js.map +0 -0
  68. package/dist/cli/help.d.ts +0 -0
  69. package/dist/cli/help.d.ts.map +0 -0
  70. package/dist/cli/help.js +0 -0
  71. package/dist/cli/help.js.map +0 -0
  72. package/dist/cli/setup-auth.d.ts +0 -0
  73. package/dist/cli/setup-auth.d.ts.map +0 -0
  74. package/dist/cli/setup-auth.js +18 -10
  75. package/dist/cli/setup-auth.js.map +1 -1
  76. package/dist/config.d.ts +1 -0
  77. package/dist/config.d.ts.map +1 -1
  78. package/dist/config.js +15 -1
  79. package/dist/config.js.map +1 -1
  80. package/dist/content/content-generator.d.ts +0 -0
  81. package/dist/content/content-generator.d.ts.map +0 -0
  82. package/dist/content/content-generator.js +0 -0
  83. package/dist/content/content-generator.js.map +0 -0
  84. package/dist/content/content-manager.d.ts +0 -0
  85. package/dist/content/content-manager.d.ts.map +0 -0
  86. package/dist/content/content-manager.js +0 -0
  87. package/dist/content/content-manager.js.map +0 -0
  88. package/dist/content/content-templates.d.ts +0 -0
  89. package/dist/content/content-templates.d.ts.map +0 -0
  90. package/dist/content/content-templates.js +0 -0
  91. package/dist/content/content-templates.js.map +0 -0
  92. package/dist/content/index.d.ts +0 -0
  93. package/dist/content/index.d.ts.map +0 -0
  94. package/dist/content/index.js +0 -0
  95. package/dist/content/index.js.map +0 -0
  96. package/dist/content/types.d.ts +0 -0
  97. package/dist/content/types.d.ts.map +0 -0
  98. package/dist/content/types.js +0 -0
  99. package/dist/content/types.js.map +0 -0
  100. package/dist/errors.d.ts +0 -0
  101. package/dist/errors.d.ts.map +0 -0
  102. package/dist/errors.js +0 -0
  103. package/dist/errors.js.map +0 -0
  104. package/dist/http-wrapper.d.ts +0 -0
  105. package/dist/http-wrapper.d.ts.map +1 -1
  106. package/dist/http-wrapper.js +275 -7
  107. package/dist/http-wrapper.js.map +1 -1
  108. package/dist/i18n/en.json +0 -0
  109. package/dist/i18n/fr.json +0 -0
  110. package/dist/i18n/index.d.ts +0 -0
  111. package/dist/i18n/index.d.ts.map +0 -0
  112. package/dist/i18n/index.js +0 -0
  113. package/dist/i18n/index.js.map +0 -0
  114. package/dist/index.d.ts +0 -0
  115. package/dist/index.d.ts.map +0 -0
  116. package/dist/index.js +0 -0
  117. package/dist/index.js.map +0 -0
  118. package/dist/library/notebook-library.d.ts +0 -0
  119. package/dist/library/notebook-library.d.ts.map +0 -0
  120. package/dist/library/notebook-library.js +0 -0
  121. package/dist/library/notebook-library.js.map +0 -0
  122. package/dist/library/types.d.ts +0 -0
  123. package/dist/library/types.d.ts.map +0 -0
  124. package/dist/library/types.js +0 -0
  125. package/dist/library/types.js.map +0 -0
  126. package/dist/session/browser-session.d.ts +0 -0
  127. package/dist/session/browser-session.d.ts.map +1 -1
  128. package/dist/session/browser-session.js +215 -91
  129. package/dist/session/browser-session.js.map +1 -1
  130. package/dist/session/session-manager.d.ts +0 -0
  131. package/dist/session/session-manager.d.ts.map +0 -0
  132. package/dist/session/session-manager.js +0 -0
  133. package/dist/session/session-manager.js.map +0 -0
  134. package/dist/session/shared-context-manager.d.ts +0 -0
  135. package/dist/session/shared-context-manager.d.ts.map +1 -1
  136. package/dist/session/shared-context-manager.js +38 -5
  137. package/dist/session/shared-context-manager.js.map +1 -1
  138. package/dist/startup/startup-manager.d.ts +60 -0
  139. package/dist/startup/startup-manager.d.ts.map +1 -0
  140. package/dist/startup/startup-manager.js +468 -0
  141. package/dist/startup/startup-manager.js.map +1 -0
  142. package/dist/stdio-http-proxy.d.ts +0 -0
  143. package/dist/stdio-http-proxy.d.ts.map +0 -0
  144. package/dist/stdio-http-proxy.js +91 -16
  145. package/dist/stdio-http-proxy.js.map +1 -1
  146. package/dist/tools/index.d.ts +1 -0
  147. package/dist/tools/index.d.ts.map +1 -1
  148. package/dist/tools/index.js +55 -34
  149. package/dist/tools/index.js.map +1 -1
  150. package/dist/types.d.ts +0 -0
  151. package/dist/types.d.ts.map +0 -0
  152. package/dist/types.js +0 -0
  153. package/dist/types.js.map +0 -0
  154. package/dist/utils/citation-extractor.d.ts +6 -7
  155. package/dist/utils/citation-extractor.d.ts.map +1 -1
  156. package/dist/utils/citation-extractor.js +138 -303
  157. package/dist/utils/citation-extractor.js.map +1 -1
  158. package/dist/utils/cleanup-manager.d.ts +0 -0
  159. package/dist/utils/cleanup-manager.d.ts.map +0 -0
  160. package/dist/utils/cleanup-manager.js +0 -0
  161. package/dist/utils/cleanup-manager.js.map +0 -0
  162. package/dist/utils/logger.d.ts +0 -0
  163. package/dist/utils/logger.d.ts.map +0 -0
  164. package/dist/utils/logger.js +0 -0
  165. package/dist/utils/logger.js.map +0 -0
  166. package/dist/utils/page-utils.d.ts +0 -0
  167. package/dist/utils/page-utils.d.ts.map +1 -1
  168. package/dist/utils/page-utils.js +12 -13
  169. package/dist/utils/page-utils.js.map +1 -1
  170. package/dist/utils/stealth-utils.d.ts +0 -0
  171. package/dist/utils/stealth-utils.d.ts.map +0 -0
  172. package/dist/utils/stealth-utils.js +0 -0
  173. package/dist/utils/stealth-utils.js.map +0 -0
  174. package/docs/ADDING_A_LANGUAGE.md +0 -0
  175. package/docs/ARCHITECTURE_MIGRATION_STUDY.md +0 -0
  176. package/docs/CHROME_PROFILE_LIMITATION.md +0 -0
  177. package/docs/MULTI_ACCOUNT_SYSTEM.md +0 -0
  178. package/docs/archive/auto-discovery-complet.md +906 -0
  179. package/package.json +4 -2
  180. package/scripts/add-totp.ts +110 -0
  181. package/scripts/archive/add-and-activate-notebook.ps1 +0 -0
  182. package/scripts/archive/add-new-notebook.ps1 +0 -0
  183. package/scripts/archive/add-rom1pey.ps1 +0 -0
  184. package/scripts/archive/add-rpmonster.ps1 +0 -0
  185. package/scripts/archive/add-source-debug.ps1 +0 -0
  186. package/scripts/archive/add-source-e2e.ps1 +0 -0
  187. package/scripts/archive/add-source-visible.ps1 +0 -0
  188. package/scripts/archive/add-test-notebook.ps1 +0 -0
  189. package/scripts/archive/add-test-source.ps1 +0 -0
  190. package/scripts/archive/capture-screen.ps1 +0 -0
  191. package/scripts/archive/change-language.mjs +0 -0
  192. package/scripts/archive/change-language.ts +0 -0
  193. package/scripts/archive/check-account.ps1 +0 -0
  194. package/scripts/archive/check-notebook-2.ps1 +0 -0
  195. package/scripts/archive/check-test-notebook.ps1 +0 -0
  196. package/scripts/archive/create-notebook-auto.ps1 +0 -0
  197. package/scripts/archive/create-notebook.ps1 +0 -0
  198. package/scripts/archive/create-rom1pey-notebook.ps1 +0 -0
  199. package/scripts/archive/create-rom1pey.ps1 +0 -0
  200. package/scripts/archive/create-test-notebook-fresh.ps1 +0 -0
  201. package/scripts/archive/create-test-notebook.ps1 +0 -0
  202. package/scripts/archive/debug-add-source-auto.ps1 +0 -0
  203. package/scripts/archive/debug-add-source.ps1 +0 -0
  204. package/scripts/archive/debug-add-text-source.ps1 +0 -0
  205. package/scripts/archive/debug-home.ps1 +0 -0
  206. package/scripts/archive/debug-selectors.ps1 +0 -0
  207. package/scripts/archive/debug-sources-panel.ps1 +0 -0
  208. package/scripts/archive/debug-ui.ps1 +0 -0
  209. package/scripts/archive/discover-home.ps1 +0 -0
  210. package/scripts/archive/kill-automation-chrome.ps1 +0 -0
  211. package/scripts/archive/list-my-notebooks.ps1 +0 -0
  212. package/scripts/archive/navigate-home-visible.ps1 +0 -0
  213. package/scripts/archive/navigate-home.ps1 +0 -0
  214. package/scripts/archive/run-e2e-english.ps1 +0 -0
  215. package/scripts/archive/run-e2e-rom1pey-v2.ps1 +0 -0
  216. package/scripts/archive/run-e2e-rom1pey.ps1 +0 -0
  217. package/scripts/archive/setup-english-test.ps1 +0 -0
  218. package/scripts/archive/setup-test-notebook.ps1 +0 -0
  219. package/scripts/archive/simple-add-source.ps1 +0 -0
  220. package/scripts/archive/t10.ps1 +0 -0
  221. package/scripts/archive/t20.ps1 +0 -0
  222. package/scripts/archive/t30.ps1 +0 -0
  223. package/scripts/archive/t31.ps1 +0 -0
  224. package/scripts/archive/t32.ps1 +0 -0
  225. package/scripts/archive/t39.ps1 +0 -0
  226. package/scripts/archive/t40.ps1 +0 -0
  227. package/scripts/archive/t53.ps1 +0 -0
  228. package/scripts/archive/t54.ps1 +0 -0
  229. package/scripts/archive/t55.ps1 +0 -0
  230. package/scripts/archive/t9.ps1 +0 -0
  231. package/scripts/archive/test-access.ps1 +0 -0
  232. package/scripts/archive/test-add-delete-source.ps1 +0 -0
  233. package/scripts/archive/test-add-source-visible.ps1 +0 -0
  234. package/scripts/archive/test-add-source.ps1 +0 -0
  235. package/scripts/archive/test-add-text-debug.ps1 +0 -0
  236. package/scripts/archive/test-add-text-source.ps1 +0 -0
  237. package/scripts/archive/test-add-url-source.ps1 +0 -0
  238. package/scripts/archive/test-ask-ascii.ps1 +0 -0
  239. package/scripts/archive/test-ask-cnv.ps1 +0 -0
  240. package/scripts/archive/test-ask-headed.ps1 +0 -0
  241. package/scripts/archive/test-ask-ifs.ps1 +0 -0
  242. package/scripts/archive/test-ask-now.ps1 +0 -0
  243. package/scripts/archive/test-ask-real.ps1 +0 -0
  244. package/scripts/archive/test-ask-visible.ps1 +0 -0
  245. package/scripts/archive/test-create-notebook.ps1 +0 -0
  246. package/scripts/archive/test-create-then-add.ps1 +0 -0
  247. package/scripts/archive/test-delete-source.ps1 +0 -0
  248. package/scripts/archive/test-e2e-notebook.ps1 +0 -0
  249. package/scripts/archive/test-english-notebook.ps1 +0 -0
  250. package/scripts/archive/test-english.ps1 +0 -0
  251. package/scripts/archive/test-full-custom-instructions.ps1 +0 -0
  252. package/scripts/archive/test-full-infographic.ps1 +0 -0
  253. package/scripts/archive/test-full-language.ps1 +0 -0
  254. package/scripts/archive/test-full-presentation.ps1 +0 -0
  255. package/scripts/archive/test-full-report.ps1 +0 -0
  256. package/scripts/archive/test-full-source-selection.ps1 +0 -0
  257. package/scripts/archive/test-full-video-brief.ps1 +0 -0
  258. package/scripts/archive/test-full-video-explainer.ps1 +0 -0
  259. package/scripts/archive/test-full-video-styles.ps1 +0 -0
  260. package/scripts/archive/test-generate-report.ps1 +0 -0
  261. package/scripts/archive/test-generate-study-guide.ps1 +0 -0
  262. package/scripts/archive/test-headed-ask.ps1 +0 -0
  263. package/scripts/archive/test-headed-now.ps1 +0 -0
  264. package/scripts/archive/test-headed.ps1 +0 -0
  265. package/scripts/archive/test-hello.ps1 +0 -0
  266. package/scripts/archive/test-i18n-studio.ps1 +0 -0
  267. package/scripts/archive/test-i18n.ps1 +0 -0
  268. package/scripts/archive/test-manual-headed.ps1 +0 -0
  269. package/scripts/archive/test-mathieu-quota.ps1 +0 -0
  270. package/scripts/archive/test-notebook-1.ps1 +0 -0
  271. package/scripts/archive/test-notebook-2-sources.ps1 +0 -0
  272. package/scripts/archive/test-notebook1.ps1 +0 -0
  273. package/scripts/archive/test-personal-notebook.ps1 +0 -0
  274. package/scripts/archive/test-rate-limit.ps1 +0 -0
  275. package/scripts/archive/test-real-ask.ps1 +0 -0
  276. package/scripts/archive/test-real-ask2.ps1 +0 -0
  277. package/scripts/archive/test-rom1pey.ps1 +0 -0
  278. package/scripts/archive/test-rotation-complete.ps1 +0 -0
  279. package/scripts/archive/test-rotation.ps1 +0 -0
  280. package/scripts/archive/test-show-browser.ps1 +0 -0
  281. package/scripts/archive/test-update-notebook.ps1 +0 -0
  282. package/scripts/archive/verify-language-slow.ps1 +0 -0
  283. package/scripts/archive/verify-language.ps1 +0 -0
  284. package/scripts/check-server.ps1 +0 -0
  285. package/scripts/docker-entrypoint.sh +25 -0
  286. package/scripts/mcp-proxy-hidden.ps1 +31 -0
  287. package/scripts/mcp-wsl-helper.sh +146 -146
  288. package/scripts/start-server-hidden.vbs +13 -0
  289. package/scripts/start-server.ps1 +0 -0
  290. package/scripts/start-vnc.sh +37 -0
  291. package/scripts/stop-server.bat +5 -0
  292. package/scripts/stop-server.ps1 +0 -0
  293. package/scripts/switch-account-language.sh +0 -0
  294. package/scripts/test-account.ps1 +0 -0
@@ -1,70 +1,18 @@
1
1
  /**
2
2
  * Citation Extractor for NotebookLM
3
3
  *
4
- * Extracts source citations by hovering over citation markers [1], [2], etc.
5
- * and capturing the tooltip content.
4
+ * Extracts source citations from NotebookLM responses:
5
+ * - Source names from citation button aria-labels (instant, 100% reliable)
6
+ * - Source excerpts by clicking citations to open the source panel (reads .highlighted)
7
+ * - All done via page.evaluate() — no ElementHandle references that can go stale
6
8
  *
7
- * Features:
8
- * - Hover-based extraction (no additional API calls)
9
- * - Multiple output formats (inline, footnotes, json, expanded)
10
- * - Graceful fallback if citations can't be extracted
9
+ * Multiple output formats: inline, footnotes, json, expanded
11
10
  */
12
11
  import { log } from './logger.js';
13
12
  import { randomDelay } from './stealth-utils.js';
14
13
  // ============================================================================
15
14
  // CSS Selectors for NotebookLM Citations
16
15
  // ============================================================================
17
- /**
18
- * Selectors to find citation markers in the response
19
- * NotebookLM typically uses superscript numbers or bracketed references
20
- */
21
- const CITATION_SELECTORS = [
22
- // Primary: Citation links/buttons
23
- '.citation-link',
24
- '.citation-marker',
25
- '[data-citation]',
26
- '[data-citation-id]',
27
- '[data-source-id]',
28
- // Superscript numbers
29
- 'sup.citation',
30
- 'sup[data-citation]',
31
- 'sup a',
32
- // Bracketed references [1], [2]
33
- '.reference-marker',
34
- '[role="button"][aria-label*="citation"]',
35
- '[role="button"][aria-label*="source"]',
36
- // NotebookLM specific (may need adjustment based on actual DOM)
37
- '.source-citation',
38
- '.inline-citation',
39
- 'button.citation',
40
- // Generic clickable citations
41
- '[class*="citation"]',
42
- '[class*="source-ref"]',
43
- ];
44
- /**
45
- * Selectors for the tooltip/popover that appears on hover
46
- */
47
- const TOOLTIP_SELECTORS = [
48
- // Common tooltip patterns
49
- '[role="tooltip"]',
50
- '.tooltip',
51
- '.popover',
52
- '.citation-tooltip',
53
- '.citation-popover',
54
- '.source-preview',
55
- '.source-tooltip',
56
- // Material Design / Google patterns
57
- '.mdc-tooltip',
58
- '.mat-tooltip',
59
- '[class*="tooltip"]',
60
- '[class*="popover"]',
61
- // NotebookLM specific
62
- '.citation-preview',
63
- '.source-card',
64
- '.source-snippet',
65
- '[data-tooltip]',
66
- '[aria-describedby]',
67
- ];
68
16
  // ============================================================================
69
17
  // Main Extraction Function
70
18
  // ============================================================================
@@ -77,7 +25,7 @@ const TOOLTIP_SELECTORS = [
77
25
  * @param format Desired output format
78
26
  * @returns Extraction result with formatted answer and citations
79
27
  */
80
- export async function extractCitations(page, answerText, responseContainer, format = 'none') {
28
+ export async function extractCitations(page, answerText, _responseContainer, format = 'none') {
81
29
  // Early return if no extraction requested
82
30
  if (format === 'none') {
83
31
  return {
@@ -91,9 +39,53 @@ export async function extractCitations(page, answerText, responseContainer, form
91
39
  log.info(`📚 [CITATIONS] Extracting sources (format: ${format})...`);
92
40
  const citations = [];
93
41
  try {
94
- // Find citation markers in the response
95
- const citationElements = await findCitationElements(page, responseContainer);
96
- if (citationElements.length === 0) {
42
+ // ================================================================
43
+ // SIMPLE APPROACH: Extract all citation data in ONE page.evaluate()
44
+ // No hover, no click, no ElementHandle — just read the DOM directly.
45
+ //
46
+ // NotebookLM citation buttons have:
47
+ // - innerText: the citation number (e.g. "1")
48
+ // - child span[aria-label]: "N: Source Name.pdf"
49
+ //
50
+ // For source excerpts, we click each citation to open the source panel.
51
+ // ================================================================
52
+ // IMPORTANT: Scope to the LAST response container only!
53
+ // After multiple questions, the page has citation buttons from ALL previous answers.
54
+ // If we querySelectorAll('button.citation-marker') globally, we click old citations
55
+ // from previous responses → wrong source panel → no highlights for current answer.
56
+ const rawCitations = await page.evaluate(`
57
+ (() => {
58
+ // Find the last response container (most recent answer)
59
+ const containers = document.querySelectorAll('.to-user-container .message-text-content');
60
+ const lastContainer = containers.length > 0 ? containers[containers.length - 1] : document;
61
+
62
+ const buttons = lastContainer.querySelectorAll('button.citation-marker');
63
+ const seen = new Set();
64
+ const results = [];
65
+
66
+ buttons.forEach((btn) => {
67
+ const text = btn.textContent || '';
68
+ const match = text.match(/(\\d+)/);
69
+ if (!match) return;
70
+ const num = parseInt(match[1], 10);
71
+ if (seen.has(num)) return;
72
+ seen.add(num);
73
+
74
+ const span = btn.querySelector('span[aria-label]');
75
+ let sourceName = '';
76
+ if (span) {
77
+ const label = span.getAttribute('aria-label') || '';
78
+ const colonIdx = label.indexOf(': ');
79
+ sourceName = colonIdx > 0 ? label.substring(colonIdx + 2).trim() : label.trim();
80
+ }
81
+
82
+ results.push({ number: num, sourceName });
83
+ });
84
+
85
+ return results.sort((a, b) => a.number - b.number);
86
+ })()
87
+ `);
88
+ if (rawCitations.length === 0) {
97
89
  log.info(`📚 [CITATIONS] No citation markers found in response`);
98
90
  return {
99
91
  originalAnswer: answerText,
@@ -103,32 +95,99 @@ export async function extractCitations(page, answerText, responseContainer, form
103
95
  success: true,
104
96
  };
105
97
  }
106
- log.info(`📚 [CITATIONS] Found ${citationElements.length} citation markers`);
107
- // Extract source text for each citation via hover
108
- for (const { element, marker, number } of citationElements) {
98
+ log.info(`📚 [CITATIONS] Found ${rawCitations.length} citation markers`);
99
+ // Extract source excerpts by CLICKING each citation button.
100
+ // Click opens the source panel with .highlighted marking the cited passage.
101
+ // Use JS .click() — real mouse clicks and hover don't work reliably in headless.
102
+ for (const { number, sourceName } of rawCitations) {
103
+ const marker = `[${number}]`;
104
+ let sourceText = '';
109
105
  try {
110
- const sourceText = await extractSourceViaHover(page, element);
111
- if (sourceText) {
112
- citations.push({
113
- marker,
114
- number,
115
- sourceText,
116
- });
117
- log.success(` ✅ [${marker}] Extracted: "${sourceText.substring(0, 50)}..."`);
118
- }
119
- else {
120
- log.warning(` ⚠️ [${marker}] Could not extract source text`);
106
+ // Step 1: Click the citation button (scoped to LAST response container)
107
+ const clicked = await page.evaluate(`
108
+ (() => {
109
+ const containers = document.querySelectorAll('.to-user-container .message-text-content');
110
+ const scope = containers.length > 0 ? containers[containers.length - 1] : document;
111
+ const num = ${number};
112
+ const buttons = scope.querySelectorAll('button.citation-marker');
113
+ for (const btn of buttons) {
114
+ const text = btn.textContent || '';
115
+ const match = text.match(/(\\d+)/);
116
+ if (match && parseInt(match[1], 10) === num) {
117
+ btn.scrollIntoView({ block: 'center' });
118
+ btn.click();
119
+ return true;
120
+ }
121
+ }
122
+ return false;
123
+ })()
124
+ `);
125
+ if (clicked) {
126
+ // Step 2: Wait for .highlighted to appear (poll with timeout)
127
+ const maxWaitMs = 3000;
128
+ const pollMs = 200;
129
+ const startTime = Date.now();
130
+ while (Date.now() - startTime < maxWaitMs) {
131
+ sourceText = await page.evaluate(`
132
+ (() => {
133
+ const highlights = document.querySelectorAll('.highlighted');
134
+ if (highlights.length === 0) return '';
135
+
136
+ const hTexts = Array.from(highlights).map(el => el.innerText?.trim()).filter(Boolean);
137
+ if (hTexts.length === 0) return '';
138
+
139
+ const parent = highlights[0].closest('.paragraph') || highlights[0].parentElement;
140
+ const pText = parent?.innerText?.trim() || '';
141
+ const hText = hTexts.join(' ');
142
+
143
+ return pText.length > hText.length ? pText : hText;
144
+ })()
145
+ `);
146
+ if (sourceText)
147
+ break;
148
+ await new Promise((r) => setTimeout(r, pollMs));
149
+ }
150
+ // Step 3: Dismiss the source panel
151
+ await page.keyboard.press('Escape');
152
+ await randomDelay(200, 400);
121
153
  }
122
154
  }
123
155
  catch (error) {
124
- log.warning(` ⚠️ [${marker}] Error extracting: ${error}`);
156
+ log.warning(` ⚠️ [${marker}] Click/extract failed: ${error}`);
157
+ }
158
+ // Always add the citation (with excerpt or just source name)
159
+ citations.push({
160
+ marker,
161
+ number,
162
+ sourceText: sourceText || sourceName,
163
+ sourceName: sourceName || undefined,
164
+ });
165
+ if (sourceText && sourceText !== sourceName) {
166
+ log.success(` ✅ [${marker}] ${sourceName}: "${sourceText.substring(0, 80)}..."`);
167
+ }
168
+ else {
169
+ log.info(` 📄 [${marker}] ${sourceName} (no excerpt)`);
125
170
  }
126
- // Small delay between hovers to avoid detection
127
- await randomDelay(100, 200);
171
+ }
172
+ // Dismiss any leftover source panel to ensure chat input is accessible for next question
173
+ try {
174
+ await page.keyboard.press('Escape');
175
+ await randomDelay(300, 500);
176
+ // Click on the chat area to ensure focus returns there
177
+ await page.evaluate(`
178
+ (() => {
179
+ const input = document.querySelector('textarea.query-box-input');
180
+ if (input) input.focus();
181
+ })()
182
+ `);
183
+ }
184
+ catch {
185
+ // Best effort
128
186
  }
129
187
  // Format the answer based on requested format
130
188
  const formattedAnswer = formatAnswerWithSources(answerText, citations, format);
131
- log.success(`📚 [CITATIONS] Extracted ${citations.length}/${citationElements.length} sources`);
189
+ const withExcerpt = citations.filter((c) => c.sourceText && c.sourceText !== c.sourceName).length;
190
+ log.success(`📚 [CITATIONS] Extracted ${citations.length}/${rawCitations.length} sources (${withExcerpt} with excerpts)`);
132
191
  return {
133
192
  originalAnswer: answerText,
134
193
  formattedAnswer,
@@ -150,230 +209,6 @@ export async function extractCitations(page, answerText, responseContainer, form
150
209
  };
151
210
  }
152
211
  }
153
- /**
154
- * Find citation marker elements in the response
155
- */
156
- async function findCitationElements(page, container) {
157
- const results = [];
158
- const seenNumbers = new Set();
159
- // Search context: container if available, otherwise full page
160
- const searchContext = container || page;
161
- // Try each selector
162
- for (const selector of CITATION_SELECTORS) {
163
- try {
164
- const elements = await searchContext.$$(selector);
165
- for (const element of elements) {
166
- try {
167
- // Get the text content to identify the citation number
168
- const text = await element.innerText();
169
- const match = text.match(/\[?(\d+)\]?/);
170
- if (match) {
171
- const number = parseInt(match[1], 10);
172
- // Skip if we've already found this citation
173
- if (seenNumbers.has(number))
174
- continue;
175
- seenNumbers.add(number);
176
- const marker = `[${number}]`;
177
- results.push({ element, marker, number });
178
- }
179
- }
180
- catch {
181
- continue;
182
- }
183
- }
184
- }
185
- catch {
186
- continue;
187
- }
188
- }
189
- // Also try to find citations by regex pattern in the page
190
- if (results.length === 0) {
191
- const regexResults = await findCitationsByRegex(page, container);
192
- results.push(...regexResults);
193
- }
194
- // Sort by citation number
195
- results.sort((a, b) => a.number - b.number);
196
- return results;
197
- }
198
- /**
199
- * Find citations using regex matching on text content
200
- * Fallback method when CSS selectors don't work
201
- *
202
- * This improved version:
203
- * 1. Detects citation markers [n] in the text
204
- * 2. Finds clickable elements containing those markers
205
- * 3. Returns element handles for hover extraction
206
- */
207
- async function findCitationsByRegex(page, container) {
208
- const results = [];
209
- const seenNumbers = new Set();
210
- try {
211
- // First, detect unique citation numbers in the response text
212
- const citationNumbers = await page.evaluate((containerSelector) => {
213
- const searchRoot = containerSelector
214
- ? // @ts-expect-error - document available in browser context
215
- document.querySelector(containerSelector)
216
- : // @ts-expect-error - document available in browser context
217
- document.body;
218
- if (!searchRoot)
219
- return [];
220
- const text = searchRoot.textContent || '';
221
- const matches = text.matchAll(/\[(\d+)\]/g);
222
- const numbers = new Set();
223
- for (const match of matches) {
224
- numbers.add(parseInt(match[1], 10));
225
- }
226
- return Array.from(numbers).sort((a, b) => a - b);
227
- }, container ? '.to-user-container .message-text-content' : null);
228
- log.info(`📚 [CITATIONS] Regex found ${citationNumbers.length} unique citation markers: [${citationNumbers.join(', ')}]`);
229
- // For each citation number, try to find a clickable element
230
- // NotebookLM typically wraps citations in <a>, <button>, or <span> with click handlers
231
- const searchContext = container || page;
232
- for (const num of citationNumbers) {
233
- if (seenNumbers.has(num))
234
- continue;
235
- // Try multiple strategies to find the citation element
236
- const strategies = [
237
- // Strategy 1: Look for links with the citation number
238
- `a:has-text("[${num}]")`,
239
- `button:has-text("[${num}]")`,
240
- `span:has-text("[${num}]")`,
241
- // Strategy 2: Look for elements with citation-related attributes
242
- `[data-citation="${num}"]`,
243
- `[data-source="${num}"]`,
244
- `[aria-label*="${num}"]`,
245
- // Strategy 3: Look for superscript elements
246
- `sup:has-text("${num}")`,
247
- // Strategy 4: Generic clickable elements with the number
248
- `[role="button"]:has-text("[${num}]")`,
249
- `[role="link"]:has-text("[${num}]")`,
250
- ];
251
- for (const selector of strategies) {
252
- try {
253
- const element = await searchContext.$(selector);
254
- if (element) {
255
- const isVisible = await element.isVisible();
256
- if (isVisible) {
257
- seenNumbers.add(num);
258
- results.push({
259
- element,
260
- marker: `[${num}]`,
261
- number: num,
262
- });
263
- log.info(` 📌 Found element for [${num}] using selector: ${selector}`);
264
- break;
265
- }
266
- }
267
- }
268
- catch {
269
- continue;
270
- }
271
- }
272
- // If no element found with specific selectors, try XPath as last resort
273
- if (!seenNumbers.has(num)) {
274
- try {
275
- // Find any element that contains exactly [n]
276
- const xpath = `//*[contains(text(), '[${num}]')]`;
277
- const elements = await page.$$(`::-p-xpath(${xpath})`);
278
- for (const element of elements) {
279
- try {
280
- const text = await element.innerText();
281
- // Make sure it's the citation marker, not just any text with [n]
282
- if (text.includes(`[${num}]`) && text.length < 50) {
283
- const isVisible = await element.isVisible();
284
- if (isVisible) {
285
- seenNumbers.add(num);
286
- results.push({
287
- element,
288
- marker: `[${num}]`,
289
- number: num,
290
- });
291
- log.info(` 📌 Found element for [${num}] using XPath fallback`);
292
- break;
293
- }
294
- }
295
- }
296
- catch {
297
- continue;
298
- }
299
- }
300
- }
301
- catch {
302
- // XPath failed, continue without this citation
303
- }
304
- }
305
- if (!seenNumbers.has(num)) {
306
- log.warning(` ⚠️ Could not find DOM element for [${num}]`);
307
- }
308
- }
309
- log.info(`📚 [CITATIONS] Found ${results.length}/${citationNumbers.length} citation elements`);
310
- }
311
- catch (error) {
312
- log.warning(`⚠️ [CITATIONS] Regex search failed: ${error}`);
313
- }
314
- // Sort by citation number
315
- results.sort((a, b) => a.number - b.number);
316
- return results;
317
- }
318
- /**
319
- * Extract source text by hovering over a citation element
320
- */
321
- async function extractSourceViaHover(page, element) {
322
- try {
323
- // Scroll element into view
324
- await element.scrollIntoViewIfNeeded();
325
- await randomDelay(50, 100);
326
- // Hover over the element
327
- await element.hover();
328
- // Wait for tooltip to appear
329
- await randomDelay(300, 500);
330
- // Try to find and read the tooltip content
331
- for (const tooltipSelector of TOOLTIP_SELECTORS) {
332
- try {
333
- const tooltip = await page.$(tooltipSelector);
334
- if (tooltip) {
335
- const isVisible = await tooltip.isVisible();
336
- if (isVisible) {
337
- const text = await tooltip.innerText();
338
- if (text && text.trim()) {
339
- // Move mouse away to dismiss tooltip
340
- await page.mouse.move(0, 0);
341
- await randomDelay(100, 150);
342
- return text.trim();
343
- }
344
- }
345
- }
346
- }
347
- catch {
348
- continue;
349
- }
350
- }
351
- // Fallback: Check for aria-describedby attribute
352
- try {
353
- const describedBy = await element.getAttribute('aria-describedby');
354
- if (describedBy) {
355
- const tooltipById = await page.$(`#${describedBy}`);
356
- if (tooltipById) {
357
- const text = await tooltipById.innerText();
358
- if (text && text.trim()) {
359
- await page.mouse.move(0, 0);
360
- return text.trim();
361
- }
362
- }
363
- }
364
- }
365
- catch {
366
- // Ignore
367
- }
368
- // Move mouse away even if we didn't find content
369
- await page.mouse.move(0, 0);
370
- return null;
371
- }
372
- catch (error) {
373
- log.warning(`⚠️ [CITATIONS] Hover extraction failed: ${error}`);
374
- return null;
375
- }
376
- }
377
212
  // ============================================================================
378
213
  // Formatting Functions
379
214
  // ============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"citation-extractor.js","sourceRoot":"","sources":["../../src/utils/citation-extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"citation-extractor.js","sourceRoot":"","sources":["../../src/utils/citation-extractor.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"page-utils.d.ts","sourceRoot":"","sources":["../../src/utils/page-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAkFvC;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxD;AA4CD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE/E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,GACL,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8IxB;;;;;;;AA+MD,wBAKE"}
1
+ {"version":3,"file":"page-utils.d.ts","sourceRoot":"","sources":["../../src/utils/page-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAiFvC;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxD;AA4CD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE/E;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;CACZ,GACL,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8IxB;;;;;;;AA+MD,wBAKE"}
@@ -61,6 +61,7 @@ const PLACEHOLDER_SNIPPETS = [
61
61
  'processing request',
62
62
  ];
63
63
  // Error messages from NotebookLM that indicate failure
64
+ // These trigger immediate return (no stability wait) but NOT account rotation.
64
65
  const ERROR_SNIPPETS = [
65
66
  "le système n'a pas pu répondre", // French: The system could not respond
66
67
  'the system could not respond',
@@ -70,19 +71,17 @@ const ERROR_SNIPPETS = [
70
71
  'une erreur est survenue',
71
72
  'try again later',
72
73
  'réessayez plus tard',
73
- 'rate limit',
74
- 'too many requests',
75
74
  ];
76
75
  // Rate limit specific messages (trigger account rotation)
76
+ // IMPORTANT: Must be VERY specific — generic phrases like "daily limit" or "revenez plus tard"
77
+ // can appear in academic answers and cause false positives.
77
78
  const RATE_LIMIT_MESSAGES = [
78
- "le système n'a pas pu répondre", // Generic error that often indicates rate limit
79
79
  'vous avez atteint la limite quotidienne', // French: You have reached the daily limit
80
- 'limite quotidienne de discussions',
81
- 'daily limit',
82
- 'revenez plus tard', // Come back later
80
+ 'limite quotidienne de discussions', // French: Daily discussion limit
81
+ 'daily discussion limit',
82
+ 'daily limit reached',
83
83
  'query limit reached',
84
84
  'rate limit exceeded',
85
- 'daily discussion limit',
86
85
  ];
87
86
  /**
88
87
  * Check if text is an error message from NotebookLM
@@ -344,12 +343,12 @@ async function extractLatestText(page, knownHashes, debug, pollCount) {
344
343
  // Scroll to bottom periodically to reveal new messages (every 5 polls)
345
344
  if (pollCount % 5 === 0) {
346
345
  try {
347
- await page.evaluate(`
348
- (() => {
349
- const containers = document.querySelectorAll('.chat-scroll-container, .messages-container, [class*="scroll"]');
350
- containers.forEach(c => { c.scrollTop = c.scrollHeight; });
351
- window.scrollTo(0, document.body.scrollHeight);
352
- })()
346
+ await page.evaluate(`
347
+ (() => {
348
+ const containers = document.querySelectorAll('.chat-scroll-container, .messages-container, [class*="scroll"]');
349
+ containers.forEach(c => { c.scrollTop = c.scrollHeight; });
350
+ window.scrollTo(0, document.body.scrollHeight);
351
+ })()
353
352
  `);
354
353
  }
355
354
  catch {