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,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Context Manager with Persistent Chrome Profile
|
|
3
|
+
*
|
|
4
|
+
* Manages ONE global persistent BrowserContext for ALL sessions.
|
|
5
|
+
* This is critical for avoiding bot detection:
|
|
6
|
+
*
|
|
7
|
+
* - Google tracks browser fingerprints (Canvas, WebGL, Audio, Fonts, etc.)
|
|
8
|
+
* - Multiple contexts = Multiple fingerprints = Suspicious!
|
|
9
|
+
* - ONE persistent context = ONE consistent fingerprint = Normal user
|
|
10
|
+
* - Persistent user_data_dir = SAME fingerprint across all app restarts!
|
|
11
|
+
*
|
|
12
|
+
* Based on the Python implementation from shared_context_manager.py
|
|
13
|
+
*/
|
|
14
|
+
import { chromium } from "patchright";
|
|
15
|
+
import { CONFIG } from "../config.js";
|
|
16
|
+
import { log } from "../utils/logger.js";
|
|
17
|
+
import fs from "fs";
|
|
18
|
+
import path from "path";
|
|
19
|
+
/**
|
|
20
|
+
* Shared Context Manager
|
|
21
|
+
*
|
|
22
|
+
* Benefits:
|
|
23
|
+
* 1. ONE consistent browser fingerprint for all sessions
|
|
24
|
+
* 2. Fingerprint persists across app restarts (user_data_dir)
|
|
25
|
+
* 3. Mimics real user behavior (one browser, multiple tabs)
|
|
26
|
+
* 4. Google sees: "Same browser since day 1"
|
|
27
|
+
*/
|
|
28
|
+
export class SharedContextManager {
|
|
29
|
+
authManager;
|
|
30
|
+
globalContext = null;
|
|
31
|
+
contextCreatedAt = null;
|
|
32
|
+
currentProfileDir = null;
|
|
33
|
+
isIsolatedProfile = false;
|
|
34
|
+
currentHeadlessMode = null;
|
|
35
|
+
constructor(authManager) {
|
|
36
|
+
this.authManager = authManager;
|
|
37
|
+
log.info("🌐 SharedContextManager initialized (PERSISTENT MODE)");
|
|
38
|
+
log.info(` Chrome Profile: ${CONFIG.chromeProfileDir}`);
|
|
39
|
+
log.success(" Fingerprint: PERSISTENT across restarts! 🎯");
|
|
40
|
+
// Cleanup old isolated profiles at startup (best-effort)
|
|
41
|
+
if (CONFIG.cleanupInstancesOnStartup) {
|
|
42
|
+
void this.pruneIsolatedProfiles("startup");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get the global shared persistent context, or create new if needed
|
|
47
|
+
*
|
|
48
|
+
* Context is recreated only when:
|
|
49
|
+
* - First time (no context exists in this app instance)
|
|
50
|
+
* - Context was closed/invalid
|
|
51
|
+
*
|
|
52
|
+
* Note: Auth expiry does NOT recreate context - we reuse the SAME
|
|
53
|
+
* fingerprint and just re-login!
|
|
54
|
+
*
|
|
55
|
+
* @param overrideHeadless Optional override for headless mode (true = show browser)
|
|
56
|
+
*/
|
|
57
|
+
async getOrCreateContext(overrideHeadless) {
|
|
58
|
+
// Check if headless mode needs to be changed (e.g., show_browser=true)
|
|
59
|
+
// If yes, close the browser so it gets recreated with the new mode
|
|
60
|
+
if (this.needsHeadlessModeChange(overrideHeadless)) {
|
|
61
|
+
log.warning("🔄 Headless mode change detected - recreating browser context...");
|
|
62
|
+
await this.closeContext();
|
|
63
|
+
}
|
|
64
|
+
if (await this.needsRecreation()) {
|
|
65
|
+
log.warning("🔄 Creating/Loading persistent context...");
|
|
66
|
+
await this.recreateContext(overrideHeadless);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
log.success("♻️ Reusing existing persistent context");
|
|
70
|
+
}
|
|
71
|
+
return this.globalContext;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if global context needs to be recreated
|
|
75
|
+
*/
|
|
76
|
+
async needsRecreation() {
|
|
77
|
+
// No context exists yet (first time or after manual close)
|
|
78
|
+
if (!this.globalContext) {
|
|
79
|
+
log.info(" ℹ️ No context exists yet");
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
// Async validity check (will throw if closed)
|
|
83
|
+
try {
|
|
84
|
+
await this.globalContext.cookies();
|
|
85
|
+
log.dim(" ✅ Context still valid (browser open)");
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
log.warning(" ⚠️ Context appears closed - will recreate");
|
|
90
|
+
this.globalContext = null;
|
|
91
|
+
this.contextCreatedAt = null;
|
|
92
|
+
this.currentHeadlessMode = null;
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Create/Load the global PERSISTENT context with Chrome user_data_dir
|
|
98
|
+
*
|
|
99
|
+
* This is THE KEY to fingerprint persistence!
|
|
100
|
+
*
|
|
101
|
+
* First time:
|
|
102
|
+
* - Chrome creates new profile in user_data_dir
|
|
103
|
+
* - Generates fingerprint (Canvas, WebGL, Audio, etc.)
|
|
104
|
+
* - Saves everything to disk
|
|
105
|
+
*
|
|
106
|
+
* Subsequent starts:
|
|
107
|
+
* - Chrome loads profile from user_data_dir
|
|
108
|
+
* - SAME fingerprint as before! ✅
|
|
109
|
+
* - Google sees: "Same browser since day 1"
|
|
110
|
+
*
|
|
111
|
+
* @param overrideHeadless Optional override for headless mode (true = show browser)
|
|
112
|
+
*/
|
|
113
|
+
async recreateContext(overrideHeadless) {
|
|
114
|
+
// Close old context if exists
|
|
115
|
+
if (this.globalContext) {
|
|
116
|
+
try {
|
|
117
|
+
log.info(" 🗑️ Closing old context...");
|
|
118
|
+
await this.globalContext.close();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
log.warning(` ⚠️ Error closing old context: ${error}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check for saved auth
|
|
125
|
+
const statePath = await this.authManager.getValidStatePath();
|
|
126
|
+
if (statePath) {
|
|
127
|
+
log.success(` 📂 Found auth state: ${statePath}`);
|
|
128
|
+
log.info(" 💡 Will load cookies into persistent profile");
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
log.warning(" 🆕 No saved auth - fresh persistent profile");
|
|
132
|
+
log.info(" 💡 First login will save auth to persistent profile");
|
|
133
|
+
}
|
|
134
|
+
// Determine headless mode: use override if provided, otherwise use CONFIG
|
|
135
|
+
const shouldBeHeadless = overrideHeadless !== undefined ? !overrideHeadless : CONFIG.headless;
|
|
136
|
+
if (overrideHeadless !== undefined) {
|
|
137
|
+
log.info(` Browser visibility override: ${overrideHeadless ? 'VISIBLE' : 'HEADLESS'}`);
|
|
138
|
+
}
|
|
139
|
+
// Build launch options for persistent context
|
|
140
|
+
// NOTE: userDataDir is passed as first parameter, NOT in options!
|
|
141
|
+
const launchOptions = {
|
|
142
|
+
headless: shouldBeHeadless,
|
|
143
|
+
channel: "chrome",
|
|
144
|
+
viewport: CONFIG.viewport,
|
|
145
|
+
locale: "en-US",
|
|
146
|
+
timezoneId: "Europe/Berlin",
|
|
147
|
+
// ✅ CRITICAL FIX: Pass storageState directly at launch!
|
|
148
|
+
// This is the PROPER way to handle session cookies (Playwright bug workaround)
|
|
149
|
+
// Benefits:
|
|
150
|
+
// - Session cookies persist correctly
|
|
151
|
+
// - No need for addCookies() workarounds
|
|
152
|
+
// - Chrome loads everything automatically
|
|
153
|
+
...(statePath && { storageState: statePath }),
|
|
154
|
+
args: [
|
|
155
|
+
"--disable-blink-features=AutomationControlled",
|
|
156
|
+
"--disable-dev-shm-usage",
|
|
157
|
+
"--no-first-run",
|
|
158
|
+
"--no-default-browser-check",
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
// 🔥 CRITICAL: launchPersistentContext creates/loads Chrome profile
|
|
162
|
+
// Strategy handling for concurrent instances
|
|
163
|
+
const baseProfile = CONFIG.chromeProfileDir;
|
|
164
|
+
const strategy = CONFIG.profileStrategy;
|
|
165
|
+
const tryLaunch = async (userDataDir) => {
|
|
166
|
+
log.info(" 🚀 Launching persistent Chrome context...");
|
|
167
|
+
log.dim(` 📍 Profile location: ${userDataDir}`);
|
|
168
|
+
if (statePath) {
|
|
169
|
+
log.info(` 📄 Loading auth state: ${statePath}`);
|
|
170
|
+
}
|
|
171
|
+
return chromium.launchPersistentContext(userDataDir, launchOptions);
|
|
172
|
+
};
|
|
173
|
+
try {
|
|
174
|
+
if (strategy === "isolated") {
|
|
175
|
+
const isolatedDir = await this.prepareIsolatedProfileDir(baseProfile);
|
|
176
|
+
this.globalContext = await tryLaunch(isolatedDir);
|
|
177
|
+
this.currentProfileDir = isolatedDir;
|
|
178
|
+
this.isIsolatedProfile = true;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
// single or auto → first try base
|
|
182
|
+
this.globalContext = await tryLaunch(baseProfile);
|
|
183
|
+
this.currentProfileDir = baseProfile;
|
|
184
|
+
this.isIsolatedProfile = false;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
const msg = String(e?.message || e);
|
|
189
|
+
const isSingleton = /ProcessSingleton|SingletonLock|profile is already in use/i.test(msg);
|
|
190
|
+
if (strategy === "single" || !isSingleton) {
|
|
191
|
+
// hard fail
|
|
192
|
+
if (isSingleton && strategy === "single") {
|
|
193
|
+
log.error("❌ Chrome profile already in use and strategy=single. Close other instance or set NOTEBOOK_PROFILE_STRATEGY=auto/isolated.");
|
|
194
|
+
}
|
|
195
|
+
throw e;
|
|
196
|
+
}
|
|
197
|
+
// auto strategy with lock → fall back to isolated instance dir
|
|
198
|
+
log.warning("⚠️ Base Chrome profile in use by another process. Falling back to isolated per-instance profile...");
|
|
199
|
+
const isolatedDir = await this.prepareIsolatedProfileDir(baseProfile);
|
|
200
|
+
this.globalContext = await tryLaunch(isolatedDir);
|
|
201
|
+
this.currentProfileDir = isolatedDir;
|
|
202
|
+
this.isIsolatedProfile = true;
|
|
203
|
+
}
|
|
204
|
+
this.contextCreatedAt = Date.now();
|
|
205
|
+
this.currentHeadlessMode = shouldBeHeadless;
|
|
206
|
+
// Track close event to force recreation next time
|
|
207
|
+
try {
|
|
208
|
+
this.globalContext.on("close", () => {
|
|
209
|
+
log.warning(" 🛑 Persistent context was closed externally");
|
|
210
|
+
this.globalContext = null;
|
|
211
|
+
this.contextCreatedAt = null;
|
|
212
|
+
this.currentHeadlessMode = null;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch { }
|
|
216
|
+
// Validate cookies if we loaded state
|
|
217
|
+
if (statePath) {
|
|
218
|
+
try {
|
|
219
|
+
if (await this.authManager.validateCookiesExpiry(this.globalContext)) {
|
|
220
|
+
log.success(" ✅ Authentication state loaded successfully");
|
|
221
|
+
log.success(" 🎯 Session cookies persisted correctly!");
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
log.warning(" ⚠️ Cookies expired - will need re-login");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
log.warning(` ⚠️ Could not validate auth state: ${error}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
log.success("✅ Persistent context ready!");
|
|
232
|
+
log.dim(` Context ID: ${this.getContextId()}`);
|
|
233
|
+
log.dim(` Chrome Profile: ${CONFIG.chromeProfileDir}`);
|
|
234
|
+
log.success(" 🎯 Fingerprint: PERSISTENT (same across restarts!)");
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Manually close the global context (e.g., on shutdown)
|
|
238
|
+
*
|
|
239
|
+
* Note: This closes the context for ALL sessions!
|
|
240
|
+
* Chrome will save everything to user_data_dir automatically.
|
|
241
|
+
*/
|
|
242
|
+
async closeContext() {
|
|
243
|
+
if (this.globalContext) {
|
|
244
|
+
log.warning("🛑 Closing persistent context...");
|
|
245
|
+
log.info(" 💾 Chrome is saving profile to disk...");
|
|
246
|
+
try {
|
|
247
|
+
await this.globalContext.close();
|
|
248
|
+
this.globalContext = null;
|
|
249
|
+
this.contextCreatedAt = null;
|
|
250
|
+
this.currentHeadlessMode = null;
|
|
251
|
+
log.success("✅ Persistent context closed");
|
|
252
|
+
log.success(` 💾 Profile saved: ${this.currentProfileDir || CONFIG.chromeProfileDir}`);
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
log.error(`❌ Error closing context: ${error}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Best-effort cleanup on shutdown
|
|
259
|
+
if (CONFIG.cleanupInstancesOnShutdown) {
|
|
260
|
+
try {
|
|
261
|
+
// If this process used an isolated profile, remove it now
|
|
262
|
+
if (this.isIsolatedProfile && this.currentProfileDir) {
|
|
263
|
+
await this.safeRemoveIsolatedProfile(this.currentProfileDir);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
log.warning(` ⚠️ Cleanup (self) failed: ${err}`);
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
await this.pruneIsolatedProfiles("shutdown");
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
log.warning(` ⚠️ Cleanup (prune) failed: ${err}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async prepareIsolatedProfileDir(baseProfile) {
|
|
278
|
+
const stamp = `${process.pid}-${Date.now()}`;
|
|
279
|
+
const dir = path.join(CONFIG.chromeInstancesDir, `instance-${stamp}`);
|
|
280
|
+
try {
|
|
281
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
282
|
+
if (CONFIG.cloneProfileOnIsolated && fs.existsSync(baseProfile)) {
|
|
283
|
+
log.info(" 🧬 Cloning base Chrome profile into isolated instance (may take time)...");
|
|
284
|
+
// Best-effort clone without locks
|
|
285
|
+
await fs.promises.cp(baseProfile, dir, {
|
|
286
|
+
recursive: true,
|
|
287
|
+
errorOnExist: false,
|
|
288
|
+
force: true,
|
|
289
|
+
filter: (src) => {
|
|
290
|
+
const bn = path.basename(src);
|
|
291
|
+
return !/^Singleton/i.test(bn) && !bn.endsWith(".lock") && !bn.endsWith(".tmp");
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
log.success(" ✅ Clone complete");
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
log.info(" 🧪 Using fresh isolated Chrome profile (no clone)");
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
log.warning(` ⚠️ Could not prepare isolated profile: ${err}`);
|
|
302
|
+
}
|
|
303
|
+
return dir;
|
|
304
|
+
}
|
|
305
|
+
async pruneIsolatedProfiles(phase) {
|
|
306
|
+
const root = CONFIG.chromeInstancesDir;
|
|
307
|
+
let entries;
|
|
308
|
+
try {
|
|
309
|
+
const names = await fs.promises.readdir(root, { withFileTypes: true });
|
|
310
|
+
entries = [];
|
|
311
|
+
for (const d of names) {
|
|
312
|
+
if (!d.isDirectory())
|
|
313
|
+
continue;
|
|
314
|
+
const p = path.join(root, d.name);
|
|
315
|
+
try {
|
|
316
|
+
const st = await fs.promises.stat(p);
|
|
317
|
+
entries.push({ path: p, mtimeMs: st.mtimeMs });
|
|
318
|
+
}
|
|
319
|
+
catch { }
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return; // directory absent is fine
|
|
324
|
+
}
|
|
325
|
+
if (entries.length === 0)
|
|
326
|
+
return;
|
|
327
|
+
const now = Date.now();
|
|
328
|
+
const ttlMs = CONFIG.instanceProfileTtlHours * 3600 * 1000;
|
|
329
|
+
const maxCount = Math.max(0, CONFIG.instanceProfileMaxCount);
|
|
330
|
+
// Sort newest first
|
|
331
|
+
entries.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
332
|
+
const keep = new Set();
|
|
333
|
+
const toDelete = new Set();
|
|
334
|
+
// Keep newest up to maxCount
|
|
335
|
+
for (let i = 0; i < entries.length; i++) {
|
|
336
|
+
const e = entries[i];
|
|
337
|
+
const ageMs = now - e.mtimeMs;
|
|
338
|
+
const overTtl = ttlMs > 0 && ageMs > ttlMs;
|
|
339
|
+
const overCount = i >= maxCount;
|
|
340
|
+
const isCurrent = this.currentProfileDir && path.resolve(e.path) === path.resolve(this.currentProfileDir);
|
|
341
|
+
if (!isCurrent && (overTtl || overCount)) {
|
|
342
|
+
toDelete.add(e.path);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
keep.add(e.path);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (toDelete.size === 0)
|
|
349
|
+
return;
|
|
350
|
+
log.info(`🧹 Pruning isolated profiles (${phase})...`);
|
|
351
|
+
for (const p of toDelete) {
|
|
352
|
+
try {
|
|
353
|
+
await this.safeRemoveIsolatedProfile(p);
|
|
354
|
+
log.dim(` 🗑️ removed ${p}`);
|
|
355
|
+
}
|
|
356
|
+
catch (err) {
|
|
357
|
+
log.warning(` ⚠️ Failed to remove ${p}: ${err}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
async safeRemoveIsolatedProfile(dir) {
|
|
362
|
+
// Never remove the base profile
|
|
363
|
+
if (path.resolve(dir) === path.resolve(CONFIG.chromeProfileDir))
|
|
364
|
+
return;
|
|
365
|
+
// Only remove within instances root
|
|
366
|
+
if (!path.resolve(dir).startsWith(path.resolve(CONFIG.chromeInstancesDir)))
|
|
367
|
+
return;
|
|
368
|
+
// Best-effort: try removing typical lock files first, then the directory
|
|
369
|
+
try {
|
|
370
|
+
await fs.promises.rm(dir, { recursive: true, force: true });
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
// If rm is not available in older node, fallback to rmdir
|
|
374
|
+
try {
|
|
375
|
+
await fs.promises.rmdir(dir, { recursive: true });
|
|
376
|
+
}
|
|
377
|
+
catch { }
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Get information about the global persistent context
|
|
382
|
+
*/
|
|
383
|
+
getContextInfo() {
|
|
384
|
+
if (!this.globalContext) {
|
|
385
|
+
return {
|
|
386
|
+
exists: false,
|
|
387
|
+
user_data_dir: CONFIG.chromeProfileDir,
|
|
388
|
+
persistent: true,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
const ageSeconds = this.contextCreatedAt
|
|
392
|
+
? (Date.now() - this.contextCreatedAt) / 1000
|
|
393
|
+
: undefined;
|
|
394
|
+
const ageHours = ageSeconds ? ageSeconds / 3600 : undefined;
|
|
395
|
+
return {
|
|
396
|
+
exists: true,
|
|
397
|
+
age_seconds: ageSeconds,
|
|
398
|
+
age_hours: ageHours,
|
|
399
|
+
fingerprint_id: this.getContextId(),
|
|
400
|
+
user_data_dir: CONFIG.chromeProfileDir,
|
|
401
|
+
persistent: true,
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Get the current headless mode of the browser context
|
|
406
|
+
*
|
|
407
|
+
* @returns boolean | null - true if headless, false if visible, null if no context exists
|
|
408
|
+
*/
|
|
409
|
+
getCurrentHeadlessMode() {
|
|
410
|
+
return this.currentHeadlessMode;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Check if the browser context needs to be recreated due to headless mode change
|
|
414
|
+
*
|
|
415
|
+
* @param overrideHeadless - Optional override for headless mode (true = show browser)
|
|
416
|
+
* @returns boolean - true if context needs to be recreated with new mode
|
|
417
|
+
*/
|
|
418
|
+
needsHeadlessModeChange(overrideHeadless) {
|
|
419
|
+
// No context exists yet = will be created with correct mode anyway
|
|
420
|
+
if (this.currentHeadlessMode === null) {
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
// Calculate target headless mode
|
|
424
|
+
// If override is specified, use it (!overrideHeadless because true = show browser = headless false)
|
|
425
|
+
// Otherwise, use CONFIG.headless (which may have been temporarily modified by browser_options)
|
|
426
|
+
const targetHeadless = overrideHeadless !== undefined
|
|
427
|
+
? !overrideHeadless
|
|
428
|
+
: CONFIG.headless;
|
|
429
|
+
// Compare with current mode
|
|
430
|
+
const needsChange = this.currentHeadlessMode !== targetHeadless;
|
|
431
|
+
if (needsChange) {
|
|
432
|
+
log.info(` Browser mode change detected: ${this.currentHeadlessMode ? 'HEADLESS' : 'VISIBLE'} → ${targetHeadless ? 'HEADLESS' : 'VISIBLE'}`);
|
|
433
|
+
}
|
|
434
|
+
return needsChange;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Get context ID for logging
|
|
438
|
+
*/
|
|
439
|
+
getContextId() {
|
|
440
|
+
if (!this.globalContext) {
|
|
441
|
+
return "none";
|
|
442
|
+
}
|
|
443
|
+
// Use object hash as ID
|
|
444
|
+
return `ctx-${this.globalContext._guid || "unknown"}`;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=shared-context-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-context-manager.js","sourceRoot":"","sources":["../../src/session/shared-context-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Manager for NotebookLM
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Interactive login (headful browser for setup)
|
|
6
|
+
* - Auto-login with credentials (email/password from ENV)
|
|
7
|
+
* - Browser state persistence (cookies + localStorage + sessionStorage)
|
|
8
|
+
* - Cookie expiry validation
|
|
9
|
+
* - State expiry checks (24h file age)
|
|
10
|
+
* - Hard reset for clean start
|
|
11
|
+
*
|
|
12
|
+
* Based on the Python implementation from auth.py
|
|
13
|
+
*/
|
|
14
|
+
import type { BrowserContext, Page } from "patchright";
|
|
15
|
+
import type { ProgressCallback } from "../types.js";
|
|
16
|
+
export declare class AuthManager {
|
|
17
|
+
private stateFilePath;
|
|
18
|
+
private sessionFilePath;
|
|
19
|
+
constructor();
|
|
20
|
+
/**
|
|
21
|
+
* Save entire browser state (cookies + localStorage)
|
|
22
|
+
*/
|
|
23
|
+
saveBrowserState(context: BrowserContext, page?: Page): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if saved browser state exists
|
|
26
|
+
*/
|
|
27
|
+
hasSavedState(): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Get path to saved browser state
|
|
30
|
+
*/
|
|
31
|
+
getStatePath(): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* Get valid state path (checks expiry)
|
|
34
|
+
*/
|
|
35
|
+
getValidStatePath(): Promise<string | null>;
|
|
36
|
+
/**
|
|
37
|
+
* Load sessionStorage from file
|
|
38
|
+
*/
|
|
39
|
+
loadSessionStorage(): Promise<Record<string, string> | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Validate if saved state is still valid
|
|
42
|
+
*/
|
|
43
|
+
validateState(context: BrowserContext): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Validate if critical authentication cookies are still valid
|
|
46
|
+
*/
|
|
47
|
+
validateCookiesExpiry(context: BrowserContext): Promise<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* Check if the saved state file is too old (>24 hours)
|
|
50
|
+
*/
|
|
51
|
+
isStateExpired(): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Perform interactive login
|
|
54
|
+
* User will see a browser window and login manually
|
|
55
|
+
*
|
|
56
|
+
* SIMPLE & RELIABLE: Just wait for URL to change to notebooklm.google.com
|
|
57
|
+
*/
|
|
58
|
+
performLogin(page: Page, sendProgress?: ProgressCallback): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* Attempt to authenticate using configured credentials
|
|
61
|
+
*/
|
|
62
|
+
loginWithCredentials(context: BrowserContext, page: Page, email: string, password: string): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Wait for Google to redirect to NotebookLM after successful login (SIMPLE & RELIABLE)
|
|
65
|
+
*
|
|
66
|
+
* Just checks if URL changes to notebooklm.google.com - no complex UI element searching!
|
|
67
|
+
* Matches the simplified approach used in performLogin().
|
|
68
|
+
*/
|
|
69
|
+
private waitForRedirectAfterLogin;
|
|
70
|
+
/**
|
|
71
|
+
* Wait for NotebookLM to load (SIMPLE & RELIABLE)
|
|
72
|
+
*
|
|
73
|
+
* Just checks if URL starts with notebooklm.google.com - no complex UI element searching!
|
|
74
|
+
* Matches the simplified approach used in performLogin().
|
|
75
|
+
*/
|
|
76
|
+
private waitForNotebook;
|
|
77
|
+
/**
|
|
78
|
+
* Handle possible account chooser
|
|
79
|
+
*/
|
|
80
|
+
private handleAccountChooser;
|
|
81
|
+
/**
|
|
82
|
+
* Fill email identifier field with human-like typing
|
|
83
|
+
*/
|
|
84
|
+
private fillIdentifier;
|
|
85
|
+
/**
|
|
86
|
+
* Fill password field with human-like typing
|
|
87
|
+
*/
|
|
88
|
+
private fillPassword;
|
|
89
|
+
/**
|
|
90
|
+
* Click text element
|
|
91
|
+
*/
|
|
92
|
+
private clickText;
|
|
93
|
+
/**
|
|
94
|
+
* Mask email for logging
|
|
95
|
+
*/
|
|
96
|
+
private maskEmail;
|
|
97
|
+
/**
|
|
98
|
+
* Load authentication state from a specific file path
|
|
99
|
+
*/
|
|
100
|
+
loadAuthState(context: BrowserContext, statePath: string): Promise<boolean>;
|
|
101
|
+
/**
|
|
102
|
+
* Perform interactive setup (for setup_auth tool)
|
|
103
|
+
* Opens a PERSISTENT browser for manual login
|
|
104
|
+
*
|
|
105
|
+
* CRITICAL: Uses the SAME persistent context as runtime!
|
|
106
|
+
* This ensures cookies are automatically saved to the Chrome profile.
|
|
107
|
+
*
|
|
108
|
+
* Benefits over temporary browser:
|
|
109
|
+
* - Session cookies persist correctly (Playwright bug workaround)
|
|
110
|
+
* - Same fingerprint as runtime
|
|
111
|
+
* - No need for addCookies() workarounds
|
|
112
|
+
* - Automatic cookie persistence via Chrome profile
|
|
113
|
+
*
|
|
114
|
+
* @param sendProgress Optional progress callback
|
|
115
|
+
* @param overrideHeadless Optional override for headless mode (true = visible, false = headless)
|
|
116
|
+
* If not provided, defaults to true (visible) for setup
|
|
117
|
+
*/
|
|
118
|
+
performSetup(sendProgress?: ProgressCallback, overrideHeadless?: boolean): Promise<boolean>;
|
|
119
|
+
/**
|
|
120
|
+
* Clear ALL authentication data for account switching
|
|
121
|
+
*
|
|
122
|
+
* CRITICAL: This deletes EVERYTHING to ensure only ONE account is active:
|
|
123
|
+
* - All state.json files (cookies, localStorage)
|
|
124
|
+
* - sessionStorage files
|
|
125
|
+
* - Chrome profile directory (browser fingerprint, cache, etc.)
|
|
126
|
+
*
|
|
127
|
+
* Use this BEFORE authenticating a new account!
|
|
128
|
+
*/
|
|
129
|
+
clearAllAuthData(): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Clear all saved authentication state
|
|
132
|
+
*/
|
|
133
|
+
clearState(): Promise<boolean>;
|
|
134
|
+
/**
|
|
135
|
+
* HARD RESET: Completely delete ALL authentication state
|
|
136
|
+
*/
|
|
137
|
+
hardResetState(): Promise<boolean>;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=auth-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../../src/auth/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAYvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,eAAe,CAAS;;IAWhC;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAwC9E;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IASvC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAQ7B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAejD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAgBlE;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC9D;;OAEG;IACG,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDtE;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBxC;;;;;OAKG;IACG,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAmFjF;;OAEG;IACG,oBAAoB,CACxB,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC;IA2InB;;;;;OAKG;YACW,yBAAyB;IA4BvC;;;;;OAKG;YACW,eAAe;IAsB7B;;OAEG;YACW,oBAAoB;IA+BlC;;OAEG;YACW,cAAc;IA2H5B;;OAEG;YACW,YAAY;IA+F1B;;OAEG;YACW,SAAS;IAiBvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAejB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqBjF;;;;;;;;;;;;;;;;OAgBG;IACG,YAAY,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAoEjG;;;;;;;;;OASG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCvC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBpC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;CAgDzC"}
|