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,396 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stealth utilities for human-like browser behavior
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to simulate realistic human interactions:
|
|
5
|
+
* - Human-like typing (speed configurable via CONFIG.typingWpmMin/Max)
|
|
6
|
+
* - Realistic mouse movements (Bezier curves with jitter)
|
|
7
|
+
* - Random delays (normal distribution)
|
|
8
|
+
* - Smooth scrolling
|
|
9
|
+
* - Reading pauses
|
|
10
|
+
*
|
|
11
|
+
* Based on the Python implementation from stealth_utils.py
|
|
12
|
+
*/
|
|
13
|
+
import { CONFIG } from "../config.js";
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Helper Functions
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Sleep for specified milliseconds
|
|
19
|
+
*/
|
|
20
|
+
export async function sleep(ms) {
|
|
21
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate random integer between min and max (inclusive)
|
|
25
|
+
*/
|
|
26
|
+
export function randomInt(min, max) {
|
|
27
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Generate random float between min and max
|
|
31
|
+
*/
|
|
32
|
+
export function randomFloat(min, max) {
|
|
33
|
+
return Math.random() * (max - min) + min;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generate random character (for typos)
|
|
37
|
+
*/
|
|
38
|
+
export function randomChar() {
|
|
39
|
+
const chars = "qwertyuiopasdfghjklzxcvbnm";
|
|
40
|
+
return chars[randomInt(0, chars.length - 1)];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate Gaussian (normal) distributed random number
|
|
44
|
+
* Uses Box-Muller transform
|
|
45
|
+
*/
|
|
46
|
+
export function gaussian(mean, stdDev) {
|
|
47
|
+
const u1 = Math.random();
|
|
48
|
+
const u2 = Math.random();
|
|
49
|
+
const z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(2.0 * Math.PI * u2);
|
|
50
|
+
return z0 * stdDev + mean;
|
|
51
|
+
}
|
|
52
|
+
// ============================================================================
|
|
53
|
+
// Random Delays
|
|
54
|
+
// ============================================================================
|
|
55
|
+
/**
|
|
56
|
+
* Add a random delay to simulate human thinking/reaction time
|
|
57
|
+
* Uses normal distribution for more realistic delays
|
|
58
|
+
*
|
|
59
|
+
* @param minMs Minimum delay in milliseconds (default: from CONFIG)
|
|
60
|
+
* @param maxMs Maximum delay in milliseconds (default: from CONFIG)
|
|
61
|
+
*/
|
|
62
|
+
export async function randomDelay(minMs, maxMs) {
|
|
63
|
+
minMs = minMs ?? CONFIG.minDelayMs;
|
|
64
|
+
maxMs = maxMs ?? CONFIG.maxDelayMs;
|
|
65
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthRandomDelays) {
|
|
66
|
+
// Fixed delay (average)
|
|
67
|
+
const target = minMs === maxMs ? minMs : (minMs + maxMs) / 2;
|
|
68
|
+
if (target > 0) {
|
|
69
|
+
await sleep(target);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Use normal distribution for more realistic delays
|
|
74
|
+
// Mean at 60% of range, standard deviation of 20% of range
|
|
75
|
+
const mean = minMs + (maxMs - minMs) * 0.6;
|
|
76
|
+
const stdDev = (maxMs - minMs) * 0.2;
|
|
77
|
+
let delay = gaussian(mean, stdDev);
|
|
78
|
+
delay = Math.max(minMs, Math.min(maxMs, delay)); // Clamp to range
|
|
79
|
+
await sleep(delay);
|
|
80
|
+
}
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Human Typing
|
|
83
|
+
// ============================================================================
|
|
84
|
+
/**
|
|
85
|
+
* Type text in a human-like manner with variable speed and optional typos
|
|
86
|
+
*
|
|
87
|
+
* Simulates realistic typing patterns:
|
|
88
|
+
* - Variable speed (45-65 WPM by default)
|
|
89
|
+
* - Occasional typos (2% chance)
|
|
90
|
+
* - Longer pauses after punctuation
|
|
91
|
+
* - Realistic character delays
|
|
92
|
+
*
|
|
93
|
+
* @param page Playwright page instance
|
|
94
|
+
* @param selector CSS selector of input element
|
|
95
|
+
* @param text Text to type
|
|
96
|
+
* @param options Typing options (wpm, withTypos)
|
|
97
|
+
*/
|
|
98
|
+
export async function humanType(page, selector, text, options = {}) {
|
|
99
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthHumanTyping) {
|
|
100
|
+
// Fast typing without stealth
|
|
101
|
+
await page.fill(selector, text);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const wpm = options.wpm ?? randomInt(CONFIG.typingWpmMin, CONFIG.typingWpmMax);
|
|
105
|
+
const withTypos = options.withTypos ?? true;
|
|
106
|
+
// Calculate average delay per character (in ms)
|
|
107
|
+
// WPM = (characters / 5) / minutes
|
|
108
|
+
// Average word length ~5 characters
|
|
109
|
+
const charsPerMinute = wpm * 5;
|
|
110
|
+
const avgDelayMs = (60 * 1000) / charsPerMinute;
|
|
111
|
+
// Clear existing text first
|
|
112
|
+
await page.fill(selector, "");
|
|
113
|
+
await randomDelay(30, 80);
|
|
114
|
+
// Click to focus
|
|
115
|
+
await page.click(selector);
|
|
116
|
+
await randomDelay(20, 60);
|
|
117
|
+
// Type each character
|
|
118
|
+
let currentText = "";
|
|
119
|
+
let i = 0;
|
|
120
|
+
while (i < text.length) {
|
|
121
|
+
const char = text[i];
|
|
122
|
+
// Simulate very rare typo (0.3% chance) and shorter correction
|
|
123
|
+
if (withTypos && Math.random() < 0.003 && i > 0) {
|
|
124
|
+
// Type wrong character
|
|
125
|
+
const wrongChar = randomChar();
|
|
126
|
+
currentText += wrongChar;
|
|
127
|
+
await page.fill(selector, currentText);
|
|
128
|
+
// Shorter notice window for faster typing
|
|
129
|
+
const noticeDelay = randomFloat(avgDelayMs * 0.6, avgDelayMs * 1.1);
|
|
130
|
+
await sleep(noticeDelay);
|
|
131
|
+
// Backspace
|
|
132
|
+
currentText = currentText.slice(0, -1);
|
|
133
|
+
await page.fill(selector, currentText);
|
|
134
|
+
await randomDelay(20, 60);
|
|
135
|
+
}
|
|
136
|
+
// Type correct character
|
|
137
|
+
currentText += char;
|
|
138
|
+
await page.fill(selector, currentText);
|
|
139
|
+
// Variable delay between characters – tuned for faster but still human-like typing
|
|
140
|
+
let delay;
|
|
141
|
+
if (char === "." || char === "!" || char === "?") {
|
|
142
|
+
delay = randomFloat(avgDelayMs * 1.05, avgDelayMs * 1.4);
|
|
143
|
+
}
|
|
144
|
+
else if (char === " ") {
|
|
145
|
+
delay = randomFloat(avgDelayMs * 0.5, avgDelayMs * 0.9);
|
|
146
|
+
}
|
|
147
|
+
else if (char === ",") {
|
|
148
|
+
delay = randomFloat(avgDelayMs * 0.9, avgDelayMs * 1.2);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Normal character
|
|
152
|
+
const variation = randomFloat(0.5, 0.9);
|
|
153
|
+
delay = avgDelayMs * variation;
|
|
154
|
+
}
|
|
155
|
+
await sleep(delay);
|
|
156
|
+
i++;
|
|
157
|
+
}
|
|
158
|
+
// Small delay after finishing typing
|
|
159
|
+
await randomDelay(50, 120);
|
|
160
|
+
}
|
|
161
|
+
// ============================================================================
|
|
162
|
+
// Mouse Movement
|
|
163
|
+
// ============================================================================
|
|
164
|
+
/**
|
|
165
|
+
* Move mouse in a realistic curved path to target coordinates
|
|
166
|
+
* Uses Bezier-like curves with jitter for natural movement
|
|
167
|
+
*
|
|
168
|
+
* @param page Playwright page instance
|
|
169
|
+
* @param targetX Target X coordinate (default: random)
|
|
170
|
+
* @param targetY Target Y coordinate (default: random)
|
|
171
|
+
* @param steps Number of steps in movement (default: random 10-25)
|
|
172
|
+
*/
|
|
173
|
+
export async function randomMouseMovement(page, targetX, targetY, steps) {
|
|
174
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const viewport = page.viewportSize() || CONFIG.viewport;
|
|
178
|
+
targetX = targetX ?? randomInt(100, viewport.width - 100);
|
|
179
|
+
targetY = targetY ?? randomInt(100, viewport.height - 100);
|
|
180
|
+
steps = steps ?? randomInt(10, 25);
|
|
181
|
+
// Start from a random position (we don't know current position)
|
|
182
|
+
const startX = randomInt(0, viewport.width);
|
|
183
|
+
const startY = randomInt(0, viewport.height);
|
|
184
|
+
// Generate curved path using Bezier-like curve
|
|
185
|
+
for (let step = 0; step < steps; step++) {
|
|
186
|
+
const progress = step / steps;
|
|
187
|
+
// Add some randomness to create a natural curve
|
|
188
|
+
const curveOffsetX = Math.sin(progress * Math.PI) * randomInt(-50, 50);
|
|
189
|
+
const curveOffsetY = Math.cos(progress * Math.PI) * randomInt(-30, 30);
|
|
190
|
+
let currentX = startX + (targetX - startX) * progress + curveOffsetX;
|
|
191
|
+
let currentY = startY + (targetY - startY) * progress + curveOffsetY;
|
|
192
|
+
// Add micro-jitter (humans never move in perfectly straight lines)
|
|
193
|
+
const jitterX = randomFloat(-3, 3);
|
|
194
|
+
const jitterY = randomFloat(-3, 3);
|
|
195
|
+
currentX = Math.max(0, Math.min(viewport.width, currentX + jitterX));
|
|
196
|
+
currentY = Math.max(0, Math.min(viewport.height, currentY + jitterY));
|
|
197
|
+
await page.mouse.move(currentX, currentY);
|
|
198
|
+
// Variable delay between movements (faster in middle, slower at ends)
|
|
199
|
+
const delay = 10 + 20 * Math.abs(0.5 - progress);
|
|
200
|
+
await sleep(delay);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// ============================================================================
|
|
204
|
+
// Realistic Click
|
|
205
|
+
// ============================================================================
|
|
206
|
+
/**
|
|
207
|
+
* Click an element with realistic human behavior
|
|
208
|
+
* Includes mouse movement, pause, and click
|
|
209
|
+
*
|
|
210
|
+
* @param page Playwright page instance
|
|
211
|
+
* @param selector CSS selector of element to click
|
|
212
|
+
* @param withMouseMovement Whether to move mouse first (default: true)
|
|
213
|
+
*/
|
|
214
|
+
export async function realisticClick(page, selector, withMouseMovement = true) {
|
|
215
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
|
|
216
|
+
await page.click(selector);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (withMouseMovement) {
|
|
220
|
+
// Move mouse to element
|
|
221
|
+
const element = await page.$(selector);
|
|
222
|
+
if (element) {
|
|
223
|
+
const box = await element.boundingBox();
|
|
224
|
+
if (box) {
|
|
225
|
+
// Don't click exactly in center (humans are imperfect)
|
|
226
|
+
const offsetX = randomFloat(-box.width * 0.2, box.width * 0.2);
|
|
227
|
+
const offsetY = randomFloat(-box.height * 0.2, box.height * 0.2);
|
|
228
|
+
const targetX = box.x + box.width / 2 + offsetX;
|
|
229
|
+
const targetY = box.y + box.height / 2 + offsetY;
|
|
230
|
+
await randomMouseMovement(page, targetX, targetY);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Small pause before clicking
|
|
235
|
+
await randomDelay(100, 300);
|
|
236
|
+
// Click
|
|
237
|
+
await page.click(selector);
|
|
238
|
+
// Small pause after clicking
|
|
239
|
+
await randomDelay(150, 400);
|
|
240
|
+
}
|
|
241
|
+
// ============================================================================
|
|
242
|
+
// Smooth Scrolling
|
|
243
|
+
// ============================================================================
|
|
244
|
+
/**
|
|
245
|
+
* Scroll the page smoothly like a human
|
|
246
|
+
* Uses multiple small steps for smooth animation
|
|
247
|
+
*
|
|
248
|
+
* @param page Playwright page instance
|
|
249
|
+
* @param amount Scroll amount in pixels (default: random 100-400)
|
|
250
|
+
* @param direction Scroll direction ("down" or "up")
|
|
251
|
+
*/
|
|
252
|
+
export async function smoothScroll(page, amount, direction = "down") {
|
|
253
|
+
amount = amount ?? randomInt(100, 400);
|
|
254
|
+
amount = Math.abs(amount);
|
|
255
|
+
if (direction === "up") {
|
|
256
|
+
amount = -amount;
|
|
257
|
+
}
|
|
258
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
|
|
259
|
+
await page.evaluate((scrollAmount) => {
|
|
260
|
+
window.scrollBy({ top: scrollAmount, behavior: "auto" });
|
|
261
|
+
}, amount);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// Scroll in multiple small steps for smoothness
|
|
265
|
+
const steps = randomInt(8, 15);
|
|
266
|
+
const stepAmount = amount / steps;
|
|
267
|
+
for (let i = 0; i < steps; i++) {
|
|
268
|
+
await page.evaluate((step) => {
|
|
269
|
+
window.scrollBy({ top: step, behavior: "smooth" });
|
|
270
|
+
}, stepAmount);
|
|
271
|
+
await sleep(randomFloat(20, 50));
|
|
272
|
+
}
|
|
273
|
+
// Pause after scrolling (humans look at content)
|
|
274
|
+
await randomDelay(300, 800);
|
|
275
|
+
}
|
|
276
|
+
// ============================================================================
|
|
277
|
+
// Reading Simulation
|
|
278
|
+
// ============================================================================
|
|
279
|
+
/**
|
|
280
|
+
* Pause as if reading text, based on length
|
|
281
|
+
* Calculates realistic reading time based on text length and WPM
|
|
282
|
+
*
|
|
283
|
+
* @param textLength Number of characters to "read"
|
|
284
|
+
* @param wpm Reading speed in words per minute (default: random 200-250)
|
|
285
|
+
*/
|
|
286
|
+
export async function readingPause(textLength, wpm) {
|
|
287
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthRandomDelays) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
wpm = wpm ?? randomInt(200, 250);
|
|
291
|
+
// Calculate reading time
|
|
292
|
+
// Average word length ~5 characters
|
|
293
|
+
const wordCount = textLength / 5;
|
|
294
|
+
const minutes = wordCount / wpm;
|
|
295
|
+
let seconds = minutes * 60;
|
|
296
|
+
// Add some randomness (humans don't read at constant speed)
|
|
297
|
+
seconds *= randomFloat(0.8, 1.2);
|
|
298
|
+
// Cap at reasonable maximum (3 seconds)
|
|
299
|
+
seconds = Math.min(seconds, 3.0);
|
|
300
|
+
await sleep(seconds * 1000);
|
|
301
|
+
}
|
|
302
|
+
// ============================================================================
|
|
303
|
+
// Random Mouse Jitter
|
|
304
|
+
// ============================================================================
|
|
305
|
+
/**
|
|
306
|
+
* Add small random mouse movements to simulate natural fidgeting
|
|
307
|
+
*
|
|
308
|
+
* @param page Playwright page instance
|
|
309
|
+
* @param iterations Number of small movements (default: 3)
|
|
310
|
+
*/
|
|
311
|
+
export async function randomMouseJitter(page, iterations = 3) {
|
|
312
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const viewport = page.viewportSize() || CONFIG.viewport;
|
|
316
|
+
for (let i = 0; i < iterations; i++) {
|
|
317
|
+
const targetX = randomInt(0, viewport.width);
|
|
318
|
+
const targetY = randomInt(0, viewport.height);
|
|
319
|
+
await page.mouse.move(targetX, targetY, { steps: randomInt(2, 4) });
|
|
320
|
+
await sleep(randomFloat(100, 300));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// ============================================================================
|
|
324
|
+
// Hover Element
|
|
325
|
+
// ============================================================================
|
|
326
|
+
/**
|
|
327
|
+
* Hover over an element with realistic mouse movement
|
|
328
|
+
*
|
|
329
|
+
* @param page Playwright page instance
|
|
330
|
+
* @param selector CSS selector of element to hover
|
|
331
|
+
*/
|
|
332
|
+
export async function hoverElement(page, selector) {
|
|
333
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthMouseMovements) {
|
|
334
|
+
await page.hover(selector);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const element = await page.$(selector);
|
|
338
|
+
if (element) {
|
|
339
|
+
const box = await element.boundingBox();
|
|
340
|
+
if (box) {
|
|
341
|
+
// Move to center of element
|
|
342
|
+
const targetX = box.x + box.width / 2;
|
|
343
|
+
const targetY = box.y + box.height / 2;
|
|
344
|
+
await randomMouseMovement(page, targetX, targetY);
|
|
345
|
+
await page.hover(selector);
|
|
346
|
+
await randomDelay(200, 500);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// ============================================================================
|
|
351
|
+
// Simulate Reading Page
|
|
352
|
+
// ============================================================================
|
|
353
|
+
/**
|
|
354
|
+
* Simulate reading a page with scrolling and pauses
|
|
355
|
+
* Adds realistic behavior of scrolling and reading content
|
|
356
|
+
*
|
|
357
|
+
* @param page Playwright page instance
|
|
358
|
+
*/
|
|
359
|
+
export async function simulateReadingPage(page) {
|
|
360
|
+
if (!CONFIG.stealthEnabled || !CONFIG.stealthRandomDelays) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
// Random number of scroll actions
|
|
364
|
+
const scrollCount = randomInt(1, 3);
|
|
365
|
+
for (let i = 0; i < scrollCount; i++) {
|
|
366
|
+
// Scroll down
|
|
367
|
+
await smoothScroll(page, undefined, "down");
|
|
368
|
+
// "Read" the visible content
|
|
369
|
+
await randomDelay(800, 1500);
|
|
370
|
+
// Sometimes scroll up a bit (humans do this)
|
|
371
|
+
if (Math.random() < 0.3) {
|
|
372
|
+
await smoothScroll(page, randomInt(50, 150), "up");
|
|
373
|
+
await randomDelay(400, 800);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// ============================================================================
|
|
378
|
+
// Exports
|
|
379
|
+
// ============================================================================
|
|
380
|
+
export default {
|
|
381
|
+
sleep,
|
|
382
|
+
randomInt,
|
|
383
|
+
randomFloat,
|
|
384
|
+
randomChar,
|
|
385
|
+
gaussian,
|
|
386
|
+
randomDelay,
|
|
387
|
+
humanType,
|
|
388
|
+
randomMouseMovement,
|
|
389
|
+
realisticClick,
|
|
390
|
+
smoothScroll,
|
|
391
|
+
readingPause,
|
|
392
|
+
randomMouseJitter,
|
|
393
|
+
hoverElement,
|
|
394
|
+
simulateReadingPage,
|
|
395
|
+
};
|
|
396
|
+
//# sourceMappingURL=stealth-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth-utils.js","sourceRoot":"","sources":["../../src/utils/stealth-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth-utils.test.d.ts","sourceRoot":"","sources":["../../src/utils/stealth-utils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for stealth-utils.ts
|
|
3
|
+
*
|
|
4
|
+
* Unit tests for human-like behavior simulation utilities.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { randomInt, randomFloat, randomChar, gaussian, sleep, } from './stealth-utils.js';
|
|
8
|
+
describe('stealth-utils', () => {
|
|
9
|
+
describe('randomInt', () => {
|
|
10
|
+
it('should return integer within range', () => {
|
|
11
|
+
for (let i = 0; i < 100; i++) {
|
|
12
|
+
const result = randomInt(1, 10);
|
|
13
|
+
expect(result).toBeGreaterThanOrEqual(1);
|
|
14
|
+
expect(result).toBeLessThanOrEqual(10);
|
|
15
|
+
expect(Number.isInteger(result)).toBe(true);
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
it('should handle same min and max', () => {
|
|
19
|
+
expect(randomInt(5, 5)).toBe(5);
|
|
20
|
+
});
|
|
21
|
+
it('should handle zero range', () => {
|
|
22
|
+
expect(randomInt(0, 0)).toBe(0);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('randomFloat', () => {
|
|
26
|
+
it('should return float within range', () => {
|
|
27
|
+
for (let i = 0; i < 100; i++) {
|
|
28
|
+
const result = randomFloat(1.0, 10.0);
|
|
29
|
+
expect(result).toBeGreaterThanOrEqual(1.0);
|
|
30
|
+
expect(result).toBeLessThanOrEqual(10.0);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
it('should handle same min and max', () => {
|
|
34
|
+
expect(randomFloat(5.0, 5.0)).toBe(5.0);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('randomChar', () => {
|
|
38
|
+
it('should return lowercase letter', () => {
|
|
39
|
+
for (let i = 0; i < 100; i++) {
|
|
40
|
+
const result = randomChar();
|
|
41
|
+
expect(result).toMatch(/^[a-z]$/);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('gaussian', () => {
|
|
46
|
+
it('should return values around mean', () => {
|
|
47
|
+
const mean = 100;
|
|
48
|
+
const stdDev = 10;
|
|
49
|
+
const values = [];
|
|
50
|
+
for (let i = 0; i < 1000; i++) {
|
|
51
|
+
values.push(gaussian(mean, stdDev));
|
|
52
|
+
}
|
|
53
|
+
const avg = values.reduce((a, b) => a + b, 0) / values.length;
|
|
54
|
+
// Average should be close to mean (within 2 std devs)
|
|
55
|
+
expect(Math.abs(avg - mean)).toBeLessThan(stdDev * 2);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('sleep', () => {
|
|
59
|
+
it('should delay for specified time', async () => {
|
|
60
|
+
const start = Date.now();
|
|
61
|
+
await sleep(50);
|
|
62
|
+
const elapsed = Date.now() - start;
|
|
63
|
+
// Allow some tolerance for timing
|
|
64
|
+
expect(elapsed).toBeGreaterThanOrEqual(45);
|
|
65
|
+
expect(elapsed).toBeLessThan(100);
|
|
66
|
+
});
|
|
67
|
+
it('should resolve without error', async () => {
|
|
68
|
+
await expect(sleep(10)).resolves.toBeUndefined();
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=stealth-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stealth-utils.test.js","sourceRoot":"","sources":["../../src/utils/stealth-utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
## Configuration
|
|
2
|
+
|
|
3
|
+
**No config files needed!** The server works out of the box with sensible defaults.
|
|
4
|
+
|
|
5
|
+
### Configuration Priority (highest to lowest):
|
|
6
|
+
1. **Tool Parameters** - Claude passes settings like `browser_options` at runtime
|
|
7
|
+
2. **Environment Variables** - Optional overrides for advanced users
|
|
8
|
+
3. **Hardcoded Defaults** - Sensible defaults that work for most users
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Tool Parameters (Runtime Configuration)
|
|
13
|
+
|
|
14
|
+
Claude can control browser behavior via the `browser_options` parameter in tools like `ask_question`, `setup_auth`, and `re_auth`:
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
browser_options: {
|
|
18
|
+
show: boolean, // Show browser window (overrides headless)
|
|
19
|
+
headless: boolean, // Run in headless mode (default: true)
|
|
20
|
+
timeout_ms: number, // Browser timeout in ms (default: 30000)
|
|
21
|
+
|
|
22
|
+
stealth: {
|
|
23
|
+
enabled: boolean, // Master switch (default: true)
|
|
24
|
+
random_delays: boolean, // Random delays between actions (default: true)
|
|
25
|
+
human_typing: boolean, // Human-like typing (default: true)
|
|
26
|
+
mouse_movements: boolean, // Realistic mouse movements (default: true)
|
|
27
|
+
typing_wpm_min: number, // Min typing speed (default: 160)
|
|
28
|
+
typing_wpm_max: number, // Max typing speed (default: 240)
|
|
29
|
+
delay_min_ms: number, // Min delay between actions (default: 100)
|
|
30
|
+
delay_max_ms: number, // Max delay between actions (default: 400)
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
viewport: {
|
|
34
|
+
width: number, // Viewport width (default: 1024)
|
|
35
|
+
height: number, // Viewport height (default: 768)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Example usage:**
|
|
41
|
+
- "Research this and show me the browser" → Sets `show: true`
|
|
42
|
+
- "Use slow typing for this query" → Adjusts typing WPM via stealth settings
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Environment Variables (Optional)
|
|
47
|
+
|
|
48
|
+
For advanced users who want to set global defaults:
|
|
49
|
+
- Auth
|
|
50
|
+
- `AUTO_LOGIN_ENABLED` — `true|false` (default `false`)
|
|
51
|
+
- `LOGIN_EMAIL`, `LOGIN_PASSWORD` — for auto‑login if enabled
|
|
52
|
+
- `AUTO_LOGIN_TIMEOUT_MS` (default `120000`)
|
|
53
|
+
- Stealth / Human-like behavior
|
|
54
|
+
- `STEALTH_ENABLED` — `true|false` (default `true`) — Master switch for all stealth features
|
|
55
|
+
- `STEALTH_RANDOM_DELAYS` — `true|false` (default `true`)
|
|
56
|
+
- `STEALTH_HUMAN_TYPING` — `true|false` (default `true`)
|
|
57
|
+
- `STEALTH_MOUSE_MOVEMENTS` — `true|false` (default `true`)
|
|
58
|
+
- Typing speed (human‑like)
|
|
59
|
+
- `TYPING_WPM_MIN` (default 160), `TYPING_WPM_MAX` (default 240)
|
|
60
|
+
- Delays (human‑like)
|
|
61
|
+
- `MIN_DELAY_MS` (default 100), `MAX_DELAY_MS` (default 400)
|
|
62
|
+
- Browser
|
|
63
|
+
- `HEADLESS` (default `true`), `BROWSER_TIMEOUT` (ms, default `30000`)
|
|
64
|
+
- Sessions
|
|
65
|
+
- `MAX_SESSIONS` (default 10), `SESSION_TIMEOUT` (s, default 900)
|
|
66
|
+
- Multi‑instance profile strategy
|
|
67
|
+
- `NOTEBOOK_PROFILE_STRATEGY` — `auto|single|isolated` (default `auto`)
|
|
68
|
+
- `NOTEBOOK_CLONE_PROFILE` — clone base profile into isolated dir (default `false`)
|
|
69
|
+
- Cleanup (to prevent disk bloat)
|
|
70
|
+
- `NOTEBOOK_CLEANUP_ON_STARTUP` (default `true`)
|
|
71
|
+
- `NOTEBOOK_CLEANUP_ON_SHUTDOWN` (default `true`)
|
|
72
|
+
- `NOTEBOOK_INSTANCE_TTL_HOURS` (default `72`)
|
|
73
|
+
- `NOTEBOOK_INSTANCE_MAX_COUNT` (default `20`)
|
|
74
|
+
- Library metadata (optional hints)
|
|
75
|
+
- `NOTEBOOK_DESCRIPTION`, `NOTEBOOK_TOPICS`, `NOTEBOOK_CONTENT_TYPES`, `NOTEBOOK_USE_CASES`
|
|
76
|
+
- `NOTEBOOK_URL` — optional; leave empty and manage notebooks via the library
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## Storage Paths
|
|
81
|
+
|
|
82
|
+
The server uses platform-specific paths via [env-paths](https://github.com/sindresorhus/env-paths)
|
|
83
|
+
- **Linux**: `~/.local/share/notebooklm-mcp/`
|
|
84
|
+
- **macOS**: `~/Library/Application Support/notebooklm-mcp/`
|
|
85
|
+
- **Windows**: `%LOCALAPPDATA%\notebooklm-mcp\`
|
|
86
|
+
|
|
87
|
+
**What's stored:**
|
|
88
|
+
- `chrome_profile/` - Persistent Chrome browser profile with login session
|
|
89
|
+
- `browser_state/` - Browser context state and cookies
|
|
90
|
+
- `library.json` - Your notebook library with metadata
|
|
91
|
+
- `chrome_profile_instances/` - Isolated Chrome profiles for concurrent sessions
|
|
92
|
+
|
|
93
|
+
**No config.json file** - Configuration is purely via environment variables or tool parameters!
|
|
94
|
+
|
package/docs/02_tools.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
## Tools
|
|
2
|
+
|
|
3
|
+
### Core
|
|
4
|
+
- `ask_question`
|
|
5
|
+
- Parameters: `question` (string, required), optional `session_id`, `notebook_id`, `notebook_url`, `show_browser`.
|
|
6
|
+
- Returns NotebookLM's answer plus the follow-up reminder.
|
|
7
|
+
- `list_sessions`, `close_session`, `reset_session`
|
|
8
|
+
- Inspect or manage active browser sessions.
|
|
9
|
+
- `get_health`
|
|
10
|
+
- Summaries auth status, active sessions, and configuration.
|
|
11
|
+
- `setup_auth`
|
|
12
|
+
- Opens the persistent Chrome profile so you can log in manually.
|
|
13
|
+
- `re_auth`
|
|
14
|
+
- Switch to a different Google account or re-authenticate.
|
|
15
|
+
- Use when NotebookLM rate limit is reached (50 queries/day for free accounts).
|
|
16
|
+
- Closes all sessions, clears auth data, and opens browser for fresh login.
|
|
17
|
+
|
|
18
|
+
### Notebook library
|
|
19
|
+
- `add_notebook` – Safe conversational add; expects confirmation before writing.
|
|
20
|
+
- `list_notebooks` – Returns id, name, topics, URL, metadata for every entry.
|
|
21
|
+
- `get_notebook` – Fetch a single notebook by id.
|
|
22
|
+
- `select_notebook` – Set the active default notebook.
|
|
23
|
+
- `update_notebook` – Modify metadata fields.
|
|
24
|
+
- `remove_notebook` – Removes entries from the library (not the original NotebookLM notebook).
|
|
25
|
+
- `search_notebooks` – Simple query across name/description/topics/tags.
|
|
26
|
+
- `get_library_stats` – Aggregate statistics (total notebooks, usage counts, etc.).
|
|
27
|
+
|
|
28
|
+
### Resources
|
|
29
|
+
- `notebooklm://library`
|
|
30
|
+
- JSON representation of the full library: active notebook, stats, individual notebooks.
|
|
31
|
+
- `notebooklm://library/{id}`
|
|
32
|
+
- Fetch metadata for a specific notebook. The `{id}` completion pulls from the library automatically.
|
|
33
|
+
|
|
34
|
+
**Remember:** Every `ask_question` response ends with a reminder that nudges your agent to keep asking until the user’s task is fully addressed.
|