notelm-mcp 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +456 -0
  3. package/dist/auth/auth-manager.d.ts +139 -0
  4. package/dist/auth/auth-manager.d.ts.map +1 -0
  5. package/dist/auth/auth-manager.js +960 -0
  6. package/dist/auth/auth-manager.js.map +1 -0
  7. package/dist/config.d.ts +92 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +219 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/constants.d.ts +58 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +133 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/errors.d.ts +26 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +41 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/index.d.ts +32 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +325 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/library/notebook-library.d.ts +70 -0
  24. package/dist/library/notebook-library.d.ts.map +1 -0
  25. package/dist/library/notebook-library.js +279 -0
  26. package/dist/library/notebook-library.js.map +1 -0
  27. package/dist/library/types.d.ts +67 -0
  28. package/dist/library/types.d.ts.map +1 -0
  29. package/dist/library/types.js +8 -0
  30. package/dist/library/types.js.map +1 -0
  31. package/dist/playwright.config.d.ts +3 -0
  32. package/dist/playwright.config.d.ts.map +1 -0
  33. package/dist/playwright.config.js +38 -0
  34. package/dist/playwright.config.js.map +1 -0
  35. package/dist/resources/resource-handlers.d.ts +22 -0
  36. package/dist/resources/resource-handlers.d.ts.map +1 -0
  37. package/dist/resources/resource-handlers.js +216 -0
  38. package/dist/resources/resource-handlers.js.map +1 -0
  39. package/dist/scripts/save-auth-state.d.ts +2 -0
  40. package/dist/scripts/save-auth-state.d.ts.map +1 -0
  41. package/dist/scripts/save-auth-state.js +91 -0
  42. package/dist/scripts/save-auth-state.js.map +1 -0
  43. package/dist/session/browser-session.d.ts +108 -0
  44. package/dist/session/browser-session.d.ts.map +1 -0
  45. package/dist/session/browser-session.js +636 -0
  46. package/dist/session/browser-session.js.map +1 -0
  47. package/dist/session/session-manager.d.ts +76 -0
  48. package/dist/session/session-manager.d.ts.map +1 -0
  49. package/dist/session/session-manager.js +273 -0
  50. package/dist/session/session-manager.js.map +1 -0
  51. package/dist/session/shared-context-manager.d.ts +107 -0
  52. package/dist/session/shared-context-manager.d.ts.map +1 -0
  53. package/dist/session/shared-context-manager.js +447 -0
  54. package/dist/session/shared-context-manager.js.map +1 -0
  55. package/dist/src/auth/auth-manager.d.ts +139 -0
  56. package/dist/src/auth/auth-manager.d.ts.map +1 -0
  57. package/dist/src/auth/auth-manager.js +960 -0
  58. package/dist/src/auth/auth-manager.js.map +1 -0
  59. package/dist/src/config.d.ts +92 -0
  60. package/dist/src/config.d.ts.map +1 -0
  61. package/dist/src/config.js +219 -0
  62. package/dist/src/config.js.map +1 -0
  63. package/dist/src/constants.d.ts +58 -0
  64. package/dist/src/constants.d.ts.map +1 -0
  65. package/dist/src/constants.js +133 -0
  66. package/dist/src/constants.js.map +1 -0
  67. package/dist/src/errors.d.ts +26 -0
  68. package/dist/src/errors.d.ts.map +1 -0
  69. package/dist/src/errors.js +41 -0
  70. package/dist/src/errors.js.map +1 -0
  71. package/dist/src/index.d.ts +32 -0
  72. package/dist/src/index.d.ts.map +1 -0
  73. package/dist/src/index.js +325 -0
  74. package/dist/src/index.js.map +1 -0
  75. package/dist/src/library/notebook-library.d.ts +70 -0
  76. package/dist/src/library/notebook-library.d.ts.map +1 -0
  77. package/dist/src/library/notebook-library.js +279 -0
  78. package/dist/src/library/notebook-library.js.map +1 -0
  79. package/dist/src/library/types.d.ts +67 -0
  80. package/dist/src/library/types.d.ts.map +1 -0
  81. package/dist/src/library/types.js +8 -0
  82. package/dist/src/library/types.js.map +1 -0
  83. package/dist/src/resources/resource-handlers.d.ts +22 -0
  84. package/dist/src/resources/resource-handlers.d.ts.map +1 -0
  85. package/dist/src/resources/resource-handlers.js +216 -0
  86. package/dist/src/resources/resource-handlers.js.map +1 -0
  87. package/dist/src/scripts/health-check.d.ts +13 -0
  88. package/dist/src/scripts/health-check.d.ts.map +1 -0
  89. package/dist/src/scripts/health-check.js +100 -0
  90. package/dist/src/scripts/health-check.js.map +1 -0
  91. package/dist/src/session/browser-session.d.ts +108 -0
  92. package/dist/src/session/browser-session.d.ts.map +1 -0
  93. package/dist/src/session/browser-session.js +642 -0
  94. package/dist/src/session/browser-session.js.map +1 -0
  95. package/dist/src/session/session-manager.d.ts +76 -0
  96. package/dist/src/session/session-manager.d.ts.map +1 -0
  97. package/dist/src/session/session-manager.js +273 -0
  98. package/dist/src/session/session-manager.js.map +1 -0
  99. package/dist/src/session/shared-context-manager.d.ts +107 -0
  100. package/dist/src/session/shared-context-manager.d.ts.map +1 -0
  101. package/dist/src/session/shared-context-manager.js +447 -0
  102. package/dist/src/session/shared-context-manager.js.map +1 -0
  103. package/dist/src/tools/definitions/ask-question.d.ts +8 -0
  104. package/dist/src/tools/definitions/ask-question.d.ts.map +1 -0
  105. package/dist/src/tools/definitions/ask-question.js +211 -0
  106. package/dist/src/tools/definitions/ask-question.js.map +1 -0
  107. package/dist/src/tools/definitions/notebook-management.d.ts +3 -0
  108. package/dist/src/tools/definitions/notebook-management.d.ts.map +1 -0
  109. package/dist/src/tools/definitions/notebook-management.js +243 -0
  110. package/dist/src/tools/definitions/notebook-management.js.map +1 -0
  111. package/dist/src/tools/definitions/session-management.d.ts +3 -0
  112. package/dist/src/tools/definitions/session-management.d.ts.map +1 -0
  113. package/dist/src/tools/definitions/session-management.js +41 -0
  114. package/dist/src/tools/definitions/session-management.js.map +1 -0
  115. package/dist/src/tools/definitions/system.d.ts +3 -0
  116. package/dist/src/tools/definitions/system.d.ts.map +1 -0
  117. package/dist/src/tools/definitions/system.js +143 -0
  118. package/dist/src/tools/definitions/system.js.map +1 -0
  119. package/dist/src/tools/definitions.d.ts +12 -0
  120. package/dist/src/tools/definitions.d.ts.map +1 -0
  121. package/dist/src/tools/definitions.js +26 -0
  122. package/dist/src/tools/definitions.js.map +1 -0
  123. package/dist/src/tools/handlers.d.ts +212 -0
  124. package/dist/src/tools/handlers.d.ts.map +1 -0
  125. package/dist/src/tools/handlers.js +712 -0
  126. package/dist/src/tools/handlers.js.map +1 -0
  127. package/dist/src/tools/index.d.ts +8 -0
  128. package/dist/src/tools/index.d.ts.map +1 -0
  129. package/dist/src/tools/index.js +8 -0
  130. package/dist/src/tools/index.js.map +1 -0
  131. package/dist/src/types.d.ts +88 -0
  132. package/dist/src/types.d.ts.map +1 -0
  133. package/dist/src/types.js +5 -0
  134. package/dist/src/types.js.map +1 -0
  135. package/dist/src/utils/auth-manager.d.ts +2 -0
  136. package/dist/src/utils/auth-manager.d.ts.map +1 -0
  137. package/dist/src/utils/auth-manager.js +25 -0
  138. package/dist/src/utils/auth-manager.js.map +1 -0
  139. package/dist/src/utils/cleanup-manager.d.ts +133 -0
  140. package/dist/src/utils/cleanup-manager.d.ts.map +1 -0
  141. package/dist/src/utils/cleanup-manager.js +673 -0
  142. package/dist/src/utils/cleanup-manager.js.map +1 -0
  143. package/dist/src/utils/cli-handler.d.ts +16 -0
  144. package/dist/src/utils/cli-handler.d.ts.map +1 -0
  145. package/dist/src/utils/cli-handler.js +102 -0
  146. package/dist/src/utils/cli-handler.js.map +1 -0
  147. package/dist/src/utils/logger.d.ts +61 -0
  148. package/dist/src/utils/logger.d.ts.map +1 -0
  149. package/dist/src/utils/logger.js +92 -0
  150. package/dist/src/utils/logger.js.map +1 -0
  151. package/dist/src/utils/page-utils.d.ts +54 -0
  152. package/dist/src/utils/page-utils.d.ts.map +1 -0
  153. package/dist/src/utils/page-utils.js +381 -0
  154. package/dist/src/utils/page-utils.js.map +1 -0
  155. package/dist/src/utils/rate-limit-handler.d.ts +42 -0
  156. package/dist/src/utils/rate-limit-handler.d.ts.map +1 -0
  157. package/dist/src/utils/rate-limit-handler.js +88 -0
  158. package/dist/src/utils/rate-limit-handler.js.map +1 -0
  159. package/dist/src/utils/rate-limit-handler.test.d.ts +7 -0
  160. package/dist/src/utils/rate-limit-handler.test.d.ts.map +1 -0
  161. package/dist/src/utils/rate-limit-handler.test.js +86 -0
  162. package/dist/src/utils/rate-limit-handler.test.js.map +1 -0
  163. package/dist/src/utils/settings-manager.d.ts +37 -0
  164. package/dist/src/utils/settings-manager.d.ts.map +1 -0
  165. package/dist/src/utils/settings-manager.js +121 -0
  166. package/dist/src/utils/settings-manager.js.map +1 -0
  167. package/dist/src/utils/stealth-utils.d.ts +135 -0
  168. package/dist/src/utils/stealth-utils.d.ts.map +1 -0
  169. package/dist/src/utils/stealth-utils.js +396 -0
  170. package/dist/src/utils/stealth-utils.js.map +1 -0
  171. package/dist/src/utils/stealth-utils.test.d.ts +7 -0
  172. package/dist/src/utils/stealth-utils.test.d.ts.map +1 -0
  173. package/dist/src/utils/stealth-utils.test.js +72 -0
  174. package/dist/src/utils/stealth-utils.test.js.map +1 -0
  175. package/dist/tests/e2e/authenticated.spec.d.ts +2 -0
  176. package/dist/tests/e2e/authenticated.spec.d.ts.map +1 -0
  177. package/dist/tests/e2e/authenticated.spec.js +41 -0
  178. package/dist/tests/e2e/authenticated.spec.js.map +1 -0
  179. package/dist/tests/e2e/mocked.spec.d.ts +2 -0
  180. package/dist/tests/e2e/mocked.spec.d.ts.map +1 -0
  181. package/dist/tests/e2e/mocked.spec.js +32 -0
  182. package/dist/tests/e2e/mocked.spec.js.map +1 -0
  183. package/dist/tests/mocks/handlers.d.ts +4 -0
  184. package/dist/tests/mocks/handlers.d.ts.map +1 -0
  185. package/dist/tests/mocks/handlers.js +55 -0
  186. package/dist/tests/mocks/handlers.js.map +1 -0
  187. package/dist/tests/mocks/setup.d.ts +3 -0
  188. package/dist/tests/mocks/setup.d.ts.map +1 -0
  189. package/dist/tests/mocks/setup.js +77 -0
  190. package/dist/tests/mocks/setup.js.map +1 -0
  191. package/dist/tools/definitions/ask-question.d.ts +8 -0
  192. package/dist/tools/definitions/ask-question.d.ts.map +1 -0
  193. package/dist/tools/definitions/ask-question.js +211 -0
  194. package/dist/tools/definitions/ask-question.js.map +1 -0
  195. package/dist/tools/definitions/notebook-management.d.ts +3 -0
  196. package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
  197. package/dist/tools/definitions/notebook-management.js +243 -0
  198. package/dist/tools/definitions/notebook-management.js.map +1 -0
  199. package/dist/tools/definitions/session-management.d.ts +3 -0
  200. package/dist/tools/definitions/session-management.d.ts.map +1 -0
  201. package/dist/tools/definitions/session-management.js +41 -0
  202. package/dist/tools/definitions/session-management.js.map +1 -0
  203. package/dist/tools/definitions/system.d.ts +3 -0
  204. package/dist/tools/definitions/system.d.ts.map +1 -0
  205. package/dist/tools/definitions/system.js +143 -0
  206. package/dist/tools/definitions/system.js.map +1 -0
  207. package/dist/tools/definitions.d.ts +12 -0
  208. package/dist/tools/definitions.d.ts.map +1 -0
  209. package/dist/tools/definitions.js +26 -0
  210. package/dist/tools/definitions.js.map +1 -0
  211. package/dist/tools/handlers.d.ts +212 -0
  212. package/dist/tools/handlers.d.ts.map +1 -0
  213. package/dist/tools/handlers.js +712 -0
  214. package/dist/tools/handlers.js.map +1 -0
  215. package/dist/tools/index.d.ts +8 -0
  216. package/dist/tools/index.d.ts.map +1 -0
  217. package/dist/tools/index.js +8 -0
  218. package/dist/tools/index.js.map +1 -0
  219. package/dist/types.d.ts +82 -0
  220. package/dist/types.d.ts.map +1 -0
  221. package/dist/types.js +5 -0
  222. package/dist/types.js.map +1 -0
  223. package/dist/utils/cleanup-manager.d.ts +133 -0
  224. package/dist/utils/cleanup-manager.d.ts.map +1 -0
  225. package/dist/utils/cleanup-manager.js +673 -0
  226. package/dist/utils/cleanup-manager.js.map +1 -0
  227. package/dist/utils/cli-handler.d.ts +16 -0
  228. package/dist/utils/cli-handler.d.ts.map +1 -0
  229. package/dist/utils/cli-handler.js +102 -0
  230. package/dist/utils/cli-handler.js.map +1 -0
  231. package/dist/utils/logger.d.ts +61 -0
  232. package/dist/utils/logger.d.ts.map +1 -0
  233. package/dist/utils/logger.js +92 -0
  234. package/dist/utils/logger.js.map +1 -0
  235. package/dist/utils/page-utils.d.ts +54 -0
  236. package/dist/utils/page-utils.d.ts.map +1 -0
  237. package/dist/utils/page-utils.js +381 -0
  238. package/dist/utils/page-utils.js.map +1 -0
  239. package/dist/utils/rate-limit-handler.d.ts +42 -0
  240. package/dist/utils/rate-limit-handler.d.ts.map +1 -0
  241. package/dist/utils/rate-limit-handler.js +88 -0
  242. package/dist/utils/rate-limit-handler.js.map +1 -0
  243. package/dist/utils/rate-limit-handler.test.d.ts +7 -0
  244. package/dist/utils/rate-limit-handler.test.d.ts.map +1 -0
  245. package/dist/utils/rate-limit-handler.test.js +91 -0
  246. package/dist/utils/rate-limit-handler.test.js.map +1 -0
  247. package/dist/utils/settings-manager.d.ts +37 -0
  248. package/dist/utils/settings-manager.d.ts.map +1 -0
  249. package/dist/utils/settings-manager.js +121 -0
  250. package/dist/utils/settings-manager.js.map +1 -0
  251. package/dist/utils/stealth-utils.d.ts +135 -0
  252. package/dist/utils/stealth-utils.d.ts.map +1 -0
  253. package/dist/utils/stealth-utils.js +396 -0
  254. package/dist/utils/stealth-utils.js.map +1 -0
  255. package/dist/utils/stealth-utils.test.d.ts +7 -0
  256. package/dist/utils/stealth-utils.test.d.ts.map +1 -0
  257. package/dist/utils/stealth-utils.test.js +72 -0
  258. package/dist/utils/stealth-utils.test.js.map +1 -0
  259. package/docs/01_configuration.md +94 -0
  260. package/docs/02_tools.md +34 -0
  261. package/docs/03_troubleshooting.md +59 -0
  262. package/docs/04_usage-guide.md +245 -0
  263. package/docs/05_project-analysis.qmd +309 -0
  264. package/docs/06_integration-analysis.html +914 -0
  265. package/docs/06_integration-analysis.qmd +255 -0
  266. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-4f0954b6b0dd6bf39f4bb9151ba984db.min.css +12 -0
  267. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  268. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  269. package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap.min.js +7 -0
  270. package/docs/06_integration-analysis_files/libs/clipboard/clipboard.min.js +7 -0
  271. package/docs/06_integration-analysis_files/libs/quarto-html/anchor.min.js +9 -0
  272. package/docs/06_integration-analysis_files/libs/quarto-html/axe/axe-check.js +145 -0
  273. package/docs/06_integration-analysis_files/libs/quarto-html/popper.min.js +6 -0
  274. package/docs/06_integration-analysis_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  275. package/docs/06_integration-analysis_files/libs/quarto-html/quarto.js +847 -0
  276. package/docs/06_integration-analysis_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  277. package/docs/06_integration-analysis_files/libs/quarto-html/tippy.css +1 -0
  278. package/docs/06_integration-analysis_files/libs/quarto-html/tippy.umd.min.js +2 -0
  279. package/docs/07_e2e-testing-safety.qmd +754 -0
  280. package/docs/08_project-re-evaluation.html +609 -0
  281. package/docs/08_project-re-evaluation.qmd +86 -0
  282. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-4f0954b6b0dd6bf39f4bb9151ba984db.min.css +12 -0
  283. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  284. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  285. package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap.min.js +7 -0
  286. package/docs/08_project-re-evaluation_files/libs/clipboard/clipboard.min.js +7 -0
  287. package/docs/08_project-re-evaluation_files/libs/quarto-html/anchor.min.js +9 -0
  288. package/docs/08_project-re-evaluation_files/libs/quarto-html/axe/axe-check.js +145 -0
  289. package/docs/08_project-re-evaluation_files/libs/quarto-html/popper.min.js +6 -0
  290. package/docs/08_project-re-evaluation_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  291. package/docs/08_project-re-evaluation_files/libs/quarto-html/quarto.js +847 -0
  292. package/docs/08_project-re-evaluation_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  293. package/docs/08_project-re-evaluation_files/libs/quarto-html/tippy.css +1 -0
  294. package/docs/08_project-re-evaluation_files/libs/quarto-html/tippy.umd.min.js +2 -0
  295. package/docs/notebooklm-mcp-usage.html +704 -0
  296. package/docs/notebooklm-mcp-usage.qmd +119 -0
  297. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-6b71f2156b6a5230c6677325978bcf08.min.css +12 -0
  298. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  299. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  300. package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap.min.js +7 -0
  301. package/docs/notebooklm-mcp-usage_files/libs/clipboard/clipboard.min.js +7 -0
  302. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/anchor.min.js +9 -0
  303. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/axe/axe-check.js +145 -0
  304. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/popper.min.js +6 -0
  305. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  306. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/quarto.js +847 -0
  307. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  308. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tippy.css +1 -0
  309. package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tippy.umd.min.js +2 -0
  310. package/docs/repomix-usage_files/libs/bootstrap/bootstrap-6b71f2156b6a5230c6677325978bcf08.min.css +12 -0
  311. package/docs/repomix-usage_files/libs/bootstrap/bootstrap-icons.css +2106 -0
  312. package/docs/repomix-usage_files/libs/bootstrap/bootstrap-icons.woff +0 -0
  313. package/docs/repomix-usage_files/libs/bootstrap/bootstrap.min.js +7 -0
  314. package/docs/repomix-usage_files/libs/clipboard/clipboard.min.js +7 -0
  315. package/docs/repomix-usage_files/libs/quarto-html/anchor.min.js +9 -0
  316. package/docs/repomix-usage_files/libs/quarto-html/axe/axe-check.js +145 -0
  317. package/docs/repomix-usage_files/libs/quarto-html/popper.min.js +6 -0
  318. package/docs/repomix-usage_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
  319. package/docs/repomix-usage_files/libs/quarto-html/quarto.js +847 -0
  320. package/docs/repomix-usage_files/libs/quarto-html/tabsets/tabsets.js +95 -0
  321. package/docs/repomix-usage_files/libs/quarto-html/tippy.css +1 -0
  322. package/docs/repomix-usage_files/libs/quarto-html/tippy.umd.min.js +2 -0
  323. package/package.json +62 -0
