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.
- package/LICENSE +21 -0
- package/README.md +456 -0
- package/dist/auth/auth-manager.d.ts +139 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +960 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/config.d.ts +92 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +219 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +58 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +133 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +325 -0
- package/dist/index.js.map +1 -0
- package/dist/library/notebook-library.d.ts +70 -0
- package/dist/library/notebook-library.d.ts.map +1 -0
- package/dist/library/notebook-library.js +279 -0
- package/dist/library/notebook-library.js.map +1 -0
- package/dist/library/types.d.ts +67 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +8 -0
- package/dist/library/types.js.map +1 -0
- package/dist/playwright.config.d.ts +3 -0
- package/dist/playwright.config.d.ts.map +1 -0
- package/dist/playwright.config.js +38 -0
- package/dist/playwright.config.js.map +1 -0
- package/dist/resources/resource-handlers.d.ts +22 -0
- package/dist/resources/resource-handlers.d.ts.map +1 -0
- package/dist/resources/resource-handlers.js +216 -0
- package/dist/resources/resource-handlers.js.map +1 -0
- package/dist/scripts/save-auth-state.d.ts +2 -0
- package/dist/scripts/save-auth-state.d.ts.map +1 -0
- package/dist/scripts/save-auth-state.js +91 -0
- package/dist/scripts/save-auth-state.js.map +1 -0
- package/dist/session/browser-session.d.ts +108 -0
- package/dist/session/browser-session.d.ts.map +1 -0
- package/dist/session/browser-session.js +636 -0
- package/dist/session/browser-session.js.map +1 -0
- package/dist/session/session-manager.d.ts +76 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +273 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/shared-context-manager.d.ts +107 -0
- package/dist/session/shared-context-manager.d.ts.map +1 -0
- package/dist/session/shared-context-manager.js +447 -0
- package/dist/session/shared-context-manager.js.map +1 -0
- package/dist/src/auth/auth-manager.d.ts +139 -0
- package/dist/src/auth/auth-manager.d.ts.map +1 -0
- package/dist/src/auth/auth-manager.js +960 -0
- package/dist/src/auth/auth-manager.js.map +1 -0
- package/dist/src/config.d.ts +92 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +219 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/constants.d.ts +58 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +133 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/errors.d.ts +26 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +41 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +32 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +325 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/library/notebook-library.d.ts +70 -0
- package/dist/src/library/notebook-library.d.ts.map +1 -0
- package/dist/src/library/notebook-library.js +279 -0
- package/dist/src/library/notebook-library.js.map +1 -0
- package/dist/src/library/types.d.ts +67 -0
- package/dist/src/library/types.d.ts.map +1 -0
- package/dist/src/library/types.js +8 -0
- package/dist/src/library/types.js.map +1 -0
- package/dist/src/resources/resource-handlers.d.ts +22 -0
- package/dist/src/resources/resource-handlers.d.ts.map +1 -0
- package/dist/src/resources/resource-handlers.js +216 -0
- package/dist/src/resources/resource-handlers.js.map +1 -0
- package/dist/src/scripts/health-check.d.ts +13 -0
- package/dist/src/scripts/health-check.d.ts.map +1 -0
- package/dist/src/scripts/health-check.js +100 -0
- package/dist/src/scripts/health-check.js.map +1 -0
- package/dist/src/session/browser-session.d.ts +108 -0
- package/dist/src/session/browser-session.d.ts.map +1 -0
- package/dist/src/session/browser-session.js +642 -0
- package/dist/src/session/browser-session.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +76 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +273 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/shared-context-manager.d.ts +107 -0
- package/dist/src/session/shared-context-manager.d.ts.map +1 -0
- package/dist/src/session/shared-context-manager.js +447 -0
- package/dist/src/session/shared-context-manager.js.map +1 -0
- package/dist/src/tools/definitions/ask-question.d.ts +8 -0
- package/dist/src/tools/definitions/ask-question.d.ts.map +1 -0
- package/dist/src/tools/definitions/ask-question.js +211 -0
- package/dist/src/tools/definitions/ask-question.js.map +1 -0
- package/dist/src/tools/definitions/notebook-management.d.ts +3 -0
- package/dist/src/tools/definitions/notebook-management.d.ts.map +1 -0
- package/dist/src/tools/definitions/notebook-management.js +243 -0
- package/dist/src/tools/definitions/notebook-management.js.map +1 -0
- package/dist/src/tools/definitions/session-management.d.ts +3 -0
- package/dist/src/tools/definitions/session-management.d.ts.map +1 -0
- package/dist/src/tools/definitions/session-management.js +41 -0
- package/dist/src/tools/definitions/session-management.js.map +1 -0
- package/dist/src/tools/definitions/system.d.ts +3 -0
- package/dist/src/tools/definitions/system.d.ts.map +1 -0
- package/dist/src/tools/definitions/system.js +143 -0
- package/dist/src/tools/definitions/system.js.map +1 -0
- package/dist/src/tools/definitions.d.ts +12 -0
- package/dist/src/tools/definitions.d.ts.map +1 -0
- package/dist/src/tools/definitions.js +26 -0
- package/dist/src/tools/definitions.js.map +1 -0
- package/dist/src/tools/handlers.d.ts +212 -0
- package/dist/src/tools/handlers.d.ts.map +1 -0
- package/dist/src/tools/handlers.js +712 -0
- package/dist/src/tools/handlers.js.map +1 -0
- package/dist/src/tools/index.d.ts +8 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +8 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/types.d.ts +88 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +5 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/auth-manager.d.ts +2 -0
- package/dist/src/utils/auth-manager.d.ts.map +1 -0
- package/dist/src/utils/auth-manager.js +25 -0
- package/dist/src/utils/auth-manager.js.map +1 -0
- package/dist/src/utils/cleanup-manager.d.ts +133 -0
- package/dist/src/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/src/utils/cleanup-manager.js +673 -0
- package/dist/src/utils/cleanup-manager.js.map +1 -0
- package/dist/src/utils/cli-handler.d.ts +16 -0
- package/dist/src/utils/cli-handler.d.ts.map +1 -0
- package/dist/src/utils/cli-handler.js +102 -0
- package/dist/src/utils/cli-handler.js.map +1 -0
- package/dist/src/utils/logger.d.ts +61 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +92 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/page-utils.d.ts +54 -0
- package/dist/src/utils/page-utils.d.ts.map +1 -0
- package/dist/src/utils/page-utils.js +381 -0
- package/dist/src/utils/page-utils.js.map +1 -0
- package/dist/src/utils/rate-limit-handler.d.ts +42 -0
- package/dist/src/utils/rate-limit-handler.d.ts.map +1 -0
- package/dist/src/utils/rate-limit-handler.js +88 -0
- package/dist/src/utils/rate-limit-handler.js.map +1 -0
- package/dist/src/utils/rate-limit-handler.test.d.ts +7 -0
- package/dist/src/utils/rate-limit-handler.test.d.ts.map +1 -0
- package/dist/src/utils/rate-limit-handler.test.js +86 -0
- package/dist/src/utils/rate-limit-handler.test.js.map +1 -0
- package/dist/src/utils/settings-manager.d.ts +37 -0
- package/dist/src/utils/settings-manager.d.ts.map +1 -0
- package/dist/src/utils/settings-manager.js +121 -0
- package/dist/src/utils/settings-manager.js.map +1 -0
- package/dist/src/utils/stealth-utils.d.ts +135 -0
- package/dist/src/utils/stealth-utils.d.ts.map +1 -0
- package/dist/src/utils/stealth-utils.js +396 -0
- package/dist/src/utils/stealth-utils.js.map +1 -0
- package/dist/src/utils/stealth-utils.test.d.ts +7 -0
- package/dist/src/utils/stealth-utils.test.d.ts.map +1 -0
- package/dist/src/utils/stealth-utils.test.js +72 -0
- package/dist/src/utils/stealth-utils.test.js.map +1 -0
- package/dist/tests/e2e/authenticated.spec.d.ts +2 -0
- package/dist/tests/e2e/authenticated.spec.d.ts.map +1 -0
- package/dist/tests/e2e/authenticated.spec.js +41 -0
- package/dist/tests/e2e/authenticated.spec.js.map +1 -0
- package/dist/tests/e2e/mocked.spec.d.ts +2 -0
- package/dist/tests/e2e/mocked.spec.d.ts.map +1 -0
- package/dist/tests/e2e/mocked.spec.js +32 -0
- package/dist/tests/e2e/mocked.spec.js.map +1 -0
- package/dist/tests/mocks/handlers.d.ts +4 -0
- package/dist/tests/mocks/handlers.d.ts.map +1 -0
- package/dist/tests/mocks/handlers.js +55 -0
- package/dist/tests/mocks/handlers.js.map +1 -0
- package/dist/tests/mocks/setup.d.ts +3 -0
- package/dist/tests/mocks/setup.d.ts.map +1 -0
- package/dist/tests/mocks/setup.js +77 -0
- package/dist/tests/mocks/setup.js.map +1 -0
- package/dist/tools/definitions/ask-question.d.ts +8 -0
- package/dist/tools/definitions/ask-question.d.ts.map +1 -0
- package/dist/tools/definitions/ask-question.js +211 -0
- package/dist/tools/definitions/ask-question.js.map +1 -0
- package/dist/tools/definitions/notebook-management.d.ts +3 -0
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
- package/dist/tools/definitions/notebook-management.js +243 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -0
- package/dist/tools/definitions/session-management.d.ts +3 -0
- package/dist/tools/definitions/session-management.d.ts.map +1 -0
- package/dist/tools/definitions/session-management.js +41 -0
- package/dist/tools/definitions/session-management.js.map +1 -0
- package/dist/tools/definitions/system.d.ts +3 -0
- package/dist/tools/definitions/system.d.ts.map +1 -0
- package/dist/tools/definitions/system.js +143 -0
- package/dist/tools/definitions/system.js.map +1 -0
- package/dist/tools/definitions.d.ts +12 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +26 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers.d.ts +212 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +712 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +133 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +673 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/cli-handler.d.ts +16 -0
- package/dist/utils/cli-handler.d.ts.map +1 -0
- package/dist/utils/cli-handler.js +102 -0
- package/dist/utils/cli-handler.js.map +1 -0
- package/dist/utils/logger.d.ts +61 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/page-utils.d.ts +54 -0
- package/dist/utils/page-utils.d.ts.map +1 -0
- package/dist/utils/page-utils.js +381 -0
- package/dist/utils/page-utils.js.map +1 -0
- package/dist/utils/rate-limit-handler.d.ts +42 -0
- package/dist/utils/rate-limit-handler.d.ts.map +1 -0
- package/dist/utils/rate-limit-handler.js +88 -0
- package/dist/utils/rate-limit-handler.js.map +1 -0
- package/dist/utils/rate-limit-handler.test.d.ts +7 -0
- package/dist/utils/rate-limit-handler.test.d.ts.map +1 -0
- package/dist/utils/rate-limit-handler.test.js +91 -0
- package/dist/utils/rate-limit-handler.test.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +37 -0
- package/dist/utils/settings-manager.d.ts.map +1 -0
- package/dist/utils/settings-manager.js +121 -0
- package/dist/utils/settings-manager.js.map +1 -0
- package/dist/utils/stealth-utils.d.ts +135 -0
- package/dist/utils/stealth-utils.d.ts.map +1 -0
- package/dist/utils/stealth-utils.js +396 -0
- package/dist/utils/stealth-utils.js.map +1 -0
- package/dist/utils/stealth-utils.test.d.ts +7 -0
- package/dist/utils/stealth-utils.test.d.ts.map +1 -0
- package/dist/utils/stealth-utils.test.js +72 -0
- package/dist/utils/stealth-utils.test.js.map +1 -0
- package/docs/01_configuration.md +94 -0
- package/docs/02_tools.md +34 -0
- package/docs/03_troubleshooting.md +59 -0
- package/docs/04_usage-guide.md +245 -0
- package/docs/05_project-analysis.qmd +309 -0
- package/docs/06_integration-analysis.html +914 -0
- package/docs/06_integration-analysis.qmd +255 -0
- package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-4f0954b6b0dd6bf39f4bb9151ba984db.min.css +12 -0
- package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-icons.css +2106 -0
- package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap-icons.woff +0 -0
- package/docs/06_integration-analysis_files/libs/bootstrap/bootstrap.min.js +7 -0
- package/docs/06_integration-analysis_files/libs/clipboard/clipboard.min.js +7 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/anchor.min.js +9 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/axe/axe-check.js +145 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/popper.min.js +6 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/quarto.js +847 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/tabsets/tabsets.js +95 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/tippy.css +1 -0
- package/docs/06_integration-analysis_files/libs/quarto-html/tippy.umd.min.js +2 -0
- package/docs/07_e2e-testing-safety.qmd +754 -0
- package/docs/08_project-re-evaluation.html +609 -0
- package/docs/08_project-re-evaluation.qmd +86 -0
- package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-4f0954b6b0dd6bf39f4bb9151ba984db.min.css +12 -0
- package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-icons.css +2106 -0
- package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap-icons.woff +0 -0
- package/docs/08_project-re-evaluation_files/libs/bootstrap/bootstrap.min.js +7 -0
- package/docs/08_project-re-evaluation_files/libs/clipboard/clipboard.min.js +7 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/anchor.min.js +9 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/axe/axe-check.js +145 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/popper.min.js +6 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/quarto.js +847 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/tabsets/tabsets.js +95 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/tippy.css +1 -0
- package/docs/08_project-re-evaluation_files/libs/quarto-html/tippy.umd.min.js +2 -0
- package/docs/notebooklm-mcp-usage.html +704 -0
- package/docs/notebooklm-mcp-usage.qmd +119 -0
- package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-6b71f2156b6a5230c6677325978bcf08.min.css +12 -0
- package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-icons.css +2106 -0
- package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap-icons.woff +0 -0
- package/docs/notebooklm-mcp-usage_files/libs/bootstrap/bootstrap.min.js +7 -0
- package/docs/notebooklm-mcp-usage_files/libs/clipboard/clipboard.min.js +7 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/anchor.min.js +9 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/axe/axe-check.js +145 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/popper.min.js +6 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/quarto.js +847 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tabsets/tabsets.js +95 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tippy.css +1 -0
- package/docs/notebooklm-mcp-usage_files/libs/quarto-html/tippy.umd.min.js +2 -0
- package/docs/repomix-usage_files/libs/bootstrap/bootstrap-6b71f2156b6a5230c6677325978bcf08.min.css +12 -0
- package/docs/repomix-usage_files/libs/bootstrap/bootstrap-icons.css +2106 -0
- package/docs/repomix-usage_files/libs/bootstrap/bootstrap-icons.woff +0 -0
- package/docs/repomix-usage_files/libs/bootstrap/bootstrap.min.js +7 -0
- package/docs/repomix-usage_files/libs/clipboard/clipboard.min.js +7 -0
- package/docs/repomix-usage_files/libs/quarto-html/anchor.min.js +9 -0
- package/docs/repomix-usage_files/libs/quarto-html/axe/axe-check.js +145 -0
- package/docs/repomix-usage_files/libs/quarto-html/popper.min.js +6 -0
- package/docs/repomix-usage_files/libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +236 -0
- package/docs/repomix-usage_files/libs/quarto-html/quarto.js +847 -0
- package/docs/repomix-usage_files/libs/quarto-html/tabsets/tabsets.js +95 -0
- package/docs/repomix-usage_files/libs/quarto-html/tippy.css +1 -0
- package/docs/repomix-usage_files/libs/quarto-html/tippy.umd.min.js +2 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/library/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -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
|