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,712 @@
1
+ /**
2
+ * MCP Tool Handlers
3
+ *
4
+ * Implements the logic for all MCP tools.
5
+ */
6
+ import { CONFIG, applyBrowserOptions } from "../config.js";
7
+ import { log } from "../utils/logger.js";
8
+ import { RateLimitError } from "../errors.js";
9
+ import { CleanupManager } from "../utils/cleanup-manager.js";
10
+ const FOLLOW_UP_REMINDER = "\n\nEXTREMELY IMPORTANT: Is that ALL you need to know? You can always ask another question using the same session ID! Think about it carefully: before you reply to the user, review their original request and this answer. If anything is still unclear or missing, ask me another question first.";
11
+ /**
12
+ * MCP Tool Handlers
13
+ */
14
+ export class ToolHandlers {
15
+ sessionManager;
16
+ authManager;
17
+ library;
18
+ constructor(sessionManager, authManager, library) {
19
+ this.sessionManager = sessionManager;
20
+ this.authManager = authManager;
21
+ this.library = library;
22
+ }
23
+ /**
24
+ * Handle ask_question tool
25
+ */
26
+ async handleAskQuestion(args, sendProgress) {
27
+ const { question, session_id, notebook_id, notebook_url, show_browser, browser_options } = args;
28
+ log.info(`๐Ÿ”ง [TOOL] ask_question called`);
29
+ log.info(` Question: "${question.substring(0, 100)}"...`);
30
+ if (session_id) {
31
+ log.info(` Session ID: ${session_id}`);
32
+ }
33
+ if (notebook_id) {
34
+ log.info(` Notebook ID: ${notebook_id}`);
35
+ }
36
+ if (notebook_url) {
37
+ log.info(` Notebook URL: ${notebook_url}`);
38
+ }
39
+ try {
40
+ // Resolve notebook URL
41
+ let resolvedNotebookUrl = notebook_url;
42
+ if (!resolvedNotebookUrl && notebook_id) {
43
+ const notebook = this.library.incrementUseCount(notebook_id);
44
+ if (!notebook) {
45
+ throw new Error(`Notebook not found in library: ${notebook_id}`);
46
+ }
47
+ resolvedNotebookUrl = notebook.url;
48
+ log.info(` Resolved notebook: ${notebook.name}`);
49
+ }
50
+ else if (!resolvedNotebookUrl) {
51
+ const active = this.library.getActiveNotebook();
52
+ if (active) {
53
+ const notebook = this.library.incrementUseCount(active.id);
54
+ if (!notebook) {
55
+ throw new Error(`Active notebook not found: ${active.id}`);
56
+ }
57
+ resolvedNotebookUrl = notebook.url;
58
+ log.info(` Using active notebook: ${notebook.name}`);
59
+ }
60
+ }
61
+ // Progress: Getting or creating session
62
+ await sendProgress?.("Getting or creating browser session...", 1, 5);
63
+ // Apply browser options temporarily
64
+ const originalConfig = { ...CONFIG };
65
+ const effectiveConfig = applyBrowserOptions(browser_options, show_browser);
66
+ Object.assign(CONFIG, effectiveConfig);
67
+ // Calculate overrideHeadless parameter for session manager
68
+ // show_browser takes precedence over browser_options.headless
69
+ let overrideHeadless = undefined;
70
+ if (show_browser !== undefined) {
71
+ overrideHeadless = show_browser;
72
+ }
73
+ else if (browser_options?.show !== undefined) {
74
+ overrideHeadless = browser_options.show;
75
+ }
76
+ else if (browser_options?.headless !== undefined) {
77
+ overrideHeadless = !browser_options.headless;
78
+ }
79
+ try {
80
+ // Get or create session (with headless override to handle mode changes)
81
+ const session = await this.sessionManager.getOrCreateSession(session_id, resolvedNotebookUrl, overrideHeadless);
82
+ // Progress: Asking question
83
+ await sendProgress?.("Asking question to NotebookLM...", 2, 5);
84
+ // Ask the question (pass progress callback)
85
+ const rawAnswer = await session.ask(question, sendProgress);
86
+ const answer = `${rawAnswer.trimEnd()}${FOLLOW_UP_REMINDER}`;
87
+ // Get session info
88
+ const sessionInfo = session.getInfo();
89
+ const result = {
90
+ status: "success",
91
+ question,
92
+ answer,
93
+ session_id: session.sessionId,
94
+ notebook_url: session.notebookUrl,
95
+ session_info: {
96
+ age_seconds: sessionInfo.age_seconds,
97
+ message_count: sessionInfo.message_count,
98
+ last_activity: sessionInfo.last_activity,
99
+ },
100
+ };
101
+ // Progress: Complete
102
+ await sendProgress?.("Question answered successfully!", 5, 5);
103
+ log.success(`โœ… [TOOL] ask_question completed successfully`);
104
+ return {
105
+ success: true,
106
+ data: result,
107
+ };
108
+ }
109
+ finally {
110
+ // Restore original CONFIG
111
+ Object.assign(CONFIG, originalConfig);
112
+ }
113
+ }
114
+ catch (error) {
115
+ const errorMessage = error instanceof Error ? error.message : String(error);
116
+ // Special handling for rate limit errors
117
+ if (error instanceof RateLimitError || errorMessage.toLowerCase().includes("rate limit")) {
118
+ log.error(`๐Ÿšซ [TOOL] Rate limit detected`);
119
+ return {
120
+ success: false,
121
+ error: "NotebookLM rate limit reached (50 queries/day for free accounts).\n\n" +
122
+ "You can:\n" +
123
+ "1. Use the 're_auth' tool to login with a different Google account\n" +
124
+ "2. Wait until tomorrow for the quota to reset\n" +
125
+ "3. Upgrade to Google AI Pro/Ultra for 5x higher limits\n\n" +
126
+ `Original error: ${errorMessage}`,
127
+ };
128
+ }
129
+ log.error(`โŒ [TOOL] ask_question failed: ${errorMessage}`);
130
+ return {
131
+ success: false,
132
+ error: errorMessage,
133
+ };
134
+ }
135
+ }
136
+ /**
137
+ * Handle list_sessions tool
138
+ */
139
+ async handleListSessions() {
140
+ log.info(`๐Ÿ”ง [TOOL] list_sessions called`);
141
+ try {
142
+ const stats = this.sessionManager.getStats();
143
+ const sessions = this.sessionManager.getAllSessionsInfo();
144
+ const result = {
145
+ active_sessions: stats.active_sessions,
146
+ max_sessions: stats.max_sessions,
147
+ session_timeout: stats.session_timeout,
148
+ oldest_session_seconds: stats.oldest_session_seconds,
149
+ total_messages: stats.total_messages,
150
+ sessions: sessions.map((info) => ({
151
+ id: info.id,
152
+ created_at: info.created_at,
153
+ last_activity: info.last_activity,
154
+ age_seconds: info.age_seconds,
155
+ inactive_seconds: info.inactive_seconds,
156
+ message_count: info.message_count,
157
+ notebook_url: info.notebook_url,
158
+ })),
159
+ };
160
+ log.success(`โœ… [TOOL] list_sessions completed (${result.active_sessions} sessions)`);
161
+ return {
162
+ success: true,
163
+ data: result,
164
+ };
165
+ }
166
+ catch (error) {
167
+ const errorMessage = error instanceof Error ? error.message : String(error);
168
+ log.error(`โŒ [TOOL] list_sessions failed: ${errorMessage}`);
169
+ return {
170
+ success: false,
171
+ error: errorMessage,
172
+ };
173
+ }
174
+ }
175
+ /**
176
+ * Handle close_session tool
177
+ */
178
+ async handleCloseSession(args) {
179
+ const { session_id } = args;
180
+ log.info(`๐Ÿ”ง [TOOL] close_session called`);
181
+ log.info(` Session ID: ${session_id}`);
182
+ try {
183
+ const closed = await this.sessionManager.closeSession(session_id);
184
+ if (closed) {
185
+ log.success(`โœ… [TOOL] close_session completed`);
186
+ return {
187
+ success: true,
188
+ data: {
189
+ status: "success",
190
+ message: `Session ${session_id} closed successfully`,
191
+ session_id,
192
+ },
193
+ };
194
+ }
195
+ else {
196
+ log.warning(`โš ๏ธ [TOOL] Session ${session_id} not found`);
197
+ return {
198
+ success: false,
199
+ error: `Session ${session_id} not found`,
200
+ };
201
+ }
202
+ }
203
+ catch (error) {
204
+ const errorMessage = error instanceof Error ? error.message : String(error);
205
+ log.error(`โŒ [TOOL] close_session failed: ${errorMessage}`);
206
+ return {
207
+ success: false,
208
+ error: errorMessage,
209
+ };
210
+ }
211
+ }
212
+ /**
213
+ * Handle reset_session tool
214
+ */
215
+ async handleResetSession(args) {
216
+ const { session_id } = args;
217
+ log.info(`๐Ÿ”ง [TOOL] reset_session called`);
218
+ log.info(` Session ID: ${session_id}`);
219
+ try {
220
+ const session = this.sessionManager.getSession(session_id);
221
+ if (!session) {
222
+ log.warning(`โš ๏ธ [TOOL] Session ${session_id} not found`);
223
+ return {
224
+ success: false,
225
+ error: `Session ${session_id} not found`,
226
+ };
227
+ }
228
+ await session.reset();
229
+ log.success(`โœ… [TOOL] reset_session completed`);
230
+ return {
231
+ success: true,
232
+ data: {
233
+ status: "success",
234
+ message: `Session ${session_id} reset successfully`,
235
+ session_id,
236
+ },
237
+ };
238
+ }
239
+ catch (error) {
240
+ const errorMessage = error instanceof Error ? error.message : String(error);
241
+ log.error(`โŒ [TOOL] reset_session failed: ${errorMessage}`);
242
+ return {
243
+ success: false,
244
+ error: errorMessage,
245
+ };
246
+ }
247
+ }
248
+ /**
249
+ * Handle get_health tool
250
+ */
251
+ async handleGetHealth() {
252
+ log.info(`๐Ÿ”ง [TOOL] get_health called`);
253
+ try {
254
+ // Check authentication status
255
+ const statePath = await this.authManager.getValidStatePath();
256
+ const authenticated = statePath !== null;
257
+ // Get session stats
258
+ const stats = this.sessionManager.getStats();
259
+ const result = {
260
+ status: "ok",
261
+ authenticated,
262
+ notebook_url: CONFIG.notebookUrl || "not configured",
263
+ active_sessions: stats.active_sessions,
264
+ max_sessions: stats.max_sessions,
265
+ session_timeout: stats.session_timeout,
266
+ total_messages: stats.total_messages,
267
+ headless: CONFIG.headless,
268
+ auto_login_enabled: CONFIG.autoLoginEnabled,
269
+ stealth_enabled: CONFIG.stealthEnabled,
270
+ // Add troubleshooting tip if not authenticated
271
+ ...((!authenticated) && {
272
+ troubleshooting_tip: "For fresh start with clean browser session: Close all Chrome instances โ†’ " +
273
+ "cleanup_data(confirm=true, preserve_library=true) โ†’ setup_auth"
274
+ }),
275
+ };
276
+ log.success(`โœ… [TOOL] get_health completed`);
277
+ return {
278
+ success: true,
279
+ data: result,
280
+ };
281
+ }
282
+ catch (error) {
283
+ const errorMessage = error instanceof Error ? error.message : String(error);
284
+ log.error(`โŒ [TOOL] get_health failed: ${errorMessage}`);
285
+ return {
286
+ success: false,
287
+ error: errorMessage,
288
+ };
289
+ }
290
+ }
291
+ /**
292
+ * Handle setup_auth tool
293
+ *
294
+ * Opens a browser window for manual login with live progress updates.
295
+ * The operation waits synchronously for login completion (up to 10 minutes).
296
+ */
297
+ async handleSetupAuth(args, sendProgress) {
298
+ const { show_browser, browser_options } = args;
299
+ // CRITICAL: Send immediate progress to reset timeout from the very start
300
+ await sendProgress?.("Initializing authentication setup...", 0, 10);
301
+ log.info(`๐Ÿ”ง [TOOL] setup_auth called`);
302
+ if (show_browser !== undefined) {
303
+ log.info(` Show browser: ${show_browser}`);
304
+ }
305
+ const startTime = Date.now();
306
+ // Apply browser options temporarily
307
+ const originalConfig = { ...CONFIG };
308
+ const effectiveConfig = applyBrowserOptions(browser_options, show_browser);
309
+ Object.assign(CONFIG, effectiveConfig);
310
+ try {
311
+ // Progress: Starting
312
+ await sendProgress?.("Preparing authentication browser...", 1, 10);
313
+ log.info(` ๐ŸŒ Opening browser for interactive login...`);
314
+ // Progress: Opening browser
315
+ await sendProgress?.("Opening browser window...", 2, 10);
316
+ // Perform setup with progress updates (uses CONFIG internally)
317
+ const success = await this.authManager.performSetup(sendProgress);
318
+ const durationSeconds = (Date.now() - startTime) / 1000;
319
+ if (success) {
320
+ // Progress: Complete
321
+ await sendProgress?.("Authentication saved successfully!", 10, 10);
322
+ log.success(`โœ… [TOOL] setup_auth completed (${durationSeconds.toFixed(1)}s)`);
323
+ return {
324
+ success: true,
325
+ data: {
326
+ status: "authenticated",
327
+ message: "Successfully authenticated and saved browser state",
328
+ authenticated: true,
329
+ duration_seconds: durationSeconds,
330
+ },
331
+ };
332
+ }
333
+ else {
334
+ log.error(`โŒ [TOOL] setup_auth failed (${durationSeconds.toFixed(1)}s)`);
335
+ return {
336
+ success: false,
337
+ error: "Authentication failed or was cancelled",
338
+ };
339
+ }
340
+ }
341
+ catch (error) {
342
+ const errorMessage = error instanceof Error ? error.message : String(error);
343
+ const durationSeconds = (Date.now() - startTime) / 1000;
344
+ log.error(`โŒ [TOOL] setup_auth failed: ${errorMessage} (${durationSeconds.toFixed(1)}s)`);
345
+ return {
346
+ success: false,
347
+ error: errorMessage,
348
+ };
349
+ }
350
+ finally {
351
+ // Restore original CONFIG
352
+ Object.assign(CONFIG, originalConfig);
353
+ }
354
+ }
355
+ /**
356
+ * Handle re_auth tool
357
+ *
358
+ * Performs a complete re-authentication:
359
+ * 1. Closes all active browser sessions
360
+ * 2. Deletes all saved authentication data (cookies, Chrome profile)
361
+ * 3. Opens browser for fresh Google login
362
+ *
363
+ * Use for switching Google accounts or recovering from rate limits.
364
+ */
365
+ async handleReAuth(args, sendProgress) {
366
+ const { show_browser, browser_options } = args;
367
+ await sendProgress?.("Preparing re-authentication...", 0, 12);
368
+ log.info(`๐Ÿ”ง [TOOL] re_auth called`);
369
+ if (show_browser !== undefined) {
370
+ log.info(` Show browser: ${show_browser}`);
371
+ }
372
+ const startTime = Date.now();
373
+ // Apply browser options temporarily
374
+ const originalConfig = { ...CONFIG };
375
+ const effectiveConfig = applyBrowserOptions(browser_options, show_browser);
376
+ Object.assign(CONFIG, effectiveConfig);
377
+ try {
378
+ // 1. Close all active sessions
379
+ await sendProgress?.("Closing all active sessions...", 1, 12);
380
+ log.info(" ๐Ÿ›‘ Closing all sessions...");
381
+ await this.sessionManager.closeAllSessions();
382
+ log.success(" โœ… All sessions closed");
383
+ // 2. Clear all auth data
384
+ await sendProgress?.("Clearing authentication data...", 2, 12);
385
+ log.info(" ๐Ÿ—‘๏ธ Clearing all auth data...");
386
+ await this.authManager.clearAllAuthData();
387
+ log.success(" โœ… Auth data cleared");
388
+ // 3. Perform fresh setup
389
+ await sendProgress?.("Starting fresh authentication...", 3, 12);
390
+ log.info(" ๐ŸŒ Starting fresh authentication setup...");
391
+ const success = await this.authManager.performSetup(sendProgress);
392
+ const durationSeconds = (Date.now() - startTime) / 1000;
393
+ if (success) {
394
+ await sendProgress?.("Re-authentication complete!", 12, 12);
395
+ log.success(`โœ… [TOOL] re_auth completed (${durationSeconds.toFixed(1)}s)`);
396
+ return {
397
+ success: true,
398
+ data: {
399
+ status: "authenticated",
400
+ message: "Successfully re-authenticated with new account. All previous sessions have been closed.",
401
+ authenticated: true,
402
+ duration_seconds: durationSeconds,
403
+ },
404
+ };
405
+ }
406
+ else {
407
+ log.error(`โŒ [TOOL] re_auth failed (${durationSeconds.toFixed(1)}s)`);
408
+ return {
409
+ success: false,
410
+ error: "Re-authentication failed or was cancelled",
411
+ };
412
+ }
413
+ }
414
+ catch (error) {
415
+ const errorMessage = error instanceof Error ? error.message : String(error);
416
+ const durationSeconds = (Date.now() - startTime) / 1000;
417
+ log.error(`โŒ [TOOL] re_auth failed: ${errorMessage} (${durationSeconds.toFixed(1)}s)`);
418
+ return {
419
+ success: false,
420
+ error: errorMessage,
421
+ };
422
+ }
423
+ finally {
424
+ // Restore original CONFIG
425
+ Object.assign(CONFIG, originalConfig);
426
+ }
427
+ }
428
+ /**
429
+ * Handle add_notebook tool
430
+ */
431
+ async handleAddNotebook(args) {
432
+ log.info(`๐Ÿ”ง [TOOL] add_notebook called`);
433
+ log.info(` Name: ${args.name}`);
434
+ try {
435
+ const notebook = this.library.addNotebook(args);
436
+ log.success(`โœ… [TOOL] add_notebook completed: ${notebook.id}`);
437
+ return {
438
+ success: true,
439
+ data: { notebook },
440
+ };
441
+ }
442
+ catch (error) {
443
+ const errorMessage = error instanceof Error ? error.message : String(error);
444
+ log.error(`โŒ [TOOL] add_notebook failed: ${errorMessage}`);
445
+ return {
446
+ success: false,
447
+ error: errorMessage,
448
+ };
449
+ }
450
+ }
451
+ /**
452
+ * Handle list_notebooks tool
453
+ */
454
+ async handleListNotebooks() {
455
+ log.info(`๐Ÿ”ง [TOOL] list_notebooks called`);
456
+ try {
457
+ const notebooks = this.library.listNotebooks();
458
+ log.success(`โœ… [TOOL] list_notebooks completed (${notebooks.length} notebooks)`);
459
+ return {
460
+ success: true,
461
+ data: { notebooks },
462
+ };
463
+ }
464
+ catch (error) {
465
+ const errorMessage = error instanceof Error ? error.message : String(error);
466
+ log.error(`โŒ [TOOL] list_notebooks failed: ${errorMessage}`);
467
+ return {
468
+ success: false,
469
+ error: errorMessage,
470
+ };
471
+ }
472
+ }
473
+ /**
474
+ * Handle get_notebook tool
475
+ */
476
+ async handleGetNotebook(args) {
477
+ log.info(`๐Ÿ”ง [TOOL] get_notebook called`);
478
+ log.info(` ID: ${args.id}`);
479
+ try {
480
+ const notebook = this.library.getNotebook(args.id);
481
+ if (!notebook) {
482
+ log.warning(`โš ๏ธ [TOOL] Notebook not found: ${args.id}`);
483
+ return {
484
+ success: false,
485
+ error: `Notebook not found: ${args.id}`,
486
+ };
487
+ }
488
+ log.success(`โœ… [TOOL] get_notebook completed: ${notebook.name}`);
489
+ return {
490
+ success: true,
491
+ data: { notebook },
492
+ };
493
+ }
494
+ catch (error) {
495
+ const errorMessage = error instanceof Error ? error.message : String(error);
496
+ log.error(`โŒ [TOOL] get_notebook failed: ${errorMessage}`);
497
+ return {
498
+ success: false,
499
+ error: errorMessage,
500
+ };
501
+ }
502
+ }
503
+ /**
504
+ * Handle select_notebook tool
505
+ */
506
+ async handleSelectNotebook(args) {
507
+ log.info(`๐Ÿ”ง [TOOL] select_notebook called`);
508
+ log.info(` ID: ${args.id}`);
509
+ try {
510
+ const notebook = this.library.selectNotebook(args.id);
511
+ log.success(`โœ… [TOOL] select_notebook completed: ${notebook.name}`);
512
+ return {
513
+ success: true,
514
+ data: { notebook },
515
+ };
516
+ }
517
+ catch (error) {
518
+ const errorMessage = error instanceof Error ? error.message : String(error);
519
+ log.error(`โŒ [TOOL] select_notebook failed: ${errorMessage}`);
520
+ return {
521
+ success: false,
522
+ error: errorMessage,
523
+ };
524
+ }
525
+ }
526
+ /**
527
+ * Handle update_notebook tool
528
+ */
529
+ async handleUpdateNotebook(args) {
530
+ log.info(`๐Ÿ”ง [TOOL] update_notebook called`);
531
+ log.info(` ID: ${args.id}`);
532
+ try {
533
+ const notebook = this.library.updateNotebook(args);
534
+ log.success(`โœ… [TOOL] update_notebook completed: ${notebook.name}`);
535
+ return {
536
+ success: true,
537
+ data: { notebook },
538
+ };
539
+ }
540
+ catch (error) {
541
+ const errorMessage = error instanceof Error ? error.message : String(error);
542
+ log.error(`โŒ [TOOL] update_notebook failed: ${errorMessage}`);
543
+ return {
544
+ success: false,
545
+ error: errorMessage,
546
+ };
547
+ }
548
+ }
549
+ /**
550
+ * Handle remove_notebook tool
551
+ */
552
+ async handleRemoveNotebook(args) {
553
+ log.info(`๐Ÿ”ง [TOOL] remove_notebook called`);
554
+ log.info(` ID: ${args.id}`);
555
+ try {
556
+ const notebook = this.library.getNotebook(args.id);
557
+ if (!notebook) {
558
+ log.warning(`โš ๏ธ [TOOL] Notebook not found: ${args.id}`);
559
+ return {
560
+ success: false,
561
+ error: `Notebook not found: ${args.id}`,
562
+ };
563
+ }
564
+ const removed = this.library.removeNotebook(args.id);
565
+ if (removed) {
566
+ const closedSessions = await this.sessionManager.closeSessionsForNotebook(notebook.url);
567
+ log.success(`โœ… [TOOL] remove_notebook completed`);
568
+ return {
569
+ success: true,
570
+ data: { removed: true, closed_sessions: closedSessions },
571
+ };
572
+ }
573
+ else {
574
+ log.warning(`โš ๏ธ [TOOL] Notebook not found: ${args.id}`);
575
+ return {
576
+ success: false,
577
+ error: `Notebook not found: ${args.id}`,
578
+ };
579
+ }
580
+ }
581
+ catch (error) {
582
+ const errorMessage = error instanceof Error ? error.message : String(error);
583
+ log.error(`โŒ [TOOL] remove_notebook failed: ${errorMessage}`);
584
+ return {
585
+ success: false,
586
+ error: errorMessage,
587
+ };
588
+ }
589
+ }
590
+ /**
591
+ * Handle search_notebooks tool
592
+ */
593
+ async handleSearchNotebooks(args) {
594
+ log.info(`๐Ÿ”ง [TOOL] search_notebooks called`);
595
+ log.info(` Query: "${args.query}"`);
596
+ try {
597
+ const notebooks = this.library.searchNotebooks(args.query);
598
+ log.success(`โœ… [TOOL] search_notebooks completed (${notebooks.length} results)`);
599
+ return {
600
+ success: true,
601
+ data: { notebooks },
602
+ };
603
+ }
604
+ catch (error) {
605
+ const errorMessage = error instanceof Error ? error.message : String(error);
606
+ log.error(`โŒ [TOOL] search_notebooks failed: ${errorMessage}`);
607
+ return {
608
+ success: false,
609
+ error: errorMessage,
610
+ };
611
+ }
612
+ }
613
+ /**
614
+ * Handle get_library_stats tool
615
+ */
616
+ async handleGetLibraryStats() {
617
+ log.info(`๐Ÿ”ง [TOOL] get_library_stats called`);
618
+ try {
619
+ const stats = this.library.getStats();
620
+ log.success(`โœ… [TOOL] get_library_stats completed`);
621
+ return {
622
+ success: true,
623
+ data: stats,
624
+ };
625
+ }
626
+ catch (error) {
627
+ const errorMessage = error instanceof Error ? error.message : String(error);
628
+ log.error(`โŒ [TOOL] get_library_stats failed: ${errorMessage}`);
629
+ return {
630
+ success: false,
631
+ error: errorMessage,
632
+ };
633
+ }
634
+ }
635
+ /**
636
+ * Handle cleanup_data tool
637
+ *
638
+ * ULTRATHINK Deep Cleanup - scans entire system for ALL NotebookLM MCP files
639
+ */
640
+ async handleCleanupData(args) {
641
+ const { confirm, preserve_library = false } = args;
642
+ log.info(`๐Ÿ”ง [TOOL] cleanup_data called`);
643
+ log.info(` Confirm: ${confirm}`);
644
+ log.info(` Preserve Library: ${preserve_library}`);
645
+ const cleanupManager = new CleanupManager();
646
+ try {
647
+ // Always run in deep mode
648
+ const mode = "deep";
649
+ if (!confirm) {
650
+ // Preview mode - show what would be deleted
651
+ log.info(` ๐Ÿ“‹ Generating cleanup preview (mode: ${mode})...`);
652
+ const preview = await cleanupManager.getCleanupPaths(mode, preserve_library);
653
+ const platformInfo = cleanupManager.getPlatformInfo();
654
+ log.info(` Found ${preview.totalPaths.length} items (${cleanupManager.formatBytes(preview.totalSizeBytes)})`);
655
+ log.info(` Platform: ${platformInfo.platform}`);
656
+ return {
657
+ success: true,
658
+ data: {
659
+ status: "preview",
660
+ mode,
661
+ preview: {
662
+ categories: preview.categories,
663
+ totalPaths: preview.totalPaths.length,
664
+ totalSizeBytes: preview.totalSizeBytes,
665
+ },
666
+ },
667
+ };
668
+ }
669
+ else {
670
+ // Cleanup mode - actually delete files
671
+ log.info(` ๐Ÿ—‘๏ธ Performing cleanup (mode: ${mode})...`);
672
+ const result = await cleanupManager.performCleanup(mode, preserve_library);
673
+ if (result.success) {
674
+ log.success(`โœ… [TOOL] cleanup_data completed - deleted ${result.deletedPaths.length} items`);
675
+ }
676
+ else {
677
+ log.warning(`โš ๏ธ [TOOL] cleanup_data completed with ${result.failedPaths.length} errors`);
678
+ }
679
+ return {
680
+ success: result.success,
681
+ data: {
682
+ status: result.success ? "completed" : "partial",
683
+ mode,
684
+ result: {
685
+ deletedPaths: result.deletedPaths,
686
+ failedPaths: result.failedPaths,
687
+ totalSizeBytes: result.totalSizeBytes,
688
+ categorySummary: result.categorySummary,
689
+ },
690
+ },
691
+ };
692
+ }
693
+ }
694
+ catch (error) {
695
+ const errorMessage = error instanceof Error ? error.message : String(error);
696
+ log.error(`โŒ [TOOL] cleanup_data failed: ${errorMessage}`);
697
+ return {
698
+ success: false,
699
+ error: errorMessage,
700
+ };
701
+ }
702
+ }
703
+ /**
704
+ * Cleanup all resources (called on server shutdown)
705
+ */
706
+ async cleanup() {
707
+ log.info(`๐Ÿงน Cleaning up tool handlers...`);
708
+ await this.sessionManager.closeAllSessions();
709
+ log.success(`โœ… Tool handlers cleanup complete`);
710
+ }
711
+ }
712
+ //# sourceMappingURL=handlers.js.map