@@ -0,0 +1,642 @@
1
+ /**
2
+ * Browser Session
3
+ *
4
+ * Represents a single browser session for NotebookLM interactions.
5
+ *
6
+ * Features:
7
+ * - Human-like question typing
8
+ * - Streaming response detection
9
+ * - Auto-login on session expiry
10
+ * - Session activity tracking
11
+ * - Chat history reset
12
+ *
13
+ * Based on the Python implementation from browser_session.py
14
+ */
15
+ import { humanType, randomDelay } from "../utils/stealth-utils.js";
16
+ import { waitForLatestAnswer, snapshotAllResponses, } from "../utils/page-utils.js";
17
+ import { CONFIG } from "../config.js";
18
+ import { log } from "../utils/logger.js";
19
+ import { RateLimitError } from "../errors.js";
20
+ import { RateLimitHandler } from "../utils/rate-limit-handler.js";
21
+ import { CHAT_INPUT_SELECTORS } from "../constants.js";
22
+ export class BrowserSession {
23
+ sessionId;
24
+ notebookUrl;
25
+ createdAt;
26
+ lastActivity;
27
+ messageCount;
28
+ context;
29
+ sharedContextManager;
30
+ authManager;
31
+ page = null;
32
+ initialized = false;
33
+ constructor(sessionId, sharedContextManager, authManager, notebookUrl) {
34
+ this.sessionId = sessionId;
35
+ this.sharedContextManager = sharedContextManager;
36
+ this.authManager = authManager;
37
+ this.notebookUrl = notebookUrl;
38
+ this.createdAt = Date.now();
39
+ this.lastActivity = Date.now();
40
+ this.messageCount = 0;
41
+ log.info(`🆕 BrowserSession ${sessionId} created`);
42
+ }
43
+ /**
44
+ * Initialize the session by creating a page and navigating to the notebook
45
+ */
46
+ async init() {
47
+ if (this.initialized) {
48
+ log.warning(`⚠️ Session ${this.sessionId} already initialized`);
49
+ return;
50
+ }
51
+ log.info(`🚀 Initializing session ${this.sessionId}...`);
52
+ try {
53
+ // Ensure a valid shared context
54
+ this.context = await this.sharedContextManager.getOrCreateContext();
55
+ // Create new page (tab) in the shared context (with auto-recovery)
56
+ try {
57
+ this.page = await this.context.newPage();
58
+ }
59
+ catch (e) {
60
+ const error = e;
61
+ const msg = String(error?.message || e);
62
+ if (/has been closed|Target .* closed|Browser has been closed|Context .* closed/i.test(msg)) {
63
+ log.warning(" ♻️ Context was closed. Recreating and retrying newPage...");
64
+ this.context = await this.sharedContextManager.getOrCreateContext();
65
+ this.page = await this.context.newPage();
66
+ }
67
+ else {
68
+ throw e;
69
+ }
70
+ }
71
+ log.success(` ✅ Created new page`);
72
+ // Navigate to notebook
73
+ log.info(` 🌐 Navigating to: ${this.notebookUrl}`);
74
+ await this.page.goto(this.notebookUrl, {
75
+ waitUntil: "domcontentloaded",
76
+ timeout: CONFIG.browserTimeout,
77
+ });
78
+ // Wait for page to stabilize
79
+ await randomDelay(2000, 3000);
80
+ // Check if we need to login
81
+ const isAuthenticated = await this.authManager.validateCookiesExpiry(this.context);
82
+ if (!isAuthenticated) {
83
+ log.warning(` 🔑 Session ${this.sessionId} needs authentication`);
84
+ const loginSuccess = await this.ensureAuthenticated();
85
+ if (!loginSuccess) {
86
+ throw new Error("Failed to authenticate session");
87
+ }
88
+ }
89
+ else {
90
+ log.success(` ✅ Session already authenticated`);
91
+ }
92
+ // CRITICAL: Restore sessionStorage from saved state
93
+ // This is essential for maintaining Google session state!
94
+ log.info(` 🔄 Restoring sessionStorage...`);
95
+ const sessionData = await this.authManager.loadSessionStorage();
96
+ if (sessionData) {
97
+ const entryCount = Object.keys(sessionData).length;
98
+ if (entryCount > 0) {
99
+ await this.restoreSessionStorage(sessionData, entryCount);
100
+ }
101
+ else {
102
+ log.info(` ℹ️ SessionStorage empty (fresh session)`);
103
+ }
104
+ }
105
+ else {
106
+ log.info(` ℹ️ No saved sessionStorage found (fresh session)`);
107
+ }
108
+ // Wait for NotebookLM interface to load
109
+ log.info(` ⏳ Waiting for NotebookLM interface...`);
110
+ await this.waitForNotebookLMReady();
111
+ this.initialized = true;
112
+ this.updateActivity();
113
+ log.success(`✅ Session ${this.sessionId} initialized successfully`);
114
+ }
115
+ catch (error) {
116
+ log.error(`❌ Failed to initialize session ${this.sessionId}: ${error}`);
117
+ if (this.page) {
118
+ await this.page.close();
119
+ this.page = null;
120
+ }
121
+ throw error;
122
+ }
123
+ }
124
+ /**
125
+ * Wait for NotebookLM interface to be ready
126
+ *
127
+ * IMPORTANT: Matches Python implementation EXACTLY!
128
+ * - Uses SPECIFIC selectors (textarea.query-box-input)
129
+ * - Checks ONLY for "visible" state (NOT disabled!)
130
+ * - NO placeholder checks (let NotebookLM handle that!)
131
+ *
132
+ * Based on Python _wait_for_ready() from browser_session.py:104-113
133
+ */
134
+ async waitForNotebookLMReady() {
135
+ if (!this.page) {
136
+ throw new Error("Page not initialized");
137
+ }
138
+ // Use centralized chat input selectors from constants
139
+ const [primarySelector, ...fallbackSelectors] = CHAT_INPUT_SELECTORS;
140
+ try {
141
+ // PRIMARY: Class-based selector (most reliable)
142
+ log.info(` ⏳ Waiting for chat input (${primarySelector})...`);
143
+ await this.page.waitForSelector(primarySelector, {
144
+ timeout: 10000, // Python uses 10s timeout
145
+ state: "visible", // ONLY check visibility (NO disabled check!)
146
+ });
147
+ log.success(" ✅ Chat input ready!");
148
+ }
149
+ catch {
150
+ // FALLBACK: Multi-language aria-label selectors from constants
151
+ let found = false;
152
+ for (const selector of fallbackSelectors) {
153
+ try {
154
+ log.info(` ⏳ Trying fallback selector: ${selector}...`);
155
+ await this.page.waitForSelector(selector, {
156
+ timeout: 2000, // Quick check per language
157
+ state: "visible",
158
+ });
159
+ log.success(" ✅ Chat input ready (fallback)!");
160
+ found = true;
161
+ break;
162
+ }
163
+ catch {
164
+ continue;
165
+ }
166
+ }
167
+ if (!found) {
168
+ log.error(` ❌ NotebookLM interface not ready - no matching selector found`);
169
+ throw new Error("Could not find NotebookLM chat input. " +
170
+ "Please ensure the notebook page has loaded correctly.");
171
+ }
172
+ }
173
+ }
174
+ isPageClosedSafe() {
175
+ if (!this.page)
176
+ return true;
177
+ const p = this.page;
178
+ try {
179
+ if (typeof p.isClosed === 'function') {
180
+ if (p.isClosed())
181
+ return true;
182
+ }
183
+ // Accessing URL should be safe; if page is gone, this may throw
184
+ this.page.url();
185
+ return false;
186
+ }
187
+ catch {
188
+ return true;
189
+ }
190
+ }
191
+ /**
192
+ * Ensure the session is authenticated, perform auto-login if needed
193
+ */
194
+ async ensureAuthenticated() {
195
+ if (!this.page) {
196
+ throw new Error("Page not initialized");
197
+ }
198
+ log.info(`🔑 Checking authentication for session ${this.sessionId}...`);
199
+ // Check cookie validity
200
+ const isValid = await this.authManager.validateCookiesExpiry(this.context);
201
+ if (isValid) {
202
+ log.success(` ✅ Cookies valid`);
203
+ return true;
204
+ }
205
+ log.warning(` ⚠️ Cookies expired or invalid`);
206
+ // Try to get valid auth state
207
+ const statePath = await this.authManager.getValidStatePath();
208
+ if (statePath) {
209
+ // Load saved state
210
+ log.info(` 📂 Loading auth state from: ${statePath}`);
211
+ await this.authManager.loadAuthState(this.context, statePath);
212
+ // Reload page to apply new auth
213
+ log.info(` 🔄 Reloading page...`);
214
+ await this.page.reload({ waitUntil: "domcontentloaded" });
215
+ await randomDelay(2000, 3000);
216
+ // Check if it worked
217
+ const nowValid = await this.authManager.validateCookiesExpiry(this.context);
218
+ if (nowValid) {
219
+ log.success(` ✅ Auth state loaded successfully`);
220
+ return true;
221
+ }
222
+ }
223
+ // Need fresh login
224
+ log.warning(` 🔑 Fresh login required`);
225
+ if (CONFIG.autoLoginEnabled) {
226
+ log.info(` 🤖 Attempting auto-login...`);
227
+ const loginSuccess = await this.authManager.loginWithCredentials(this.context, this.page, CONFIG.loginEmail, CONFIG.loginPassword);
228
+ if (loginSuccess) {
229
+ log.success(` ✅ Auto-login successful`);
230
+ // Navigate back to notebook
231
+ await this.page.goto(this.notebookUrl, {
232
+ waitUntil: "domcontentloaded",
233
+ });
234
+ await randomDelay(2000, 3000);
235
+ return true;
236
+ }
237
+ else {
238
+ log.error(` ❌ Auto-login failed`);
239
+ return false;
240
+ }
241
+ }
242
+ else {
243
+ log.error(` ❌ Auto-login disabled and no valid auth state - manual login required`);
244
+ return false;
245
+ }
246
+ }
247
+ getOriginFromUrl(url) {
248
+ try {
249
+ return new URL(url).origin;
250
+ }
251
+ catch {
252
+ return null;
253
+ }
254
+ }
255
+ /**
256
+ * Safely restore sessionStorage when the page is on the expected origin
257
+ */
258
+ async restoreSessionStorage(sessionData, entryCount) {
259
+ if (!this.page) {
260
+ log.warning(` ⚠️ Cannot restore sessionStorage without an active page`);
261
+ return;
262
+ }
263
+ const targetOrigin = this.getOriginFromUrl(this.notebookUrl);
264
+ if (!targetOrigin) {
265
+ log.warning(` ⚠️ Unable to determine target origin for sessionStorage restore`);
266
+ return;
267
+ }
268
+ let restored = false;
269
+ const applyToPage = async () => {
270
+ if (!this.page) {
271
+ return false;
272
+ }
273
+ const currentOrigin = this.getOriginFromUrl(this.page.url());
274
+ if (currentOrigin !== targetOrigin) {
275
+ return false;
276
+ }
277
+ try {
278
+ await this.page.evaluate((data) => {
279
+ for (const [key, value] of Object.entries(data)) {
280
+ sessionStorage.setItem(key, value);
281
+ }
282
+ }, sessionData);
283
+ restored = true;
284
+ log.success(` ✅ SessionStorage restored: ${entryCount} entries`);
285
+ return true;
286
+ }
287
+ catch (error) {
288
+ log.warning(` ⚠️ Failed to restore sessionStorage: ${error}`);
289
+ return false;
290
+ }
291
+ };
292
+ if (await applyToPage()) {
293
+ return;
294
+ }
295
+ log.info(` ⏳ Waiting for NotebookLM origin before restoring sessionStorage...`);
296
+ const handleNavigation = async () => {
297
+ if (restored) {
298
+ return;
299
+ }
300
+ if (await applyToPage()) {
301
+ this.page?.off("framenavigated", handleNavigation);
302
+ }
303
+ };
304
+ this.page.on("framenavigated", handleNavigation);
305
+ }
306
+ /**
307
+ * Ask a question to NotebookLM
308
+ */
309
+ async ask(question, sendProgress) {
310
+ const askOnce = async () => {
311
+ if (!this.initialized || !this.page || this.isPageClosedSafe()) {
312
+ log.warning(` ℹ️ Session not initialized or page missing → re-initializing...`);
313
+ await this.init();
314
+ }
315
+ log.info(`💬 [${this.sessionId}] Asking: "${question.substring(0, 100)}..."`);
316
+ const page = this.page;
317
+ // Ensure we're still authenticated
318
+ await sendProgress?.("Verifying authentication...", 2, 5);
319
+ const isAuth = await this.authManager.validateCookiesExpiry(this.context);
320
+ if (!isAuth) {
321
+ log.warning(` 🔑 Session expired, re-authenticating...`);
322
+ await sendProgress?.("Re-authenticating session...", 2, 5);
323
+ const reAuthSuccess = await this.ensureAuthenticated();
324
+ if (!reAuthSuccess) {
325
+ throw new Error("Failed to re-authenticate session");
326
+ }
327
+ }
328
+ // Snapshot existing responses BEFORE asking
329
+ log.info(` 📸 Snapshotting existing responses...`);
330
+ const existingResponses = await snapshotAllResponses(page);
331
+ log.success(` ✅ Captured ${existingResponses.length} existing responses`);
332
+ // Find the chat input
333
+ const inputSelector = await this.findChatInput();
334
+ if (!inputSelector) {
335
+ throw new Error("Could not find visible chat input element. " +
336
+ "Please check if the notebook page has loaded correctly.");
337
+ }
338
+ log.info(` ⌨️ Typing question with human-like behavior...`);
339
+ await sendProgress?.("Typing question with human-like behavior...", 2, 5);
340
+ await humanType(page, inputSelector, question, {
341
+ withTypos: true,
342
+ wpm: Math.max(CONFIG.typingWpmMin, CONFIG.typingWpmMax),
343
+ });
344
+ // Small pause before submitting
345
+ await randomDelay(500, 1000);
346
+ // Submit the question (Enter key)
347
+ log.info(` 📤 Submitting question...`);
348
+ await sendProgress?.("Submitting question...", 3, 5);
349
+ await page.keyboard.press("Enter");
350
+ // Small pause after submit
351
+ await randomDelay(1000, 1500);
352
+ // Wait for the response with streaming detection
353
+ log.info(` ⏳ Waiting for response (with streaming detection)...`);
354
+ await sendProgress?.("Waiting for NotebookLM response (streaming detection active)...", 3, 5);
355
+ const answer = await waitForLatestAnswer(page, {
356
+ question,
357
+ timeoutMs: 120000, // 2 minutes
358
+ pollIntervalMs: 1000,
359
+ ignoreTexts: existingResponses,
360
+ debug: false,
361
+ });
362
+ if (!answer) {
363
+ throw new Error("Timeout waiting for response from NotebookLM");
364
+ }
365
+ // Check for rate limit errors AFTER receiving answer
366
+ log.info(` 🔍 Checking for rate limit errors...`);
367
+ if (await this.detectRateLimitError()) {
368
+ throw new RateLimitError("NotebookLM rate limit reached (50 queries/day for free accounts)");
369
+ }
370
+ // Update session stats
371
+ this.messageCount++;
372
+ this.updateActivity();
373
+ log.success(`✅ [${this.sessionId}] Received answer (${answer.length} chars, ${this.messageCount} total messages)`);
374
+ return answer;
375
+ };
376
+ const handler = new RateLimitHandler();
377
+ const askWithRetry = () => handler.executeWithRetry(askOnce);
378
+ try {
379
+ return await askWithRetry();
380
+ }
381
+ catch (error) {
382
+ const err = error;
383
+ const msg = String(err?.message || error);
384
+ if (/has been closed|Target .* closed|Browser has been closed|Context .* closed/i.test(msg)) {
385
+ log.warning(` ♻️ Detected closed page/context. Recovering session and retrying ask...`);
386
+ try {
387
+ this.initialized = false;
388
+ if (this.page) {
389
+ try {
390
+ await this.page.close();
391
+ }
392
+ catch { }
393
+ }
394
+ this.page = null;
395
+ await this.init();
396
+ return await askWithRetry();
397
+ }
398
+ catch (e2) {
399
+ log.error(`❌ Recovery failed: ${e2}`);
400
+ throw e2;
401
+ }
402
+ }
403
+ log.error(`❌ [${this.sessionId}] Failed to ask question: ${msg}`);
404
+ throw error;
405
+ }
406
+ }
407
+ /**
408
+ * Find the chat input element
409
+ *
410
+ * IMPORTANT: Matches Python implementation EXACTLY!
411
+ * - Uses SPECIFIC selectors from Python
412
+ * - Checks ONLY visibility (NOT disabled state!)
413
+ *
414
+ * Based on Python ask() method from browser_session.py:166-171
415
+ */
416
+ async findChatInput() {
417
+ if (!this.page) {
418
+ return null;
419
+ }
420
+ // Use selectors in order of preference (with multi-language support)
421
+ const selectors = [
422
+ "textarea.query-box-input", // PRIMARY: class-based selector
423
+ 'textarea[aria-label="Enter your question"]', // English
424
+ 'textarea[aria-label="Feld für Anfragen"]', // German
425
+ 'textarea[aria-label="質問を入力"]', // Japanese
426
+ 'textarea[aria-label="질문 입력"]', // Korean
427
+ 'textarea[aria-label="Entrez votre question"]', // French
428
+ 'textarea[aria-label="Ingresa tu pregunta"]', // Spanish
429
+ ];
430
+ for (const selector of selectors) {
431
+ try {
432
+ const element = await this.page.$(selector);
433
+ if (element) {
434
+ const isVisible = await element.isVisible();
435
+ if (isVisible) {
436
+ // NO disabled check! Just like Python!
437
+ log.success(` ✅ Found chat input: ${selector}`);
438
+ return selector;
439
+ }
440
+ }
441
+ }
442
+ catch {
443
+ continue;
444
+ }
445
+ }
446
+ log.error(` ❌ Could not find visible chat input`);
447
+ return null;
448
+ }
449
+ /**
450
+ * Detect if a rate limit error occurred
451
+ *
452
+ * Searches the page for error messages indicating rate limit/quota exhaustion.
453
+ * Free NotebookLM accounts have 50 queries/day limit.
454
+ *
455
+ * @returns true if rate limit error detected, false otherwise
456
+ */
457
+ async detectRateLimitError() {
458
+ if (!this.page) {
459
+ return false;
460
+ }
461
+ // Error message selectors (common patterns for error containers)
462
+ const errorSelectors = [
463
+ ".error-message",
464
+ ".error-container",
465
+ "[role='alert']",
466
+ ".rate-limit-message",
467
+ "[data-error]",
468
+ ".notification-error",
469
+ ".alert-error",
470
+ ".toast-error",
471
+ ];
472
+ // Keywords that indicate rate limiting
473
+ const keywords = [
474
+ "rate limit",
475
+ "limit exceeded",
476
+ "quota exhausted",
477
+ "daily limit",
478
+ "limit reached",
479
+ "too many requests",
480
+ "ratenlimit",
481
+ "quota",
482
+ "query limit",
483
+ "request limit",
484
+ ];
485
+ // Check error containers for rate limit messages
486
+ for (const selector of errorSelectors) {
487
+ try {
488
+ const elements = await this.page.$$(selector);
489
+ for (const el of elements) {
490
+ try {
491
+ const text = await el.innerText();
492
+ const lower = text.toLowerCase();
493
+ if (keywords.some((k) => lower.includes(k))) {
494
+ log.error(`🚫 Rate limit detected: ${text.slice(0, 100)}`);
495
+ return true;
496
+ }
497
+ }
498
+ catch {
499
+ continue;
500
+ }
501
+ }
502
+ }
503
+ catch {
504
+ continue;
505
+ }
506
+ }
507
+ // Also check if chat input is disabled (sometimes NotebookLM disables input when rate limited)
508
+ try {
509
+ const inputSelector = "textarea.query-box-input";
510
+ const input = await this.page.$(inputSelector);
511
+ if (input) {
512
+ const isDisabled = await input.evaluate((el) => {
513
+ return el.disabled || el.hasAttribute("disabled");
514
+ });
515
+ if (isDisabled) {
516
+ // Check if there's an error message near the input
517
+ const parent = await input.evaluateHandle((el) => el.parentElement);
518
+ const parentEl = parent.asElement();
519
+ if (parentEl) {
520
+ try {
521
+ const parentText = await parentEl.innerText();
522
+ const lower = parentText.toLowerCase();
523
+ if (keywords.some((k) => lower.includes(k))) {
524
+ log.error(`🚫 Rate limit detected: Chat input disabled with error message`);
525
+ return true;
526
+ }
527
+ }
528
+ catch {
529
+ // Ignore
530
+ }
531
+ }
532
+ }
533
+ }
534
+ }
535
+ catch {
536
+ // Ignore errors checking input state
537
+ }
538
+ return false;
539
+ }
540
+ /**
541
+ * Reset the chat history (start a new conversation)
542
+ */
543
+ async reset() {
544
+ const resetOnce = async () => {
545
+ if (!this.initialized || !this.page || this.isPageClosedSafe()) {
546
+ await this.init();
547
+ }
548
+ log.info(`🔄 [${this.sessionId}] Resetting chat history...`);
549
+ // Reload the page to clear chat history
550
+ await this.page.reload({ waitUntil: "domcontentloaded" });
551
+ await randomDelay(2000, 3000);
552
+ // Wait for interface to be ready again
553
+ await this.waitForNotebookLMReady();
554
+ // Reset message count
555
+ this.messageCount = 0;
556
+ this.updateActivity();
557
+ log.success(`✅ [${this.sessionId}] Chat history reset`);
558
+ };
559
+ try {
560
+ await resetOnce();
561
+ }
562
+ catch (error) {
563
+ const err = error;
564
+ const msg = String(err?.message || error);
565
+ if (/has been closed|Target .* closed|Browser has been closed|Context .* closed/i.test(msg)) {
566
+ log.warning(` ♻️ Detected closed page/context during reset. Recovering and retrying...`);
567
+ this.initialized = false;
568
+ if (this.page) {
569
+ try {
570
+ await this.page.close();
571
+ }
572
+ catch { }
573
+ }
574
+ this.page = null;
575
+ await this.init();
576
+ await resetOnce();
577
+ return;
578
+ }
579
+ log.error(`❌ [${this.sessionId}] Failed to reset: ${msg}`);
580
+ throw error;
581
+ }
582
+ }
583
+ /**
584
+ * Close the session
585
+ */
586
+ async close() {
587
+ log.info(`🛑 Closing session ${this.sessionId}...`);
588
+ if (this.page) {
589
+ try {
590
+ await this.page.close();
591
+ this.page = null;
592
+ log.success(` ✅ Page closed`);
593
+ }
594
+ catch (error) {
595
+ log.warning(` ⚠️ Error closing page: ${error}`);
596
+ }
597
+ }
598
+ this.initialized = false;
599
+ log.success(`✅ Session ${this.sessionId} closed`);
600
+ }
601
+ /**
602
+ * Update last activity timestamp
603
+ */
604
+ updateActivity() {
605
+ this.lastActivity = Date.now();
606
+ }
607
+ /**
608
+ * Check if session has expired (inactive for too long)
609
+ */
610
+ isExpired(timeoutSeconds) {
611
+ const inactiveSeconds = (Date.now() - this.lastActivity) / 1000;
612
+ return inactiveSeconds > timeoutSeconds;
613
+ }
614
+ /**
615
+ * Get session information
616
+ */
617
+ getInfo() {
618
+ const now = Date.now();
619
+ return {
620
+ id: this.sessionId,
621
+ created_at: this.createdAt,
622
+ last_activity: this.lastActivity,
623
+ age_seconds: (now - this.createdAt) / 1000,
624
+ inactive_seconds: (now - this.lastActivity) / 1000,
625
+ message_count: this.messageCount,
626
+ notebook_url: this.notebookUrl,
627
+ };
628
+ }
629
+ /**
630
+ * Get the underlying page (for advanced operations)
631
+ */
632
+ getPage() {
633
+ return this.page;
634
+ }
635
+ /**
636
+ * Check if session is initialized
637
+ */
638
+ isInitialized() {
639
+ return this.initialized && this.page !== null;
640
+ }
641
+ }
642
+ //# sourceMappingURL=browser-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../../src/session/browser-session.ts"],"names":[],"mappings":"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"}