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,279 @@
1
+ /**
2
+ * NotebookLM Library Manager
3
+ *
4
+ * Manages a persistent library of NotebookLM notebooks.
5
+ * Allows Claude to autonomously add, remove, and switch between
6
+ * multiple notebooks based on the task at hand.
7
+ */
8
+ import fs from "fs";
9
+ import path from "path";
10
+ import { CONFIG } from "../config.js";
11
+ import { log } from "../utils/logger.js";
12
+ export class NotebookLibrary {
13
+ libraryPath;
14
+ library;
15
+ constructor() {
16
+ this.libraryPath = path.join(CONFIG.dataDir, "library.json");
17
+ this.library = this.loadLibrary();
18
+ log.info("📚 NotebookLibrary initialized");
19
+ log.info(` Library path: ${this.libraryPath}`);
20
+ log.info(` Notebooks: ${this.library.notebooks.length}`);
21
+ if (this.library.active_notebook_id) {
22
+ log.info(` Active: ${this.library.active_notebook_id}`);
23
+ }
24
+ }
25
+ /**
26
+ * Load library from disk, or create default if not exists
27
+ */
28
+ loadLibrary() {
29
+ try {
30
+ if (fs.existsSync(this.libraryPath)) {
31
+ const data = fs.readFileSync(this.libraryPath, "utf-8");
32
+ const library = JSON.parse(data);
33
+ log.success(` ✅ Loaded library with ${library.notebooks.length} notebooks`);
34
+ return library;
35
+ }
36
+ }
37
+ catch (error) {
38
+ log.warning(` ⚠️ Failed to load library: ${error}`);
39
+ }
40
+ // Create default library with current CONFIG as first entry
41
+ log.info(" 🆕 Creating new library...");
42
+ const defaultLibrary = this.createDefaultLibrary();
43
+ this.saveLibrary(defaultLibrary);
44
+ return defaultLibrary;
45
+ }
46
+ /**
47
+ * Create default library from current CONFIG
48
+ */
49
+ createDefaultLibrary() {
50
+ const hasConfig = CONFIG.notebookUrl &&
51
+ CONFIG.notebookDescription &&
52
+ CONFIG.notebookDescription !== "General knowledge base - configure NOTEBOOK_DESCRIPTION to help Claude understand what's in this notebook";
53
+ const notebooks = [];
54
+ if (hasConfig) {
55
+ // Create first entry from CONFIG
56
+ const id = this.generateId(CONFIG.notebookDescription);
57
+ notebooks.push({
58
+ id,
59
+ url: CONFIG.notebookUrl,
60
+ name: CONFIG.notebookDescription.substring(0, 50), // First 50 chars as name
61
+ description: CONFIG.notebookDescription,
62
+ topics: CONFIG.notebookTopics,
63
+ content_types: CONFIG.notebookContentTypes,
64
+ use_cases: CONFIG.notebookUseCases,
65
+ added_at: new Date().toISOString(),
66
+ last_used: new Date().toISOString(),
67
+ use_count: 0,
68
+ tags: [],
69
+ });
70
+ log.success(` ✅ Created default notebook: ${id}`);
71
+ }
72
+ return {
73
+ notebooks,
74
+ active_notebook_id: notebooks.length > 0 ? notebooks[0].id : null,
75
+ last_modified: new Date().toISOString(),
76
+ version: "1.0.0",
77
+ };
78
+ }
79
+ /**
80
+ * Save library to disk
81
+ */
82
+ saveLibrary(library) {
83
+ try {
84
+ library.last_modified = new Date().toISOString();
85
+ const data = JSON.stringify(library, null, 2);
86
+ fs.writeFileSync(this.libraryPath, data, "utf-8");
87
+ this.library = library;
88
+ log.success(` 💾 Library saved (${library.notebooks.length} notebooks)`);
89
+ }
90
+ catch (error) {
91
+ log.error(` ❌ Failed to save library: ${error}`);
92
+ throw error;
93
+ }
94
+ }
95
+ /**
96
+ * Generate a unique ID from a string (slug format)
97
+ */
98
+ generateId(name) {
99
+ const base = name
100
+ .toLowerCase()
101
+ .replace(/[^a-z0-9]+/g, "-")
102
+ .replace(/^-+|-+$/g, "")
103
+ .substring(0, 30);
104
+ // Ensure uniqueness
105
+ let id = base;
106
+ let counter = 1;
107
+ while (this.library.notebooks.some((n) => n.id === id)) {
108
+ id = `${base}-${counter}`;
109
+ counter++;
110
+ }
111
+ return id;
112
+ }
113
+ /**
114
+ * Add a new notebook to the library
115
+ */
116
+ addNotebook(input) {
117
+ log.info(`📝 Adding notebook: ${input.name}`);
118
+ // Generate ID
119
+ const id = this.generateId(input.name);
120
+ // Create entry
121
+ const notebook = {
122
+ id,
123
+ url: input.url,
124
+ name: input.name,
125
+ description: input.description,
126
+ topics: input.topics,
127
+ content_types: input.content_types || ["documentation", "examples"],
128
+ use_cases: input.use_cases || [
129
+ `Learning about ${input.name}`,
130
+ `Implementing features with ${input.name}`,
131
+ ],
132
+ added_at: new Date().toISOString(),
133
+ last_used: new Date().toISOString(),
134
+ use_count: 0,
135
+ tags: input.tags || [],
136
+ };
137
+ // Add to library
138
+ const updated = { ...this.library };
139
+ updated.notebooks.push(notebook);
140
+ // Set as active if it's the first notebook
141
+ if (updated.notebooks.length === 1) {
142
+ updated.active_notebook_id = id;
143
+ }
144
+ this.saveLibrary(updated);
145
+ log.success(`✅ Notebook added: ${id}`);
146
+ return notebook;
147
+ }
148
+ /**
149
+ * List all notebooks in library
150
+ */
151
+ listNotebooks() {
152
+ return this.library.notebooks;
153
+ }
154
+ /**
155
+ * Get a specific notebook by ID
156
+ */
157
+ getNotebook(id) {
158
+ return this.library.notebooks.find((n) => n.id === id) || null;
159
+ }
160
+ /**
161
+ * Get the currently active notebook
162
+ */
163
+ getActiveNotebook() {
164
+ if (!this.library.active_notebook_id) {
165
+ return null;
166
+ }
167
+ return this.getNotebook(this.library.active_notebook_id);
168
+ }
169
+ /**
170
+ * Select a notebook as active
171
+ */
172
+ selectNotebook(id) {
173
+ const notebook = this.getNotebook(id);
174
+ if (!notebook) {
175
+ throw new Error(`Notebook not found: ${id}`);
176
+ }
177
+ log.info(`🎯 Selecting notebook: ${id}`);
178
+ const updated = { ...this.library };
179
+ updated.active_notebook_id = id;
180
+ // Update last_used
181
+ const notebookIndex = updated.notebooks.findIndex((n) => n.id === id);
182
+ updated.notebooks[notebookIndex] = {
183
+ ...notebook,
184
+ last_used: new Date().toISOString(),
185
+ };
186
+ this.saveLibrary(updated);
187
+ log.success(`✅ Active notebook: ${id}`);
188
+ return updated.notebooks[notebookIndex];
189
+ }
190
+ /**
191
+ * Update notebook metadata
192
+ */
193
+ updateNotebook(input) {
194
+ const notebook = this.getNotebook(input.id);
195
+ if (!notebook) {
196
+ throw new Error(`Notebook not found: ${input.id}`);
197
+ }
198
+ log.info(`📝 Updating notebook: ${input.id}`);
199
+ const updated = { ...this.library };
200
+ const index = updated.notebooks.findIndex((n) => n.id === input.id);
201
+ updated.notebooks[index] = {
202
+ ...notebook,
203
+ ...(input.name && { name: input.name }),
204
+ ...(input.description && { description: input.description }),
205
+ ...(input.topics && { topics: input.topics }),
206
+ ...(input.content_types && { content_types: input.content_types }),
207
+ ...(input.use_cases && { use_cases: input.use_cases }),
208
+ ...(input.tags && { tags: input.tags }),
209
+ ...(input.url && { url: input.url }),
210
+ };
211
+ this.saveLibrary(updated);
212
+ log.success(`✅ Notebook updated: ${input.id}`);
213
+ return updated.notebooks[index];
214
+ }
215
+ /**
216
+ * Remove notebook from library
217
+ */
218
+ removeNotebook(id) {
219
+ const notebook = this.getNotebook(id);
220
+ if (!notebook) {
221
+ return false;
222
+ }
223
+ log.info(`🗑️ Removing notebook: ${id}`);
224
+ const updated = { ...this.library };
225
+ updated.notebooks = updated.notebooks.filter((n) => n.id !== id);
226
+ // If we removed the active notebook, select another one
227
+ if (updated.active_notebook_id === id) {
228
+ updated.active_notebook_id =
229
+ updated.notebooks.length > 0 ? updated.notebooks[0].id : null;
230
+ }
231
+ this.saveLibrary(updated);
232
+ log.success(`✅ Notebook removed: ${id}`);
233
+ return true;
234
+ }
235
+ /**
236
+ * Increment use count for a notebook
237
+ */
238
+ incrementUseCount(id) {
239
+ const notebookIndex = this.library.notebooks.findIndex((n) => n.id === id);
240
+ if (notebookIndex === -1) {
241
+ return null;
242
+ }
243
+ const notebook = this.library.notebooks[notebookIndex];
244
+ const updated = { ...this.library };
245
+ const updatedNotebook = {
246
+ ...notebook,
247
+ use_count: notebook.use_count + 1,
248
+ last_used: new Date().toISOString(),
249
+ };
250
+ updated.notebooks[notebookIndex] = updatedNotebook;
251
+ this.saveLibrary(updated);
252
+ return updatedNotebook;
253
+ }
254
+ /**
255
+ * Get library statistics
256
+ */
257
+ getStats() {
258
+ const totalQueries = this.library.notebooks.reduce((sum, n) => sum + n.use_count, 0);
259
+ const mostUsed = this.library.notebooks.reduce((max, n) => n.use_count > (max?.use_count || 0) ? n : max, null);
260
+ return {
261
+ total_notebooks: this.library.notebooks.length,
262
+ active_notebook: this.library.active_notebook_id,
263
+ most_used_notebook: mostUsed?.id || null,
264
+ total_queries: totalQueries,
265
+ last_modified: this.library.last_modified,
266
+ };
267
+ }
268
+ /**
269
+ * Search notebooks by query (searches name, description, topics)
270
+ */
271
+ searchNotebooks(query) {
272
+ const lowerQuery = query.toLowerCase();
273
+ return this.library.notebooks.filter((n) => n.name.toLowerCase().includes(lowerQuery) ||
274
+ n.description.toLowerCase().includes(lowerQuery) ||
275
+ n.topics.some((t) => t.toLowerCase().includes(lowerQuery)) ||
276
+ n.tags?.some((t) => t.toLowerCase().includes(lowerQuery)));
277
+ }
278
+ }
279
+ //# sourceMappingURL=notebook-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebook-library.js","sourceRoot":"","sources":["../../src/library/notebook-library.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AASzC,MAAM,OAAO,eAAe;IAClB,WAAW,CAAS;IACpB,OAAO,CAAU;IAEzB;QACE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAElC,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;gBACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;gBAC5C,GAAG,CAAC,OAAO,CAAC,2BAA2B,OAAO,CAAC,SAAS,CAAC,MAAM,YAAY,CAAC,CAAC;gBAC7E,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,OAAO,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,4DAA4D;QAC5D,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACzC,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACjC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,MAAM,SAAS,GACb,MAAM,CAAC,WAAW;YAClB,MAAM,CAAC,mBAAmB;YAC1B,MAAM,CAAC,mBAAmB,KAAK,2GAA2G,CAAC;QAE7I,MAAM,SAAS,GAAoB,EAAE,CAAC;QAEtC,IAAI,SAAS,EAAE,CAAC;YACd,iCAAiC;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACvD,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE;gBACF,GAAG,EAAE,MAAM,CAAC,WAAW;gBACvB,IAAI,EAAE,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,yBAAyB;gBAC5E,WAAW,EAAE,MAAM,CAAC,mBAAmB;gBACvC,MAAM,EAAE,MAAM,CAAC,cAAc;gBAC7B,aAAa,EAAE,MAAM,CAAC,oBAAoB;gBAC1C,SAAS,EAAE,MAAM,CAAC,gBAAgB;gBAClC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,SAAS,EAAE,CAAC;gBACZ,IAAI,EAAE,EAAE;aACT,CAAC,CAAC;YAEH,GAAG,CAAC,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL,SAAS;YACT,kBAAkB,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACjE,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACvC,OAAO,EAAE,OAAO;SACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAgB;QAClC,IAAI,CAAC;YACH,OAAO,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAClD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,GAAG,CAAC,OAAO,CAAC,uBAAuB,OAAO,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;YAClD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,IAAY;QAC7B,MAAM,IAAI,GAAG,IAAI;aACd,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;aACvB,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEpB,oBAAoB;QACpB,IAAI,EAAE,GAAG,IAAI,CAAC;QACd,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACvD,EAAE,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAuB;QACjC,GAAG,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAE9C,cAAc;QACd,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEvC,eAAe;QACf,MAAM,QAAQ,GAAkB;YAC9B,EAAE;YACF,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC;YACnE,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI;gBAC5B,kBAAkB,KAAK,CAAC,IAAI,EAAE;gBAC9B,8BAA8B,KAAK,CAAC,IAAI,EAAE;aAC3C;YACD,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE;SACvB,CAAC;QAEF,iBAAiB;QACjB,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjC,2CAA2C;QAC3C,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAEvC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,EAAU;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;QAEzC,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAEhC,mBAAmB;QACnB,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG;YACjC,GAAG,QAAQ;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAExC,OAAO,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAA0B;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAE9C,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;QAEpE,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG;YACzB,GAAG,QAAQ;YACX,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;YAC5D,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7C,GAAG,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;YAClE,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;YACtD,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;SACrC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,uBAAuB,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,OAAO,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,EAAU;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QAE1C,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjE,wDAAwD;QACxD,IAAI,OAAO,CAAC,kBAAkB,KAAK,EAAE,EAAE,CAAC;YACtC,OAAO,CAAC,kBAAkB;gBACxB,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1B,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QAEzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,EAAU;QAC1B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,eAAe,GAAkB;YACrC,GAAG,QAAQ;YACX,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAG,CAAC;YACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,eAAe,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAE1B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAChD,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAC7B,CAAC,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CACxD,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAC7C,IAA4B,CAAC,CAAC;QAEhC,OAAO;YACL,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM;YAC9C,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB;YAChD,kBAAkB,EAAE,QAAQ,EAAE,EAAE,IAAI,IAAI;YACxC,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;SAC1C,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAAa;QAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAChD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC1D,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAC5D,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * NotebookLM Library Types
3
+ *
4
+ * Defines the structure for managing multiple NotebookLM notebooks
5
+ * in a persistent library that Claude can manage autonomously.
6
+ */
7
+ /**
8
+ * Single notebook entry in the library
9
+ */
10
+ export interface NotebookEntry {
11
+ id: string;
12
+ url: string;
13
+ name: string;
14
+ description: string;
15
+ topics: string[];
16
+ content_types: string[];
17
+ use_cases: string[];
18
+ added_at: string;
19
+ last_used: string;
20
+ use_count: number;
21
+ tags?: string[];
22
+ }
23
+ /**
24
+ * The complete notebook library
25
+ */
26
+ export interface Library {
27
+ notebooks: NotebookEntry[];
28
+ active_notebook_id: string | null;
29
+ last_modified: string;
30
+ version: string;
31
+ }
32
+ /**
33
+ * Input for adding a new notebook
34
+ */
35
+ export interface AddNotebookInput {
36
+ url: string;
37
+ name: string;
38
+ description: string;
39
+ topics: string[];
40
+ content_types?: string[];
41
+ use_cases?: string[];
42
+ tags?: string[];
43
+ }
44
+ /**
45
+ * Input for updating a notebook
46
+ */
47
+ export interface UpdateNotebookInput {
48
+ id: string;
49
+ name?: string;
50
+ description?: string;
51
+ topics?: string[];
52
+ content_types?: string[];
53
+ use_cases?: string[];
54
+ tags?: string[];
55
+ url?: string;
56
+ }
57
+ /**
58
+ * Statistics about library usage
59
+ */
60
+ export interface LibraryStats {
61
+ total_notebooks: number;
62
+ active_notebook: string | null;
63
+ most_used_notebook: string | null;
64
+ total_queries: number;
65
+ last_modified: string;
66
+ }
67
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAE5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IAGb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IAGpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAGlB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * NotebookLM Library Types
3
+ *
4
+ * Defines the structure for managing multiple NotebookLM notebooks
5
+ * in a persistent library that Claude can manage autonomously.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@playwright/test").PlaywrightTestConfig<{}, {}>;
2
+ export default _default;
3
+ //# sourceMappingURL=playwright.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.config.d.ts","sourceRoot":"","sources":["../playwright.config.ts"],"names":[],"mappings":";AAGA,wBAoCG"}
@@ -0,0 +1,38 @@
1
+ import { defineConfig } from '@playwright/test';
2
+ // import { CONFIG } from './src/config.js';
3
+ export default defineConfig({
4
+ testDir: './tests/e2e',
5
+ timeout: 30000,
6
+ expect: {
7
+ timeout: 5000,
8
+ },
9
+ fullyParallel: true,
10
+ forbidOnly: !!process.env.CI,
11
+ retries: process.env.CI ? 2 : 0,
12
+ workers: process.env.CI ? 1 : undefined,
13
+ reporter: 'html',
14
+ use: {
15
+ actionTimeout: 0,
16
+ trace: 'on-first-retry',
17
+ viewport: { width: 1280, height: 720 },
18
+ },
19
+ projects: [
20
+ {
21
+ name: 'mocked',
22
+ use: {
23
+ baseURL: 'http://localhost:3000',
24
+ // Mocked tests don't need real browser state
25
+ },
26
+ testMatch: /.*mocked.spec.ts/,
27
+ },
28
+ {
29
+ name: 'authenticated',
30
+ use: {
31
+ baseURL: 'https://notebooklm.google.com',
32
+ storageState: '.auth/user-state.json',
33
+ },
34
+ testMatch: /.*authenticated.spec.ts/,
35
+ },
36
+ ],
37
+ });
38
+ //# sourceMappingURL=playwright.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.config.js","sourceRoot":"","sources":["../playwright.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,4CAA4C;AAE5C,eAAe,YAAY,CAAC;IACxB,OAAO,EAAE,aAAa;IACtB,OAAO,EAAE,KAAK;IACd,MAAM,EAAE;QACJ,OAAO,EAAE,IAAI;KAChB;IACD,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;IAC5B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IACvC,QAAQ,EAAE,MAAM;IAEhB,GAAG,EAAE;QACD,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;KACzC;IAED,QAAQ,EAAE;QACN;YACI,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE;gBACD,OAAO,EAAE,uBAAuB;gBAChC,6CAA6C;aAChD;YACD,SAAS,EAAE,kBAAkB;SAChC;QACD;YACI,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE;gBACD,OAAO,EAAE,+BAA+B;gBACxC,YAAY,EAAE,uBAAuB;aACxC;YACD,SAAS,EAAE,yBAAyB;SACvC;KACJ;CACJ,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { NotebookLibrary } from "../library/notebook-library.js";
3
+ /**
4
+ * Handlers for MCP Resource-related requests
5
+ */
6
+ export declare class ResourceHandlers {
7
+ private library;
8
+ constructor(library: NotebookLibrary);
9
+ /**
10
+ * Register all resource handlers to the server
11
+ */
12
+ registerHandlers(server: Server): void;
13
+ /**
14
+ * Return notebook IDs matching the provided input (case-insensitive contains)
15
+ */
16
+ private completeNotebookIds;
17
+ /**
18
+ * Build a completion payload for MCP responses
19
+ */
20
+ private buildCompletion;
21
+ }
22
+ //# sourceMappingURL=resource-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-handlers.d.ts","sourceRoot":"","sources":["../../src/resources/resource-handlers.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAkB;gBAErB,OAAO,EAAE,eAAe;IAIpC;;OAEG;IACI,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAkN7C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,eAAe;CAQxB"}
@@ -0,0 +1,216 @@
1
+ import { ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ReadResourceRequestSchema, CompleteRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
2
+ import { log } from "../utils/logger.js";
3
+ /**
4
+ * Handlers for MCP Resource-related requests
5
+ */
6
+ export class ResourceHandlers {
7
+ library;
8
+ constructor(library) {
9
+ this.library = library;
10
+ }
11
+ /**
12
+ * Register all resource handlers to the server
13
+ */
14
+ registerHandlers(server) {
15
+ // List available resources
16
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
17
+ log.info("📚 [MCP] list_resources request received");
18
+ const notebooks = this.library.listNotebooks();
19
+ const resources = [
20
+ {
21
+ uri: "notebooklm://library",
22
+ name: "Notebook Library",
23
+ description: "Complete notebook library with all available knowledge sources. " +
24
+ "Read this to discover what notebooks are available. " +
25
+ "⚠️ If you think a notebook might help with the user's task, " +
26
+ "ASK THE USER FOR PERMISSION before consulting it: " +
27
+ "'Should I consult the [notebook] for this task?'",
28
+ mimeType: "application/json",
29
+ },
30
+ ];
31
+ // Add individual notebook resources
32
+ for (const notebook of notebooks) {
33
+ resources.push({
34
+ uri: `notebooklm://library/${notebook.id}`,
35
+ name: notebook.name,
36
+ description: `${notebook.description} | Topics: ${notebook.topics.join(", ")} | ` +
37
+ `💡 Use ask_question to query this notebook (ask user permission first if task isn't explicitly about these topics)`,
38
+ mimeType: "application/json",
39
+ });
40
+ }
41
+ // Add legacy metadata resource for backwards compatibility
42
+ const active = this.library.getActiveNotebook();
43
+ if (active) {
44
+ resources.push({
45
+ uri: "notebooklm://metadata",
46
+ name: "Active Notebook Metadata (Legacy)",
47
+ description: "Information about the currently active notebook. " +
48
+ "DEPRECATED: Use notebooklm://library instead for multi-notebook support. " +
49
+ "⚠️ Always ask user permission before using notebooks for tasks they didn't explicitly mention.",
50
+ mimeType: "application/json",
51
+ });
52
+ }
53
+ return { resources };
54
+ });
55
+ // List resource templates
56
+ server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
57
+ log.info("📑 [MCP] list_resource_templates request received");
58
+ return {
59
+ resourceTemplates: [
60
+ {
61
+ uriTemplate: "notebooklm://library/{id}",
62
+ name: "Notebook by ID",
63
+ description: "Access a specific notebook from your library by ID. " +
64
+ "Provides detailed metadata about the notebook including topics, use cases, and usage statistics. " +
65
+ "💡 Use the 'id' parameter from list_notebooks to access specific notebooks.",
66
+ mimeType: "application/json",
67
+ },
68
+ ],
69
+ };
70
+ });
71
+ // Read resource content
72
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
73
+ const { uri } = request.params;
74
+ log.info(`📖 [MCP] read_resource request: ${uri}`);
75
+ // Handle library resource
76
+ if (uri === "notebooklm://library") {
77
+ const notebooks = this.library.listNotebooks();
78
+ const stats = this.library.getStats();
79
+ const active = this.library.getActiveNotebook();
80
+ const libraryData = {
81
+ active_notebook: active
82
+ ? {
83
+ id: active.id,
84
+ name: active.name,
85
+ description: active.description,
86
+ topics: active.topics,
87
+ }
88
+ : null,
89
+ notebooks: notebooks.map((nb) => ({
90
+ id: nb.id,
91
+ name: nb.name,
92
+ description: nb.description,
93
+ topics: nb.topics,
94
+ content_types: nb.content_types,
95
+ use_cases: nb.use_cases,
96
+ url: nb.url,
97
+ use_count: nb.use_count,
98
+ last_used: nb.last_used,
99
+ tags: nb.tags,
100
+ })),
101
+ stats,
102
+ };
103
+ return {
104
+ contents: [
105
+ {
106
+ uri,
107
+ mimeType: "application/json",
108
+ text: JSON.stringify(libraryData, null, 2),
109
+ },
110
+ ],
111
+ };
112
+ }
113
+ // Handle individual notebook resource
114
+ if (uri.startsWith("notebooklm://library/")) {
115
+ const prefix = "notebooklm://library/";
116
+ const encodedId = uri.slice(prefix.length);
117
+ if (!encodedId) {
118
+ throw new Error("Notebook resource requires an ID (e.g. notebooklm://library/{id})");
119
+ }
120
+ let id;
121
+ try {
122
+ id = decodeURIComponent(encodedId);
123
+ }
124
+ catch {
125
+ throw new Error(`Invalid notebook identifier encoding: ${encodedId}`);
126
+ }
127
+ if (!/^[a-z0-9][a-z0-9-]{0,62}$/i.test(id)) {
128
+ throw new Error(`Invalid notebook identifier: ${encodedId}. Notebook IDs may only contain letters, numbers, and hyphens.`);
129
+ }
130
+ const notebook = this.library.getNotebook(id);
131
+ if (!notebook) {
132
+ throw new Error(`Notebook not found: ${id}`);
133
+ }
134
+ return {
135
+ contents: [
136
+ {
137
+ uri,
138
+ mimeType: "application/json",
139
+ text: JSON.stringify(notebook, null, 2),
140
+ },
141
+ ],
142
+ };
143
+ }
144
+ // Legacy metadata resource (backwards compatibility)
145
+ if (uri === "notebooklm://metadata") {
146
+ const active = this.library.getActiveNotebook();
147
+ if (!active) {
148
+ throw new Error("No active notebook. Use notebooklm://library to see all notebooks.");
149
+ }
150
+ const metadata = {
151
+ description: active.description,
152
+ topics: active.topics,
153
+ content_types: active.content_types,
154
+ use_cases: active.use_cases,
155
+ notebook_url: active.url,
156
+ notebook_id: active.id,
157
+ last_used: active.last_used,
158
+ use_count: active.use_count,
159
+ note: "DEPRECATED: Use notebooklm://library or notebooklm://library/{id} instead",
160
+ };
161
+ return {
162
+ contents: [
163
+ {
164
+ uri,
165
+ mimeType: "application/json",
166
+ text: JSON.stringify(metadata, null, 2),
167
+ },
168
+ ],
169
+ };
170
+ }
171
+ throw new Error(`Unknown resource: ${uri}`);
172
+ });
173
+ // Argument completions (for prompt arguments and resource templates)
174
+ server.setRequestHandler(CompleteRequestSchema, async (request) => {
175
+ const { ref, argument } = request.params;
176
+ try {
177
+ if (ref?.type === "ref/resource") {
178
+ // Complete variables for resource templates
179
+ const uri = String(ref.uri || "");
180
+ // Notebook by ID template
181
+ if (uri === "notebooklm://library/{id}" && argument?.name === "id") {
182
+ const values = this.completeNotebookIds(argument?.value);
183
+ return this.buildCompletion(values);
184
+ }
185
+ }
186
+ }
187
+ catch (e) {
188
+ log.warning(`⚠️ [MCP] completion error: ${e}`);
189
+ }
190
+ return { completion: { values: [], total: 0 } };
191
+ });
192
+ }
193
+ /**
194
+ * Return notebook IDs matching the provided input (case-insensitive contains)
195
+ */
196
+ completeNotebookIds(input) {
197
+ const query = String(input ?? "").toLowerCase();
198
+ return this.library
199
+ .listNotebooks()
200
+ .map((nb) => nb.id)
201
+ .filter((id) => id.toLowerCase().includes(query))
202
+ .slice(0, 50);
203
+ }
204
+ /**
205
+ * Build a completion payload for MCP responses
206
+ */
207
+ buildCompletion(values) {
208
+ return {
209
+ completion: {
210
+ values,
211
+ total: values.length,
212
+ },
213
+ };
214
+ }
215
+ }
216
+ //# sourceMappingURL=resource-handlers.js.map